标题:
单片机时钟程序
[打印本页]
作者:
hongniu
时间:
2015-6-23 23:55
标题:
单片机时钟程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit wela=P2^7;
sbit dula=P2^6;
sbit beep=P2^3;
uchar code table[]= //定义数组
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar code table1[]=
{0xfe,0xfd,0xdf,0xf7,0xef,0xfb,0xbf,0x7f};
char shi=0,fen=0,n=0,shit=0,fent=1,numt,b=0,x=0,y=0,z=0,num,num2;
unsigned char a=0;
uchar flag;
void delayms(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void di()//蜂鸣器函数
{
beep=0;
delayms(100);
beep=1;
}
void keyscan()//独立按键程序
{
if(key1==0) //第一位为功能键
{
delayms(10);
if(key1==0)
{
n++;
if(n==8)
{n=0;a=0;TR1=1;}
while(!key1);
di();
}
}
if(n==0)
{
TR0=1;
}
if(n==1) //调时
{
TR0=0;
if(key2==0)
{
delayms(10);
if(key2==0)
{
shi++;
if(shi==24)
shi=0;
while(!key2);
di();
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
shi--;
if(shi==-1)
shi=23;
while(!key3);
di();
}
}
}
if(n==2)//调分
{
TR0=0;
if(key2==0)
{
delayms(10);
if(key2==0)
{
fen++;
if(fen==60)
fen=0;
while(!key2);
di();
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
fen--;
if(fen==-1)
fen=59;
while(!key3);
di();
}
}
}
if(n==3) //调秒
{
TR0=0;
if(key2==0)
{
delayms(10);
if(key2==0)
{
num++;
if(num==60)
num=0;
while(!key2);
di();
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
num--;
if(num==-1)
num=59;
while(!key3);
di();
}
}
}
if(n==4)//调闹铃时
{
TR0=0;
if(key2==0)
{
delayms(10);
if(key2==0)
{
shit++;
if(shit==24)
shit=0;
while(!key2);
di();
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
shit--;
if(shit==-1)
shit=23;
while(!key3);
di();
}
}
}
if(n==5)//调闹铃分
{
TR0=0;
if(key2==0)
{
delayms(10);
if(key2==0)
{
fent++;
if(fent==60)
fent=0;
while(!key2);
di();
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
fent--;
if(fent==-1)
fent=59;
while(!key3);
di();
}
}
}
if(n==6) //调闹铃秒
{
if(key2==0)
{
delayms(10);
if(key2==0)
{
numt++;
if(numt==60)
numt=0;
while(!key2);
di();
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
numt--;
if(numt==-1)
numt=59;
while(!key3);
di();
}
}
}
if(n==7) //调秒表
{
if(a==0){TR1=0;z=0;x=0;y=0;a=1;} //因为当开启闹铃模式时,定时器已经开启一段时间当按下key1时,a=0;定时器从新至0
if(!key2){delayms(10);while(!key2);TR1=~TR1;} //TR1=~TR1;以为按下key2件可切换定时器的开启和停止,从而实现开始和停止
if(!key3){delayms(10);while(!key3);a=0;x=0;y=0;z=0;} //归零
}
}
void display(uchar s,uchar f,uchar m)
{
if(b<25&&(n==1||n==4))
{
wela=1;
P0=0xff;
wela=0;
delayms(2);
}
else
{
wela=1;
P0=table1[0];
wela=0;
//P0=0xff;
dula=1;
P0=table[s/10];
dula=0;
delayms(2);
wela=1;
P0=table1[1];
wela=0;
P0=0xff;
dula=1;
P0=table[s%10];
dula=0;
delayms(2);
}
wela=1;
P0=table1[2];
wela=0;
dula=1;
P0=0x40;
dula=0;
delayms(2);
if(b<25&&(n==2||n==5))
{
wela=1;
P0=0xff;
wela=0;
delayms(2);
}
else
{
wela=1;
P0=table1[3];
wela=0;
//P0=0xff;
dula=1;
P0=table[f/10];
dula=0;
delayms(2);
wela=1;
P0=table1[4];
wela=0;
//P0=0xff;
dula=1;
P0=table[f%10];
dula=0;
delayms(2);
}
wela=1;
P0=table1[5];
wela=0;
//P0=0xff;
dula=1;
P0=0x40;
dula=0;
delayms(2);
if(b<25&&(n==3||n==6))
{
wela=1;
P0=0xff;
wela=0;
delayms(2);
}
else
{
wela=1;
P0=table1[6];
wela=0;
P0=0xff;
dula=1;
P0=table[m/10];
dula=0;
delayms(2);
wela=1;
P0=table1[7];
wela=0;
P0=0xff;
dula=1;
P0=table[m%10];
dula=0;
delayms(2);
}
}
void display1(uchar x,uchar y,uchar z)
{
wela=1;
P0=table1[0];
wela=0;
dula=1;
P0=table[x/10];
dula=0;
delayms(2);
wela=1;
P0=table1[1];
wela=0;
delayms(2);
P0=0xff;
dula=1;
P0=table[x%10];
dula=0;
delayms(2);
wela=1;
P0=table1[2];
wela=0;
P0=0xff;
dula=1;
P0=0x40;
dula=0;
delayms(2);
wela=1;
P0=table1[3];
wela=0;
dula=1;
P0=table[y/10];
dula=0;
delayms(2);
wela=1;
P0=table1[4];
wela=0;
//P0=0xff;
dula=1;
P0=table[y%10];
dula=0;
delayms(2);
wela=1;
P0=table1[5];
wela=0;
P0=0xff;
dula=1;
P0=0x40;
dula=0;
delayms(2);
wela=1;
P0=table1[6];
wela=0;
P0=0xff;
dula=1;
P0=table[z/10];
dula=0;
delayms(2);
wela=1;
P0=table1[7];
wela=0;
// P0=0xff;
dula=1;
P0=table[z%10];
dula=0;
delayms(2);
}
void init()
{
//IE=0x8a;//开总中断
TMOD=0x11;//选择工作方式1
TH0=(65536-50000)/256;// 赋初值 50毫秒
TL0=(65536-50000)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;
ET0=1;//定时器零中断允许
TR0=1;//开定时器零
ET1=1; //定时器一中断允许
TR1=1; //开定时器一
flag=0;
}
main()
{
init();
while(1)
{
keyscan(); //独立按键
/*******调闹铃当时间和设定时间相等时蜂鸣器响起,当按下任意一键,暂停闹铃。********/
if(!flag)
{
if(shi==shit&&fen==fent) //开闹铃
{
di();
if(!key1||!key2||!key3)flag=1;
}
}
/**************************************************/
if(shi!=shit||fen!=fent) flag=0;
if(n==0||n==1||n==2||n==3)//显示时钟
display(shi,fen,num);
if(n==4||n==5||n==6)
display(shit,fent,numt);//显示闹铃
if(n>=7)
display1(x,y,z); //显示秒表
}
}
void T0_time()interrupt 1 //中断计时0时钟
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num2++;
if(num2==20)
{
num2=0;
num++;
if(num==60)
{
num=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
}
void T1_time()interrupt 3//中断1计时秒表 和 闪烁程序
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
if(n==7) //秒表程序
{
z++;
if(z==100)
{
z=0;
y++;
if(y==60)
{
y=0;
x++;
if(x==60)
x=0;
}
}
}
else //闪烁程序
{
b++;
if(b==50)
b=0;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1