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

合集下载

基于C51单片机的数字时钟课程设计(C语言,带闹钟).

基于C51单片机的数字时钟课程设计(C语言,带闹钟).

单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词:电子钟 AT89C52 硬件设计软件设计目录一、数字电子钟设计任务、功能要求说明及方案介绍 (4)1.1 设计课题设计任务 (4)1.2 设计课题的功能要求说明 (4)1.3 设计课的设计总体方案介绍及工作原理说明 (4)二、设计课题的硬件系统的设计 (5)2.1硬件系统各模块功能简要介绍 (5)2.1.1 AT89C52简介 (5)2.1.2 按键电路 (6)三、设计课题的软件系统的设计 (6)3.1 使用单片机资源的情况 (6)3.2 软件系统个模块功能简要介绍 (7)3.3 软件系统程序流程框图 (7)3.4 软件系统程序清单 (7)四、设计课题的设计结论、仿真结果、误差分析 (9)4.1 设计结论及使用说明 (9)4.2 仿真结果 (10)结束语 (12)参考文献 (12)附录 (13)附录A:程序清单 (13)一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。

具有时间显示,并有时间设定,时间调整功能。

1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。

该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。

基于单片机的电子时钟课程设计报告

基于单片机的电子时钟课程设计报告
二.设计课题:基于单片机的数字时钟设计
三.系统总体方案ห้องสมุดไป่ตู้
图2.1整体设计思路
针对要实现的功能,拟采用AT89C51单片机进行设计,AT89C51单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、显示程序、闹钟显示程序、调时显示、定时程序。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
四、系统硬件设计
1.硬件电路原理图
(1)复位电路
单片机有两种基本复位方式:即上电复位和按键复位。本次设计用按键复位,如下图所示,通过接通按钮开关,使单片机进入复位状态。本次按键复位清零。各元件参考下图。
(2)时钟电路
(3)键盘电路
按键处理设置为:
如没有按键,则时钟正常走时。
按下K0键:进入调分状态,时钟停止走动;
九、附录·········
一.引言
单片机因将其主要组成部分集成在一个芯片上而得名,就是把中 央处理器、随机存储器、只读存储器、中断系统、定时器/计数器以及I/O接口电路等部件集成在一个芯片上。
基于单片机设计的数字钟精确度较高, 因为在程序的执行过程中, 任何指令都不影响定时器的正常计数,即便程序很长也不会影响中断的时间。
1
晶振
12MHz
1
独石电容
30pF
2
电解电容
47μF
2

单片机数字时钟实验报告

单片机数字时钟实验报告

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

着重掌握中断和定时器的使用,以及读键盘和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) //如果有连续两次按键按下,认为有有效按键按下。

单片机课程数字时钟设计报告

单片机课程数字时钟设计报告

单片机课程设计说明书级电子信息工程专业班级题目基于单片机的数字时钟设计学号姓名指导教师二О一六年十二月十三日一、电子时钟的基本原理电子钟是一个将“ 时”,“分”,“秒”显示于人的视觉器官的计时装置,根据单片机内部的定时计时器实现定时计时,通过设定计数初值,由单片机晶振产生一定频率的脉冲,可以实现定时计时寄存器的计数,设定计数初值,在完成一次计数时自动请求中断清零,再进行下一步的计数,例如在本题中计数初值为55536,每完成一次计数,就可以实现十毫秒的累加,设置中间参量,累加100次,实现每一秒计数累加,从而完成时钟秒计时,对分钟,小时的设计,进行秒的累加,60秒一分,60分一小时,进行一定的条件控制从而实现了电子时钟计时功能. 通过单片机的数据输出端,将秒数,分数,时数(sec,min,hour),时——分——秒,动态扫描显示,通过控制段码和位码,完成对每个数码管的控制,一般的数字时钟中都要有对时分的控制,一般是通过键控,在本次课题中,通过按键K1,K2,K3,K4,分别实现对时钟的暂停,对分钟的调节,对小时的调节和开始计时,由单片机P3口进行数据控制,实现功能,设定初值在复位键按下后显示12—00—00,直接对hour,min,sec,进行初值设定就可实现本次设计时钟电路。

