单片机课程设计实验报告+基于单片机的数字时钟+含完整实验代码

合集下载

基于单片机的数字钟毕业设计(附程序全)

基于单片机的数字钟毕业设计(附程序全)

基于单片机的数字钟毕业设计(附程序全) 电子时钟设计随着现代人类生活节奏的加快,人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。

对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。

数码管显示的时间简单明了而且读数快、时间准确性更高~数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。

数字钟的精度、稳定度远远超过老式机械钟。

在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,并且由单片机的定时器计数。

在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。

数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。

关键词:数字钟;单片机;数码管;时间;准确性1目录第一章绪论1. 数字电子钟的意义和应用…………………………………………………………………… 3 第二章整体设计方案2.1 单片机的选择…………………………………………………………………………… 3 2.2 单片机的基本结构……………………………………………………………………… 5 第三章数字钟的硬件设计3.1 最小系统设计…………………………………………………………………………… 9 3.2 LED显示电路…………………………………………………………………………… 12 3.3 键盘控制电路…………………………………………………………………………… 14 第四章数字钟的软件设计4.1 系统软件设计流程图…………………………………………………………………… 15 4.2 数字电子钟的原理图…………………………………………………………………… 18 4.3 主程序…………………………………………………………………………………… 19 4.4 时钟设置子程序………………………………………………………………………… 20 4.5 定时器中断子程序……………………………………………………………………… 20 4.6 LED显示子程序………………………………………………………………………… 21 4.7 按键控制子程序………………………………………………………………………… 23 第五章系统仿真5.1 PROTUES软件介绍................................................................................. 24 5.2 电子钟系统PROTUES仿真........................................................................ 24 结束语. (2)5 参考文献 (26)2第一章绪论1.数字电子钟的意义和应用数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。

单片机数字时钟实验报告

单片机数字时钟实验报告

数字时钟实验报告一、实验目的:通过实验进一步深刻理解单片机最小系统的工作原理。

着重掌握中断和定时器的使用,以及读键盘和LED显示程序的设计(具体设计在后面会涉及到)。

培养动手能力。

二、实验内容:使用单片机最小系统设计一个12小时制自动报时的数字时钟。

三、功能描述:★使用低六位数码管显示时、分、秒、使用第七位表示上午和下午。

符号A表示上午;符号P表示下午。

★通过按键分别调整小时位和分钟位。

★到达整点时以第八位数码管闪烁的方式报时,使用8作为显示内容。

★考虑整点报时功能。

四、设计整体思路以及个别重点部分的具体实现方式:下面这幅图展示主函数的流程下面描述的是调用T0中断时所进行的动作显示更新的函数具体见下面这幅图我们还一个对键盘进行扫描以获得有效键盘值,其具体的实现见下面这幅图● 要实现时钟的运行和时间的调整,我的设计思路是这样的:由于T0中断的时间间隔是4ms,那么我可以设置一个计数器i,在每次进入中断时进行加一调整,当i计满面250时就将时钟我秒的低位加一。

然后根据进位规则,对其后的各位依次进行调整。

●要实现整点报时功能,则可以根据时位是否为0判断是否要闪烁显示字符8。

至于闪烁的具体实现方式,见源程序。

至此,本实验的设计思路己基本介绍完毕。

下面就是本次实验的源程序代码。

