微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 一个闹钟的单片机程序

一个闹钟的单片机程序

时间:08-13 来源:互联网 点击:

一个闹钟的单片机程序。

其中蜂鸣器接P37,我的单片机数码管是四位共阳数码管,接P0和P2,K1接P14,K2接P15,K3接P16,K4接P17。晶振采用12MHz。STC89C52

代码如下:

//File: Clock.c
#include REGX52.H>
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;atime;a++)
for(b=0;b120;b++);
}

//用于显示时间
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 ;i100 ;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();
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top