在本次实验中,我们使用了STC89C52单片机控制电路,使用定时器0工作方式1来实现定时功能,单片机控制电路简单且省去了很多复杂的路线,使得电路简单易懂,使用键盘上的按键来调整时钟的时,分,秒,同时用C语言程序来控制整个时钟的显示,使得编程变的更容易,这样通过三个模块:按键,芯片,显示屏即可满足设计要求。

二、 电子时钟的硬件设计此设计原理框图如图1-1所示,电路图如图1-2所示,此电路包括以下三个部分:单片机,按键和显示电路。

图1-1设计原理框图图1-2电路图经过我们小组讨论决定采用单片机和共阳极数码管等来实现对单片机电子时钟的控制,以下是对实现原理的描述:本设计采用C语言程序设计,使单片机控制数码管显示时,分,秒,当秒计数计满60就向分进位,分计数器计数满60后向时计数器进位,时计数器从12开始,满24后从新计数,时,分,秒结果经过数据处理后可直接送显示器显示,数码管显示采用共阳极,低电平有效,仿真开始运行后,时钟从12:00:00开始运行,当按下KEY1键时时钟暂停,当按下KEY2键时对分进行调整,当按下KEY3键时对时进行调整,当按下KEY4键时,从当前数据开始进行运行,而当按下复位键后程序从头开始执行,即从12:00:00开始从新计数。

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

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

目录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、单片机选择本次实验选用了常见的 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、实验结果将程序下载到单片机后,数字时钟能够正常运行,准确显示时、分、秒,并且通过按键可以进行时间的调整。

基于C51单片机的数字时钟课程设计(C语言带闹钟)

基于C51单片机的数字时钟课程设计(C语言带闹钟)

单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。

具有时间显示,并有时间设定,时间调整功能。

1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。

该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。

1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。

键盘采用动态扫描方式。

利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。

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

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

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

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

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

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

在这次设计中,我们采用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.数字电子钟的意义和应用数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。

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

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

单片机课程设计报告基于单片机的数字时钟姓名:班级:学号:一、前言利用实验板上的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灯组合各种字符数字。

单片机电子时钟课程设计报告

单片机电子时钟课程设计报告

单片机电子时钟课程设计报告一、设计目的。

本课程设计旨在通过单片机技术的应用,设计并制作一个简单的电子时钟。

通过这一设计,学生将能够掌握单片机的基本原理和应用,培养学生的动手能力和创新意识,提高学生的实际操作能力。

二、设计原理。

本电子时钟采用单片机作为控制核心,通过晶振产生的时钟信号来实现时间的计时和显示。

利用数码管来显示小时和分钟,通过按键来调整时间。

同时,通过蜂鸣器发出报时信号,实现基本的闹钟功能。

三、设计方案。

1. 硬件设计。

(1)单片机选择,本设计选用常见的51单片机作为控制核心,具有成本低、易于编程的特点。

(2)时钟电路,采用晶振作为时钟信号源,通过单片机的定时器来实现时间的计时。

(3)显示模块,采用数码管来显示小时和分钟,通过数码管的扫描显示来实现时间的动态显示。

(4)按键输入,设计按键来调整时间,包括调整小时和分钟。

(5)报时功能,通过蜂鸣器来实现基本的报时功能,可以设置闹钟时间。

2. 软件设计。

(1)时钟控制,通过单片机的定时器来实现时间的计时和更新。

(2)显示控制,设计数码管的扫描显示程序,实现时间的动态显示。

(3)按键处理,设计按键扫描程序,实现对时间的调整。

(4)报时功能,设计蜂鸣器的报时程序,实现基本的闹钟功能。

四、设计实现。

1. 硬件实现。