/*********************************************************//** 数字时钟程序**//** **//*********************************************************/#include <absacc.h>#include <reg51.h>#define uchar unsigned char#define uint8 unsigned char#define uint16 unsigned int#define LED1 XBYTE [0xA000] //数码管地址#define LED2 XBYTE [0xA001]#define LED3 XBYTE [0xA002]#define LED4 XBYTE [0xA003]#define LED5 XBYTE [0xA004]#define LED6 XBYTE [0xA005]#define LED7 XBYTE [0xA006]#define LED8 XBYTE [0xA007]#define KEY XBYTE [0xA100] //键盘地址bit ap=0;//上下午int i=0;//计数器uchar data clock[7]={0,0,0,0,0,0,0};/*扫描键盘使用的变量 */sbit first_row = P1^4; //键盘第一行控制sbit second_row = P1^3; //键盘第二行控制bit first_getkey = 0,control_readkey = 0; //读键盘过程中的标志位bit getkey = 0; //获得有效键值标志位等于1时代表得到一个有效键值bit keyon = 0; //防止按键冲突标志位uchar keynum = 0; //获得的有效按键值寄存器/*数码管显示使用的变量和常量*/uchar lednum = 0; //数码管显示位控制寄存器uchar led[8] = {0,0,0,0,0,0,0,0}; //数码管显示内容寄存器uchar code segtab[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff}; //七段码段码表// "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D","E", "F", "P" ,"black"void leddisp(void); //数码管显示函数void readkey(void); //读键盘函数void intT0() interrupt 1 //T0 定时中断处理函数{TH0 = -2720/256; //定时器中断时间间隔 4msTL0 = -2720%256;if((clock[2]==0)&&(clock[3]==0)&&(i==125)&&(clock[5]<=5)&&(clock[4]==0))led[7]=17;if((clock[2]==0)&&(clock[3]==0)&&(i==0)&&(clock[5]<=5)&&(clock[4]==0))led[7]=8;i=i+1;if(i==250){if((clock[2]==0)&&(clock[3]==0)&&(clock[4]==0)&&(clock[5]==0)&&(clock[6]==0)){ap=!ap;if(ap==0)led[6]=10;if(ap==1)led[6]=16;}clock[5]=clock[5]+1;i=0;}if(clock[5]==10){clock[5]=0;clock[4]=clock[4]+1;}if(clock[4]==6){clock[4]=0;clock[3]=clock[3]+1;}if(clock[3]==10){clock[3]=0;clock[2]=clock[2]+1;}if(clock[2]==6){clock[2]=0;clock[6]=clock[6]+1;}if(clock[6]==12){clock[6]=0;}clock[0]=clock[6]/10;clock[1]=clock[6]%10;led[5]=clock[0];led[4]=clock[1];led[3]=clock[2];led[2]=clock[3];led[1]=clock[4];led[0]=clock[5];leddisp(); //每次定时中断显示更新一次if(control_readkey == 1) //每两次定时中断扫描一次键盘{readkey();}c ontrol_readkey = !control_readkey;}void main(void){TMOD = 0x01; //TH0 = -2720/256; //定时器中断时间间隔 4msTL0 = -2720%256;TCON = 0x10;ET0 = 1;EA = 1;while(1){if(getkey == 1) //判断是否获得有效按键{getkey = 0;switch(keynum) //判断键值,对不同键值采取相应的用户定义处理方式{case 0x01: //当按下第一行第二列键时,分加一clock[3]=clock[3]+1;break;case 0x02: ////当按下第一行的第三列键时,分减一clock[3]=clock[3]-1;break;case 0x03://当按下第一行的第四列时,时加一clock[6]=clock[6]+1;break;case 0x04:clock[6]=clock[6]-1; //当按下第一行的第五列时,时减一break;default:break;}}}}/***************************************************键盘扫描函数原型: void readkey(void);功能: 当获得有效按键时,令getkey=1,keynum为按键值****************************************************/void readkey(void){uchar M_key = 0;second_row = 0;M_key = KEY;if(M_key != 0xff) //如果有连续两次按键按下,认为有有效按键按下。

基于51单片机的数字钟设计

基于51单片机的数字钟设计

基于51单片机的数字钟设计目录1 作品的背景与意义 12 功能指标设计 13 作品方案设计 13.1总体方案的选择 13.1.1方案一:基于单片机的数字钟设计 23.1.1方案二:基于数电实验的数字钟设计 33.1.2两种方案的比较......... (3)3.2控制方案比较 33.3显示方案比较 33.4单片机理论知识介绍 43.4.1单片机型号........ (5)3.4.2硬件电路平台.............. (6)3.4.3内部时钟电路........... . (7)3.4.4复位电路............. . (7)3.4.5按键部分............ (8)4 硬件设计94.1显示模块电路图95 软件设计115.1主程序流程图115.2中断服务以及显示 126 系统测试136.1测试环境136.2测试步骤136.2.1硬件测试6.2.2软件测试1.连接单片机和计算机串接............ ..136.2.3实施过程............. .. (14)6.3测试结果187 实验总结................ . (18)7.1代码编写过程中出现问题........... .. (18)7.2整个实验过程的体会................. . (19)7.3实验误差分析。

19参考文献20附录1 系统电路图21附录2 系统软件代码21附录3 系统器件清单261 作品的背景与意义数字钟是采用数字电路实现对.时,分,秒。

数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 而且大大地扩展了钟表原先的报时功能。

基于单片机的数字钟具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,生活中诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等也可广泛应用,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。

基于单片机设计的数字钟实验报告

基于单片机设计的数字钟实验报告

目录1 前言 (3)2 数字钟设计原理 (3)3 流程图 (4)4 51单片机系统的硬件连接 (4)5 程序设计 (6)5.1主程序5.2中断服务子程序5.3 显示子程序5.4 总的程序清单6 系统调试及结果分析 (12)7 注意事项 (12)8 感想与体会 (13)9 参考文献 (13)一.前言20世纪末,电子技术获得了飞速的发展,在其推动下,具有功能强、体积小、可靠性高、价格低廉的单片机在工业控制、数据采集、智能仪表、机电一体化、家用电器等领域得到了广泛的应用,极大的提高了这些领域的技术水平和自动化程度。

