一个闹钟的单片机程序

AI助手已提取文章相关产品:

一个闹钟的单片机程序。

其中蜂鸣器接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;a<time;a++)
for(b=0;b<120;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 ;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();
}
}




您可能感兴趣的与本文相关内容

<think>好的,我现在需要帮助用户找到51单片机实现数字闹钟程序代码。首先,我得回忆一下用户提供的引用内容,看看有没有相关的代码示例。引用1提到了初始化单片机、设置时钟信号、显示时间和闹钟功能,还提到有代码示例,但具体内容没有展开。引用3和4也涉及闹钟功能的实现,特别是引用3提到了使用Arduino开发板和RTC模块,而用户问的是51单片机,可能需要调整。引用4有一个Time.h的头文件示例,但代码不完整。用户需要的是具体的程序代码示例,所以我要综合这些引用中的信息,构建一个基于51单片机的数字闹钟代码。可能需要包括定时器初始化、按键处理、时间显示、闹钟设置和蜂鸣器控制等部分。同时,要确保代码符合51单片机的架构,比如使用定时器0或1,可能涉及中断服务程序。接下来,我需要考虑代码的结构。通常,51单片机程序会包括头文件、宏定义、全局变量声明、函数声明、主函数、中断服务程序和功能函数。例如,初始化定时器、LCD显示、按键扫描、时间调整、闹钟判断等模块。需要注意的地方包括定时器的配置,比如使用12MHz晶振时,定时器的工作模式设置,如何计算定时中断的时间间隔。另外,按键消抖处理、LCD1602的驱动代码、蜂鸣器的控制引脚也需要正确配置。 可能还需要引用用户提到的资料,比如引用1中的初始化步骤和代码示例,引用4中的头文件结构。但需要确保代码的正确性,比如中断号是否正确,函数调用是否合理。最后,生成的代码应该是用户可以直接参考或修改的,同时要提醒用户根据实际硬件连接调整引脚定义,比如LCD的数据端口、控制引脚,按键和蜂鸣器的连接方式。此外,可能需要解释代码的关键部分,帮助用户理解如何实现各功能模块。</think>基于51单片机的数字闹钟程序需要整合定时器控制、LCD显示、按键输入和蜂鸣器驱动等模块。以下是代码实现框架及关键功能说明: ### 一、核心代码框架 ```c #include <reg52.h> #include <intrins.h> // 硬件定义 #define LCD_DB P0 // LCD数据总线 sbit RS = P2^0; // LCD寄存器选择 sbit RW = P2^1; // LCD读写控制 sbit EN = P2^2; // LCD使能端 sbit BUZZER = P3^7; // 蜂鸣器控制 sbit KEY_SET = P1^0;// 设置键 sbit KEY_ADD = P1^1;// 加键 sbit KEY_SUB = P1^2;// 减键 // 全局变量 struct Time { uint8 hour; uint8 minute; uint8 second; } current, alarm; bit alarm_flag = 0; // 闹钟触发标志 // 函数声明 void Timer0_Init(); void LCD_Init(); void LCD_Write_String(uint8 x, uint8 y, char *str); void Key_Process(); void Time_Update(); void Alarm_Check(); ``` ### 二、定时器初始化(1ms中断) ```c void Timer0_Init() { TMOD |= 0x01; // 定时器0模式1 TH0 = 0xFC; // 1ms定时(12MHz晶振) TL0 = 0x18; ET0 = 1; // 允许定时器0中断 EA = 1; // 开总中断 TR0 = 1; // 启动定时器 } void Timer0_ISR() interrupt 1 { static uint16 ms_count = 0; TH0 = 0xFC; // 重装初值 TL0 = 0x18; if(++ms_count >= 1000) { Time_Update(); ms_count = 0; } } ``` ### 三、时间显示与更新 ```c void Time_Update() { current.second++; if(current.second >= 60) { current.second = 0; current.minute++; if(current.minute >= 60) { current.minute = 0; current.hour++; if(current.hour >= 24) { current.hour = 0; } } } // 更新LCD显示 char time_str[9]; sprintf(time_str, "%02d:%02d:%02d", current.hour, current.minute, current.second); LCD_Write_String(0, 1, time_str); } ``` ### 四、闹钟检测与触发 ```c void Alarm_Check() { if(current.hour == alarm.hour && current.minute == alarm.minute && current.second == 0) { alarm_flag = 1; BUZZER = 1; // 触发蜂鸣器 } if(alarm_flag && KEY_SET) { // 任意键关闭闹铃 alarm_flag = 0; BUZZER = 0; } } ``` ### 五、按键处理逻辑 ```c void Key_Process() { static bit key_lock = 0; if(!KEY_SET && !key_lock) { key_lock = 1; // 进入设置模式 uint8 set_mode = 0; while(1) { if(!KEY_ADD) { switch(set_mode) { case 0: alarm.hour++; break; case 1: alarm.minute++; break; } } if(!KEY_SUB) { switch(set_mode) { case 0: alarm.hour--; break; case 1: alarm.minute--; break; } } if(!KEY_SET) { if(++set_mode > 1) break; } // 显示闹钟设置值 char alarm_str[6]; sprintf(alarm_str, "%02d:%02d", alarm.hour, alarm.minute); LCD_Write_String(0, 0, "Alarm:"); LCD_Write_String(6, 0, alarm_str); } key_lock = 0; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值