根据上述设计方案,完成了电子时钟的硬件连接和布线,保证各个模块之间的正常通讯和工作。

2. 软件实现。

编写了单片机的程序,实现了时钟的计时、显示和控制功能,保证了电子时钟的正常运行。

五、实验结果。

经过调试,电子时钟能够准确显示当前的时间,并能够通过按键调整时间和设置闹钟功能,报时功能也能够正常工作。

六、总结与展望。

通过本课程设计,学生掌握了单片机的基本原理和应用,培养了动手能力和创新意识。

在今后的学习和工作中,学生将能够更好地应用单片机技术,设计和制作更加复杂的电子产品。

同时,也为学生今后的科研和创新工作奠定了良好的基础。

电子钟单片机课程设计报告(含源码)

电子钟单片机课程设计报告(含源码)

一、总设计思路电子时钟是我们日常生活中最常见的一种钟表,由于它结构简单、功耗低、时间精度比较准、等优点,使得广泛应用,在未来肯定有很大的市场。

这次课程设计我的目的就是尝试着做一个电子时钟。

1、系统功能显示时间、声音提示、调整时间、设置闹钟的功能。

2、功能硬件实现方案时间显示:时间的显示我选用的是六位七段数码管,由于数码管控制简单,而且显示效果好,所以选用它。

由于静态显示方式比较占资源,而且电路比较复杂,所以我们选择了动态显示方式,电路简单,效果挺好。

时间调整和闹钟设置:是通过外部两个按键触发单片机中断进而控制时间的调整。

其中一个按键是模式选择按键通过触发外部中断0来选择功能,功能主要是选择要调时、调分、调秒、闹钟调时、闹钟调分、闹钟调秒六种模式。

第二个按键通过触发外部中断1来在相应的模式下对时间的大小做调整。

声音提示:通过利用蜂鸣器来作为发生装置,有整点提示功能和闹铃功能。

时间发生:利用单片机自带定时器0做定时,通过软件控制来产生时、分、秒。

3、功能软件实现方案由于单片机C语言已经全面普及,它的程序容易理解、简单易写、可移植性好,所以我们选择用单片机C语言来写。

4、开发环境操作系统:window 7旗舰版64位程序编辑编译软件:KEIL μVision V4.60.6.10仿真软件;Proteus V ersion 7.85.、总设计原理框图STC89C52RC6位七段数码管显示时、分、秒蜂鸣器发声装置时钟复位电路按键调时模块一、硬件设计定时和程序执行及控制模块:我们选择的是宏晶科技生产的STC89C52RC芯片,它在很多硬件资源上比8051提升了不少,所以在后期我们可以做更多扩展和维护。

时间显示模块::采用六个七段带小数点的共阴极数码管。

声音提示模块:采用简单蜂鸣器做声音提示。

调时模块:通过两个简单按键来触发中断调时。

时钟复位模块:采用11.0592MHz的晶振,提供单片机工作频率。

二、设计原理图三、芯片解说STC89C52:是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。

(完整word版)单片机课程设计数字钟报告

(完整word版)单片机课程设计数字钟报告

For personal use only in study and research; not for commercial use单片机课程设计正文数字钟是采用数字电路实现对时,分,秒,数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能.诸如定时自动报警、按时自动打铃、时程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的.因此,研究数字钟及扩大其应用,有着非常现实的意义。

二、For personal use only in study and research;not for commercial use三、四、题目及要求设计一个多功能数字钟,使其具有以下功能:1、由晶振电路产生标准秒信号.2、能够显示时、分、秒:完成显示由秒00一直加1至59,再恢复为00;分加1,由00至01,一直加1至59,再恢复00;时加1,由00至01,一直加1到23,再恢复00。

3、要有手动快速校时、校分、秒。

4、要有报时电路(蜂鸣器每分钟短叫一声,一小时长叫一声).5、自定义电路,设计、调试,并完成实验报告.要求设计基于单片机的多功能数字钟,即用单片机来实现课程设计。