现在生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号,对于那些对时间把握非常严格和准确的人或事来说,时间的不准确性带来不小的麻烦,所以说以数码管显示的时钟比指针式的时钟表现出了很大的优势。

数码管显示的时间简明而且读数快,时间准确显示到秒。

数字钟是采用数字电路对时分秒数字显示的计时装置。

数字钟的精度,稳定性远远超过老式机械钟。

数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受到广大消费者的喜爱。

二.数字钟设计原理数字钟实际是对标准频率计数的电路,由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路,同时标准的时间信号必须做到准确稳定。

通常使用石英晶体振荡电路构成数字钟。

数字钟电子钟由以下几部分组成:按键开关部分,振荡电路部分,89c51单片机控制器,4位数码管显示部分,7407数码管驱动部分。

按键开关振荡电路89C51单片机控制器4位数码管显示7407列驱动三.流程图主程序流程图如图2.3所示,定时器T0中断服务程序流程图如2.4所示。

返回图2.4中断服务程序流程图四.51单片机系统的硬件连接1.硬件电路的设计,硬件电路图如图2.2所示图2.2硬件电路图该电路采用AT89C51单片机最小化应用,采用共阴7段LED数码管显示器,P2.4~P2.7口作为列扫描输出,P0口输出段码数据,P1.2,P1.1口接2个按钮开关,用于调时及功能误差,采用12Mhz晶振,可提高秒计时的精确度。

单片机数字钟实习报告

单片机数字钟实习报告

一、实习目的随着电子技术的飞速发展,单片机作为一种重要的电子元件,在工业、医疗、通讯等领域得到了广泛的应用。

为了更好地掌握单片机的原理和应用,提高动手能力,我们选择了单片机数字钟作为实习项目。

通过本次实习,我们旨在掌握单片机的编程、调试、硬件连接等方面的知识,实现数字时钟的显示与控制。

二、实习内容1. 单片机数字钟硬件设计(1)选用AT89C51单片机作为核心控制单元,具有丰富的片上资源,方便编程和调试。

(2)采用LCD1602液晶显示屏,显示时间、日期等信息。

(3)使用DS1302实时时钟芯片,实现时间的存储和更新。

(4)选用按键作为输入设备,实现时间的调整和设置。

(5)选用蜂鸣器作为报警设备,实现定时报警功能。

2. 单片机数字钟软件设计(1)编写主程序,实现系统初始化、时间显示、按键扫描、时间调整等功能。

(2)编写中断服务程序,实现DS1302时钟芯片的读写、按键消抖等功能。

(3)编写子程序,实现时间的计算、格式化、显示等功能。

3. 单片机数字钟调试与测试(1)连接电路,检查各个模块的连接是否正确。

(2)编写程序,将程序烧录到单片机中。

(3)调试程序,确保程序运行正常。

(4)测试各个功能模块,如时间显示、按键调整、定时报警等。

三、实习过程1. 硬件设计(1)根据设计要求,绘制电路原理图。

(2)购买所需元器件,进行焊接。

(3)组装电路板,连接各个模块。

2. 软件设计(1)编写程序,采用C语言进行编程。

(2)使用Keil软件进行编译、烧录。

(3)在仿真软件Proteus中进行仿真,验证程序的正确性。

3. 调试与测试(1)连接电路,检查各个模块的连接是否正确。

(2)编写程序,将程序烧录到单片机中。

(3)调试程序,确保程序运行正常。

(4)测试各个功能模块,如时间显示、按键调整、定时报警等。

四、实习总结1. 通过本次实习,我们掌握了单片机的编程、调试、硬件连接等方面的知识。

2. 学会了使用LCD1602液晶显示屏、DS1302实时时钟芯片、按键等元器件。

单片机实验报告数字时钟设计报告

单片机实验报告数字时钟设计报告

单片机实验报告数字时钟设计报告一、实验目的本次单片机实验的目的是设计并实现一个基于单片机的数字时钟。

通过该实验,深入了解单片机的工作原理和编程方法,掌握定时器、中断、数码管显示等功能的应用,提高综合运用知识解决实际问题的能力。

二、实验原理1、单片机选择本次实验选用了常见的 51 系列单片机,如 STC89C52。

它具有丰富的资源和易于编程的特点,能够满足数字时钟的设计需求。

2、时钟计时原理数字时钟的核心是准确的计时功能。

通过单片机内部的定时器,设定合适的定时时间间隔,不断累加计时变量,实现秒、分、时的计时。

3、数码管显示原理采用共阳或共阴数码管来显示时间数字。

通过单片机的 I/O 口控制数码管的段选和位选信号,使数码管显示相应的数字。

4、按键控制原理设置按键用于调整时间。

