内容正文:
任务4-2 BCD码显示60秒计数器
1.理解方式2初值自动重装对准确定时的影响
2.掌握多次定时计数溢出的编程要点
3.掌握BCD加法计数器编程要点
一.任务目标
4.掌握BCD码送显程序设计
二.任务要求
任务描述:用定时器T0方式2产生标准秒信号,并实现“00, 01,…, 59,00,…”计数,将计数结果通过P1、P2口外接的BCD数码管显示
仿真演示
三. 相关知识
定时计数器T0/T1方式2结构图
89C51管脚
定时计数器工作方式2:M1M0=10时,定时器T0(或T1)设置为能自动重装计数器初值的8位计数器,结构如图4-2-1所示。此时,TL0(或TL1) 参与计数,TH0(或TH1)装计数初值,当TL0(或TL1)计满溢出时,硬件自动把TH0(或TH1)的值装入TL0(或TL1)作为下一次计数的初值,不需要用指令重新装入计数初值。
方式2与方式1、方式0在使用和结构上有较大区别。方式0与方式1若用于循环重复定时/计数(如产生连续脉冲信号),则每次计满溢出后,计数器为0,第二次计数时必须通过指令重新装入计数初值。
这样,不仅在编程时麻烦,而且重新装入计数初值的指令在执行时所花费的若干机器周期将影响定时时间的精度。方式2具有自动恢复计数初值的功能,避免了上述缺陷,非常适合作为较精确的定时脉冲信号发生器。
采用工作方式2时,计数器的计数值由下式确定:
N=256x
计数范围为1~256。定时器的定时值由下式确定:
t=NT=(256x)T
如果晶体振荡器频率fosc=12MHz,则T=1s,定时范围为1~256s;若晶体振荡器频率fosc=6MHz,则T=2s,定时范围为1~512s。
四、任务分析
1、硬件电路
BCD码显示60秒计数器电路图
2、软件分析
#include <reg51.h>
unsigned char Seg7_CA_Num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit P3_0=P3^0
void delay_1s();
unsigned char Get_Low4(unsigned char i);
unsigned char Get_High4(unsigned char i);
void main()
{
unsigned char BCDCnt,BCDCntL4,BCDCntH4;
P1=Seg7_CA_Num[0];
P2=Seg7_CA_Num[0];
2、软件分析
P3_0=0;
while(1)
{
delay_1s();
BCDCnt++;
BCDCntL4=Get_Low4(BCDCnt);
if(BCDCntL4>=10)
{
BCDCnt=BCDCnt+6;
BCDCntH4=Get_High4(BCDCnt);
BCDCntL4=Get_Low4(BCDCnt);
if(BCDCntH4>=6)
2、软件分析
{
BCDCnt=0;
BCDCntH4=Get_High4(BCDCnt);
BCDCntL4=Get_Low4(BCDCnt);
}
}
P1=Seg7_CA_Num[BCDCntH4];
P2=Seg7_CA_Num[BCDCntL4];
}
}
void delay_1s()
{
unsigned char R5,R6,R7;
2、软件分析
for(R7=2;R7>0;R7--)
{
for(R6=20;R6>0;R6--)
{
for(R5=50;R5>0;R5--)
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
while(!TF0);
TF0=0;
}
}
2、软件分析
P3_0=!P3_0; }
}
unsigned char Get_High4(unsigned char i)
{
unsigned char j;
j=i>>4;
return j;
}
unsigned char Get_Low4(unsigned char i)
{
unsigned char j;
j=i&0x0F;
return j;
}
五.任务实施
(1)在Proteus软件中按BCD码显示60秒计数器电路图好电路;
(2)在Keil软件中编辑程序,进行编译,得到HEX格式文件;
(3)将所得的HEX格式文件在Proteus中加载到单片机芯片中;
(4)运行仿真,观察仿真结果;
(5)Proteus中结果正常后,用实际硬件搭接并调试电路,通过编程器将HEX格式文件下载到AT89C51中,通电验证实验结果。
六、任务总结
任务回顾
课后作业
思考题
标志
Thank you!
$$