五、总体思路数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。

由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路。

对于一般的数字钟多会有报时功能.针对以上叙述,可整体构想:标准频率可由振荡电路产生,更精确时,可由石英晶体产生。

计数,可由2个60进制计数器,分别作为秒、分计数单元,一个24进制,作为时计数单元。

计数单元同样可采用中断定时方式,这就需要由软件来实现。

单片机课程设计实验报告(时钟、日历)..(word文档良心出品)

单片机课程设计实验报告(时钟、日历)..(word文档良心出品)

基于单片机的电子钟设计目录第一章电子时钟设计---------------------------------2 1.1 设计原理简介-------------------------------------2 1.2 设计功能------------------------------------------3第二章主要电路元器件介绍------------------------3 2.1 STC89C52 单片机简介----------------------------3 2.1.1 单片机简介----------------------------------------3 2.1.2 主要特性------------------------------------------3 2.1.3 管脚功能说明--------------------------------------4 2.1.4 LCD1602-----------------------------------------5第三章单元电路的硬件设计------------------------6 3.1 硬件原理框图---------------------------------------6 3.2 单片机 STC89C52 系统的设计-------------------------6 3.3 时钟电路-------------------------------------------7 3.4 复位电路-----------------------------------------------------------------------------7 3.5 键盘接口电路---------------------------------------8 3.6 LCD1602显示----------------------------------------8 第四章设计总原理图---------------------9第五章心得体会-------------------------9 第六章源程序---------------------------------------10前言:课程设计题目电子时钟、日历任务下达日期2013年6月17日设计提交期限2013 年7 月5日设计主要内容使用89C51、LCD1602,设计一个能同时显示“年月日”“时分秒”和“星期”的电子作品主要技术要求及参数基本要求:1.时钟走一天的误差小于1秒钟2.时间、星期、日历均可以通过按键调节设置成果提交形式技术报告一份,制作实物一件。

单片机数字时钟实验报告

单片机数字时钟实验报告

单片机数字时钟实验报告引言:数字时钟是现代人们生活中不可或缺的物品之一。

现代数字时钟的核心是单片机,而且数字时钟的制作也是单片机初学者的必备实验之一。

本文将详细介绍单片机数字时钟的制作过程和原理。

实验原理:数字时钟的原理非常简单,它由单片机、时钟芯片、LED数码管等元件组成。

单片机通过时钟芯片来获取时间信息,并将时间信息通过端口输出给LED数码管,从而显示当前时间。

单片机的主要作用是控制时钟芯片的读取和LED数码管的显示。

实验材料:1. 单片机:STC89C522. 时钟芯片:DS13023. LED数码管:共阳极4位LED数码管4. 电路板、电阻、电容、晶体振荡器、按键、排针等元件实验步骤:1. 确定电路原理图:根据实验原理,确定单片机、时钟芯片和LED 数码管之间的电路连接方式。

2. 绘制电路布局图:将电路原理图转换为真实的电路布局图,并根据元件大小和数量选择合适的电路板。

3. 焊接电路:根据电路布局图进行电路的焊接,并进行电路的检查和修正。

4. 编写程序:根据实验原理编写单片机程序,并将程序下载到单片机中。

5. 测试程序:将电路接通电源后,通过按键和LED数码管来测试程序的正确性和稳定性。

实验结果:经过实验,我们成功制作了一款单片机数字时钟。

该数字时钟具有以下功能:1. 显示当前的小时、分钟和秒钟。

2. 可以通过按键进行时间的调整。

3. 每隔一秒钟左右,LED数码管上的数据会刷新一次,以显示最新的时间信息。

4. 当电源断开后,时钟芯片会自动保存当前时间信息,重新通电后,显示的时间信息仍然是正确的。

结论:通过本次实验,我们了解了单片机数字时钟的制作原理和步骤,并成功制作了一款数字时钟。