通过检测按键的按下状态,进入相应的时间调整模式。

三、实验设备与材料1、单片机开发板2、数码管3、按键4、杜邦线若干5、电脑及编程软件(如 Keil)四、实验步骤1、硬件连接将数码管、按键与单片机开发板的相应引脚通过杜邦线连接起来。

确保连接正确可靠,避免短路或断路。

2、软件编程(1)初始化单片机的定时器、中断、I/O 口等。

(2)编写定时器中断服务程序,实现秒的计时。

(3)设计计时算法,将秒转换为分、时,并进行进位处理。

(4)编写数码管显示程序,将时间数据转换为数码管的段选和位选信号进行显示。

(5)添加按键检测程序,实现时间的调整功能。

3、编译与下载使用编程软件将编写好的程序编译生成可执行文件,并下载到单片机中进行运行测试。

五、程序设计以下是本次数字时钟设计的主要程序代码片段:```cinclude <reg52h>//定义数码管段选码unsigned char code SEG_CODE ={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//定义数码管位选码unsigned char code BIT_CODE ={0x01, 0x02, 0x04, 0x08, 0x10,0x20, 0x40, 0x80};//定义时间变量unsigned int second = 0, minute = 0, hour = 0;//定时器初始化函数void Timer_Init(){TMOD = 0x01; //定时器 0 工作在方式 1 TH0 =(65536 50000) / 256; //定时 50ms TL0 =(65536 50000) % 256;EA = 1; //开总中断ET0 = 1; //开定时器 0 中断TR0 = 1; //启动定时器 0}//定时器 0 中断服务函数void Timer0_ISR() interrupt 1{TH0 =(65536 50000) / 256;TL0 =(65536 50000) % 256;second++;if (second == 60){second = 0;minute++;if (minute == 60){minute = 0;hour++;if (hour == 24){hour = 0;}}}}//数码管显示函数void Display(){unsigned char i;for (i = 0; i < 8; i++)P2 = BIT_CODEi;if (i == 0){P0 = SEG_CODEhour / 10;}else if (i == 1){P0 = SEG_CODEhour % 10;}else if (i == 2){P0 = 0xBF; //显示“”}else if (i == 3){P0 = SEG_CODEminute / 10;else if (i == 4){P0 = SEG_CODEminute % 10;}else if (i == 5){P0 = 0xBF; //显示“”}else if (i == 6){P0 = SEG_CODEsecond / 10;}else if (i == 7){P0 = SEG_CODEsecond % 10;}delay_ms(1);//适当延时,防止闪烁}}//主函数void main(){Timer_Init();while (1){Display();}}```六、实验结果与分析1、实验结果将程序下载到单片机后,数字时钟能够正常运行,准确显示时、分、秒,并且通过按键可以进行时间的调整。

单片机实验报告数字时钟设计报告

单片机实验报告数字时钟设计报告

单片机实验报告题目:数字时钟的设计指导老师:班级:姓名:学号:一、实验目的通过实践设计出能准确显示时、分、秒的时钟,并可以调时、定时,包括蜂鸣器的整点报时与闹钟功能。

二、实验要求基本功能:准确计时,以数字形式显示时间,24时制;具备时、分调整和整点报时功能。

扩展功能:定时与闹钟功能三、设计方案及论证Ⅰ、硬件部分:1、时钟显示用七段LED数码管来实现,采用共阳管和PNP驱动方式。

PNP工作于开关状态,基极通过1K的电阻连到单片机的P2口。

为节省P口,将六位数码管的8段段选端分别并接并加上470Ω的限流电阻,由P0口控制,给低电平的段会被点亮。

因为六位管的段被并接只能通过动态扫描的方式来显示,即利用管子的余晖和人眼的视觉残留实现六位管子在“同一时间”显示不同的值,而扫描这是靠位选的轮流有效实现。

如左图。

2、整点报时和闹钟铃此部分用一个5V有源蜂鸣器来做,同样用PNP作为开关来控制,此外为防止其可能的方向电压尖峰在蜂鸣器两端反接一个IN4148二极管来保护。

如右图。

3、校时、定时此部分由4个按键控制,如下图,key1和key3用来选定要调校的时、分的位,被选中的为将闪烁;key2用来是选中的为按相应的进制增1变化;key4是进入定时模式,定时的时数改变与调时方法相同。

4、单片机最小系统本实验采用STC89C52RC单片机,指令系统完全与51兼容。

其最小系统包含电源电路、晶振电路、复位电路。

本实验才用STC单片机的典型系统,各模块参数配置如图:其中晶振频率为12MHz,震荡部分电容为30pF的瓷片电容。

复位电路采用图示的兼有上电复位和按键复位功能的方式,其中的电容为10uF电解电容。

