#include<reg51.h> //头文件
#define uint unsigned int //宏定义unsigned int 为uint
#define uchar unsigned char //宏定义unsigned char为uchar
sbit wx1=P0^0; //P3.0控制74138 A
sbit wx2=P0^1; //P3.1控制74138 B
sbit wx3=P0^2; //P3.2控制74138 C
uchar num,num1,num2,num3,ms,mg,fs,fg,zs,zg; //定义num
uchar code tablea[]={0x3f,0x06,0x5b,0x4f, //定义1~F数码管显示代码
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void delayms(uint);
void display(uchar,uchar);
void main() //主函数
{
TMOD=0X01; //设置定时器0和定时器1工作(此时TMOD寄存器状态为00010001,定时器工作在方式1)
TH0=(65536-50000)/256; //装初值, THX=(65536-N)/256,TLX=(65536-N)%256
TL0=(65536-50000)%256; //N=一次中断的时间/机器周期(建议采用50ms计时)
EA=1; //总中断开启
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1) //循环体
{
display(zs,zg);
}
}
void display(uchar zs,uchar zg)
{wx1=0; //位选第一位(74HC138)
wx2=0; //位选第一位(74HC138)
wx3=0; //位选第一位(74HC138)
P1=0xff; //消抖
P1=tablea[zs]; //第一位数码管显示1
delayms(1); //延时1ms
wx1=1; //位选第2位显示2,延时1ms
wx2=0;
wx3=0;
P1=0xff;
P1=tablea[zg];
delayms(1);
wx1=0; //位选第3位显示3,延时1ms
wx2=1;
wx3=0;
P1=0xff;
P1=0x9;
delayms(1);
wx1=1; //位选第4位显示4,延时1ms
wx2=1;
wx3=0;
P1=0xff;
P1=tablea[fs];
delayms(1);
//位选第5位显示5,延时1ms
wx1=0;
wx2=0;
wx3=1;
P1=0xff;
P1=tablea[fg];
delayms(1);
wx1=1; //位选第6位显示冒号,延时1ms
wx2=0;
wx3=1;
P1=0xff;
P1=0x9;
delayms(1);
wx1=0; //位选第7位显示7,延时1ms
wx2=1;
wx3=1;
P1=0xff;
P1=tablea[ms];
delayms(1);
wx1=1; //位选第8位显示8,延时1ms
wx2=1;
wx3=1;
P1=0xff;
P1=tablea[mg];
delayms(1);
}
void delayms(uint xms) //延时子函数
{
uint i,j; //定义
for(i=xms;i>0;i--) //i=xms即为延时x毫秒
for(j=120;j>0;j--); //12M频率下,一个机器周期为1μS
}
void T0_time()interrupt 1
{
TH0=(65536-50000)/256; //重新赋予定时器初值
TL0=(65536-50000)%256;
num1++; //累加计数
if(num1==20) //如果到了20次,说明1s时间到
{
num1=0; //1s时间到,清零,重新计时
num++;
if(num==60) //num定义秒
num2++; //num2定义分,每60秒,分钟数+1
if (num2==60) //
num3++; //num3定义小时,每到60分,小时+1
if(num3==24)
num3=0; //24小时后,小时清零一次
if(num2==60)
num2=0; //60分钟后,分钟清零
if(num==60)
num=0; //60秒后,秒清零
ms=num/10;
mg=num%10; //秒显示计算
fs=num2/10;
fg=num2%10; //分钟显示计算
zs=num3/10;
zg=num3%10; //小时显示计算
}
}
源文件如下,请大家指导。我还是不明白在终端中的初值及中断次数累加是怎么回事 |