通过实验,我们深入了解了单片机的应用,也为我们今后的电子设计和制作提供了很好的基础。

单片机实验报告(电子时钟)

单片机实验报告(电子时钟)

一、课程设计的内容和要求:1了解单片机的种类,掌握单片机的工作原理;2 掌握利用单片机进行系统设计的方法;3掌握利用protel进行原理图设计和PCB设计的方法;4学会进行单片机硬件调试和软件调试;5 了解单片机系统整个设计开发流程。

二、设计装置功能1、用单片机实现设计要求(1)实现功能:①正常的24小时制的电子表功能显示(时/分/秒)。

②任意时间(时/分/秒)闹钟时刻的设置并在设定时刻响铃。

(2)所使用器件:STC 89C52RC单片机1个、2位共阳极数码管3个、蜂鸣器1个、74LS138一片、74LS47一片、74HC04一片、电阻、电容及其他辅助电子元件。

(3)显示时间与闹钟时刻的设置:单片机的人机操作部分由六个按钮组成。

从电子钟电路板上(从左到右)分别是:①单片机复位键②闹钟开关③小时位累加键④分钟位累加键⑤秒钟位累加键⑥闹钟/时间显示切换键按键说明:复位键——把3个2位数码管显示数字全部清零。

闹钟开关键——按下键,闹钟开关模式切换。

时针位累加键——按下键,则实现时针位的累加00-23(累加循环)。

分针位累加键——按下键,则实现分针位的累加00-59(累加循环)。

秒针位累加键——按下键,则实现秒针位的累加00-59(累加循环)。

闹钟/时间显示切换键——按下键,能够实现数码管闹钟和时间两种显示功能的切换。

三、设计问题分析面对的问题主要是两方面:一个是软件的设计,也就是实现计时定时的控制功能的程序编辑,在电脑上模拟需要实现的功能;另一个是硬件的设计,需要我们自己购买器件、设计并焊接电路板。

而更为重要的一步是将软件、硬件相结合,做好电路后,我们试着把程序写入芯片测试,然而没有获得应该有的显示,接着我们多次检查电路,修改程序,在不断调试中终于实现正确显示。

四、设计思路本次设计的系统以动态显示显示时分秒模块,它能显示正确的时间,而且所显示时间与北京时间相同,基本做到同步,显示清晰明亮,可读性强。

系统主程序开始后,首先是对系统环境初始化,设置好时分秒后系统开始运行;然后可打开闹钟,预设响铃的时刻,计时系统到该时刻后自动响设定铃声。

单片机课程设计报告——数字时钟

单片机课程设计报告——数字时钟

单片机课程设计报告——数字时钟用8031单片机CPU及串口电路设计一个时钟第一章设计阐明 (3)1.1 设计内容 (3)1.2 设计请求 (3)1.3设备及工作环境 (3)第二章硬件计划 (3)2.1 设计思路 (3)2.2 原理电路图 (4)2.3 重要元件功效阐明 (5)2.4 硬件工作原理论述 (6)第三章软件计划 (6)3.1 分析论证 (6)3.2 程序流程图 (8)3.3 程序清单 (12)第四章调试过程及成果分析 (18)第五章设计总结 (19)参考文献 (19)第一章设计阐明1. 1设计内容用8013单片机CPU及串口电路设计并实现显示时间的实时时钟。

1. 2设计请求(1)在ZY15MCU12BD型综合单片机实验箱的硬件结构上编写软件完成设计。

(2)程序的首地址应使目标机可以直接运行,即从0000H开端。

在主程序的开端部分必须设置一个合适的栈底。

程序放置的地址须持续且靠前,不要在中间留下大批的空间地址,以使目标机可以应用较少的硬件资源。

(3) 6位显示器数码管从左到右分辨显示时. 分. 秒(各占用2位),采用24小时标准计时制。

开端计时时为000000,到235959后变成000000.(4)在XD1—2键盘上选定3个键分辨作为小时. 分. 秒的调校键。