5、硬件系统全电路图Ⅱ、软件部分软件部分主要有两大块:一是上电后程序靠定时器T1产生的中断而实现的常规时钟显示,这里面就是要处理时、分、秒的六位数字的循环和进位问题。

按照24时制的规则,其进位逻辑为:秒的个位为十进制(0~9)满10向秒的十位进1,而秒的十位为六进制(0~5)满6向分的个位进1,分与秒相似,时的个位在时的十位为0、1的时候也是10进制,而在时的十位为2的时候则只是0到4就进位了。

基于单片机的数字钟毕业设计(附程序全)

基于单片机的数字钟毕业设计(附程序全)

基于单片机的数字钟毕业设计(附程序全) 电子时钟设计随着现代人类生活节奏的加快,人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。

对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。

数码管显示的时间简单明了而且读数快、时间准确性更高~数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。

数字钟的精度、稳定度远远超过老式机械钟。

在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,并且由单片机的定时器计数。

在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。

数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。

关键词:数字钟;单片机;数码管;时间;准确性1目录第一章绪论1. 数字电子钟的意义和应用…………………………………………………………………… 3 第二章整体设计方案2.1 单片机的选择…………………………………………………………………………… 3 2.2 单片机的基本结构……………………………………………………………………… 5 第三章数字钟的硬件设计3.1 最小系统设计…………………………………………………………………………… 9 3.2 LED显示电路…………………………………………………………………………… 12 3.3 键盘控制电路…………………………………………………………………………… 14 第四章数字钟的软件设计4.1 系统软件设计流程图…………………………………………………………………… 15 4.2 数字电子钟的原理图…………………………………………………………………… 18 4.3 主程序…………………………………………………………………………………… 19 4.4 时钟设置子程序………………………………………………………………………… 20 4.5 定时器中断子程序……………………………………………………………………… 20 4.6 LED显示子程序………………………………………………………………………… 21 4.7 按键控制子程序………………………………………………………………………… 23 第五章系统仿真5.1 PROTUES软件介绍................................................................................. 24 5.2 电子钟系统PROTUES仿真........................................................................ 24 结束语. (2)5 参考文献 (26)2第一章绪论1.数字电子钟的意义和应用数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程设计报告基于单片机的数字时钟姓名:班级:学号:一、前言利用实验板上的4个LED数码管,设计带有闹铃、秒表功能的数字时钟。

功能要求:a)计时并显示(LED)。

由于实验板上只有4位数码管,可设计成显示“时分”和显示“分秒”并可切换。

b)时间调整功能。

利用4个独立按钮,实现时钟调整功能。

这4个按钮的功能为工作模式切换按钮(MODE),数字加(INC),数字减(DEC)和数字移位(SHITF)。

c)定闹功能。

利用4个独立按钮设定闹钟时间,时间到以蜂鸣器响、继电器动作作为闹铃。

d)秒表功能。

最小时间单位0.01秒。

二、硬件原理分析1.电源部分电源部份采用两种输入接口(如上图)。

a)外电源供电,采用2.1电源座,可接入电源DC5V,经单向保护D1接入开关S1。

b)USB供电,USB供电口输入电源也经D1单向保护,送到开关S1。

注:两路电源输入是并连的,因此只选择一路就可以了,以免出问题。

S1为板子工作电源开关,按下后接通电源,提供VCC给板子各功能电路。

电路采用两个滤波电容,给板子一个更加稳定的工作电源。

LED为电源的指示灯,通电后LED灯亮。

2.蜂鸣器蜂鸣器分为有源和无源两种,有源即两引脚有一个直流电源就可以长鸣,无源则需要一个1K左右的脉冲才可以蜂鸣,因此对于按键的提示音及报警蜂鸣使用有源来得方便。

有源也可以当无源使用,而无源则不能当有源使用,当然用有源蜂鸣器作音乐发声会失真厉害。

如上图:单片机P15输出高低电平经R21连接三极管B极,控制三极管的导通与截止,从而控制蜂鸣器的工作。

低电平时三极管导通,蜂鸣器得电蜂鸣,高电平时三极管截止,蜂鸣器失电关闭蜂鸣。

电路使用一个四位共阳型数码管,四个公共阳级由三极管放大电流来驱动,三极管由P10-P13控制开与关。

数码管的阴级由P0口经过电阻限流连接。

例如,要十位的数码管工作,P12输出0,使三极管Q12导通,8脚得电,当P0口相应位有输出0时,点亮相应的LED灯组合各种字符数字。

4.独立键盘如上图,由六个按键组成,每个按键的一端连接IO口,另一端直接连接GND(0电位)。

六个按键分别接入P37-P32,只要按下按键,相应位的IO口位将被拉为低电平(0),程序可以判断相应位是否为0来确认按键己按下。

