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

合集下载

C51单片机毕业设计电子钟

C51单片机毕业设计电子钟

概述单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。

C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。

此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。

因此,使用C语言进行程序设计已成为软件开发的一个主流。

C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可靠性,便于改进和扩展,从而研制出规模更大、性能更完备的系统。

因此,用C语言进行8051单片机程序设计是单片机开发与应用的必然趋势。

本课程的目的是学习运用C语言开发单片机应用系统软件。

为将来从事单片机应用系统的开发打下坚实的基础。

一、题目电子钟二、课程设计目的(1)巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力;(2)培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;(3)过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。

三、课程设计系统环境(1)ADEK5196ET;(2)AEDK机电实验平台;(3)Keil c51软件调试环境;四、课程设计要求(1)掌握ADEK5196实验开发系统中的实验模块原理;(2)综合运用实验模块,用C51开发设计具有一定功能的单片机控制系统,进行软、硬件设计及调试;(3)写出完整的设计任务书:课题的名称、系统的功能、硬件原理图、软件框图、程序清单、参考资料;五、系统功能说明利用8279键盘显示接口电路。

使用8279可实现对键盘/显示器的自动扫描,以减轻CPU负担,其具有显示稳定、程序简单、不会出现误动作等特点。

电子钟的格式为:XX XX XX,由左向右分别为:时、分、秒。

基于单片机的数字时钟加闹钟的设计与制作毕业设计

基于单片机的数字时钟加闹钟的设计与制作毕业设计

题目基于单片机的数字时钟加闹钟的设计与制作1绪论 (2)1.1引言 (2)1.2研究目的 (2)1.3系统基本方案选择和论证 (2)1.3.1单片机芯片的选择方案和论证: (2)1.3.2显示模块选择方案和论证: (2)1.3.3时钟芯片的选择方案和论证: (2)1.3.4电路设计最终方案确定 (3)1.4硬件系统框图 (3)2 主要元件介绍 (4)2.1STC89C52以及最小系统介绍 (4)2.1.1 ST89C52单片机: (4)2.1.2 计时芯片DS1302: (5)2.1.3字符液晶显示屏LCD1602资料: (6)2.1.4 电源模块: (8)3. 硬件电路连接图: (8)3.1单片机的连接图 (8)3.2DS1302计时模块 (9)3.3LCD1602液晶显示模块 (9)3.4按键模块 (9)4. 系统的软件设计: (10)4.1软件设计流程图: (10)5. 系统的调试: (11)6. 总结: (12)参考文献 (13)附录一: (14)附录二: (15)附录三: (30)嵌入式综合课程设计III(基于单片机的数字时钟加闹钟的设计与制作)任务提出:随着单片机技术的飞速发展,在其推动下,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高。

时间就是金钱、时间就是生命、时间就是胜利……,准确的掌握时间和分配时间对人们来说至关重要,时钟是我们生活中必不可少的工具。

电子钟的设计方法有很多种,但是基于单片机并通过LCD显示的电子时钟具有编程灵活、精确度高、便于携带、显示直观等特点。

利用STC89C52单片机对DS1302时钟芯片进行读写操作并通过LCD1602字符液晶显示实时时钟信息,这样便构成了一个单片机电子时钟。

设计要求:利用单片机作为核心控制器件,制作一个数字时钟。

要求其具有如下功能:①具有年、月、日、星期、时、分、秒显示功能;②具备年、月、日、星期、时、分、秒校准功能;③具有闹钟显示、调节设定、鸣叫功能;④计时器模块能够准确计时;⑤显示模块能够清晰、稳定显示,不出现乱码;⑥输入模块能够正确输入指令;⑦控制模块能够正确控制输入、输出显示;⑧整个系统能够正常、稳定工作。

基于51单片机的简易数字钟系统设计

基于51单片机的简易数字钟系统设计

简易数字钟系统设计完成一个简易数字时钟系统设计。

要求:用3个独立按键调整时间。

一个按键控制启动运行。

在调整结束后按运行键后开始运行。

