C语言编写秒表

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include //52系列单片机头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit dula=P2^6; //申明U1锁存器的锁存端
sbit wela=P2^7; //申明U2锁存器的锁存端
sbit key1=P3^4; //申明四个按键的锁存端
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={ //含有0~9的数字数组
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void delayms(uint); //声明延时函数
void display(uchar,uchar,uchar); //声明显示函数
void keyscan(); //声明按键函数
uchar num1,num2,bai,shi,ge; //变量声明
uint num;
void main() //主函数入口
{
TMOD=0x11; //设置TO,T1定时器
TH0=(65536-45872)/256; //装初值11.05992M晶振定时50ms数为45872
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开启定时器T0中断
ET1=1; //开启定时器T1中断

while(1) //程序停在这里等待中断的发生,这个大循环也是实现数据显示的主体循环
{
keyscan();

//三个数码管要选送的数据
bai=num/100; //百位
shi=(num-100*bai)/10; //十位
ge=num-100*bai-shi*10; //个位

//直接把第二只数码管的小数点烧出来
dula=1; //打开段选
P0=0x80; //送段选数据
dula=0; //关闭断选
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱
wela=1; //打开位选
P0=0xfd; //送位选数据
wela=0; //关闭位选
delayms(5); //延时

display(bai,shi,ge);
}
}
void display(uchar bai, uchar shi,uchar ge) //数码管显示子函数
{
dula=1; //打开段选
P0=table[bai]; //送段选数据
dula=0; //关闭断选
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱
wela=1; //打开位选
P0=0xfe; //送位选数据
wela=0; //关闭位选
delayms(5); //延时

dula=1; //打开段选
P0=table[shi]; //送段选数据
dula=0; //关闭断选
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱
wela=1; //打开位选
P0=0xfd; //送位选数据
wela=0; //关闭位选
delayms(5); //延时

dula=1; //打开段选
P0=table[ge]; //送段选数据
dula=0; //关闭断选
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱
wela=1; //打开位选
P0=0xfb; //送位选数据
wela=0; //关闭位选
delayms(5); //延时
}
void delayms(uint xms) //延时子函数
{
ui

nt i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
void keyscan() //按键子函数
{
if(key1==0) //清零
{
delayms(10); //延时去抖
if(key1==0)
{
while(!key1) //等待按下
{
TR0=0; //定时器TR0关闭
TR1=1; //定时器TR1打开
num=0; //送数据num=0
TR1=0; //定时器TR1关闭
}
}
}
if(key2==0) //暂停和开始
{
delayms(10);
if(key2==0)
{
while(!key2);
TR0=0;
TR1=~TR1; //每次按下,TR1的状态时相反的
}
}
if(key3==0) //使计数器显示为60.0
{
delayms(10);
if(key3==0)
{
while(!key3);
TR0=0;
TR1=1;
num=600;
TR1=0;

}
}
if(key4==0) //实现计数器的倒数功能
{
delayms(10);
if(key4==0)
{
while(!key4);
TR1=0;
TR0=1;
}
}
}

void T0_time()interrupt 1 //定时器T0,中断序号为1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num2++;
if(num2==2) //如果到了2次,说明0.1秒的时间到
{
num2=0; //然后把num2清零重新再计2次
num1++;
if(num1==10)
num1=0;
if(num==0) //当num自减为0时,重新为60.0,再开始倒计时
num=600;
num--; //num逐渐自减
}

}

void T1_time()interrupt 3 //定时器T1,中断序号为3
{
TH1=(65536-45872)/256; //重装初值
TL1=(65536-45872)%256;
num2++;
if(num2==2) //如果到了2次,说明0.1秒的时间到
{
num2=0; //然后把num2清零重新再计2次
num1++;
if(num1==10)
num1=0;
num++; //num逐渐自加
if(num==600) //这个数十用来送给数码管显示的,到了60.0后归零
num=0;
}
}

相关文档
最新文档