#include<reg51.h> //单片机头文件
#define uint unsigned int
#define uchar unsigned char
#define CF P0 //宏定义
uint sec=0; //数码管显示同步定义数值sec 后面还会讲
sbit K1=P3^2; //K1复位 就是将运行的程序结束 然后重新开始运行
sbit K2=P3^1; //暂停
sbit K3=P3^0; //开始
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2; //位选定义
sbit LED4=P2^3;
uchar disbuff[]={0,0,0,0}; //数码管显示位数的数值数组
uchar const num[10]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f}; //0-9的显示码
void delay(int s)
{
uint i,j;
for(i=0;i<s;i++) //延时函数
for(j=114;j>0;j--);
}
void DigDisplay() //显示函数
{
LED1=1;LED2=1;LED3=1;LED4=0; //最右边一位开启 也就是个位
CF = disbuff[0];
delay(5);
CF=0x00;//消隐
LED1=1;LED2=1;LED3=0;LED4=1; //十位
CF=disbuff[1]; //因为人肉眼的可见变化最小为500ms 这个数码管此刻的变化为微秒级 所以不会看到有不显示的情况
delay(5);
CF=0x00; //消隐
LED1=1;LED2=0;LED3=1;LED4=1; //百位
CF=disbuff[2];
delay(5);
CF=0x00; //消隐
LED1=0;LED2=1;LED3=1;LED4=1; //千位
CF=disbuff[3];
delay(5);
CF=0x00; //消隐
}
void Count() //计算函数
{
disbuff[0]=num[sec%10]; //个位数字
disbuff[1]=num[sec/10%10]; //十位数字
disbuff[2]=num[sec/100%10]; //百位数字
disbuff[3]=num[sec/1000%10]; //千位数字
}
void KEY() //按键函数
{
if(K1==0); //启动
delay(10);
if(K1==0)
{TR0=1;}
while(!K1) DigDisplay();Count(); //按键释放
if(K2==0)
{
delay(5);
if(K2==0)
{
TR0=0; //关闭定时器
}
} while(!K2)DigDisplay();Count();
if(K3==0)
{
delay(10);
if(K3==0)
{
sec=0;
TH0=0x3c;//设定T0初始值(高八位)
TL0=0xb0;
}
}
}
void main()
{
TMOD=0x11;//设定定时气的工作方式
TH0=0x3c;//设定初始值(高八位)
TL0=0xb0;//设定T0初始值(低五位) 设定时间为50ms
ET0=1; //内部中断
EA=1; //打开总中断
TR0=1; //启动定时器0
while(1) // while循环
{
Count(); //计算
DigDisplay(); //延时
KEY();
}
}
void time1() interrupt 1
{
uchar m;
TH0=0x3c;
TL0=0xb0; //重新赋初值
m++; //50ms m++
if(m==20)
{ // 每50ms执行20次也就是一秒
m=0;
sec++; //每一秒数码管的显示同步数值加一
if(sec==10000) //因为我们显示只能到9999 所以达到最大显示需要清零
{
sec=0;
}
}
}
|