/*我用的是金沙滩的开发版,跟大家的不太一样,但应用的原理应该是一样的。
这部分是在学校的时候看的,当时没有掌握,回家后有看了一遍才看懂。
这个是在学完这部分后自己练习的让数码管静态显示秒表的倒计时的代码。
这是总结的使用定时器的步骤:
<1>设置特殊功能寄存器TMOD,配置号工作模式。如TMOD= 0x01;
<2>设置计数寄存器TH0和TL0的初值。 如TL0=FF,TH0=A5,计算公式:x*12/11059200=0.025(溢出一次所需的时间),y=65535-x,再将得到的y值转换成十六进制就得到了初值
<3>设置TCON,通过TR0置1来让计时器开始计数。如TR0=1
<4>判断TCON寄存器的TF0位,检测计时器的溢出情况。
*/
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[]={
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
}; //用数组来储存数码管的真值表
void main()
{
unsigned char cnt = 0; //记录T0中断次数
unsigned char sec = 15; //记录经过的秒数
ENLED = 0; //使能U3,选择数码管DS1
ADDR3 = 1;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0;
TMOD = 0x01; //设置T0为模式1
TH0 = 0xA5; //为T0赋初值为0xA5FF
TL0 = 0xFF;
TR0 = 1; //启动定时器
while(1)
{
if(TF0 == 1) //判断T0是否溢出
{
TF0 = 0; //T0溢出后,清零中断标志
TH0 = 0xA5; //重新赋初值
TL0 = 0xFF;
cnt++; //记录溢出次数
if(cnt >= 40) //判断T0溢出是否达到40次
{
cnt = 0; //计数值清零
P0 = LedChar[sec]; //将当前秒数对应的真值表中的值送到P0
sec--; //对应秒数自加1
if(sec<=1)
{
sec = 15; //秒数超过15后,重新从0开始
}
}
}
}
|