单片机电子钟程序
/*按键中
s17对应P10,用于分钟加一,记得要判断按键是否释放即while(!key1)
s18对应P11,用于小时加一,记得要判断按键是否释放即while(!key2)
s19对应P12,校准分钟,减
s20对应P13,校准小时,减*/
#include
#define uchar unsigned char #define uint unsigned int void delayms(uint);
void display(uchar,uchar); void keyscan();
uchar code table[]={
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0xBF,/*9横杠*/
};
uchar num,num1,num2,num3,shi,ge,hour1,min1,hour2,min2;
sbit led1=P0^0;
sbit wei6=P3^3;
sbit wei5=P2^4;
sbit wei4=P2^3;
sbit wei3=P2^2;
sbit wei2=P2^1;
sbit wei1=P2^0;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
void main()
{
TMOD=0x11;//设置定时器0和1工作方式1(0001 0001)
TH0=(65536-46000)/256;//装初值
TL0=(65536-46000)%256;//装初值
EA=1;//开总中断
ET0=1;//开启定时器0中断
TR0=1;//启动定时器0
// P2=0;
// P3=0;
while(1)
{
keyscan();
display(shi,ge);
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan() {
if(key4==0)
{
delayms(10);
if(key4==0)
{
if(num3==0)
{
num3=24;//在C中给寄存器赋值这样也是可以的。直接给出十进制也能识
别
}
num3--;//校准小时,减
while(!key4);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
if(num2==0)
{
num2=60;
}
num2--;//校准分钟,减
while(!key3);
}
}
if(key2==0)
{
delayms(10);//消斗
if(key2==0)
{
num3++;//校准小时,加
while(!key2);//等待按键释放
if(num3==24)
{
num3=0;
}
}
}
if(key1==0)
{
delayms(10);//消斗
if(key1==0)
{
num2++;//校准分钟,加
while(!key1);//等待按键释放
if(num2==60)
{
num2=0;
}
}
}
}
void display(uchar shi,uchar ge)
{
min2=num2/10;//求分钟的十位,并送入min2,分离个位和十位的程序
min1=num2%10;//求分钟的个位,并送入min1
hour2=num3/10;//求小时的十位,并送入hour2
hour1=num3%10;//求小时的个位,并送入hour1
P0=table[shi];//显示秒十位
wei2=1; //送位选
delayms(4); //延时
wei2=0; //在送位选数据前先关闭前一位显示,一方干扰下一位的显示
P0=table[ge]; //显示秒个位
wei1=1;
delayms(4);
wei1=0;
P0=table[min1]&0x7F; //显示分个位
wei3=1;
delayms(4);
wei3=0;
P0=table[min2]; //显示分十位
wei4=1;
delayms(4);
wei4=0;
P0=table[hour1]&0x7F; //显示小时个位
wei5=1;
delayms(4);
wei5=0;
P0=table[hour2]; //显示小时十位
wei6=1;
delayms(4);
wei6=0;
}
void T0_time()interrupt 1
{
TH0=(65536-46000)/256;//重装初值
TL0=(65536-46000)%256;//重装初值
num++;
if(num==20)
{
num=0;
num1++;
shi=num1/10;
ge=num1%10;
if(num1==60)//是否到60秒
{
num1=0;//到60秒后清零
num2++;//分钟加一
/*min2=num2/10;//求分钟的十位,并送入min2
min1=num2%10;//求分钟的个位,并送入min1*/
if(num2==60)//是否到60分
{
num2=0;//到60分后清零
num3++;//小时加一
/*hour2=num3/10;//求小时的十位,并送入hour2
hour1=num3%10;//求小时的个位,并送入hour1*/
if(num3==24)
{
num3=0;
}
}
}
}
}
本文档为【单片机电子钟程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。