摘 要
本课程设计是基于51单片机的日历时钟设计。作为嵌入式系统中常用的控制器,单片机在各种电子设备和系统中广泛应用。日历时钟作为一个常见的功能模块,在现代生活中具有重要意义。因此,设计一个基于51单片机的日历时钟,不仅有助于我们掌握单片机编程技术和时钟模块的应用,还能培养我们的实践经验、综合应用技术、硬件和软件协同设计,以及系统性能优化的能力。通过综合运用单片机编程、时钟模块连接、数字显示和按键输入等技术,学生将学习实际应用中的时钟系统设计方法,了解时间管理和日期计算等基本概念,提高他们的实用能力。同时,我们还需要考虑时钟的精度和稳定性,学习时钟模块的特性的校准方法,以提高时钟的准确性和稳定性。
关键字:单片机;时钟控制
目 录
一.绪 论
嵌入式系统是现代科技领域的重要组成部分,而单片机作为嵌入式系统中常用的控制器,具有广泛的应用前景。在单片机的学习和应用过程中,课程设计扮演着至关重要的角色。
随着科技的不断进步,日历时钟作为一种常见的功能模块,已经渗透到我们日常生活的方方面面。它不仅能提供精确的时间和日期信息,还能在各种电子设备和系统中作为时间基准和时间管理工具。因此,通过设计一个基于51单片机的日历时钟,可以为我们提供一个贴近实际应用的项目,使他们能够综合运用所学的单片机编程技术,掌握时钟模块的使用方法,并了解时间管理和日期计算等基本概念。
1.1 背景及其意义
单片机是嵌入式系统设计中常用的控制器,广泛应用于各种电子设备和系统中。而日历时钟是一种常见的功能模块,在很多电子设备和系统中都有应用,例如计算机、手机、手表等。因此,设计一个基于51单片机的日历时钟作为课程设计,有助于学生综合运用单片机编程技术和时钟模块,提高他们的嵌入式系统设计能力。
日历时钟是现代生活中不可或缺的功能之一。通过设计一个基于51单片机的日历时钟,学生可以掌握实际应用中的时钟系统设计方法,了解时间管理和日期计算等基本概念,提高他们的实用能力。日历时钟设计需要学生综合运用多种技术,包括单片机编程、时钟模块的使用、数字显示和按键输入等。通过这个课程设计,学生将获得实践经验,培养综合应用技术的能力,提高问题解决和创新能力。硬件和软件协同设计:日历时钟设计涉及到硬件电路和软件编程的结合。学生需要学习如何连接时钟模块和单片机,了解硬件电路的设计和调试方法。同时,他们还需要编写单片机的软件程序,实现时钟的功能。这将培养学生在硬件和软件之间协同设计和调试的能力。通过设计一个基于51单片机的日历时钟,可以综合运用所学知识,提高嵌入式系统设计的能力,并培养实践经验、综合应用技术、硬件和软件协同设计、以及系统性能优化的能力。这对我们今后在工程领域的发展具有积极的意义。
1.2 技术发展现状
现代时钟日历技术正在以惊人的速度发展,以下是一些当前技术发展的方向和趋势:
1. 数字化和智能化:随着数字化和智能化的进步,时钟日历技术正朝着更智能、更便捷的方向发展。传统的机械时钟逐渐被数字时钟和电子时钟所取代,使得时间和日期的显示更加准确和清晰。此外,智能手机、智能手表和智能家居设备等智能设备已经成为人们日常生活中的时钟日历工具,提供更多的功能和个性化选项。
2. 网络和互联互通:网络技术的快速发展使得时钟日历设备能够通过互联网进行时间同步和信息交互。网络时钟协议如NTP(Network Time Protocol)和SNTP(Simple Network Time Protocol)被广泛应用,保证了时钟设备的准确性和一致性。此外,互联互通的时钟日历设备也可以通过无线通信技术(如Wi-Fi、蓝牙等)与其他设备进行数据交换和控制。
3. 自动调整和校准:现代时钟日历技术越来越注重自动调整和校准功能。自动调整可以确保时钟设备始终保持准确的时间和日期,自动校准则可以校正由于环境因素或时钟本身误差引起的偏差。例如,无线网络时钟可以自动与网络时间服务器同步,GPS时钟可以利用卫星信号进行定位和时间校准。
4. 多功能性和定制化:时钟日历设备不再只是简单地显示时间和日期,而是拥有更多的功能和应用。例如,现代智能手机上的时钟应用程序提供闹钟、计时器、世界时钟、日程管理等功能。此外,人们对个性化时钟日历设备的需求也越来越高,例如可定制的时钟表盘、多样化的显示效果和界面设计等。
总的来说,现代时钟日历技术正朝着数字化、智能化、网络化、自动化、多功能化等方向快速发展。这些技术的不断进步为人们提供了更准确、便捷、智能和个性化的时钟日历体验,满足了人们对时间管理和日期显示的需求。随着科技的不断演进,我们可以期待未来时钟日历技术的更多创新和突破。
2.1系统硬件方案的设计
2.1.1主控芯片的选型
选择合适的51单片机型号作为系统的核心处理器。考虑到日历时钟的功能和性能需求,选择具有足够的存储容量和处理能力的单片机,例如AT89C51系列
2.1.2 串口通信模块选择
串口通信模块选择ch340与电脑上位机进行通信
2.1.3时钟模块选型
选择合适的时钟模块来提供准确的时间和日期信息。常见的选择包括石英晶体振荡器(Crystal Oscillator)和实时时钟模块(Real-Time Clock Module),后者通常集成了独立的时钟电路和电池备份。这里选用了DS1302
2.1.4显示模块选型
选择合适的数字显示器来显示时间和日期。常见的选择包括七段LED数码管、LCD液晶显示器等。根据实际需求和成本因素,选择合适的显示器类型和尺寸。这里选择了lcd1602
2.1.5报警模块选型
可以产生光电提醒,这里选择了蜂鸣器和led灯代替
2.2硬件电路的设计
硬件的系统供电采用了常见的type-c供电,兼容性比较高,有led灯作为电源指示,采用常见的CH340芯片进行电平转换,与电脑串口进行通信。
蜂鸣器采用了常见设计,三极管起开关作用,其基极的高电平使三极管饱和导通,使蜂鸣器发声;而基极低电平则使三极管关闭,蜂鸣器停止发声,其并联led,使蜂鸣器想时led也亮,
单片机的复位电路是为了在特定条件下将单片机恢复到初始状态或特定状态的电路设计。复位触发电路将复位源的信号进行逻辑处理,产生复位信号以触发单片机的复位操作。触发电路通常包括门电路、反相器或RC电路等。门电路可以根据不同的复位源信号和触发条件进行逻辑门电平的组合,以产生有效的复位信号。反相器可以将复位源信号进行反相,从而产生复位信号。RC电路则通过电阻和电容的组合来延时产生复位信号,以确保系统稳定后再进行复位。
复位电路设计的目的是确保单片机在复位时能够可靠地恢复到初始状态或特定状态。复位电路需要根据具体的应用需求和单片机型号进行设计。正确设计的复位电路可以确保系统在异常情况下恢复到可控的状态,提高系统的可靠性和稳定性。
单片机的P1.1到P1.4口外接按键,按键低电平有效,可以用外部案件对单片机进行设置。
51单片机晶振电路主要由石英晶体、负载电容和电阻组成。石英晶体的两端连接到单片机的X1和X2引脚上,负载电容分别连接到晶体的两端,并与单片机的GND引脚相连。此外,为了稳定振荡信号,还需要通过一个适当的电阻连接到单片机的RESET引脚,形成晶振复位电路。
振荡器的启动过程:在启动时,51单片机会提供一个初始的电平信号给晶体振荡器。这个信号被传递到晶体上,导致晶体开始振荡。晶体的振荡频率由晶体的结构和尺寸决定,通常为4MHz、8MHz等。当振荡开始后,晶体振荡器将产生一个稳定的时钟信号,并通过X1和X2引脚提供给51单片机,PCB布线时晶振外围有铺铜,减少信号干扰。
3.1软件方案总体设计
{
DISPLAYDATA,MODIFYDATA,SETALARMCLOCK,NONE,ALARMCLOCK
}mode;
enum Alarmswitch //闹钟开关
{
OFF,ON
}
alarmswitch;
/*********延时函数***********/
void delay(unsigned int t) //短延时
{
while(t--);
}
void delay_ms(unsigned int t) //毫秒延时
{
unsigned int a,b;
for(a=0;a<t;a++)
for(b=0;b<120;b++);
}
/**************************串口**************************/
void uart() interrupt 4 //串口通信中断函数
{
int a;
a=SBUF; //存储接收到的数据
RI = 0; //清除接收中断标志位
SBUF=a; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
if (a == '1')
{
flag1 = 0;
mode+= 1;
if(mode == 3) mode = DISPLAYDATA;
} else if (a == '2') {
beep = !beep;
flag2 = 0;
} else if (a == '3') {
flag3 = 0;
} else if (a == '4') {
alarmswitch=!alarmswitch;
flag4 = 0;
}
}
void display_data(void)
{
LcdWriteCom(0x80);
LcdWritestr("20");
LcdWriteData(TIME[6]/16+0x30); //年
LcdWriteData(TIME[6]%16+0x30);
LcdWriteData('-');
LcdWriteData(TIME[4]/16+0x30); //月
LcdWriteData(TIME[4]%16+0x30);
LcdWriteData('-');
LcdWriteData(TIME[3]/16+0x30); //日
LcdWriteData(TIME[3]%16+0x30);
LcdWritestr(" ");
switch(TIME[5]) //显示星期
{
case 0:LcdWritestr("Mon"); break;
case 1:LcdWritestr("Tue"); break;
case 2:LcdWritestr("Wed"); break;
case 3:LcdWritestr("Thu"); break;
case 4:LcdWritestr("Fri"); break;
case 5:LcdWritestr("Sat"); break;
case 6:LcdWritestr("Sun"); break;
}
if(alarmswitch==ON)LcdWriteData('.');
else LcdWriteData(' ');
LcdWriteCom(0xC0);
LcdWriteData(' ');
LcdWriteData(TIME[2]/16+0x30); //时
LcdWriteData(TIME[2]%16+0x30);
LcdWriteData(':');
LcdWriteData(TIME[1]/16+0x30); //分
LcdWriteData(TIME[1]%16+0x30);
LcdWriteData(':');
LcdWriteData(TIME[0]/16+0x30); //秒
LcdWriteData(TIME[0]%16+0x30);
LcdWritestr(" ");
}
/*******************************************************************************
用标志位控制日历模式的切换,闹钟的开启与设定。
*******************************************************************************/
void uartcontrol() //初始页面按键检测
{
if(flag1==0) //切换模式
{
mode+= 1;
if(mode >= 3) mode = 0;
flag1 = 1;
}
else if(flag2 == 0) //蜂鸣器测试
{
beep = !beep;
flag2 = 1;
}
else if(flag3 == 0) //背光灯测试
{
flag3 = 1;
}
else if(flag4 == 0) //背光灯测试
{
alarmswitch=!alarmswitch;
flag4 = 1;
}
}
1. 初始化部分:程序开始时,对LCD、UART以及相关的外部存储器进行初始化设置。
2. 主循环部分:通过不断循环执行主循环,实现不同模式的切换和功能实现。
3. 时间显示模式(DISPLAYDATA):在该模式下,使用DS1302实时时钟芯片读取当前时间,并通过LCD显示出来。如果闹钟开启并且闹钟时间与当前时间匹配,则切换到闹钟模式。同时,通过串口接收来自电脑的命令,根据接收到的命令控制不同的功能。
4. 时间修改模式(MODIFYDATA):在该模式下,通过标志位选择要修改的时间参数,然后通过按键控制增加或减少时间值,并通过串口通信与电脑进行交互。
5. 设置闹钟模式(SETALARMCLOCK):在该模式下,通过串口通信标志位选择要修改的闹钟参数,然后通过标志位控制增加或减少闹钟时间,并通过串口通信与电脑进行交互。
6. 闹钟模式(ALARMCLOCK):在该模式下,判断闹钟是否开启以及闹钟时间是否与当前时间匹配,如果匹配则触发闹钟,并进行相应的提示。
整体设计思路是通过不断循环执行主循环,根据不同的模式和标志位,来实现时间显示、修改、闹钟设置和闹钟功能等不同的操作。通过与电脑的串口通信,实现与电脑的交互控制,从而实现日历时钟的功能。
3.2主程序设计
用电脑向单片机发送1,可以得到标志位1,标志位1可以切换模式,在日历跟闹钟之间切换
用电脑向单片机发送2,可以得到标志位2,标志位2可以控制选择,闹钟开关,具体时间的选择
用电脑向单片机发送3,可以得到标志位3,标志位3可以控制数据加
用电脑向单片机发送4,可以得到标志位4,标志位4可以控制数据减
我获得以下收获:
1. 熟悉51单片机的基本编程和硬件操作:通过阅读和理解代码,可以了解到51单片机的基本编程方法,如引脚控制、定时器设置、中断处理等,以及相关外设的使用,如LCD显示、串口通信、实时时钟芯片等。
2. 理解嵌入式系统的模块化设计思想:以上代码将整个系统功能划分为不同的模块,每个模块负责特定的功能,通过模块间的切换和交互实现整体功能。这种模块化的设计思想使得系统结构清晰,易于维护和扩展。
3. 掌握串口通信的基本原理和应用:代码中使用串口通信与电脑进行交互控制,通过发送和接收数据实现命令的传输和状态的更新。理解串口通信的工作原理和协议,对于嵌入式系统与外部设备或上位机之间的数据交互具有重要意义。
4. 学习使用外部存储器进行数据存储:通过代码中对EEPROM的读写操作,可以了解到在嵌入式系统中使用外部存储器进行数据存储和持久化的方法,从而实现数据的保存和读取。
5. 综合运用多个外设实现复杂功能:以上代码中涉及到LCD显示、实时时钟芯片、蜂鸣器、按键等多个外设的使用,通过合理地运用这些外设,可以实现复杂的功能,如时间显示、时间修改、闹钟设置等。
通过以上收获,可以对嵌入式系统的设计和编程有更深入的理解,并能够运用所学知识进行项目开发和应用实践。
致 谢
在我完成这个单片机日历时钟的课程设计过程中,感谢老师对我学习的悉心教导。您以深厚的专业知识和丰富的经验,引导我逐步理解并掌握了51单片机的编程原理和应用技巧。您耐心而细致的讲解,让我对嵌入式系统的设计有了更清晰的认识,并能够独立思考和解决问题。我不仅学到了专业知识,更培养了批判思维、自主学习和团队合作的能力。这些都是我未来发展所必备的素质,我将铭记于心,时刻保持学习的态度和精神。
附 录
元件清单:
51单片机开发板,电脑,lcd1602,数据线
代码跟pcb开源:石乐志/单片机原理与应用课设