单片机MCS51数字时钟Word文档格式.docx
《单片机MCS51数字时钟Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机MCS51数字时钟Word文档格式.docx(49页珍藏版)》请在冰豆网上搜索。
MOVTMOD,#01H
MOVTL0,#0B0H
MOVTH0,#03CH;
定时T0初始化
SETBEA
SETBET0;
开启定时中断
SETBTR0;
定时开始
START1:
LCALLSCAN;
输出时间(动态显示)
LCALLKEYSCAN;
检测按键
SJMPSTART1
延时1MS子程序
DL1MS:
MOVR6,#14H
DL1:
MOVR7,#19H
DL2:
DJNZR7,DL2
DJNZR6,DL1
RET
延时20MS子程序
DL20MS:
ACALLSCAN
ACALLSCAN;
实际上包括了对数码管的3次动态显示
ACALLSCAN
数码管显示程序
SCAN:
MOVA,78H;
处理时间缓冲数据:
将60进制化为两个十进制(开始)
MOVB,#0AH
DIVAB;
处理秒
MOV71H,A
MOV70H,B
MOVA,79H
DIVAB;
处理分钟
MOV74H,A
MOV73H,B
MOVA,7AH
处理时钟
MOV77H,A
MOV76H,B
MOVR1,#70H;
R1是时间缓冲区首地址
MOVR5,#80H;
R5是位选码,实现数码动态显示
MOVR3,#08H
SCAN1:
MOVA,R5
MOVP2,A;
位选码,R5实现数码动态显示
MOVA,@R1;
从时间缓冲区提取一位数
MOVDPTR,#TAB;
码表首地址TAB
MOVCA,@A+DPTR;
将该位数译码输出
MOVP0,A;
;
将该位数译码输出并显示
LCALLDL1MS;
每位输出后延迟1ms,然后进行下一位的输出显示
INCR1;
R1指向下一位时间缓冲区地址
RrA
MOVR5,A;
R5会选择下一位数码管
DJNZR3,SCAN1
MOVP2,#0fH;
MOVP0,#0c0H;
这两句是扫描程序SCAN没有执行时数字时钟的状态,当按键按下不放时,前4位会显示0,
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH
;
"
0~9"
"
-"
的共阳极字段码秒速五厘米
定时器/计数器T0中断服务程序
INTT0:
PUSHACC
PUSHPSW;
storethescene
CLRET0;
停止定时时中断
CLRTR0;
停止定时
MOVTH0,#03CH
SETBTR0;
restartTO
INC7BH;
MOVA,7BH
CJNEA,#14H,OUTT0;
counttheTF0for20times
MOV7BH,#00
INC78H;
increase1secondwhen(7BH)hascounted"
TF0=1"
for20times,thatis1Sintotal!
MOVA,78H
CJNEA,#3CH,OUTT0
MOV78H,#00
INC79H;
increase1minutewhensecondisoverflow
MOV79H,#00
INC7AH;
increase1hourwhenminuteisoverflow
CJNEA,#18H,OUTT0
MOV7AH,#00;
thenextday
OUTT0:
SETBET0;
中断服务结束,恢复定时中断0
poppsw
popacc;
recoverythescene
RETI
按键处理程序
KEYSCAN:
CLREA;
屏蔽中断
JNBP1.0,KEYSCAN0
JNBP1.1,KEYSCAN1
JNBP1.2,KEYSCAN2
KEYOUT:
SETBEA;
恢复中断
按键处理程序细节
KEYSCAN0:
LCALLDL20MS
JBP1.0,KEYOUT;
持续按下20ms以上按键才有效,这20ms间实际上是对数码管作3次动态显示
WAIT0:
JNBP1.0,WAIT0
INC7CH;
7C代表状态,其初值为0(调整小时),第一次按下变为1(暂停并调整小时),二次按下变为2(暂停并调整分钟),三次按下变回0(从暂停中恢复)
MOVA,7CH
CLRTR0;
停止计时
CLRET0;
停止计时中断
CJNEA,#03H,KEYOUT;
当7C不为03时,停止计时
MOV7CH,#00;
SETBTR0;
恢复计时
SETBET0;
恢复计时中断
SJMPKEYOUT
KEYSCAN1:
LCALLDL20MS;
持续按下20ms以上按键才有效
JBP1.1,KEYOUT
WAIT1:
JNBP1.1,WAIT1
MOVA,7CH;
20ms后放下按键后
CJNEA,#02H,KSCAN11;
increaseminutewhen"
(7C)=2)"
orhourotherwise
INC79H;
increaseminute
CJNEA,#3CH,KEYOUT
KSCAN11:
INC7AH;
increasehour
CJNEA,#18H,KEYOUT
MOV7AH,#00
KEYSCAN2:
JBP1.2,KEYOUT
WAIT2:
JNBP1.2,WAIT2;
按下20ms以上按键才有效
CJNEA,#02H,KSCAN21;
DEC79H;
decreaseminute
CJNEA,#0FFH,KEYOUT
MOV79H,#3BH
SJMPKEYOUT;
KSCAN21:
DEC7AH;
decreasehour
MOV7AH,#17H
END
本设计主要组件为:
时钟振荡源、复位电路、数码管接口、按键电路
1、复位电路
说明:
当RST保持10ms以上的高电平时,单片机复位,但是内部RAM不会复位。
2、时钟振荡源
本设计使用内部时钟振荡电路,外接石英晶体和微调电容。
3、数码管接口
P0接数码管的段选口,P2接位选口。
数码管属共阴极,段选信号低电平有效。
4、按键电路
由于使用内部程序ROM,所以EA接高电平;
P1.0~P1.2接按键,低电平有效。
5、电子时钟效果图
MCS-51单片机是美国INTE公司于1980年推出的产品,与MCS-48单片机相比,它的结构更先进,功能更强,在原来的基础上增加了更多的电路单元和指令,指令数达111条,MCS-51单片机可以算是相当成功的产品,一直到现在,MCS-51系列或其兼容的单片机仍是应用的主流产品,各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。
我们也以这一代表性的机型进行系统的讲解。
MCS-51系列单片机主要包括8031、8051和8751等通用产品,其主要功能如下:
·
8位CPU
·
4kbytes程序存储器(ROM)
128bytes的数据存储器(RAM)
32条I/O口线
111条指令,大部分为单字节指令
21个专用寄存器
2个可编程定时/计数器
5个中断源,2个优先级
一个全双工串行通信口
外部数据存储器寻址空间为64kB
外部程序存储器寻址空间为64kB
逻辑操作位寻址功能
双列直插40PinDIP封装
单一+5V电源供电
MCS-51以其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“名机”,为以后的其它单片机的发展奠定了基础。
正因为其优越的性能和完善的结构,导致后来的许多厂商多沿用或参考了其体系结构,有许多世界大的电气商丰富和发展了MCS-51单片机,象PHILIPS、Dallas、ATMEL等著名的半导体公司都推出了兼容MCS-51的单片机产品,就连我国的台湾WINBOND公司也发展了兼容C51(人们习惯将MCS-51简称C51,如果没有特别声明,二者同指MCS-51系列单片机)的单片机品种。
下表是80C51系列单片机的主要分类及功能特性:
系列
典型芯片I/O口定时/计数器中断源串行通信口片内RAM
片内ROM
说明80C31
4x8位
2x16位
5
1
128字节
无
80C51
4kB掩膜ROM
87C51
4kBEPROM
89C51
4kBEEPROM
80C32
6
256字节
8kB掩膜ROM
87C52
89C52
8051是MCS-51系列单片机中的代表产品,它内部集成了功能强大的中央处理器,包含了硬件乘除法器、21个专用控制寄存器、4kB的程序存储器、128字节的数据存储器、4组8位的并行口、两个16位的可编程定时/计数器、一个全双工的串行口以及布尔处理器。
MCS-51具有比较大的寻址空间,地址线宽达16条,即外部数据存储器和程序存储器的寻址范围达216=64kB,这作为单片机控制来说已是比较大的,这同时具备对I/O口的访问能力。
此外,MCS-51采用模块化结构,可方便地增删一个模块就可引脚和指令兼容的新产品。
从而容易使产品形成系列化。
由于MCS-51集成了几乎完善的8位中央处理单元,处理功能强,中央处理单元中集成了方便灵活的专用寄存器,硬件的加、减、乘、除法器和布尔处理机及各种逻辑运算和转移指令,这给应用提供了极大的便利。
MCS-51的指令系统近乎完善,指令系统中包含了全面的数据传送指令、完善的算术和逻辑运算指令、方便的逻辑操作和控制指令、对于编程来说,是相当灵活和方便的。
MCS-51单片机的工作频率为2-12MHz,当振荡频率为12MHz时,一个机器周期为1us,这个速度应该说是比较快的。
8051中集成了完善的各种中断源,用户可十分方便地控制和使用其功能,使得它的应用范围加大,可以说它可以满足绝大部分的应用场合。
MCS-51把微型计算机的主要部件都集成在一块心片上,使得数据传送距离大大缩短,可靠性更高,运行速度更块。
由于属于芯片化的微型计算机,各功能部件在芯片中的布局和结构达最优化,抗干扰能力加强,工作亦相对稳定。
因此,在工业测控系统中,使用单片机是最理想的选择。
单片机属于典型的嵌入式系统,所以它是低端控制系统最佳器件。
MCS-51的开发环境要求较低,软件资源十分丰富,介绍其功能特性书籍和开发软件随处可取,只需配备一台PC(个人电脑——对电脑的配置基本上无要求),一台仿真编程器即可实现产品开发,早期的开发软件多使用DOS版本,随着Windows视窗软件的普及,现在几乎都使用Windows版本,并且软件种类繁多,琳琅满目,在众多的单片机品种中,C51的环境资源是最丰富的,这给C51用户带来极大的便利。
(一)定时/计数器
1工作方式0
定时/计数器T0工作在方式0时,16位计数器只用了13位,即TH0的高8位和TL0的低5位,组成一个13位定时器/计数器。
1)、工作在定时方式
2)、工作在计数方式
2工作方式1
定时器T0工作方式1与工作方式0类同,差别在于其中的计数器的位数。
工作方式0以13位计数器参与计数,工作方式1则以16位计数器参与计数。
工作方式1是16位计数器。
这是工作方式1与工作方式0在计数方式时唯一差别。
3工作方式2
定时器T0在工作方式2时,16位的计数器分成了两个独立的8位计数器TH0和TL0。
工作方式2与工作方式0、方式1的差别,在于工作方式2是一个8位的计数器。
4工作方式3
工作方式3仅对定时器T0有效。
当定时器T0工作在方式3时,将16位的计数器分为两个独立的8位计数器TH0和TL0。
当定时器T0工作在方式3时,定时器T1只能工作在方式0~2,并且工作在不需要中断的场合。
(二)中断系统
什么是中断,我们从一个生活中的例子引入。
你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书。
这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。
仔细研究一下生活中的中断,对于我们学习单片机的中断也很有好处。
第一、什么可以引起中断,生活中很多事件可以引起中断:
有人按了门铃了,电话铃响了,你的闹钟闹响了,你烧的水开了….等等诸如此类的事件,我们把可以引起中断的称之为中断源,单片机中也有一些可以引起中断的事件,8031中一共有5个:
两个外部中断,两个计数/定时器中断,一个串行口中断。
第二、中断的嵌套与优先级处理:
设想一下,我们正在看书,电话铃响了,同时又有人按了门铃,你该先做那样呢?
如果你正是在等一个很重要的电话,你一般不会去理会门铃的,而反之,你正在等一个重要的客人,则可能就不会去理会电话了。
如果不是这两者(即不等电话,也不是等人上门),你可能会按你通常的习惯去处理。
总之这里存在一个优先级的问题,单片机中也是如此,也有优先级的问题。
优先级的问题不仅仅发生在两个中断同时产生的情况,也发生在一个中断已产生,又有一个中断产生的情况,比如你正接电话,有人按门铃的情况,或你正开门与人交谈,又有电话响了情况。
考虑一下我们会怎么办吧。
第三、中断的响应过程:
当有事件产生,进入中断之前我们必须先记住现在看书的第几页了,或拿一个书签放在当前页的位置,然后去处理不同的事情(因为处理完了,我们还要回来继续看书):
电话铃响我们要到放电话的地方去,门铃响我们要到门那边去,也说是不同的中断,我们要在不同的地点处理,而这个地点通常还是固定的。
计算机中也是采用的这种方法,五个中断源,每个中断产生后都到一个固定的地方去找处理这个中断的程序,当然在去之前首先要保存下面将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。
具体地说,中断响应可以分为以下几个步骤:
1、保护断点,即保存下一将要执行的指令的地址,就是把这个地址送入堆栈。
2、寻找中断入口,根据5个不同的中断源所产生的中断,查找5个不同的入口地址。
以上工作是由计算机自动完成的,与编程者无关。
在这5个入口地址处存放有中断处理程序(这是程序编写时放在那儿的,如果没把中断程序放在那儿,就错了,中断程序就不能被执行到)。
3、执行中断处理程序。
4、中断返回:
执行完中断指令后,就从中断处返回到主程序,继续执行。
键盘是一组按键组合的开关的集合,平时按键开关处于断开状态,当按下时它才闭合。
当键位没按下时输出为高电平,键位按下时输出低电平。
通常一个单片机系统用到的键盘都包含很多键位,这些键位都通过IO接口进行连接,按下一个键位后通过键盘接口电路就得到该键位的编码。
通常有两种方法进行编码。
一是用连接键盘的IO线的二进制组合进行编码。
二是顺序排列编码。
此处是用的共阳极的LED数码管,共阳就是7段的显示字码共用一个电源的正。
原理示意图:
从上图可以看出,要是数码管显示数字,有两个条件:
1、是要在VT端(3/8脚)加正电源;
2、要使(a,b,c,d,e,f,g,dp)端接低电平或“0”电平。
这样才能显示的。
一般刚接触数码显示的网友搞不清字段和编码的关系,其实要看硬件的电路的组成的,本站的实验板上的数码显示是用P0口驱动的,原理图可以参阅实验板的网页,其计算的方法如下,供网友参考:
例:
如要显示“0”,则要
a,b,c,d,e,f六个字段亮就显示“0”了,而g和dp字段不亮;
这样只要向P0口送出相应的代码即可,编码方法如下表:
程序使用时,只需将显示数字所对应的编码送P0口,然后打开相应的数码管显示位的电源控制即可显示相应的字符
一、这个时钟实际上并不精确,主要有几下几点原因:
1、定时T0中断服务程序暂停了定时计数器,这造成了一定的延迟,延迟时间是定时T0中断服务程序运行的时间。
2、即使定时T0中断服务程序不暂停定时计数器,定时计数器重置命令也会造成延迟(为几个机器周期)
MOVTL0,#0B0H
MOVTH0,#03CH
解决方案:
设定T0的初值时,减去以上延迟就可以了
二、功能改进
本设计是按下一次按键达20ms就使时针或者分针加1/减1。
可以通过修改代码实现当按键1s以上时,使指针在1s以上时指针快速增加/减小。
JNBP1.1,WAIT1;
去掉这句铵键等待,并增加以下代码
每次按键,时针自增一次
CJNEA,#18H,delay_key
delay_key:
mov7dh,#50
delay_key_:
lcallDL20MS;
延迟50*20ms=1s
dec7dh
mova,#0
cjnea,7dh,delay_key_
JBP1.1,KEYOUT;
1S后判断按键是否还按下,否则快速增加时针
WAIT12:
INC7AH;
1s后时针快速增加
CJNEA,#18H,Kk2
kk2:
LCALLDL20MS;
即时显示调整的结果,时针每60ms增加一次
LCALLDL20MS
JNBP1.1,WAIT12
编者注:
本文件为电子工程专辑网站编辑部原创,电子工程专辑享有本文章完全著作权,如需转载该文章,必须经过电子工程专辑网站编辑部同意。
联系电子工程专辑网站编辑部,请发信至eetcol@
单片机应用编程技巧100问
1.C语言和汇编语言在开发单片机时各有哪些优缺点?
答:
汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。
其主要优点是占用资源少、程序执行效率高。
但是不同的CPU,其汇编语言可能有所差异,所以不易移植。
C语言是一种结构化的高级语言。
其优点是可读性好,移植容易,是普遍使用的一种计算机语言。
缺点是占用资源较多,执行效率没有汇编高。
对于目前普遍使用的RISC架构的8bitMCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。
而且一些单片机厂家也不一定能提供C编译器。
而汇编语言,一条指令就对应一个机器码,每一步执行什幺动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。
所以在单片机开发中,我们还是建议采用汇编语言比较好。
如果对单片机C语言有兴趣,HOLTEK的单片机就有提供C编译器,可以到HOLTEK的网站()免费下载使用。
2.C或汇编语言可以用于单片机,C++能吗?
在单片机开发中,主要是汇编和