动态显示驱动电路是单片机应用中最常用的显示方式。

动态显示接口电路是把所有显示器的8个笔划段的同名段连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。

CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是哪个显示器亮,则取决于COM端。

在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人眼的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。

动态扫描显示必须由CPU不断地调用显示程序,才能保证持续不断的显示。

在实际工作中,当然不可能只显示,这样在两次调用显示程序之间的时间间隔就不一定了,如果时间间隔比较长,就会使显示不连续。

三、软件设计主程序将按键1设定为功能选择键,每按一次按键1,进入相应的功能模式。

●分秒显示分秒显示模式下,数码管显示时钟时间的分和秒。

当按键1按下后,进入下一模式。

●时分显示时分显示模式下,数码管显示时钟时间的时和分。

当按键1按下后,进入下一模式。

时间调整时间调整模式下,仅调整时钟的时、分。

数码管闪烁的为当前调整的位子,按键2为加,按键3为减,按键4为移位键。

闹钟闹钟模式下,可设置闹钟的时、分。

数码管闪烁的为当前调整的位子,按键2为加,按键3为减,按键4为移位键。

当闹钟时间调整完毕之后,按下按键5,确认闹钟时间。

随后等待时钟时间到达闹钟时间。

时钟时间到达闹钟时间后,蜂鸣器工作。

秒表秒表模式下,按下按键4,秒表开始计时;再次按下按键4,秒表暂停。

按下按键2或按键3,秒表清零。

四、软件调试在软件调试过程中碰到了很多问题。

其中比较重要的几个问题如下:1、时钟调整子程序中,时、分的十位数、个位数加减不符合常识。

比如在加减时,小时可以达到27、28等数值,而这是不符合常识的。

在查看代码后发现,可以在加、减过程中设置if函数判断当前所处位置,调整当前数值所能达到的最大值或最小值。

修改后代码如下:else if(keyval==0xbf) //按键2 加{if(pos==0){dispbuf[pos]++;if(dispbuf[pos]==3){dispbuf[pos]=0;}}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}if(dispbuf[0]==2){dispbuf[pos]++;if(dispbuf[pos]>=4){dispbuf[pos]=0;}}}else if(pos==2){dispbuf[pos]++;if(dispbuf[pos]==6){dispbuf[pos]=0;}}else if(pos==3){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}}else if(keyval==0xdf) //按键3 减{if(pos==0){if(dispbuf[pos]==0)dispbuf[pos]=2;else dispbuf[pos]--;}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}if(dispbuf[0]==2){if(dispbuf[pos]>=4&&dispbuf[pos]<=9){dispbuf[pos]=3;}else if(dispbuf[pos]==0){dispbuf[pos]=3;}else{dispbuf[pos]--;}}}else if(pos==2){if(dispbuf[pos]==0)dispbuf[pos]=5;else dispbuf[pos]--;}else if(pos==3){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}}2、秒表模式下,无法很好地区分当前计时所达到的具体数值。

在秒的个位数位子设置一个小数点,使秒表的显示更加直观。

