打铃仪.docx
- 文档编号:5678934
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:19
- 大小:100.36KB
打铃仪.docx
《打铃仪.docx》由会员分享,可在线阅读,更多相关《打铃仪.docx(19页珍藏版)》请在冰豆网上搜索。
打铃仪
自动打铃器
摘要文章介绍了一种以8031单片机为核心片外扩展at93c46电擦除可编程只读存储器并带有数码LED显示时.分.秒和以指示灯做标志的按键校时自动打铃器。
关键词单片机存储器数码管
一、引言
用单片机控制的自动打铃器,充分发挥单片机体积小,价格便宜,功耗低
可靠性好等特点。
可用于学校作息,方便了广大师生。
二、总体设计方案
1.设计思路
利用单片机及定时器设计的一个时钟,在每次秒加1的计时过程中,都与规定的时间作比较,如果相等就进行开关电铃,不等则返回。
2.总体设计框图
总图1
三、设计原理分析
1.校时模式
按下K1(模式选择键),将模式选择为校时模式(模式指示灯黄灯亮),K2,K3,K4分别为时钟加1键,分钟加1键,秒钟加1键,K5无用。
2.定时模式
按下K1(模式选择键),将模式选择为定时模式(模式指示灯绿灯亮),K2为定时器组选择(本装置有24组定时器)键,K3,K4分别为定时器时钟加1键和定时器分钟加1键,K5为定时器状态选择键,每按K5一次,此组的定时器状态改变一次,并将此组数据存入93C46中。
3.工作模式
按下K1(模式选择键),将模式选择为工作模式(模式指示灯红灯亮),K2,K3,K4,K5无用。
此模式为正常工作模式
4.存储器93C46的相关介绍
存储器AT93C46为SPI接口,1脚为CS,2脚为CLK,3脚为DI,4脚为DO,5脚为GND,6脚为ORG,7脚为NC,8脚为VCC。
单5V电压,DIP8,64*16(ORG为HI)或128*8(ORG为LO),芯片及字的清除,时钟最高为250KHZ。
读(READ)操作:
当下达10XXXX指令后,将地址(XXXXXX)的数据在CLK=HI时由DO输出。
写(WRITE)操作:
在写入之前,必须先下达写使能(EWEN)指令,然后在下达01XXXXXX指令后,当CLK为HI时,在把数据写入指定的地址(XXXXXX),而DO=0时,表示还在烧写,烧写完成后,DO会转为HI,写入动作完成后,必须再下达写禁止(ENDS)指令。
写使能(EWEN):
下达0011XXXX指令后,才可进行写入(WRITE)的数据清除。
写禁止(EWDS):
下达0000XXXX指令后,才可重复进行写入(WRITE)的动作。
5.电路图
图2总体电路图
四、程序部分
1.程序分为五部分
1.初始化程序,2.键值处理程序,3.中断程序,4.显示程序,5.存储器93C46读写程序
2.部分寄存器及按键说明
28H:
扫描指针寄存器
20H--25H:
显示缓存寄存器
R6:
时钟寄存器
R5:
分钟寄存器
R4:
秒钟寄存器
K1:
模式选择键
K2:
时加1(定时器组加1)键
K3:
分加1(定时器时加1)键
K4:
秒加1(定时器分加1)键
K5:
定时器状态改变既存储键
3.程序流程图
通电
A
N
Y
N
图3总体软件流程图
Y
图4校时程序流程图
A
N
N
Y
N
Y
图5校分及显示流程图
4.程序清单
1.初始化程序:
READEQU0;读93C46
WRITEEQU2;写入93C46
EWENEQU4;93C46写入使能
EWDSEQU6;93C46写入禁止
ADR46EQU21H;93C46地址
THIGHEQU0F8H
TLOWEQU5FH
TIMENEQU30;打铃持续时间(30秒)
CSBITP3.7;93C46CS
CLKBITP3.6;93C46CLK
DIBITP3.5;93C46DI
DOBITP3.4;93C46DO
ORG0000H;主程序起始地址
AJMPSTART;跳至主程序
ORG000BH;TIMER0中断起始地址
AJMPTIM0;跳至TIMER0中断子程序
START:
MOVSP,#60H;设置堆栈在60H
MOV28H,#00;显示寄存器初值为00
MOVR6,#12H;“时”寄存器值为12H
MOVR5,#00H;“分”寄存器值为00H
MOVR4,#00H;“秒”寄存器值为00H
MOVTMOD,#01H;设TIMER0为MODE1
MOVTH0,#THIGH;计时中断为4000微秒
MOVTL0,#TLOW
MOVIE,#82;TIMER中断使能
MOVR2,#250;中断250次
SETBTR0;启动TIMER0
2.键值处理程序:
LOOP:
SETBP0.5;工作模式
CLRP0.6
CLRP0.7
JBP0.0,N1;K1(模式选择键)按了?
不是则跳至N1
ACALLDELAY;消除抖动
JNBP0.0,$;K1(模式选择键)放开了?
ACALLDELAY;消除抖动
AJMPSET;转到定时模式SET
N1:
MOV2FH,R6;将时钟数据载入2FH中
MOV2EH,R5;将分钟数据载入2EH中
MOVADR46,#00;把93C46地址置0
SETBRS0;将工作寄存器组选择1区
LOOP1:
MOVA,#READ;读93C46
ACALLTO93c46
MOVA,R3;取出定时器的状态
ANLA,#01H
CJNEA,#01H,N2;定时器为关闭,则跳转至N2
MOVA,R4;取出定时器分钟数据
CJNEA,2FH,N2;定时器分钟数据与时钟分钟不同则转至N2
MOVA,R5;取出定时器时钟数据
CJNEA,2EH,N2;定时器时钟数据与时钟时钟不同则转至N2
SETBP2.1;定时器时间到,打铃
MOVA,ADR46;将93C46地址载入A中
N2:
CJNEA,#1EH,N3;到定时器数据表表尾?
没到转至N3
MOVADR46,#00;到表尾,置93C46地址为表头
AJMPLOOP1;转至LOOP1
N3:
INCADR46;93C46地址加2
INCADR46
AJMPLOOP1;转至LOOP1
SET:
CLRP0.5;校时模式
SETBp0.6
CLRP0.7
LOOPS:
JBP0.0,N11;K1(模式选择键)按了?
不是则跳至N11
ACALLDELAY;消除抖动
JNBP0.0,$;K1(模式选择键)放开了?
ACALLDELAY;消除抖动
AJMPSETTIME;转至SETTIME
N11:
JBP0.1,N13;K2(时钟加1键)按了?
不是则跳至N13
ACALLDELAY;消除抖动
MOVA,R6;将时寄存器的值载入A
ADDA,#01H;A内容加1
DAA;做十进制调整
MOVR6,A;将A的值存入时寄存器
CJNEA,#24H,N12;是否超过24时?
不是则跳至N12
MOVR6,#00H;是则清除时寄存器的值为00
N12:
JNBP0.1,$;K2(时钟加1键)放开了?
ACALLDELAY;消除抖动
N13:
JBP0.2,N15;K3(分钟加1键)按了?
不是则跳至N15
ACALLDELAY;消除抖动
MOVA,R5;将分寄存器的值载入A
ADDA,#01;A内容加1
DAA;做十进制调整
MOVR5,A;将A的值存入分寄存器
CJNEA,#60H,N14;是否超过60分?
不是则跳至N14
MOVR5,#00H;是则清除分寄存器的值为00
N14:
JNBP0.2,$;K3(分钟加1键)放开了?
ACALLDELAY;消除抖动
N15:
JBP0.3,N17;K4(秒钟加1键)按了?
不是则跳至N17
ACALLDELAY;消除抖动
MOVA,R4;将秒寄存器的值载入A
ADDA,#01;A内容加1
DAA;做十进制调整
MOVR4,A;将A的值存入秒寄存器
CJNEA,#60H,N16;是否超过60秒?
不是则跳至N16
MOVR4,#00;是则清除分寄存器的值为00
N16:
JNBP0.3,$;K4(秒钟加1键)放开了?
ACALLDELAY;消除抖动
N17:
AJMPLOOPS;转至LOOPS
SETTIME:
CLRP0.5;定时模式
CLRP0.6
SETBP0.7
MOVADR46,#00H
MOVA,#READ;读93C46地址为ADR46中的数据
ACALLTO9346
LOOPB:
ACALLDISP;调用DISP
JBP0.0,N21;K1(模式选择键)按了?
不是则跳至N21
ACALLDELAY;消除抖动
JNBP0.0,$;K1(模式选择键)放开了?
ACALLDELAY;消除抖动
AJMPLOOP;转至LOOP
N21:
JBP0.1,N22;K2(定时器组加1键)按了?
不是则跳至N22
ACALLDELAY;消除抖动
MOVA,ADR46;将地址载入A
CLRC;清除进位位
RRCA;A右移1位
ADDA,#01H;地址加1
MOVR6,A;将A存入R6
CLRC;清除进位位
RLCA;A左移1位
MOVADR46,A;将A中地址存入ADR46
MOVA,#READ;读93C46地址为ADR46中的数据
ACALLTO9346
JNBP0.1,$;K2(定时器组加1键)放开了?
ACALLDELAY;消除抖动
N22:
JBP0.2,N24;K3(定时器分钟加1键)按了?
不是则跳至N24
ACALLDELAY;消除抖动
MOVA,R4;将定时器分寄存器的值载入A
ADDA,#01;A内容加1
DAA;做十进制调整
MOVR4,A;将A的值存入定时器分寄存器
CJNEA,#60H,N23;是否超过60分?
不是则跳至N16
MOVR4,#00H;是则清除分寄存器的值为00
N23:
JNBP0.2,$;K3(定时器分钟加1键)放开了?
ACALLDELAY;消除抖动
N24:
JBP0.3,N26;K4(定时器时钟加1键)按了?
不是则跳至N26
ACALLDELAY;消除抖动
MOVA,R5;将定时器时寄存器的值载入A
ADDA,#01H;A内容加1
DAA;做十进制调整
MOVR5,A;将A的值存入定时器时寄存器
CJNEA,#24H,N25;是否超过24时?
不是则跳至N25
MOVR5,#00;是则清除分寄存器的值为00
N25:
JNBP0.3,$;K4(定时器时钟加1键)放开了?
ACALLDELAY;消除抖动
N26:
JBP0.4,N27;K5(改变定时器状态存储键)按了?
不是则跳至N27
ACALLDELAY;消除抖动
INCR3;改变R3最低位的值(表示定时器的状态,1表示开,0表示关)
MOVA,#WRITE;将A的值写入93C46地址为ADR46中
ACALLTO9346
JNBP0.4,$;K5(改变定时器状态存储键)放开了?
ACALLDELAY;消除抖动
N27:
AJMPLOOPB;转至LOOPB
3.读写93C46程序:
TO9346:
SETBCS;CS=1
SETBDI;DI=1
SETBCLK;CLK=1
ACALLDELAY
CLRCLK;CLK=0
ACALLDELAY
MOVDPTR,#JPTBL46
JMP@A+DPTR;
JPTBL46:
AJMPSREAD;读
AJMPSWRITE;写
AJMPSEWEN;写使能
AJMPSEWDS;写禁止
SREAD:
MOVA,ADR46;地址载入A
ADDA,#80H;10XXXX读指令
ACALLSDT46;读入地址
ACALLRDT46;读定时器时钟数据
MOVR5,A;存入R5
ACALLRDT46;读定时器分钟数据
MOVR4,A;存入R4
INCADR46;地址加1
MOVA,ADR46;地址载入A
ADDA,#80H;10XXXX读指令
ACALLSDT46;读入地址
ACALLRDT46;读定时器状态数据
ACALLRDT46
DECADR46
MOVR3,A;存入R3
AJMPEX9346
SWRITE:
MOVA,ADR46;写入地址载入A
ADDA,#40H;01XXXX写指令
ACALLSDT46;载入地址
MOVA,R5;载入定时器时钟数据
ACALLSDT46;写入定时器时钟数据
MOVA,R4;载入定时器分钟数据
ACALLSDT46;写入定时器分钟数据
INCADR46;地址加1
MOVA,ADR46;写入地址载入A
ADDA,#40H;01XXXX写指令
ACALLSDT46;载入地址
MOVA,R3;载入定时器状态数据
DECADR46;地址减1
ACALLADR46;写入定时器状态数据
AJMPEX9346;转至EX9346
SEWEN:
MOVA,#30H;0011XXXX写使能指令
ACALLSDT46
AJMPEX9346
SEWDS:
CLRA;0000XXXX写禁止指令
ACALLSDT46
EX9346:
CLRCS;CS=0
RET
SDT46:
MOVR2,#8;写入8位数据
SD1:
RLCA
MOVDI,C
SETBCLK
ACALLDELAY
CLRCLK
ACALLDELAY
DJNZR2,SD1
RET
RDT46:
MOVR2,#8;读出8位数据
RD1:
SETBCLK
ACALLDELAY
CLRCLK
ACALLDELAY
MOVC,DO
RLCA
DJNZR2,RD1
RET
DELAY:
MOVR7,#0FH;
DJNZR7,$
RET
4.中断程序:
TIM0:
MOVTH0,#THIGH;重设计时4000微秒
MOVTL0,#TLOW
PUSHACC;将A的值存入堆栈
PUSHPSW;将PSW的值存入堆栈
CLRRS0;设置工作寄存器为0区
DJNZR2,X2;计时1秒
MOVR2,#250
ACALLCLOCK;调用计时子程序CLOCK
ACALLDISP;调用显示子程序
X2:
ACALLSCAN;调用扫描子程序
POPPSW
POPACC
RETI
显示器驱动程序:
SCAN:
MOVR0,#28H;(28H)为扫描指针
INC@R0;扫描指针加1
CJNE@R0,#6,X3;扫描完6个显示器?
不是跳至X3
MOV@R0,#00;是则扫描指针为0
X3:
MOVA,@R0;扫描指针载入A
ADDA,#20;A加常数20H(显示寄存器地址)=各时间显示区地址
;存入R1=各时间显示地址
MOVR1,A;扫描指针存入A
MOVA,@R0;将A高低4位交换(P1高4位为扫描值,
SWAPA;低4位为显示数据值)
ORLA,@R1;扫描值+显示值
MOVR1,A;输出至P1
RET
计时程序:
CLOCK:
MOVA,R4;R4为秒寄存器
ADDA,#01;加1
DAA;做十进制调整
MOVR4,A;存入秒寄存器
CJNEA,#TIMEN,X4;是否超过打零连续时间?
不是则跳至X4
CLRP2.0;关铃
X4:
CJNEA,#60H,X5;是否超过60秒?
不是则跳至X5
MOVR4,#00;是则清除为0
MOVA,R5;R5为分寄存器
ADDA,#01;加1
DAA;做十进制调整
MOVR5,A;存入分寄存器
CJNEA,#60H,X5;是否超过60分?
不是则跳至X5
MOVR5,#00;是则清除为0
MOVA,R6;R6为时寄存器
ADDA,#01;加1
DAA;做十进制调整
MOVR6,A;存入时寄存器
CJNEA,#60H,X5;是否超过24时?
不是则跳至X5
MOVR6,#00;是则清除为0
X5:
RET
5.显示程序:
DISP:
MOVR1,#20;(20H)为显示寄存器,R1=20H
MOVA,R6;将时寄存器的内容存入A
MOVB,#01H;设B累加器的值为10H
DIVAB;A/B,商(十位数)存入A,余数(个位数)存入B
MOV@R1,B;将B的内容存入(20H)
INCR1;R1=21H
MOV@R1,A;将A的内容存入(21H)
INCR1;R1=22H
MOVA,R5;将分寄存器的内容存入A
MOVB,#01H;设B累加器的值为10H
DIVAB;A/B,商(十位数)存入A,余数(个位数)存入B
MOV@R1,B;将B的内容存入(22H)
INCR1;R1=23H
MOV@R1,A;将A的内容存入(23H)
INCR1;R1=24H
MOVA,R4;将秒寄存器的内容存入A
MOVB,#01H;设B累加器的值为10H
DIVAB;A/B,商(十位数)存入A,余数(个位数)存入B
MOV@R1,B;将B的内容存入(24H)
INCR1;R1=25H
MOV@R1,A;将A的内容存入(25H)
RET
END
参考文献
[1] 李朝青.单片机原理及接口技术(修订版).北京:
北京航空航天大学出版社,1998
[2] 李广弟.单片机基础.北京:
北京航空航天大学出版社,1992
[3]何立民.单片机应用技术大全.北京:
北京航空航天大学出版社,1994
[4] 张毅刚.单片机原理及接口技术.哈尔滨:
哈尔滨工业大学出版社,1990
[5] 谭浩强.单片机课程设计.北京:
清华大学出版社,1989
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 打铃