一个闹钟的单片机程序。
其中蜂鸣器接P37,我的单片机数码管是四位共阳数码管,接P0和P2,K1接P14,K2接P15,K3接P16,K4接P17。晶振采用12MHz。STC89C52
代码如下:
//File: Clock.c
#include
const unsigned char LED7Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned int hour,minute,second,cHour,cMinute;
bit isClick = 0;
unsigned char modify =0x00;//是否处于时间编辑状态
bit isClock =0;//是否开启闹钟
unsigned char timercount;
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
timercount++;
if(timercount==20)
{
timercount=0;
second++;
if(second==60)
{
minute++;
second=0;
}
if(minute==60)
{
hour++;
minute=0;
}
if(hour==24)
{
hour=0;
}
}
}
//延迟
void Delay(unsigned int time)
{
unsigned char a,b;
for(a=0;a
//用于显示时间
void ShowTime(void)
{
unsigned int a,b, tempH,tempM;
unsigned char showChar;
if(modify==0x00 || modify ==0x01 || modify ==0x02)
{
tempH=hour;
tempM=minute;
}
else
{
tempH=cHour;
tempM=cMinute;
}
if(modify==0x00 || modify ==0x01 || modify ==0x03)
{
//显示第4个数码管
P0=0xFF;
P2=0xFF;
a=tempH/10;
showChar=LED7Code[a];
P0=showChar;
P2_3=0x00;
Delay(1);//延迟很短
//显示第3个数码管
P0=0xFF;
P2=0xFF;
b=tempH%10;
showChar=LED7Code[b];
P2_2=0x00;
P0=showChar;
Delay(1);//延迟很短
}
if(modify==0x00 || modify ==0x02 || modify ==0x04)
{
//显示第2个数码管
P0=0xFF;
P2=0xFF;
a=tempM/10;
showChar=LED7Code[a];
P0=showChar;
P2_1=0x00;
Delay(1);//延迟很短
//显示第1个数码管
P0=0xFF;
P2=0xFF;
b=tempM%10;
showChar=LED7Code[b];
P2_0=0x00;
P0=showChar;
Delay(1);//延迟很短
}
}
//蜂鸣器响
void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
Delay(100) ;
P3_7=!P3_7 ; //Beep取反
}
P3_7=1 ; //关闭蜂鸣器
Delay(100);
}
void main(void)
{
unsigned int i;
hour=12;
minute=30;
second=0;
cHour=7;
cMinute=0;
TMOD=0x01;
ET0=0x01;//定时器T0可以中断
EA=0x01;//表示允许所有的中断
TR0=0x01;//开始T0计时
while(1)
{
if(P1_4==0x00)//按下了K1键,增加小时或分钟
{
if(!isClick)
{
switch(modify)
{
case 0x01://调整小时
hour++;
if(hour==24)
hour=0;
break;
case 0x02://调整分钟
minute++;
if(minute==60)
minute=0;
break;
case 0x03://调整闹钟的小时
cHour++;
if(cHour==24)
cHour=0;
break;
case 0x04://调整闹钟的分钟
cMinute++;
if(cMinute==60)
cMinute=0;
break;
default:
break;
}
isClick=1;
}
}
else if(P1_5==0x00)//按下了K2键,减少小时或分钟
{
if(!isClick)
{
switch(modify)
{
case 0x01://调整时间的小时
if(hour==0)
hour=23;
else
hour--;
break;
case 0x02://调整时间的分钟
if(minute==0)
minute=59;
else
minute--;
break;
case 0x03://调整闹钟的小时
if(cHour==0)
cHour=23;
else
cHour--;
break;
case 0x04://调整闹钟的分钟
if(cMinute==0)
cMinute=59;
else
cMinute--;
break;
default:
break;
}
isClick=1;
}
}
else if(P1_6==0x00)//按下了K3键,更改模式,第一次修改小时,第二次修改分钟,第三次恢复
{
if(!isClick)
{
switch(modify)
{
case 0x00://不是修改状态,调整小时
modify=0x01;
break;
case 0x01://调整分钟
modify=0x02;
break;
case 0x02://调整闹钟的小时
modify=0x03;
break;
case 0x03://调整闹钟的分钟
modify=0x04;
break;
case 0x04://不修改
modify=0x00;
break;
default:
break;
}
isClick=1;
}
}
else if(P1_7==0x00)//按下了K4键,开启或关闭闹钟
{
if(!isClick)
{
isClock=~isClock;
isClick=1;
}
}
else
isClick=0;
//闹钟是否响了
if(isClock)
{
if(hour==cHour && minute == cMinute)
{
Beep();//响
}
}
ShowTime();
}
}
上一篇:51单片机:8x8点阵显示心形图案
下一篇:基于stc89c52rc单片机的数字钟设计程序
推荐阅读最新更新时间:2024-03-16 13:05
设计资源 培训 开发板 精华推荐
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况