1,开机时,显示00:00:00时间从零开始调整。

2,P10控制秒的调整,每按一次加1s。

3,p11控制分的调整,每按一次加1min。

4,p12控制时的调整,每按一次加1h。

5,p13控制运行和停止。

程序:#include<reg52.h>sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit key4=P3^7;#define uchar unsigned char#define uint unsigned intuchar shi,ge,aa,num,num1,num2,tt;uint n;uchar q1,q2,b1,b2;sbit dula=P2^6;sbit wela=P2^7;void keyscan();void delay(uint);void display();uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void keyscan(){if(key1==0){ num2++;if(num2==24)num2=0;while(!key1);if(key2==0){num1++;if(num1==60)num1=0;while(!key2);}if(key3==0){num++;if(num==60)num=0;while(!key3);}if(key4==0){ TR0=~TR0;while(!key4);}}void main(){TMOD=0x00;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;while(1){ k eyscan();display();}}void time0()interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==100){ tt=0;num++;if(num==60){ num=0;num1++;if(num1==60){ num1=0;num2++;if(num2==24)num2=0;}}}}void display(){q1=num2/10;q2=num2%10;b1=num1/10;b2=num1%10;shi=num/10;ge=num%10;wela=1;P0=0xfe;wela=0;P0=0xff;P0=table[q1]; dula=0; delay(1);wela=1;P0=0xfd; wela=0;P0=0xff; dula=1;P0=table[q2]; dula=0; delay(1);wela=1;P0=0xfb; wela=0;P0=0xff; dula=1;P0=table[b1]; dula=0; delay(1);wela=1;P0=0xf7; wela=0;P0=0xff; dula=1;P0=table[b2]; dula=0; delay(1);wela=1;P0=0xef; wela=0;P0=0xff; dula=1;P0=table[shi]; dula=0; delay(1);wela=1;P0=0xdf;P0=0xff;dula=1;P0=table[ge];dula=0;delay(1);}void delay(uint x){uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--); }。

51单片机时钟代码(带秒表闹钟功能).

