Ⅰ 以AT89C51單片機和DS18B20實現溫度檢測顯示並報警的程序和電路圖,顯示用M016L液晶模塊顯示
匯編語言程序:
;*********************************************************************
;程序適合單個DS18B20和MCS-51單片機的連接,晶振為12MHz
;測量的溫度范圍-55℃~+99℃,溫度精確到小數點後一位
;*********************************************************************
TEMPER_L EQU 30H ;存放從DS18B20中讀出的高、低位溫度值
TEMPER_H EQU 31H
TEMPER_NUM EQU 32H ;存放溫度轉換後的整數部分
TEMPER_POT EQU 33H ;存放溫度轉換後的小數部分
FLAG0 EQU 34H ;FLAG0存放溫度的符號
DQ EQU P1.0 ;DS18B20數據線
RS BIT P1.7 ;LCD1602控制線定義
RW BIT P1.6
E BIT P1.5
SkipDs18b20 EQU 0CCH ;DS18B20跳過ROM命令
StartDs18b20 EQU 44H ;DS18B20溫度變換命令
ReadDs EQU 0BEH ;DS18B20讀暫存器命令
ORG0000H
SJMPMAIN
ORG0040H
MAIN:MOVSP,#60H
ACALL LCD_INIT
MOV A,#80H ;lcd第1行第1列開始顯示temperature:
ACALL WC51R
MOV A,#'t'
ACALL WC51DDR
MOV A,#'e'
ACALL WC51DDR
MOV A,#'m'
ACALL WC51DDR
MOV A,#'p'
ACALL WC51DDR
MOV A,#'e'
ACALL WC51DDR
MOV A,#'r'
ACALL WC51DDR
MOV A,#'a'
ACALL WC51DDR
MOV A,#'t'
ACALL WC51DDR
MOV A,#'u'
ACALL WC51DDR
MOV A,#'r'
ACALL WC51DDR
MOV A,#'e'
ACALL WC51DDR
MOV A,#':'
ACALL WC51DDR
REP:LCALLGET_TEMPER ;讀出轉換後的溫度值
LCALLTEMPER_COV
MOV A,#0c6H ;lcd第2行第7列開始顯示溫度
ACALL WC51R
MOV A,FLAG0 ;顯示符號
ACALL WC51DDR
MOV A,TEMPER_NUM ;溫度整數拆分成十位和個位顯示
MOV B,#10
DIV AB
ADD A,#30H
CJNE A,#30H,REP1 ;如果十位為0不顯示
MOV A,#20H
REP1:ACALL WC51DDR
MOV A,B
ADD A,#30H
ACALL WC51DDR
MOV A,#'.' ;顯示小數點
ACALL WC51DDR
MOV DPTR,#TABLE
MOV A,TEMPER_POT ;顯示小數部分
MOVC A,@A+DPTR
ACALL WC51DDR
LJMPREP
;DS18B20復位程序
DS18B20_INIT:SETB DQ
NOP
NOP
CLR DQ
MOVR7,#9
INIT_DELAY:CALL DELAY60US
DJNZ R7,INIT_DELAY
SETB DQ
CALL DELAY60US
CALL DELAY60US
MOV C,DQ
JC ERROR
CALL DELAY60US
CALL DELAY60US
CALL DELAY60US
CALL DELAY60US
RET
ERROR:CLR DQ
SJMP DS18B20_INIT
RET
;讀DS18B20一個位元組到累加器A程序
READ_BYTE: MOV R7,#08H
SETB DQ
NOP
NOP
LOOP:CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R6,#07H
DJNZ R6,$
MOV C,DQ
CALL DELAY60US
RRC A
SETB DQ
DJNZ R7,LOOP
CALL DELAY60US
CALL DELAY60US
RET
;累加器A寫到DS18B20程序
WRITE_BYTE:MOV R7,#08H
SETB DQ
NOP
NOP
LOOP1:CLR DQ
MOV R6,#07H
DJNZ R6,$
RRC A
MOV DQ,C
CALL DELAY60US
SETB DQ
DJNZ R7,LOOP1
RET
DELAY60US:MOV R6,#1EH
DJNZ R6,$
RET
;讀溫度程序
GET_TEMPER:CALL DS18B20_INIT ;DS18B20復位程序
MOV A,#0CCH ;DS18B20跳過ROM命令
CALL WRITE_BYTE
CALL DELAY60US
CALL DELAY60US
MOV A,#44H ;DS18B20溫度變換命令
CALL WRITE_BYTE
CALL DELAY60US
CALL DS18B20_INIT ;DS18B20復位程序
MOV A,#0CCH ;DS18B20跳過ROM命令
CALL WRITE_BYTE
CALL DELAY60US
MOV A,#0BEH ;DS18B20讀暫存器命令
CALL WRITE_BYTE
CALL DELAY60US
CALL READ_BYTE ;讀溫度低位元組
MOV TEMPER_L,A
CALL READ_BYTE ;讀溫度高位元組
MOV TEMPER_H,A
RET
;將從DS18B20中讀出的溫度拆分成整數和小數
TEMPER_COV:
MOV FLAG0,#'+' ;設當前溫度為正
MOV A,TEMPER_H
SUBB A,#0F8H
JC TEM0 ;看溫度值是否為負?不是,轉
MOV FLAG0,#'-' ;是,置FLAG0為'-'
MOV A,TEMPER_L
CPL A
ADD A,#01
MOV TEMPER_L,A
MOV A,TEMPER_H
CPL A
ADDC A,#00
MOV TEMPER_H,A
TEM0:
MOV A,TEMPER_L ;存放小數部分到TEMPER_POT
ANL A,#0FH
MOV TEMPER_POT,A
MOV A,TEMPER_L ;存放小數部分到TEMPER_NUM
ANL A,#0F0H
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A
RET
;LCD初始化子程序
LCD_INIT:MOV A,#00000001H ;清屏
ACALL WC51R
MOV A,#00111000B ;使用8位數據,顯示兩行,使用5×7的字型
LCALL WC51R
MOV A,#00001100B ;顯示器開,游標關,字元不閃爍
LCALL WC51R
MOV A,#00000110B ;字元不動,游標自動右移一格
LCALL WC51R
RET
;檢查忙子程序
F_BUSY:PUSH ACC ;保護現場
MOV P2,#0FFH
CLR RS
SETB RW
WAIT: CLR E
SETB E
JB P2.7,WAIT ;忙,等待
POP ACC ;不忙,恢復現場
RET
;寫入命令子程序
WC51R: ACALL F_BUSY
CLR E
CLR RS
CLR RW
SETB E
MOV P2,ACC
CLR E
RET
;寫入數據子程序
WC51DDR:ACALL F_BUSY
CLR E
SETB RS
CLR RW
SETB E
MOV P2,ACC
CLR E
RET
TABLE:DB 30H,31H,31H,32H,33H,33H,34H,34H
DB 35H,36H,36H,37H,38H,38H,39H,39H ;小數溫度轉換表
END
C語言程序:
//程序適合單個DS18B20和MCS-51單片機的連接,晶振為12MHz
//測量的溫度范圍-55℃~+99℃,溫度精確到小數點後一位
#include<REG52.H>
#defineucharunsignedchar
#defineuintunsignedint
sbit DQ=P1^0; //定義埠
sbit RS=P1^7;
sbit RW=P1^6;
sbit EN=P1^5;
union{
ucharc[2];
uintx;
}temp;
ucharflag;//flag為溫度值的正負號標志單元,"1"表示為負值,"0"時表示為正值。
uintcc,cc2;//變數cc中保存讀出的溫度值
floatcc1;
ucharbuff1[13]={"temperature:"};
ucharbuff2[6]={"+00.0"};
//檢查忙函數
void fbusy()
{
P2=0xff;
RS=0;
RW=1;
EN=1;
EN=0;
while((P2&0x80))
{
EN=0;
EN=1;
}
}
//寫命令函數
void wc51r(uchar j)
{
fbusy();
EN=0;
RS=0;
RW=0;
EN=1;
P2=j;
EN=0;
}
//寫數據函數
void wc51ddr(uchar j)
{
fbusy(); //讀狀態;
EN=0;
RS=1;
RW=0;
EN=1;
P2=j;
EN=0;
}
void init()
{
wc51r(0x01); //清屏
wc51r(0x38); //使用8位數據,顯示兩行,使用5*7的字型
wc51r(0x0c); //顯示器開,游標開,字元不閃爍
wc51r(0x06); //字元不動,游標自動右移一格
}
voiddelay(uintuseconds) //延時程序
{
for(;useconds>0;useconds--);
}
ucharow_reset(void) //復位
{
ucharpresence;
DQ=0; //DQ低電平
delay(50); //480ms
DQ=1; //DQ高電平
delay(3); //等待
presence=DQ; //presence信號
delay(25);
return(presence); //0允許,1禁止
}
ucharread_byte(void) //從單匯流排上讀取一個位元組
{
uchari;
ucharvalue=0;
for(i=8;i>0;i--)
{
value>>=1;
DQ=0;
DQ=1;
delay(1);
if(DQ)value|=0x80;
delay(6);
}
return(value);
}
voidwrite_byte(ucharval) //向單匯流排上寫一個位元組
{
uchari;
for(i=8;i>0;i--) //一次寫一位元組
{
DQ=0;
DQ=val&0x01;
delay(5);
DQ=1;
val=val/2;
}
delay(5);
}
voidRead_Temperature(void) //讀取溫度
{
ow_reset();
write_byte(0xCC); //跳過ROM
write_byte(0xBE); //讀
temp.c[1]=read_byte();
temp.c[0]=read_byte();
ow_reset();
write_byte(0xCC);
write_byte(0x44); //開始
return;
}
voidmain() //主程序
{
uchar k;
delay(10);
EA=0;
flag=0;
init();
wc51r(0x80); //寫入顯示緩沖區起始地址為第1行第1列
for(k=0;k<13;k++) //第一行顯示提示信息"currenttempis:"
{wc51ddr(buff1[k]);}
while(1)
{
delay(10000);
Read_Temperature(); //讀取雙位元組溫度
cc=temp.c[0]*256.0+temp.c[1];
if (temp.c[0]>0xf8){flag=1;cc=~cc+1;}elseflag=0;
cc1=cc*0.0625; //計算出溫度值
cc2=cc1*100; //放大100倍,放在整型變數中便於取數字
buff2[1]=cc2/1000+0x30;if(buff2[1]==0x30)buff2[1]=0x20;//取出十位,轉換成字元,如果十位是0不顯示。
buff2[2]=cc2/100-(cc2/1000)*10+0x30;//取出個位,轉換成字元
buff2[4]=cc2/10-(cc2/100)*10+0x30;//取出小數點後一位,轉換成字元
if(flag==1)buff2[0]='-';elsebuff2[0]='+';
wc51r(0xc5); //寫入顯示緩沖區起始地址為第2行第6列
for(k=0;k<6;k++) //第二行顯示溫度
{wc51ddr(buff2[k]);}
}
}
Ⅱ python代碼運行助手怎麼打開
python代碼運行助手是能在網頁上運行python語言的工具。因為python的運行環境在很多教程里都是用dos的,黑乎乎的界面看的有點簡陋,所以出了這python代碼運行助手,作為ide。
實際上,python代碼運行助手界面只能算及格分,如果要找ide,推薦使用jupyter。jupyter被集成到ANACONDA里,只要安裝了anacoda就能使用了。
回到這個問題:
1、要打開這運行助手首先要下載一個learning.py,如果找不到可以復制如下代碼另存為「learning.py」,編輯器用sublime、或者notepad++。
#!/usr/bin/envpython3
#-*-coding:utf-8-*-
r'''
learning.py
APython3tutorialfromhttp://www.liaoxuefeng.com
Usage:
python3learning.py
'''
importsys
defcheck_version():
v=sys.version_info
ifv.major==3andv.minor>=4:
returnTrue
print('Yourcurrentpythonis%d.%d.PleaseusePython3.4.'%(v.major,v.minor))
returnFalse
ifnotcheck_version():
exit(1)
importos,io,json,subprocess,tempfile
fromurllibimportparse
fromwsgiref.simple_serverimportmake_server
EXEC=sys.executable
PORT=39093
HOST='local.liaoxuefeng.com:%d'%PORT
TEMP=tempfile.mkdtemp(suffix='_py',prefix='learn_python_')
INDEX=0
defmain():
httpd=make_server('127.0.0.1',PORT,application)
print('ReadyforPythoncodeonport%d...'%PORT)
httpd.serve_forever()
defget_name():
globalINDEX
INDEX=INDEX+1
return'test_%d'%INDEX
defwrite_py(name,code):
fpath=os.path.join(TEMP,'%s.py'%name)
withopen(fpath,'w',encoding='utf-8')asf:
f.write(code)
print('Codewroteto:%s'%fpath)
returnfpath
defdecode(s):
try:
returns.decode('utf-8')
exceptUnicodeDecodeError:
returns.decode('gbk')
defapplication(environ,start_response):
host=environ.get('HTTP_HOST')
method=environ.get('REQUEST_METHOD')
path=environ.get('PATH_INFO')
ifmethod=='GET'andpath=='/':
start_response('200OK',[('Content-Type','text/html')])
return[b'<html><head><title>LearningPython</title></head><body><formmethod="post"action="/run"><textareaname="code"style="width:90%;height:600px"></textarea><p><buttontype="submit">Run</button></p></form></body></html>']
ifmethod=='GET'andpath=='/env':
start_response('200OK',[('Content-Type','text/html')])
L=[b'<html><head><title>ENV</title></head><body>']
fork,vinenviron.items():
p='<p>%s=%s'%(k,str(v))
L.append(p.encode('utf-8'))
L.append(b'</html>')
returnL
ifhost!=HOSTormethod!='POST'orpath!='/run'ornotenviron.get('CONTENT_TYPE','').lower().startswith('application/x-www-form-urlencoded'):
start_response('400BadRequest',[('Content-Type','application/json')])
return[b'{"error":"bad_request"}']
s=environ['wsgi.input'].read(int(environ['CONTENT_LENGTH']))
qs=parse.parse_qs(s.decode('utf-8'))
ifnot'code'inqs:
start_response('400BadRequest',[('Content-Type','application/json')])
return[b'{"error":"invalid_params"}']
name=qs['name'][0]if'name'inqselseget_name()
code=qs['code'][0]
headers=[('Content-Type','application/json')]
origin=environ.get('HTTP_ORIGIN','')
iforigin.find('.liaoxuefeng.com')==-1:
start_response('400BadRequest',[('Content-Type','application/json')])
return[b'{"error":"invalid_origin"}']
headers.append(('Access-Control-Allow-Origin',origin))
start_response('200OK',headers)
r=dict()
try:
fpath=write_py(name,code)
print('Execute:%s%s'%(EXEC,fpath))
r['output']=decode(subprocess.check_output([EXEC,fpath],stderr=subprocess.STDOUT,timeout=5))
exceptsubprocess.CalledProcessErrorase:
r=dict(error='Exception',output=decode(e.output))
exceptsubprocess.TimeoutExpiredase:
r=dict(error='Timeout',output='執行超時')
exceptsubprocess.CalledProcessErrorase:
r=dict(error='Error',output='執行錯誤')
print('Executedone.')
return[json.mps(r).encode('utf-8')]
if__name__=='__main__':
main()
2,再用一個記事本寫如下的代碼:
@echooff
pythonlearning.py
pause
另存為『運行.bat』
3、把「運行.bat」和「learning.py」放到同一目錄下,
Ⅲ 初級單片機綜合題求解答,請用匯編語言
地址低8位有u2鎖存後提供,高3位由p2口的低3位提供,共11bit地址,E端接P26,所以
6116在64k地址范圍的地址為, 最基本地址是,4000h-47ffh 共 2k byte
但由於P2.7,P2.6,P2.5,P2.5懸空,可以是任意值,都可讀寫到6116,所以6116有多重地址. 即0000h-ffffh的64k中,除了p2.6=0,的地址,其他地址均可分成多個2k的塊,每個2k的塊都可讀寫到同一個6116的數據。
2. mov A,#5ah
MOV DPH,#40H
MOV DPL,#0
movx @DPTR,A
MOV A,#0A5H
MOV DPH,#47H
MOV DPL,#0FFH
movx @DPTR,A
3. MOV A,#0
MOV DPH,#40H
MOV DPL,#0
MOV R0,#7h
LOOP1:
MOV R1,#0ffh
loop2:
movx @dptr,a
inc dptr
djnz R1,LOOP2
djnz R0,LOOP1