修改后代码如下:在程序开始处,添加如下代码:unsigned char code segtab_dot[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点的数码管代码在void t0int(void) interrupt 1 using 1之中添加如下代码:if(mode==4&&P1==0xfd) //秒表处显示小数点的if语句{P0=segtab_dot[dispbuf[dispindex]];}else{P0=segtab[dispbuf[dispindex]];}3、在秒表运行一遍后,进入其他模式操作完毕,再次进入秒表模式下发现秒表无法清零。

检查代码后发现,在闹钟模式下,进入秒表模式时,未对秒表清零。

修改后代码如下:if(keyval==0x7f)//1号按键模式进入秒表模式{mode=4;old_ss=0;old_ms=0;miaobiao_ss=old_ss;miaobiao_ms=old_ms;dispbuf[0]=miaobiao_ss/10;dispbuf[1]=miaobiao_ss%10;dispbuf[2]=miaobiao_ms/10;dispbuf[3]=miaobiao_ms%10;clocksing=0;}附完整实验代码:/*********************************************************************** 基于单片机的数字时钟功能:时钟、闹钟、秒表模式0:时钟显示模式-分、秒模式0下,数码管显示时钟时间-分、秒。

按键说明:按键1:选择下一模式。

模式1:时钟显示模式-时、分模式1下,数码管显示时钟时间-时、分。

按键说明:按键1:选择下一模式。

模式2:时钟调整模式模式2下,调整时钟时间,仅调整时、分时间。

按键说明:按键1:选择下一模式。

按键2:增加选中数码管的数值。

按键3:减少选中数码管的数值。

按键4:移位键,按键选择下一数码管。

模式3:闹钟模式模式3下,设置闹铃时间之后,等时钟到达相应时间,发出铃声。

按键说明:按键1:选择下一模式。

按键2:增加选中数码管的数值。

按键3:减少选中数码管的数值。

按键4:移位键,按键选择下一数码管。

按键5:设置闹铃时间后,按键确认,数码管显示当前时钟时间。

模式4:秒表模式模式4为秒表模式,可记录0-59秒。

最小时间单位为0.01秒。

按键说明:按键1:选择下一模式。

按键2:清除秒表当前数值。

按键3:清除秒表当前数值。

按键4:开始、暂停秒表。

***********************************************************************/#include <reg52.h>unsigned char dispbuf[4]={0,0,0,0};unsigned char code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //不带小数点的数码管代码unsigned char code segtab_dot[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点的数码管代码unsigned char code bittab[]={0xfe,0xfd,0xfb,0xf7};unsigned char dispindex;unsigned char mode;unsigned char pos;unsigned char keyval;unsigned char hh,mm,ss;unsigned char miaobiao_ms=0,miaobiao_ss=0; //秒表unsigned char old_ms,old_ss; //保存秒表时间unsigned char clock_hh,clock_mm; //用于存放所设闹钟时间unsigned int clock_shanshuo; //用于控制闹钟调整时间时是否闪烁 0:闪烁 1:不闪烁sbit clocksing=P1^5; //闹钟所用蜂鸣器unsigned int cnt; //用于10ms转1s计数unsigned char cnt1; //用于10ms转0.5s处计数(用于闪烁)unsigned char cnt2; //用于秒表处计时unsigned char keyscan(void);void delay(unsigned int t);void keypro(void);bit flash;/******************主函数******************/void main(void){TMOD=0x11;TH0=(0-2000)/256;TL0=(0-2000)%256;ET0=1;TR0=1;TH1=(0-2000)/256;TL1=(0-2000)%256;ET1=1;TR1=0; //秒表先不开EA=1;mode=0;hh=02;mm=03;ss=15;while(1){if(mode==3){if(hh==clock_hh){if(mm==clock_mm){clocksing=0;}}else{clocksing=1;}}else{clocksing=1;}if(keyscan()==0xff) continue;keypro();}}/******************键扫描程序******************/ unsigned char keyscan(void){P3=0xff;keyval=P3;if(keyval==0xff){return 0xff;}delay(10000);if(keyval!=P3){return 0xff;}else{while(P3!=0xff);return keyval;}}/******************时钟中断及显示程序******************/ void t0int(void) interrupt 1 using 1{TH0=(0-2000)/256; //2msTL0=(0-2000)%256;P0=0xff;P1=0xff;P1=bittab[dispindex];if(mode==4&&P1==0xfd) //秒表处显示小数点的if语句{P0=segtab_dot[dispbuf[dispindex]];}else{P0=segtab[dispbuf[dispindex]];}if((dispindex==pos)&&(flash==1)&&(mode==2||(mode==3&&clock_shanshuo==0))) //闪烁控制程序{P0=0xff;P1=0xf0;}dispindex++;dispindex=dispindex&0x03;cnt++;cnt1++;if(cnt1>=250) //0.5ms闪烁{cnt1=0;flash=~flash;}if(cnt>=500) //2ms*500=1s{cnt=0;ss++;if(ss>=60){ss=0;mm++;if(mm>=60){mm=0;hh++;if(hh>=24){hh=0;}}}if(mode==0){dispbuf[0]=mm/10;dispbuf[1]=mm%10;dispbuf[2]=ss/10;dispbuf[3]=ss%10;}else if(mode==1||(mode==3&&clock_shanshuo==1)){dispbuf[0]=hh/10;dispbuf[1]=hh%10;dispbuf[2]=mm/10;dispbuf[3]=mm%10;}}}/******************按键选择,进入不同模式******************/ void keypro(void){switch(mode){case 0://显示分秒if(keyval==0x7f){mode=1;dispbuf[0]=hh/10;dispbuf[1]=hh%10;dispbuf[2]=mm/10;dispbuf[3]=mm%10;}break;case 1://显示时分if(keyval==0x7f){mode=2;dispbuf[0]=hh/10;dispbuf[1]=hh%10;dispbuf[2]=mm/10;dispbuf[3]=mm%10;}break;case 2://时间调整(只调整时分)if(keyval==0x7f) //按键1 调整模式进入闹钟模式{mode=3;clock_hh=0;clock_mm=0;clock_shanshuo=0;hh=dispbuf[0]*10+dispbuf[1]; //保存调整后的时间mm=dispbuf[2]*10+dispbuf[3];dispbuf[0]=clock_hh/10; //显示闹钟的初始时间dispbuf[1]=clock_hh%10;dispbuf[2]=clock_mm/10;dispbuf[3]=clock_mm%10;TR0=1;}else if(keyval==0xbf) //按键2 加{if(pos==0){dispbuf[pos]++;if(dispbuf[pos]==3){dispbuf[pos]=0;}}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}if(dispbuf[0]==2){dispbuf[pos]++;if(dispbuf[pos]>=4){dispbuf[pos]=0;}}}else if(pos==2){dispbuf[pos]++;if(dispbuf[pos]==6){dispbuf[pos]=0;}}else if(pos==3){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}}else if(keyval==0xdf) //按键3 减{if(pos==0){if(dispbuf[pos]==0)dispbuf[pos]=2;else dispbuf[pos]--;}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}if(dispbuf[0]==2){if(dispbuf[pos]>=4&&dispbuf[pos]<=9){dispbuf[pos]=3;}else if(dispbuf[pos]==0){dispbuf[pos]=3;}else{dispbuf[pos]--;}}}else if(pos==2){if(dispbuf[pos]==0)dispbuf[pos]=5;else dispbuf[pos]--;}else if(pos==3){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}}else if(keyval==0xef) //按键4 移位{pos++;pos=pos&03;}break;case 3: //闹钟模式if(keyval==0x7f) //按键1 调整模式进入秒表模式{mode=4;old_ss=0;old_ms=0;miaobiao_ss=old_ss;miaobiao_ms=old_ms;dispbuf[0]=miaobiao_ss/10;dispbuf[1]=miaobiao_ss%10;dispbuf[2]=miaobiao_ms/10;dispbuf[3]=miaobiao_ms%10;}else if(keyval==0xbf) //按键2 加{clock_shanshuo=0;if(pos==0){dispbuf[pos]++;if(dispbuf[pos]==3){dispbuf[pos]=0;}}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}if(dispbuf[0]==2){dispbuf[pos]++;if(dispbuf[pos]>=4){dispbuf[pos]=0;}}}else if(pos==2){dispbuf[pos]++;if(dispbuf[pos]==6){dispbuf[pos]=0;}}else if(pos==3){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}}else if(keyval==0xdf) //按键3 减{clock_shanshuo=0;if(pos==0){if(dispbuf[pos]==0)dispbuf[pos]=2;else dispbuf[pos]--;}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}if(dispbuf[0]==2){if(dispbuf[pos]>=4&&dispbuf[pos]<=9){dispbuf[pos]=3;}else if(dispbuf[pos]==0){dispbuf[pos]=3;}else{dispbuf[pos]--;}}}else if(pos==2){if(dispbuf[pos]==0)dispbuf[pos]=5;else dispbuf[pos]--;}else if(pos==3){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}}else if(keyval==0xef) //按键4 移位{clock_shanshuo=0;pos++;pos=pos&03;}else if(keyval==0xf7) //按键5 设置闹钟时间{clock_shanshuo=1;clock_hh=dispbuf[0]*10+dispbuf[1]; //保存所设闹钟时间clock_mm=dispbuf[2]*10+dispbuf[3];dispbuf[0]=hh/10;dispbuf[1]=hh%10;dispbuf[2]=mm/10;dispbuf[3]=mm%10;}break;case 4: //秒表模式if(keyval==0x7f) //按键1 调整模式进入时钟显示模式{mode=0;TR1=0; //关闭秒表dispbuf[0]=mm/10;dispbuf[1]=mm%10;dispbuf[2]=ss/10;dispbuf[3]=ss%10;}else if(keyval==0xef) //按键4 开始、暂停{old_ss=miaobiao_ss;old_ms=miaobiao_ms;TR1=~TR1;}else if(keyval==0xbf||keyval==0xdf) //按键2或按键3 清零{miaobiao_ss=0;miaobiao_ms=0;dispbuf[0]=miaobiao_ss/10;dispbuf[1]=miaobiao_ss%10;dispbuf[2]=miaobiao_ms/10;dispbuf[3]=miaobiao_ms%10;}break;default:break;}}/******************延时程序******************/void delay(unsigned int t){while(t--);}/******************中断程序,用于秒表******************/ void t1int(void) interrupt 3 using 3{TH1=(0-2000)/256;TL1=(0-2000)%256;cnt2++;if(cnt2>=5){cnt2=0;miaobiao_ms++;if(miaobiao_ms>=100){miaobiao_ms=0;miaobiao_ss++;if(miaobiao_ss>=60){miaobiao_ss=0;}}dispbuf[0]=miaobiao_ss/10;dispbuf[1]=miaobiao_ss%10;dispbuf[2]=miaobiao_ms/10;dispbuf[3]=miaobiao_ms%10;}}五、学习体会通过本次单片机课程设计,不仅加深了我对单片机理论课程知识的认识,而且通过将理论与实践相结合,使我真正地全面理解单片机的功能。

相关文档
最新文档