#include <REGX51.H>
#include "AT89x51.h"
#define uchar unsigned char
#define dword unsigned int
//数码管位接口
sbit s1=P2^0; //定义毫秒十位
sbit s2=P2^2; //定义毫秒百位
//按键接口
sbit k1=P3^0; //开始/暂停按键
sbit k2=P3^1; //清零按键
sbit buzzer = P3^7;
//数码管段和开启关闭
#define SMG_IO P0//数码管显示
#define Enable 0 //使能
#define Disability 1 //失能
//数码管0-9
uchar seg_cc[10]={0xCF,0x03,0x5D,0x5B,0x93,0xDA,0xDE,0x43,0xDF,0xDB}; //数码管0-9
uchar dp = 0x7f; //点亮小数点
//全局变量
uchar msge,msshi,s; //毫秒和秒
//延时
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//显示
void showtime(uchar s) //数码管显示,最大显示99.99秒
{
s1=Enable; //秒十位显示
SMG_IO=seg_cc[s/10];
delay(10);
SMG_IO=0x00;//消除余辉
s1=Disability;
s2=Enable; //秒十位显示
SMG_IO=seg_cc[s%10];
delay(10);
SMG_IO=0x00;//消除余辉
s2=Disability;
}
//清零
void initall()
{
msge = 0; //初始化 0*5 毫秒 , 1 ss = 5 ms
msshi = 0;
s = 0; // 0 秒
}
void T0intinit( ) //定时中断初始化
{
TMOD=0x01;
TH0=(65536-10000)/256; //10ms??
TL0=(65536-10000)%256;
EA=1;
ET0=1;
}
void alarm() //报警电路
{
buzzer=1;
delay(100);
buzzer=0;
delay(100);
}
//主程序
void main() //主函数
{
T0intinit( );
while(1)
{
showtime(s); //显示
if(k1 == 0) //S1开始按键
{
if(k1 == 0)
{
TR0 = ~TR0;
}
while(!k1)
{
showtime(s);//显示
}
}
if(k2 == 0) //S3清零按?
{
TR0=0; //停止计时
initall(); //清零
}
if(s==99)
{
alarm();
}
}
}
//定时中断服务,毫秒计时
void timer0()interrupt 1
{
TH0=(65536-10000)/256; //??10ms????
TL0=(65536-10000)%256;
if(++msge == 10) //飞秒
{
msge=0;
if(++msshi == 10) //飞秒
{
msshi=0;
if(++s>99) //最大99s
{
s=0;
initall(); //超出最大时清零。
TR0=0; //停止计时
}
}
}
}
|