打铃仪.docx

上传人:b****6 文档编号:5678934 上传时间:2022-12-31 格式:DOCX 页数:19 大小:100.36KB
下载 相关 举报
打铃仪.docx_第1页
第1页 / 共19页
打铃仪.docx_第2页
第2页 / 共19页
打铃仪.docx_第3页
第3页 / 共19页
打铃仪.docx_第4页
第4页 / 共19页
打铃仪.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

打铃仪.docx

《打铃仪.docx》由会员分享,可在线阅读,更多相关《打铃仪.docx(19页珍藏版)》请在冰豆网上搜索。

打铃仪.docx

打铃仪

自动打铃器

摘要文章介绍了一种以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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 社交礼仪

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1