仿真图
程序如下
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar dd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管断码表
uchar miao=10; //时间初始值
uchar count=0;//计数变量
sbit led=P1^0; //LED端口
void delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
//闪烁延时
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//数码管显示时间
void display()
{
P3=0x01; //位选
P2=dd[miao/10]; //段选
delay1ms();
P3=0x02;
P2=dd[miao%10];
delay1ms();
}
//显示时间和LED闪烁不显示
void display1()
{
if(miao==0) //判断时间是否到0,是LED闪烁,否显示时间
{
led=1;Delay100ms();
led=0;Delay100ms();
P3=0x01;
P2=0xff;
delay1ms();
P3=0x02;
P2=0xff;
delay1ms();
}
else
{
display();
}
}
void Timer0Init(void) //100微秒@11.0592MHz
{
TMOD = 0x01; //设置定时器模式
TL0 =(65536-50000)%256; //设置定时初值
TH0 =(65536-50000)/256; //设置定时初值
TF0 = 1; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1;
ET0=1;
}
void serviceTimer0Init() interrupt 1
{
TL0 =(65536-50000)%256; //设置定时初值
TH0 =(65536-50000)/256;
count++;
if(count==20) //20*50000=1秒
{
count=0;
miao--;
}
if(miao==0) //秒到0关闭定时器
{
ET0=0;
miao=0;
}
}
//主函数
void main()
{
Timer0Init();
led=0;
while(1)
{
display1();
}
}