51单片机时钟代码(带秒表闹钟功能).
write_com(0x80+0x00+7);
}
}
}
if(s6==0)
{
delay(5);
if(s6==0)
{
while(!s6);
di();
if(s4num==1)
{
miao--;
if(miao<0)
miao=59;
write_alarm(10,miao);
write_com(0x80+0x00+13);
ep=0;
}
voidwrite_data(uchardat) //写入字符显示数据到LCD
{
while(lcd_bz()); //等待LCD空闲
rs=1;
rw=0;
ep=0;
P0=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
}
if(s1num==3)
{
hour++;
if(hour==24)
hour=0;
write_time(4,hour);
write_com(0x80+0x40+7);delay(5);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
di();
if(s1num==1)
批注本地保存成功开通会员云端永久保存去开通
#include <reg51.h>
#include <intrins.h>

C51课程设计报告(液晶时钟)

C51课程设计报告(液晶时钟)

深圳职业技术学院Shenzhen Polytechnic 嵌入式C语言课程设计报告课题:学院:班级:姓名:目录一、设计方案 (1)1、功能简介 (1)2、开发测试环境选择 (1)二、液晶时钟程序设计 (1)1、功能状态转换图 (1)2、主要功能模块 (2)2.1主显示模块 (2)2.2功能选择模块 (2)2.3时间修改模块 (3)2.4闹铃修改模块 (3)2.6其他辅助模块函数以及变量 (4)三、小结 (4)四、附录 (5)1、使用说明 (5)2、参考文献资料 (5)3、附表1 (6)一、设计方案1、功能简介本文所设计的简易电子时钟可输出当前时间以及闹铃时间,并可通过机械按键来实现修改当前时间、修改闹铃时间、退出修改以及控制闹铃的打开和关闭,并通过1602型号的液晶屏显示出不同操作时的不同界面。

本程序共设计按键5个,按键及功能分别是1键:选择功能界面下选择时间修改、时间和闹铃修改状态下的增加“1”计数;2键:选择功能界面下选择闹铃修改、时间和闹铃修改状态下的减少“1”计数;3键:主显示界面下进入选择功能界面、时间和闹铃修改状态下切换修改项目、修改完成退回主显示界面;4键:时间和闹铃修改状态下直接退回主显示界面;5键:主显示界面下控制闹铃的开关。

2、开发测试环境选择开发软件选择了ARM公司的KeiluVision4,仿真软件选择了英国Labcenter electronics公司的proteus7 professional,测试硬件选择了普中的HC6800开发箱。

首先在KeiluVision4下进行程序设计,编译通过后用proteus7 professional进行仿真并尝试下载到开发箱中进行操作,最后下载到开发箱中进行操作演示。

二、液晶时钟程序设计1、功能状态转换图2、主要功能模块注:本文中提到的函数均见附表1的液晶时钟源程序中,本次使用的是1602液晶。

2.1主显示模块主显示模块包含了时间显示模块void TimeDisplay(void)函数,其运行过程为首先读取初始值,再通过定时器中断TO的中断服务函数void T0_int () interrupt 1 来进行秒计时并通过void TimeRunning(void)函数进行时间的加计数和进位运算;闹铃显示模块void AlarmDisplay(void),其运行过程为首先读取初始值,再通过void AlarmRunning(void)来进行比较,如果预设时间与当前时间相等就将响铃标记变量SoundFlage_1置为1,进而引发主函数中的响铃事件。

基于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 作品的背景与意义数字钟是采用数字电路实现对.时,分,秒。

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

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

基于51的电子闹钟设计报告(附原理图、PCB图、程序)

基于51的电子闹钟设计报告(附原理图、PCB图、程序)

基于51的电⼦闹钟设计报告(附原理图、PCB图、程序)成都信息⼯程学院第五届嵌⼊式创新技术⼤赛基于MCS51的智能电⼦闹钟设计报告姓名学院班级实物图⽬录1.电⼦时钟的设计原理和⽅法 (1)1.1设计原理 (1)1.2 硬件电路的设计 (1)1.2.1 STC89C51RC简介 (1)1.2.2 键盘电路的设计 (2)1.2.3蜂鸣器驱动电路 (3)1.2.4 数码管驱动电路 (3)1.2.5 电源电路 (4)1.3软件部分的设计 (4)1.3.1主程序部分的设计 (4)1.3.2中断计时器及时间进位 (5)1.3.3 闹钟⼦函数 (7)1.3.4 按键扫描 (8)1.3.5 时钟闹钟设置 (9)1.3.6 显⽰数字函数 (10)1.3.7 显⽰界⾯函数 (10)1.3.8 闹钟记录及读取 (11)2.硬件调试 (13)附录A:电路原理图 (15)附录B:电路PCB图 (16)附录C:源程序 (17)1.电⼦时钟的设计原理和⽅法1.1设计原理系统框图1.2硬件电路的设计1.2.1 STC89C51RC简介STC89C52R CSTC89C51RC是⼀种带8K闪烁可编程可擦除只读存储器(FPETOM-FlashProgrammabalandErasableReadOnlyMemory )的低电压、⾼性能CMOS8位微型处理器,即单⽚机芯⽚。

单⽚机的可擦除只读存储器可以反复擦除1000次,内部FLASH 擦写次数为100000次以上。

该芯⽚使⽤⾼密度⾮易失存储制造技术,与⼯业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU 和闪烁存储器集成在单个芯⽚中,使得STC89C51RC 成为了⼀种性价⽐极⾼的微型处理器芯⽚,在许多电路设计中都得到了应⽤。

STC89C51RC 单⽚机特点:⼯作电压:5.5V-3.4V ⼯作频率:0-40MHz ⽤户应⽤程序空间:8K ⽚上集成128*8RAMISP (在系统可编程)/IAP (在应⽤可编程),⽆需专⽤编程器/仿真器可通过串⼝(P3.0/P3.1)直接下载⽤户程序EEPROM 功能共3个16位定时器/计数器,其中定时0还可以当成2个8位定时器使⽤外部中断4路通⽤异步串⾏⼝(UART ),还可⽤定时器软件实现多个UART ⼯作温度范围:0-75℃引脚说明:VCC:供电电压 GND :接地P0:P0是⼀个8位漏级开路双向I/O ⼝,低8位地址复⽤总线端⼝。

基于单片机的带温度显示的数字钟设计(c51语言编程)【开题报告】

基于单片机的带温度显示的数字钟设计(c51语言编程)【开题报告】

开题报告电气工程及其自动化基于单片机的带温度显示的数字钟设计(c51语言编程)一、课题研究意义及现状1980年因特尔公司推出了MCS-51单片机,近30年来,其衍生系列不断出现,从Atmel加入FLASH ROM,到philips加入各种外设,再到后来的Cygnal推出C8051F,使得以8051为核心的单片机在各个发展阶段的低端产品应用中始终扮演着一个重要的角色,其地位不断升高,资源越来越丰富,历经30年仍在生机勃勃地发展,甚至在SoC时代仍占有重要的一席之地。

单片机具有体积小、功能强、低功耗、可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域智能仪表、机电一体化、实时控制、国防工业普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。

C语言已经成为当前举世公认的高效简洁而又贴近硬件的编程语言之一。

将C语言向单片机8051上移植十余20世纪80年代的中后期,经过几十年的努力,C语言已成为专业化单片机上的实用高级语言。

C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。

此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。

与汇编语言相比,C51在功能、结构、可读性、可维护性上有明显的优势,因而易学易用。

另外C51可以缩短开发周期,降低成本,可靠性,可移植性好。

因此,使用C语言进行程序设计已成为软件开发的一个主流,用C语言进行8051单片机程序设计是单片机开发与应用的必然趋势。

随着人们生活水平的提高,对物质需求也越来越高,人们已不再满足于钟表原先简单的报时功能,希望出现一些新的功能,诸如环境温度显示、日历的显示、重要日期倒计时、显示跑表功能等,用以带来更大的方便。

而所有这些,又都是以数字化的电子时钟为基础的,不仅应用了数字电路技术,而且还加入了需要模拟电路技术和单片机技术。

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

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

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

本电子钟采用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键再次进入时钟运行状态。

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

键盘采用动态扫描方式。

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

二、设计课题的硬件系统的设计2.1硬件系统各模块功能简要介绍2.1.1 AT89C52简介(1) 兼容MCS51指令系统;(2)8kB可反复擦写(大于1000次)Flash ROM;(3)32个双向I/O口;(4)256x8bit内部RAM;(5)3个16位可编程定时/计数器中断;(6)时钟频率0-24MHz;(7)2个串行中断,可编程UART串行通道;(8)2个外部中断源,共8个中断源;(9)2个读写中断口线,3级加密位;(10)低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;(11)有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。

它的价格便宜,功能强大,能耗低。

很大程度上减少总电路的复杂性,提高了所设计系统的稳定性。

其芯片引脚图如图2-1所示。

图2-1 单片机AT89S52引脚图2.1.2 按键电路图2—2 按键图三、设计课题的软件系统的设计3.1 使用单片机资源的情况设计课题使用单片机资源的情况如下:P0口输出数码管段选信号,P2口输出数码管位选信号;晶振12MHz;调整选择键KEY1:P1.0;通过选择键选择调整位,选中位闪烁;增加键KEY2:P1.1;按一次使选中位加1;减少键KEY3:P1.2;按一次使选中位减1;此数字钟可实现基本的走时和显示时间时、分、秒;时间的调整;闹钟的设定和调整;闹钟的开启和关闭功能,具体如下:(1)实现基本的走时和显示时间的时、分、秒,上电自动显示初始时间12-59-00,且控制闹钟状态的的红色led灯为亮的状态;(2)当第一次按下第一个弹性按键时进入时间的调节状态,此时实现对显示时间的小时调节,按下第二个按键时实现小时的加一调节,按下第三个按键时实现小时的减一调节;(3)当第二次按下第一个弹性按键时进入显示时间的分钟调节状态,按下第二个按键时实现分钟的加一调节,按下第三个按键时实现分钟的减一调节;(4)当第三次按下第一个弹性按键时进入闹钟的小时调节状态,按下第二个按键时实现闹钟小时的加一调节,按下第三个按键时实现闹钟小时的减一调节;(5)当第四次按下第一个弹性按键时进入闹钟的分钟调节状态,按下第二个按键时实现闹钟分钟的加一调节,按下第三个按键时实现闹钟分钟的减一调节;(6)当第五次按下第一个弹性按键时返回正常的显示时间走时状态;(7)当同时按下第二和第三个弹性按键时,关闭闹钟,且此时蓝色led灯为灭,及定时时间到蜂鸣器并不响,若再次同时按下第二和第三个弹性按键,则开启闹钟,且此时红色led灯为亮,定时时间到蜂鸣器发出滴滴的闹铃声,同时按下第二和第三个弹性按键即可关闭闹铃。

闹铃状态默认为开启。

3.2 软件系统个模块功能简要介绍本设计的软件系统主要采用以下基本模块来实现,主程序、中断服务程序、键盘输入程序模块、数码管及其驱动模块和延时模块。

主程序:主要是用于对输入信号的处理、输出信号的控制和对各个功能程序模块的运用及其控制。

中断服务程序:主要是用于电子钟的准确运行、数据输入过程中的闪烁。

键盘输入程序模块:主要是用于确定按键并得到特定的键码值。

数码管及其驱动模块:主要是用于驱动数码管及利用数码管显示时间。

延时模块:程序中有两种延时子程序,一种是短延时用于判键按下等,一种是长延时。

3.3 软件系统程序流程框图系统软件采用汇编语言按模块化方式进行设计,然后通过Keil软件开发平台将程序转变成十六进制程序语言,接着使用Proteous 进行仿真,读出显示数据。

3.4 软件系统程序清单本电子钟实现24小时制,8位数码管显示时分秒,显示式:12-59-00。

通过4只按键来调整时间:KEY1(P1.0):调整选择键,选中位闪烁;KEY2(P1.1):增加键,按一次使选中位加1;KEY3(P1.2):减少键,按一次使选中位减1;Bear(P3.1):到了整点和闹钟就会响;Led (P1.2):闪烁;P0口输出数码管段选信号,P2口输出数码管位选信号;晶振12MHz。

图3-1主程序流程框图图3-2显示时钟数组子程序 图3-3中断服务程序程序四、设计课题的设计结论、仿真结果、误差分析4.1 设计结论及使用说明 本设计为基于单片机的电子钟的设计。

刚开始,我们很多地方理不清头绪,无从下手,但通过认真研究设计课题,找书上网查资料,确定基本设计方案,对所用芯片功能进行查找、调试,然后画电路图等,积累了很多宝贵的经验。

本设计用2个四位一体的共阳数码管做为显示器,它显示时间值;设计中有三个按键,其中KEY1为启动键,KEY2为加控制键 KEY3为减控制键。

图4—1 结果图4.2 仿真结果在Proteus ISIS的Debug菜单中选择Execute,运行程序,系统仿真结果如图所示。

实现功能:可调整运行的电子钟具有三种工作状态:“d.1004-22”状态、运行状态、调整状态。

图4-2“d.1004-22”上电初始化运行状态仿真结果图4-3时钟正常运行状态仿真结果图4-4闹钟定时调整状态仿真结果图4-5小时调整状态仿真结果图4-6分钟调整状态仿真结果结束语单片机课程设计是一门很实用,很复杂的设计。

这个设计用到了单片机,电路等方面的知识,通过这次课程设计,使我对单片机及其附属电路有了一定的了解,对课本上的知识有了近一步的掌握,也深刻明白了自己的不足。

完成本次课程设计的过程,是一个从无到有的过程,经历了兴奋、所悟、完成几个过程。

刚做做课程设计时,仔细阅读设计的题目和要求,以为没什么困难的,所用的知识书上都有。

可是当我动手开始做的时候,才发现其中的算法,设计是那么繁琐。

经过一天的努力,再到图书馆和网上查找资料,在经过借鉴很多类似的资料,文献后,总算是有点眉目了。

埋头苦干的过程是痛苦的,在思考算法和程序框架时,迷茫,烦躁,也参考别人的思路,不断循环中,终于最后完善了程序。

其中的煎熬是很痛苦的,深刻明白攻克自己“未知领域”的困难。

但当课程设计完成时,那感觉是甜蜜的,没有耕耘,哪来得收获的喜悦,就在这样的痛与快乐的交换中,我学到了知识。

通过这短短一周的实践,我感觉到自己从课本上学到的理论知识和实践仍有很大的差距。

知道了很多元器件有什么功效,在仿真仪器中是什么代码。

有的知识,自己感觉已经掌握得差不多了,但是实际操作起来就有问题出现了。

我遇到了不少问题,花费了很多的时间。

这让我重新反思我们的学习,深刻领悟到我们这个专业动手,实践的重要性。

理论不经过实践考验,是没法实施的,就像我们编的程序,很多方面考虑的都不够,几乎没有涉及到实际应用时的防范方法措施。

这次的课程设计,让我学到了很多书本上学不到的东西,学到了实际应用时。

最大的收获是:对键盘,显示器,C51语言的应用有了深刻的了解。

参考文献[1] 百度文库,基于C51单片机的程序设计.[2] 百度百科,AT89C52简介附录附录A 程序清单#include <reg51.h>#include <absacc.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit KEY1=P1^1; //切换键sbit KEY2=P1^2; //minute ,hour调整加1定义sbit KEY3=P1^7; //minute ,hour调整减1定义sbit bear=P3^1; //闹铃sbit led=P1^2; //闹钟,整时灯闪烁code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21}; //段码控制char code weikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar ms[8]={2,2,10,4,0,0,1,14};uchar StrTab[8];uchar minute=59,hour=12,second=0; //正常时钟秒,分,时定义uchar minute1=00,hour1=00; second1=00; //闹钟时钟秒,分,时定义uchar flag=0, flag1=0; //切换标志uchar num=0;uint count=0; //定时器计数,定时50ms,count满20,秒加1/***********子函数声明*******************************************/ void xianshishuzu(); //显示数组子程序void alarm(); //闹钟子程序/********************** 延时子程序*****************************/ void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<110;y++);}/**********************显示时钟子函数***************************/ void dispaly(uchar w[8]){unsigned int i,j,aa;aa=0xfe; //位选初值1111 1110for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示{P2=aa; //位选j=w[i]; //取出要显示的数码P0=tab[j]; //取出段选编码aa=_crol_(aa,1); //位选信号循环右移delay(1); //显示延时P0=0xff; //消影}}/***********************显示时钟数组子程序***********************/void xianshishuzu(){StrTab[1]=second/10; //秒个位StrTab[0]=second%10; //秒十位StrTab[2]=10; //间隔符-StrTab[4]=minute/10; //分个位StrTab[3]=minute%10; //分十位StrTab[5]=10; //间隔符-StrTab[7]=hour/10; //时个位StrTab[6]=hour%10; //时十位}/**********************键盘扫描子程序*************************/void keycan(){if(KEY1==0) //按一次,正常显示,按第二次,时调整,按第三次,分调这整,{delay(10); //按键1去抖以及动作if(KEY1==0) //确认按键是否按下{flag++; //切换标志}while(!KEY1); //释放按键}if(flag==1){if(KEY2==0){delay(10);if(KEY2==0){hour++; //正常时间小时加1if(hour==24)hour=0;}while(!KEY2) //释放按键{dispaly(StrTab);}}if(KEY3==0){delay(10);if(KEY3==0){hour--; //正常时间小时减1if(hour==0)hour=23;dispaly(StrTab);}while(!KEY3){dispaly(StrTab);}}}if(flag==2){if(KEY2==0) //按键去抖以及动作{delay(10);if(KEY2==0){minute++; //分加1if(minute==60)minute=0;}while(!KEY2){dispaly(StrTab);}}if(flag==3) //秒表的加1 {if(KEY3==0){delay(10);if(KEY3==0){second++; //秒加1if(second==0)second=59;}while(!KEY3){dispaly(StrTab);}}}}if(flag==3) //闹钟对时{if(KEY2==0){delay(10);if(KEY2==0){hour1++;if(hour1==24)hour1=0; //闹钟时间小时加1 }while(!KEY2){alarm();}}if(KEY3==0){delay(10);if(KEY3==0){hour1--;if(hour1==0)hour1=23; //闹钟时间小时减}while(!KEY3){alarm();}}}if(flag==4){if(KEY2==0) //按键去抖以及动作{delay(10);if(KEY2==0)minute1++;if(minute1==60)minute1=0; //闹钟分加1}while(!KEY2){alarm();}}if(KEY3==0) //按键去抖以及动作{delay(10);if(KEY3==0){minute1--;if(minute1==0)minute1=59; //闹钟分减1}}while(!KEY3){alarm();}}}/*******************蜂鸣器子程序****************************/ void beng(){bear=1;P3=0xfd;delay(100);bear=0;P3=0XFf;delay(100);}/*****************整点报警子程序***************************/ void zhengdian (void){uchar i=0;if((second==0)&(minute==0)) //整点报时{for(i=0;i<10;i++){TR0=1; beng();dispaly(ms);}}/********************************定时闹钟*******************************/void alarm(){uint i;if((hour==hour1&&second1==minute1&&(second>=second1&&second<second1+5))||(min ute==0&&second<1))for(i=0;i<3;i++){ beng();}StrTab[1]=second1/10; //闹钟秒个位StrTab[0]=second1%10; //秒十位StrTab[2]=10; //间隔符-StrTab[4]=minute1/10; //分个位StrTab[3]=minute1%10; //分十位StrTab[5]=10; //间隔符-StrTab[7]=hour1/10; //时个位StrTab[6]=hour1%10; //时十位TR0=0;dispaly(StrTab);xianshishuzu();}/**************************中断子程序*********************************/void time_() interrupt 1 //中断程序{count++;TH0=(65536-50000)/256; //0.5ms重新送初值TL0=(65536-50000)%256;if(count==20) //定时器计数,定时50ms,count满20,秒加1{second++; count=0;if(second==60) //秒值等于60,秒清零,分加1{second=0;minute++;if(minute==60) //分值等于60,分清零,时加1{minute=0; hour++;if(hour==24) //时值等于24,时清零,返回,全部归零{hour=0;}}}xianshishuzu();}/***********************数字电子钟主函数***************************/void main(){P1=0XFF;TMOD = 0x11; //time0为定时器,方式1TH0=(65536-50000)/256; //预置计数初值,50msTL0=(65536-50000)%256;EA=1; //总中断开ET0=1; //允许定时器0中断TR0=1; //开启定时器0while(1) //主循环{if(flag==0){TR0=0; dispaly(ms); //上电初始化就显示bad.1004-22}if(P1!=0XFF){keycan(); //按键提前扫描}if(flag>0){if(flag==1||flag==2) { TR0=1; dispaly(StrTab); zhengdian ();}//KEY1按第二次或第二次定时器开始,电子钟和整点报时正常显示if(flag==3||flag==4) { TR0=0;alarm(); }//按KEY1第三或第四次闹钟开始显示,分时的调整if(flag==5) { dispaly(StrTab); }//按KEY1第五次返回电子钟正常显示if(flag==6) { TR0=0; flag=0; dispaly(ms); }//按KEY1第六次定时器关闭,切换标志请零,显示d.1004-22 }}}。

相关文档
最新文档