单片机课程设计温度报警器系统计数器.docx
《单片机课程设计温度报警器系统计数器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计温度报警器系统计数器.docx(12页珍藏版)》请在冰豆网上搜索。
单片机课程设计温度报警器系统计数器
课程名称单片机原理与应用
设计题目计数器及温度报警器
内
容
及
任
务
进
度
安
排
起止日期
工作内容
参
考
文
献
一:
设计任务
1:
设计一个0-255计数器,计满后自动清零,重新计数,在数码管中显示。
2:
设计一个0-50000计数器,计满后自动清零,重新计数,在数码管中显示。
3.设计一个温度报警系统;温度显示范围为0-51度,当温度大于40度时,上限报警指示灯点亮,并驱动电机1转动;当温度小于10度时,下限报警指示灯点亮,并驱动电机2转动。
二:
设计源程序
1:
255计数器
ORG0000H
AJMPSTART
ORG0300H
START:
MOVDPTR,#0CFE9H
MOVA,#0D1H;将8279初始化
MOVX@DPTR,A
NOP
NOP
NOP
NOP;延时
NOP
NOP
NOP
NOP
MOVTMOD,#50H;采用工作方式一进行计数
MOVTH1,#00H;高位清零
MOVTL1,#00H;地位清零
SETBTR1;启动定时器/计数器T1进行加1计数
LOOP1:
MOVA,TL1;将低位数给累加器A
MOVB,#64H;将十进制数100给B
DIVAB;用A除以B,商保存在A中,余数保存在B
MOVR1,A;将百位给R1
MOVA,B;将B传递给A
MOVB,#0AH;把十进制数10传给B
DIVAB;用A除以B
MOVR2,A;把十位上的数字传给R2
MOVR3,B;把个位上的数字传给R3
MOVDPTR,#0CFE9H
MOVA,#80H;选择第一个数码管
MOVX@DPTR,A
MOVDPTR,#TAB
MOVA,R
MOVCA,@A+DPTR;通过查表将百位数送入到第一个数
MOVDPTR,#0CFE8H码管
MOVX@DPTR,A
CLRA;将累加器A清零
MOVDPTR,#0CFE9H
MOVA,#81H;选择第二个数码管
MOVX@DPTR,A
MOVDPTR,#TAB
MOVA,R2;通过查表将十位上的数送至第二
MOVCA,@A+DPTR个数码管
MOVDPTR,#0CFE8H
MOVX@DPTR,A
CLRA;将累加器清零
MOVDPTR,#0CFE9H
MOVA,#82H;选择第三个数码管
MOVX@DPTR,A
MOVDPTR,#TAB
MOVA,R3;通过查表将个位上的数字送
MOVCA,@A+DPTR到第三个数码管
MOVDPTR,#0CFE8H
MOVX@DPTR,A
LJMPLOOP1
TAB:
DB3FH,06H,5BH,4FH,66H;共阴极LED数码管的段码管
DB6DH,7DH,07H,7FH,6FH
END
1:
0-255计数器数码管显示仿真图
2:
0-50000计数器
ORG0000H
SJMPSTART
DRG000BH
AJMPT0
START:
MOVTMOD,#050H
MOVP1,#0
MOVTH0,#0FFH
MOVTL0,#0FFH
MOVP3,#0;将p3口置0
CLRC;将C置0
MOVDPTR,#TAB;指针指向TAB,
SETBEA;总中断控制设为“1”
SETBET0;T0允许中断控制设为“1”
MOVR0,#0;个位值清零
MOVR1,#0;十位值清零
MOVR2,#0;百位值清零
MOVR3,#0;千位值清零
MOVR4,#0;万位值清零
SETBTR0;打开T0开关
ACALLT1;显示加等待中断
TO:
MOVTH0,#0FFH
MOVTL0,#0FFH;中断将计数器初始化
INCR0;R0自动加1
MOVA,R0;将R0的值赋给A
CJNEA,#10AAA;比较A是否等于十,若为十则进位,否则继续计数
MOVR0,#0;R0置零
INCR1;进位到十位
AAA:
MOVCA,@A+DPTR;查表
MOVP2,A
SETBP1.0;示个位
ACALLDELAY;延时
SETBP1.0
MOVA,R1;R1的值赋给A中
CJNEA,#10,BBB;比较,是否进位
MOVR1,#0;进位R1置0
INCR2;进位到百位
BBB:
MOVCA,@A+DPTR;查表
MOVP2,A
SETBP1.1;显示十位
ACALLDELAY;延时
CLRP1.0
MOVA,R2R2;赋给百位
CJNEA,#10,CCC;比较,是否进位
MOVR2,#0;进位,R2置0
INCR4;进位到千位
CCC:
MOVCA,@A+DOTR;查表
MOVR2,A
SETBP1.2;显示百位
MOVA,R3;R3赋给A
CJNEA,#10,DDD;比较,是否进位
MOVR3,#0;进位置0
INCR4;进位到万位
DDD:
MOVCA,@A+DPTR;查表
MOVP2,A
SETBP1.3;显示千位
ACALLDELAY;延时
CLRP1.3
MOVA,R4
CJNEA,#5,EEE;比较万位是否到5
MOVR4,#0;万位到5时置0
MOVR3,#0
EEE:
MOVCA,@A+DPTR;查表
MOVP2,A
SETBP1.4;显示万位
ACALLDELAY;延时
CLRP1.4
RETI
T1:
MOVA,R0;等待中断时调用
MOVCA,@A+DPTR
MOVP2,A
SETBP1.0
ACALLDELAY
CLRP1.0
MOVA,R1
MOVCA,@A+DPTR
MOVP2,A
SETBP1.1
ACALLDELAY
CLRP1.1
MOVA,R2
MOVA,@A+DPTR
MOVP2,A
SETBP1.2
ACALLDELAY
CLRP1.2
MOVA,R3
MOVCA,@A+DPTR
MOVP2,A
SETBP1.3
ACALLDELAY
CLRP1.3
MOVA,R4
MOVCA,@A+DPTR
MOVP2,A
SETBP1.4
ACALLDELAY
CLRP1.4
AJMPT1
DELAY:
MOVR7,#10
DE1:
MOVR6,#50
DE2:
DJNZR6,DE2
DJNZR7,DE1
RET
TAB:
DB0C0H0F9H0A4H0B0H99H92H82H0F8H80H90H88H83H0C6H0A1H86H8EH
2;0-50000计数器数码管显示仿真图
3:
温度报警器源程序
DISPLAY0EQU71H;EQU赋值命令
DISPLAY1EQU72H
DISPLAY2EQU73H
ADCEQU74H
STBITP1.0;将P2.5地址赋值给START
EOCBITP1.1;将P2.6地址赋值给EOC
OEBITP1.2;将P2.7地址赋值给OE
ORG00H
SJMPSTART
START:
CLRP3;P3清零,为报警电路做准备
MOVP1.2,#1;P2.7给高电平,OE高电平有效
MOVDISPLAY0,#0FFH;给数码管赋初值
MOVDISPLAY1,#0FFH
MOVDISPLAY2,#0FFH
MOVDPTR,#TABLE;跳转至表格
MOVTMOD,#02H;工作方式二8-bit定时/计数(自动重装初值)
MOVTH0,#0F5H;定时计数器高八位付初值
MOVTL0,#00H
MOVIE,#82H;EA=1,ET0=1溢出中断位允许中断
SETBTR0;启动定时器TR0开始运行
WAIT:
CLRST;转换启动信号STARK清零
SETBST;启动转换信号
CLRST
JNBEOC,$;EOC为转换结束线,高电平为转换结束
;当EOC=0时转移到本指令首地址
SETBOE;输出转换得到的数据
MOVADC,P1;OE=1时将AD信号存入ADC中
CLROE;输出数据线呈高阻态
给第一个数码管的值
MOVA,ADC
MOVB,#51;DOUT=VIN*51为AD转换得出数据
DIVAB;DOUT/51为DISPLAY2值
MOVDISPLAY2,A;给第一个数码管的值
报警程序
MOVR0,#2
SUBBA,R0
JCLOOP1;如果A大于R0(大于2)则转移至LOOP1
MOVP3,00H;否则
给第二,第三个数码管的值
LOOP2:
MOVA,B
MOVB,#5
DIVAB
MOVDISPLAY1,A;分别得到DISPLAY1DISPLAY0的值
MOVA,B
MOVDISPLAY0,A
LCALLDISP
SJMPWAIT;等待再次得到ADC
RETI
数码管点亮程序
DISP:
MOVA,DISPLAY0
MOVCA,@A+DPTR
CLRP1.6;位选第一个数码管低电平有效
MOVP0,A;点亮第一个数码管
NOP
NOP
NOP
NOP
NOP
NOP
SETBP1.6;重新置一(动态扫描)
MOVA,DISPLAY1
MOVCA,@A+DPTR
CLRP1.5
MOVP0,A;点亮第二个数码管
NOP
NOP
NOP
NOP
NOP
NOP
SETBP1.5
MOVA,DISPLAY2
MOVCA,@A+DPTR
CLRP1.4
ORLA,#80H;或指令点亮数码管点号
MOVP0,A;点亮第三个数管
NOP
NOP
NOP
NOP
NOP
NOP
SETBP1.4
RET
表格
TABLE:
DB3FH,06H,5BH,4FH,66H
DB6DH,7DH,07H,7FH,6FH
点亮报警电路数码管
LOOP1:
MOVP3.1,#1
LJMPLOOP2
END
温度报警器仿真图