每按一次键,对应的显示值便加1。

分. 秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不产生转变).(5)软件设计必须应用8031片内定时器,采用定时中断结构,不得应用软件延时法。

(6)上机调试程序。

(7)写出设计报告。

2. 3设备及工作环境(1) 硬件:盘算机一台、ZY15MCU12BD型综合单片机实验箱一台、通信电缆一根。

(2) 软件:Windows操纵系统、Keil C51软件。

第二章硬件计划2.1 设计思路电子时钟重要由显示模块、校时模块和时钟运算模块三大部分组成。

单片机数字时钟实训报告

单片机数字时钟实训报告

一、实训目的本次实训旨在通过设计和实现单片机数字时钟,使学生掌握单片机的基本原理和应用技术,提高学生的动手能力和实践技能。

通过实训,使学生熟悉单片机的硬件结构、编程方法和调试技巧,了解数字时钟的设计原理和实现方法,培养学生的创新意识和团队协作能力。

二、实训内容1. 硬件设计(1)单片机选型:MSP430F5529(2)显示模块:OLED显示屏(3)按键模块:4个按键(4)蜂鸣器模块:蜂鸣器(5)电源模块:电源电路2. 软件设计(1)系统初始化:设置系统时钟、初始化OLED显示屏、按键扫描、蜂鸣器控制等(2)实时时钟(RTC)实现:通过MSP430F5529的RTC模块获取当前时间(3)时间显示:在OLED显示屏上显示年、月、日、时、分、秒等信息(4)整点报时:在整点时刻通过蜂鸣器播放音乐进行报时(5)按键控制:通过按键实现时间的设置、闹钟的设定等功能三、实训过程1. 硬件搭建(1)根据设计图纸,连接MSP430F5529单片机、OLED显示屏、按键、蜂鸣器等元器件(2)搭建电源电路,为单片机和显示屏提供稳定的电源(3)检查连接是否正确,确保电路安全可靠2. 软件编写(1)使用C语言编写程序,实现系统初始化、实时时钟获取、时间显示、整点报时、按键控制等功能(2)编写程序代码,实现各个功能模块的代码(3)调试程序,确保程序运行正确3. 系统调试(1)将程序烧录到MSP430F5529单片机中(2)连接OLED显示屏、按键、蜂鸣器等模块(3)检查系统运行情况,确保各个功能正常(4)调整程序参数,优化系统性能四、实训结果与分析1. 系统功能实现本次实训成功实现了单片机数字时钟的功能,包括时间显示、整点报时、按键控制等。

系统运行稳定,各项功能正常。

2. 系统性能分析(1)实时时钟获取:通过MSP430F5529的RTC模块获取当前时间,精度较高(2)时间显示:OLED显示屏显示清晰,信息完整(3)整点报时:在整点时刻通过蜂鸣器播放音乐进行报时,声音清晰(4)按键控制:通过按键实现时间的设置、闹钟的设定等功能,操作方便3. 系统优化(1)优化程序代码,提高程序运行效率(2)改进显示效果,提高用户体验(3)增加闹钟功能,实现定时提醒五、实训总结1. 通过本次实训,使学生掌握了单片机的基本原理和应用技术,提高了学生的动手能力和实践技能2. 学生学会了如何使用MSP430F5529单片机设计数字时钟,了解了数字时钟的设计原理和实现方法3. 学生培养了创新意识和团队协作能力,为今后的学习和工作打下了良好的基础4. 实训过程中,学生遇到了各种问题,通过查阅资料、讨论和请教老师,最终解决问题,提高了学生的解决问题的能力5. 本次实训使学生认识到理论知识与实践相结合的重要性,激发了学生的学习兴趣,为今后的学习和工作奠定了基础。

  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;}}五、学习体会通过本次单片机课程设计,不仅加深了我对单片机理论课程知识的认识,而且通过将理论与实践相结合,使我真正地全面理解单片机的功能。

相关文档
最新文档