单片机的可调秒表时钟程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
unsigned char i=0,count,second,minute,hour,key;
unsigned char time[8];
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};// 显示段码值012345679-
unsigned char code seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮
////////////////////////////////////////////////////////
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit LED5=P1^5;
sbit LED6=P1^6;
sbit LED7=P1^7;
sbit S1=P3^0;
sbit S4=P3^1;
sbit S7=P3^2;
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Init_Timer1(void)
{
TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL1=0x00;
EA=1; //总中断打开
ET1=1; //定时器中断打开
TR1=1; //定时器开关打开
}
void delay(unsigned int i)//延时函数
{
while(i--);
}
void keyscan()//键盘扫描函数,使用行列反转扫描法{
if(S1==0)
{
LED2=0;
while(S1==0);
LED2=1;
hour++;
}
if(S4==0)
{
LED3=0;
while(S4==0);
LED3=1;
minute++;
}
if(S7==0)
{
LED4=0;
while(S7==0);
LED4=1;
second++;
}
}
void main()
{
hour=12;minute=35;
Init_Timer0();
Init_Timer1();
time[2]=10;
time[5]=10;
while(1)
{
keyscan();//调用键盘扫描,
}
}
void Timer1_isr(void) interrupt 3 using 1 {
TH1 = 0xF8;
TL1 = 0x30;
P0=dofly[time[i]];//取显示数据
P2=seg[i]; //取段码
i++;
if(i==8)
{
i=0;
LED0=~LED0;
}
}
void Timer0_isr(void) interrupt 1 using 1 {
TH0 = 0xD8;
TL0 = 0xF0;
count++;
if (count==100)
{
count=0;
second++;
LED7=~LED7;
}
if (second==60)
{
second=0;
minute++;
}
if (minute==60)
{
minute=0;
hour++;
}
if (hour==24)
{
hour=0;
}
time[7]=second%10;
time[6]=second/10;
time[4]=minute%10;
time[3]=minute/10;
time[1]=hour%10;
time[0]=hour/10; }