基于单片机的电子闹钟设计
基于单片机的电子闹钟的设计毕业设计

基于单片机的电子闹钟的设计摘要:本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃功能的电子闹钟。
当前电子钟开发手段采用了较多的分立元器件,不仅占用很大空间而且利用率比较低。
单片机是集CPU、RAM、ROM、定时器/计数器和多种接口于一体的微控制器。
它体积小、成本低、功能强,广泛应用于智能产品和工业自动化上。
本设计应用单片机STC12C5A16AD芯片作为核心,由LCD1602液晶屏显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。
这种实现方法的优点是电路简单,性能可靠,实时性好,时间精度高,操作简单,编程容易。
关键词:电子闹钟,单片机,C语言编程1 绪论单片机是微型机的一个主要分支,就其组成和功能而言,一块单片机芯片就是一台计算机。
单片机具有如下特点:1集成度高、体积小、有很高的可靠性;有优异的性能价格比;2控制功能强;3低功耗、低电压,便于生产便携式产品;4外部总线增加了I2C、SPI等串行总线方式,进一步缩小了体积,简化了结构;5单片机的系统扩展、系统配置较典型、规范,容易构成各种规模的应用系统。
所以单片机的应用非常广泛,在智能仪表、机电一体化、实时控制、分布式多机系统以及人们的生活中均有用武之地。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思路和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种用软件代替硬件的控制技术,是对生产控制技术的一次革命。
利用单片机的智能性,可方便地实现具有智能的电子钟设计。
单片机均具有时钟振荡系统,利用系统时钟借助微处理器的定时器/计数器可实现电子钟功能。
然而系统时钟误差较大,电子钟的积累误差也可能较大,所以可以通过误差修正软件加以修正,或者在设计中加入高精度时钟日历芯片,以精确时间。
另外很多功能不同的单片机是兼容的,这就更便于实现产品的多功能性。
由于单片机具有货源充足、价格低廉,可软硬件结合使用,能够较方便的实现系统的多功能性,性价比高等诸多优点,故采用单片机作为本设计的硬件基础。
基于51单片机的多功能电子钟设计

基于51单片机的多功能电子钟设计1. 本文概述随着现代科技的发展,电子时钟已成为日常生活中不可或缺的一部分。
本文旨在介绍一种基于51单片机的多功能电子钟的设计与实现。
51单片机因其结构简单、成本低廉、易于编程等特点,在工业控制和教学实验中得到了广泛应用。
本文将重点阐述如何利用51单片机的这些特性来设计和实现一个具有基本时间显示、闹钟设定、温度显示等功能的电子钟。
本文的结构安排如下:将详细介绍51单片机的基本原理和特点,为后续的设计提供理论基础。
接着,将分析电子钟的功能需求,包括时间显示、闹钟设定、温度显示等,并基于这些需求进行系统设计。
将详细讨论电子钟的硬件设计,包括51单片机的选型、时钟电路、显示电路、温度传感器电路等。
软件设计部分将介绍如何通过编程实现电子钟的各项功能,包括时间管理、闹钟控制、温度读取等。
本文将通过实验验证所设计的电子钟的功能和性能,并对实验结果进行分析讨论。
通过本文的研究,旨在为电子钟的设计提供一种实用、经济、可靠的方法,同时也为51单片机的应用提供一个新的实践案例。
2. 51单片机概述51单片机,作为一种经典的微控制器,因其高性能、低功耗和易编程的特性而被广泛应用于工业控制、智能仪器和家用电器等领域。
它基于Intel 8051微处理器的架构,具备基本的算术逻辑单元(ALU)、程序计数器(PC)、累加器(ACC)和寄存器组等核心部件。
51单片机的核心是其8位CPU,能够处理8位数据和执行相应的指令集。
51单片机的内部结构主要包括中央处理单元(CPU)、存储器、定时器计数器、并行IO口、串行通信口等。
其存储器分为程序存储器(ROM)和数据存储器(RAM)。
程序存储器通常用于存放程序代码,而数据存储器则用于存放运行中的数据和临时变量。
51单片机还包含特殊功能寄存器(SFR),用于控制IO端口、定时器计数器和串行通信等。
51单片机的工作原理基于冯诺伊曼体系结构,即程序指令和数据存储在同一块存储器中,通过总线系统进行传输。
基于单片机电子时钟的设计与实现

基于单片机电子时钟的设计与实现一、设计目标设计一个基于单片机的电子时钟,能够准确显示时间并能够进行设置和调整。
二、硬件设计1.时钟部分:采用晶振芯片提供准确的时钟信号2.数码管显示部分:使用共阴数码管进行数字显示3.按键部分:设计几个按键用于设置和调整时间4.电源部分:采用直流电源供电三、软件设计1.功能设计a.时间设置功能:通过按键可以设置当前的时间,包括小时、分钟和秒钟。
b.时间调整功能:通过按键可以调整当前的时间,包括小时、分钟和秒钟。
c.时间显示功能:通过数码管可以实时显示当前的时间。
2.代码实现以C语言为例,以下是一个基于单片机的电子时钟的代码实现示例:```c#include <reg51.h>sbit DS18B20=P1^3; // 定义18B20数据线接口sbit beep=P2^3; // 定义蜂鸣器接口unsigned char hour,min,sec; // 定义小时、分钟、秒钟变量//函数声明void Delay_1ms(unsigned int count);bit Ds18b20Init(;unsigned char Ds18b20ReadByte(;void ReadTime(;void WriteTime(;void DisplayTime(;//主函数void mainP2=0x00;WriteTime(; // 写入时间while(1)ReadTime(; // 读取时间DisplayTime(; // 显示时间Delay_1ms(1000); // 延时1秒}//毫秒延时函数void Delay_1ms(unsigned int count) unsigned int i, j;for(i=0; i<count; i++)for(j=0; j<1275; j++);//18B20初始化函数bit Ds18b20Initbit presence;DS18B20=0;Delay_1ms(100); // 延时450us~1000us DS18B20=1;Delay_1ms(10); // 延时15us~60us presence=DS18B20;Delay_1ms(30); // 延时60us~240us return presence;//18B20读取字节函数unsigned char Ds18b20ReadByte unsigned char i, dat;for(i=0; i<8; i++)DS18B20=0;//主机发起读时序_nop_(; // 延时1us_nop_(; // 延时1us_nop_(; // 延时1usDS18B20=1;//主机释放总线_nop_(; // 延时1us_nop_(; // 延时1us_nop_(; // 延时1usdat,=(DS18B20<<i); // 读取数据位,存放在dat变量中Delay_1ms(3); // 读时序完成后等待48us再接收下一位}return dat;//读取时间函数void ReadTimeunsigned char temp;temp=0x00;while(temp!=0xaa)Ds18b20Init(; // 初始化温度传感器Delay_1ms(1);DS18B20=0xcc;Delay_1ms(1);DS18B20=0xbe;Delay_1ms(1);temp=Ds18b20ReadByte(; // 读取时间数组的标志位}for(temp=0; temp<7; temp++)//写入时间函数void WriteTimeunsigned char i,j;while(1)Ds18b20Init(;Delay_1ms(1);DS18B20=0xcc;Delay_1ms(1);DS18B20=0x4e;Delay_1ms(1);for(i=0; i<7; i++)DS18B20=0x55;Delay_1ms(1);DS18B20=0xaa;Delay_1ms(1);Ds18b20Init(;Delay_1ms(1);DS18B20=0xcc;Delay_1ms(1);DS18B20=0x48;Delay_1ms(1);j=Ds18b20ReadByte(; // 判断是否写入成功if(j==0x0a)break;}//显示时间函数void DisplayTimeP1=seg[hour/10]; // 显示十位小时P2=(P2&0xf0),0x08; // 点亮第一个数码管Delay_1ms(5); // 延时一段时间P2=0x0f;//熄灭数码管P1=seg[hour%10]; // 显示个位小时P2=(P2&0xf0),0x04; // 点亮第二个数码管Delay_1ms(5); // 延时一段时间P2=0x0f;//熄灭数码管P1=seg[min/10]; // 显示十位分钟P2=(P2&0xf0),0x02; // 点亮第三个数码管Delay_1ms(5); // 延时一段时间P2=0x0f;//熄灭数码管P1=seg[min%10]; // 显示个位分钟P2=(P2&0xf0),0x01; // 点亮第四个数码管Delay_1ms(5); // 延时一段时间P2=0x0f;//熄灭数码管P1=0x00;//空显示P2=0x00;//熄灭数码管```四、总结通过以上的硬件设计和软件实现,可以实现一个基于单片机的电子时钟。
基于单片机的定时闹钟设计.

目录目录 (I)一设计题目 (1)二设计要求 (1)三作用与目的 (1)四设备及软件 (2)1.AT89C51单片机 (2)2. Proteus仿真软件 (2)3.Keil软件 (3)五系统设计方案 (4)1 电路的总体原理框图 (4)2 工作原理 (5)六系统硬件设计 (5)1.系统总体设计 (5)2.系统时钟电路设计 (6)3.系统复位电路的设计 (6)4.闹钟指示电路设计 (6)5.电子闹钟的显示电路设计 (6)七系统软件设计 (7)1.主模块的设计 (7)2.基本显示模块设计 (8)3. 时间设定模块设计 (9)4. 闹铃功能的实现 (10)八 Proteus软件仿真 (11)1.本次试验的效果图 (12)2.性能及误差分析: (12)九设计中的问题及解决方法 (13)十设计心得 (14)参考文献 (15)致谢 (16)附录1 系统整体结构电路原理图 (17)附录2 程序清单 (18)基于单片机的定时闹钟设计一设计题目基于单片机的定时闹钟二设计要求1、能显示时时-分分-秒秒。
2、能够设定定时时间、修改定时时间。
3、定时时间到能发出报警声或者启动继电器,从而控制电器的启停。
三作用与目的以单片机为核心的数字时钟是很有社会意义和社会价值的。
钟表原先的报时功能已经原不能满足人们日益增长的要求,现代的电子时钟多带有类似自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等功能数字闹钟通过数字电路实现时、分、秒。
数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所成为人们日常生活中不可少的必需品。
由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。
多功能数字钟的应用非常普遍。
由单片机作为数字钟的核心控制器,通过它的时钟信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。
通过键盘可以进行校时、定时等功能。
单片机实训 ——基于单片机的电子闹钟设计

单片机实训——基于单片机的电子闹钟设计学院:电子与通信工程学院专业:电子信息工程技术班级:信息122姓名:冯健学号:22指导老师:邬志锋、香永辉实训时间:2013年6月30日-7月5日目录绪论 (3)第一章总体设计方案 (3)1.1 目的 (3)1.2 要求 (3)1.3 工作原理 (4)1.4 思路 (4)第二章系统硬件设计 (4)2.1 系统的硬件设计框 (4)2.2 主要单元的电路设计 (4)2.2.1 单片机最小系统 (4)2.2.2 DS1302时钟电路 (5)2.2.3 LCD1602液晶显示电路 (5)2.2.4 键盘电路 (6)第三章系统的软件设计 (6)3.1 主程序流程图 (6)3.2 时钟程序流程图 (7)第四章结束语 (7)附录 (8)绪论时钟的数字化,大力推动了计时的准确性和可靠性。
在单片机构成的装置中,实时时钟是必不可少的部件。
时钟芯片DS1302与单片机同步通信构成数字时钟电路。
DS1302的后背电源及对后背电源进行涓细电流充电功能保证电路断电后仍能保存时间和数据信息等。
该时钟电路强大的功能和优越的性能,在很多领域的应用中,尤其是某些自动化控制、长时间无人看守的测控系统等对时钟精确性和可靠性有较高的场合,具有很高的使用价值。
第一章总体设计方案1.1目的1)加深了对ds1302时钟芯片及其应用;2)了解了lcd1602液晶显示屏的工作原理和内部结构;3)能够熟练的应用lcd1602来做一些小制作。
1.2 要求1)根据系统设计的要求和设计思路,确定该系统的系统设计结构如图1所示。
电路整体上分为控制和显示部分,以单片机最小系统为核心电路,控制LCD显示,具体的显示内容和方式由软件来完成;图(1)2)由于有时钟和日期的调节功能需要校准电路和基本的复位电路,复位电路采用按键复位,调节键、加1键、确定键,闹钟调节键,共五键,计时功能由DS1302完成,显示功能则由LCD1602液晶完成。
基于51单片机的简易电子钟设计

基于51单片机的简易电子钟设计一、设计目的现代社会对于时间的要求越来越精确,电子钟成为家庭和办公场所不可缺少的设备之一、本设计基于51单片机,旨在实现一个简易的电子钟,可以显示当前的时间,并且能够通过按键进行时间的调整和设置闹钟。
二、设计原理本设计主要涉及到51单片机的IO口、定时器、中断、LCD显示技术等方面知识。
1.时钟模块时钟模块采用定时器0的中断进行时间的累加和更新。
以1秒为一个时间单位,每当定时器0中断发生,就将时间加1,并判断是否需要更新小时、分钟和秒的显示。
同时,根据用户按键的操作,可以调整时间的设定。
2.显示模块显示模块采用16x2字符LCD显示屏,通过51单片机的IO口与LCD连接。
可以显示当前时间和设置的闹钟时间。
初次上电或者重置后,LCD显示时间为00:00:00,通过定时器中断和键盘操作,实现时间的更新和设定闹钟功能。
3.键盘模块键盘模块采用矩阵键盘连接到51单片机的IO口上,用于用户进行时间的调整和设置闹钟。
通过查询键盘的按键状态,根据按键的不同操作,实现时间的调整和闹钟设定功能。
4.中断模块中断模块采用定时器0的中断,用于1秒的定时更新时间。
同时可以添加外部中断用于响应用户按键操作。
三、主要功能和实现步骤1.系统初始化。
2.设置定时器,每1秒产生一次中断。
3.初始化LCD显示屏,显示初始时间00:00:00。
4.查询键盘状态,判断是否有按键按下。
5.如果按键被按下,根据不同按键的功能进行相应的操作:-功能键:设置、调整、确认。
-数字键:根据键入的数字进行时间的调整和闹钟设定。
6.根据定时器的中断,更新时间的显示。
7.判断当前时间是否与闹钟设定时间相同,如果相同,则触发闹钟,进行提示。
8.循环执行步骤4-7,实现连续的时间显示和按键操作。
四、系统总结和改进使用51单片机设计的简易电子钟可以显示当前时间,并且实现时间的调整和闹钟设定功能。
但是由于硬件资源有限,只能实现基本的功能,不能进行其他高级功能的扩展,例如闹铃的音乐播放、温度、湿度的显示等。
单片机电子闹钟的设计 精品

电子信息工程专业课程设计任务书题目:基于单片机电子闹钟的设计设计内容1.能随意设定走时时间,具有对时功能,既能随意设定走时起始时间。
2.能设定闹铃时间,一旦走到该时间,能以声或光的形式报警。
3可采用交直流供电电源,即能自动切换。
4.设计5V直流电源,系统时钟电路、复位电路。
5.按钮与按键电路、闹铃声光电路。
设计步骤一、总体方案设计电子闹钟既可以通过纯硬件实现,也可以通过软硬件结合实现,根据电子时钟核心部件——秒信号的产生原理,通常可以用NE555时基电路、石英钟专用芯片、微处理器等三种形式来实现。
本系统采用基于微处理器的实现形式。
二、硬件选型工作对于每一个芯片要有具体型号,对每个分立元件要给出其参数三、硬件的设计和工作1.选择计算机机型2.设计支持计算机工作的外围电路3.接口电路4.其他相关电路设计或方案(电源,通信等)四、软件设计1.分配系统资源,编写系统初始化和主程序模块2.编写相关子程序3.其他程序模块(显示与键盘等处理程序)五、编写课程设计说明书,绘制完整的系统电路图(A3幅面)课程设计说明书要求1.课程设计说明书应采用学校统一印制的课程设计()说明书封面,书写应认真。
2.课程说明书应有目录,摘要,序言,主干内容(按章节编写),主要论理和参考书,附录应包括序清单,系统方框图和电路原理图。
3.课程设计说明书应包括上述设计步骤进行设计的分析和思考内容和引用的相关知识。
4.要求打印B5纸,排版要求请向指导教师索取。
目录第一章:系统概述…………………………………..(3 )一、电子闹钟的设计的基本原理………………………………( 3)二、电子闹钟的设计框图及基本工作过程…………………….(3 ) 第二章:系统硬件的设计…………………………...( 4 )一、单片机AT89C51芯片的简介………………………………( 4 )二、直流电源的设计……………………………………………( 7 )三、时钟电路的设计…………………………………………….( 7 )四、数码管的显示电路………………………………………….( 7 )五、复位电路…………………………………………………….( 9 )六、按键电路………………………………………………….....( 9 ) 第三章:系统软件的设计…………………..……( 10 )一、走时功能的设计……………………………………………( 10 )二、显示功能的设计……………………………………………( 11 )三、调整时间功能的设计………………………………………( 12 )四、喇叭和指示灯等功能的设计………………………………( 13 )五、闹铃功能的设计……………………………………………( 14 )六、时钟主程序…………………………………………………( 16 ) 第四章:心得体会………………………………….( 18 ) 第五章:附录:…………………………………….( 19 )一、系统整体硬件图……………………………………………( 19 )二、原件清单………………………………………………….(20 )第一章:系统概述一、.电子闹钟的设计的基本原理电子闹钟一般由走时、显示、调整时间和闹铃4项基本功能组成,这些功能在单片机里主要在单片机里由软件设计体现出来,其中,走时部分利用单片机里的定时器/计数器产生 的中断。
基于单片机数码管电子闹钟仿真设计

基于单⽚机数码管电⼦闹钟仿真设计#include <regx51.h>#include <intrins.h>sfr AUXR = 0x8e;/*数码管显⽰字符转换表*/unsigned char tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x39};signed char num[] = {10,10,10,10,10,10,10,10}; //数码管显⽰缓冲区signed char timeclock[] = {0,0,11,0,0,11,0,0}; //闹钟时间unsigned char TRH0,TRL0; //T0重载值的⾼字节和低字节bit clock = 0; //闹钟时间到标志位bit flag = 0; //1s闪烁标志位bit flag200ms = 0; //200ms定时标志位bit timesetup = 0; //时间设置标志位bit clocksetup = 0; //闹钟设置标志位unsigned position = 0; //设置⼩时,分钟,秒标志位(‘1’⼩时,‘2’分钟,‘3’秒)unsigned char Temp; //温度值unsigned char Time[5]; //时间值void key(); //按键判断执⾏函数void Ds1302_Display(); //时间显⽰函数void Ds18b20_Display(); //温度显⽰函数extern void Ds1302_Init(); //DS1302初始化函数void Ds1302_Time(unsigned char *time); //带参数的向DS18B20写时间extern void Write_Ds1302_Byte(unsigned char temp); //向DS1302写⼊数据extern unsigned char Read_Ds1302 (unsigned char address); //从DS1302读取数据extern unsigned char DS18B20_Temp(); //读取DS18B20温度值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机的电子闹钟设计摘要本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。
关键词:单片机;led;闹钟;定时器AbstractThis design, adopting AT89C51 chip as the core part with some necessary peripheral circuits, is a simple electronic clock which uses 5V DC as the power supply. Keywords:single chip machine ,in fixed time machine, alarm clock,LED1 引言1.1设计目的此次课程设计是在学习先修课程《单片机原理与系统设计》之后,为加强对学生系统设计和应用能力的培养而开设的综合设计训练环节。
本课程设计应结合《单片机原理与系统设计》课程的基础理论,重点强调实际应用技能训练,包括单片机系统设计的软件和硬件两部分。
其课程设计任务是使学生通过应用单片机系统设计的基本理论,基本知识与基本技能,掌握单片机应用系统各主要环节的设计、调试方法,初步掌握并具备应用单片机进行设备技术改造和产品开发的能力,培养学生的创新意识,提高学生的动手能力和分析问题、解决问题的能力。
1.2设计要求结合单片机知识,以AT89C51单片机为核心,利用七段LED数码管实现计时、校时及闹钟功能。
1.3设计方法以AT89C51单片机为核心,外加晶振电路,使用8个七段数码管显示,LED 采用动态扫描,用74ls245芯片作为驱动电路。
通过四个独立按键对时间进行定时、校时,从而实现闹钟提醒功能。
2 设计方案及原理2.1设计方案选AT89C51单片机作为系统核心,辅助外部产生时钟信号的晶振电路,再加上四个独立按键作为输入信号,使用8个七段数码管显示时间,芯片74ls245为数码管段选线的驱动,最后用蜂鸣器实现闹铃功能。
使用单片机的定时器T0计时时间为50ms,计时20次作为1s的时间基准。
第一部分,12MHz的晶振连接至单片机的时钟信号输入端;第二部分,四个独立按键加上四个上拉电阻连接至单片机的P1口的低四位;第三部分,单片机的P0口通过由芯片74ls245构成的驱动电路连接至数码管的段选线,单片机的P3口连接至数码管的位选线;第四部分,单片机的P2.1通过一个NPN型三极管连接至蜂鸣器。
8个七段数码管使用动态扫描显示时间,独立按键用软件编程实现对时间和闹钟时、分、秒的设置,再通过比较所设置的闹钟与时间是否相等,达到闹铃发出声响的效果。
2.2设计原理系统原理图如图2.1所示。
图2.1 系统原理图3 硬件设计硬件电路分四个模块:晶振电路、键盘电路、数码管显示电路、蜂鸣器驱动电路。
晶振电路使用12MHz晶体振荡器,经分频后供单片机工作。
键盘采用4个独立按键配以4个上拉电阻实现对时钟和闹钟的设定及修改。
由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片74ls245来驱动段码,用P3口作位码驱动。
发音部分是通过三极管放大驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。
系统硬件电路图如图3.1所示。
图3.1 系统硬件图4 软件设计源程序清单见附录。
主程序流程图如图4.1所示。
开始初始化设置闹铃判断显示时间键盘扫描图4.1 主程序流程图5 系统仿真及调试硬件部分设置了的三个按键K1、K2、K3、K4。
当按键K1第一次按下时,停止计时进入闹钟1的秒设置,当按键K1第二、第三次按下时,分别进入闹钟1的分设置和时设置,当按K1第四、第五、第六次按下时分别进入闹钟2的秒、分、时设置,当按K1第七、第八、第九次按下时分别进入闹钟3的秒、分、时设置,当按K1第十、第二一、第十二次按下时分别进入时间的秒、分、时设置,在K1按下的各阶段,可用按键K2、K3进行时间和闹铃时间的时、分、秒进行加减设置;当按键K1第十三次按下时恢复到时间显示功能。
当显示的时间和定时设置的时间一致时,蜂鸣器发出等时间断蜂鸣声,闹铃时间设置为60秒。
在各个闹钟设置阶段,如果有K4按下,则相应闹钟功能关闭或开启;如在闹铃时有K4按下则提前停止闹铃。
系统仿真图如图5.1所示。
图5.1 系统仿真图6 总结通过两周的努力,完成了电子闹钟的设计目的,实现了时间的显示、校时、设置闹钟、闹铃等功能。
这期间,我复习了单片机的相关知识,并结合查阅相关资料,设计了整体电路以及各模块的电路,对照硬件电路编写对应模块的子程序,最后将各个子程序整合到一个主程序中,完成了设计所需功能。
在设计中,我发现选择合适的元器件很重要,比如数码管有共阳极和共阴极两种,不同的选择会导致程序的不同,经过多次调试最终选择了共阳极数码管。
另外,我觉得软件的设计比硬件设计更重要,而且难度更大。
比如写一个程序看其功能很少认为编写程序简单,但到编程的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。
我在这次设计中收获颇多。
我对所学的理论知识在实践中加深了认识,同时更加熟练掌握了Proteus、Keil等软件的使用。
做任何事都需要耐心和细心,一点小的疏忽和懈怠可能导致整个设计失败。
还有一点,自己的设计思路不可能凭空产生,只有借鉴别人已有的设计并充分消化吸收成为自己的东西,才能做出更好的设计作品。
参考文献[1] 王思明.单片机原理及应用系统设计[M].北京:科学出版社,2012.[2] 陈明荧. 89C51单片机课程设计实训教材[M].北京:清华大学出版社,2003.[3] 刘瑞新.单片机原理及应用教程[M].北京:机械工业出版社,2005.[4] 杨文龙.单片机原理及应用[M].西安:西安电子科技大学出版社,2002.附录源程序清单://****************************头文件********************************#include<reg51.h>#include<intrins.h>//****************************宏定义********************************#define uchar unsigned char#define uint unsigned int//****************************位声明******************************** sbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;sbit fmq=P2^1;//************************数码管显示的数值************************** uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,// 0 1 2 3 4 50x82,0xf8,0x80,0x90,0xbf,0x0ff};// 6 7 8 9 - 灭void jia(); //定义时间加函数void jian(); //定义时间减函数//********************数组定义,数组内含有8个数值****************** uchar table1[8],table2[8],table3[8],table4[8];//**************************时间显示初始值************************** uchar shi=12,fen=0,miao=0;//**************************定义全局变量**************************** uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;uchar shi4,fen4,miao4;uchar flag, flag1, wss, cnt, cnt1, alm1, alm2, alm3;// 1秒等时位闪次数校时闹1 闹2 闹3uint flag2;// 蜂鸣//*********************延时函数,用于动态扫描数码管***************** void delay(uchar i){ uchar x,y;for(x=i;x>0;x--)for(y=120;y>0;y--);}//*******************************初始化函数*************************{ TMOD=0x01; //工作方式1TH0=0x3c; //定时时间为:50ms (65536-50000)/256TL0=0x0b0; //(65536-50000)%256ET0=1; //打开定时器EA=1; //开总中断TR0=1; //启动定时器}//********************显示子函数,用于显示时间数值***************** void display(){ uchar i,j;if(cnt!=10||wss==0){ table1[0]=miao%10; //分离秒的个位与十位table1[1]=miao/10;}else{ table1[0]=table1[1]=11;}if(cnt!=11||wss==0){ table1[3]=fen%10; //分离分的个位与十位table1[4]=fen/10;}else{ table1[3]=table1[4]=11;}if(cnt!=12||wss==0){ table1[6]=shi%10; //分离时的个位与十位table1[7]=shi/10;}else{ table1[6]=table1[7]=11;}table1[2]=table1[5]=10;j=0x7f;for(i=0;i<=7;i++) //从秒到时的扫描{ P3=j; //选通点亮八个数码管P0=table[table1[i]]; //显示数值delay(10); //调用延时程序j=_cror_(j,1); //循环右移}}//*******************显示子函数,用于显示定时1时间*****************{ uchar i,j;if(alm1==0){ if(cnt!=1||wss==0){ table2[0]=miao1%10; //分离秒的个位与十位table2[1]=miao1/10;}else{ table2[0]=table2[1]=11;}if(cnt!=2||wss==0){ table2[3]=fen1%10; //分离分的个位与十位table2[4]=fen1/10;}else{ table2[3]=table2[4]=11;}if(cnt!=3||wss==0){ table2[6]=shi1%10; //分离时的个位与十位table2[7]=shi1/10;}else{ table2[6]=table2[7]=11;}}elsetable2[0]=table2[1]=table2[3]=table2[4]=table2[6]=table2[7]=10;table2[2]= table2[5]=10;j=0x7f;for(i=0;i<=7;i++) //从秒到时的扫描{ P3=j; //选通点亮八个数码管P0=table[table2[i]]; //显示数值delay(10); //调用延时程序j=_cror_(j,1); //循环右移}}//********************显示子函数,用于显示定时2时间****************** void display2(){ uchar i,j;if(alm2==0){ if(cnt!=4||wss==0){ table3[0]=miao2%10; //分离秒的个位与十位table3[1]=miao2/10;else{ table3[0]=table3[1]=11;}if(cnt!=5||wss==0){ table3[3]=fen2%10; //分离分的个位与十位table3[4]=fen2/10;}else{ table3[3]=table3[4]=11;}if(cnt!=6||wss==0){ table3[6]=shi2%10; //分离时的个位与十位table3[7]=shi2/10;}else{ table3[6]=table3[7]=11;}}elsetable3[0]=table3[1]=table3[3]=table3[4]=table3[6]=table3[7]=10;table3[2]= table3[5]=10;j=0x7f;for(i=0;i<=7;i++) //从秒到时的扫描{ P3=j; //选通点亮八个数码管P0=table[table3[i]]; /显示数值delay(10); //调用延时程序j=_cror_(j,1); //循环右移}}//***************显示子函数,用于显示定时3时间数值****************// void display3(){ uchar i,j;if(alm3==0){ if(cnt!=7||wss==0){ table4[0]=miao3%10; //分离秒的个位与十位table4[1]=miao3/10;}else{ table4[0]=table4[1]=11;}if(cnt!=8||wss==0){ table4[3]=fen3%10; //分离分的个位与十位table4[4]=fen3/10;else{ table4[3]=table4[4]=11;}if(cnt!=9||wss==0){ table4[6]=shi3%10; //分离时的个位与十位table4[7]=shi3/10;}else{ table4[6]=table4[7]=11;}}elsetable4[0]=table4[1]=table4[3]=table4[4]=table4[6]=table4[7]=10;table4[2]= table4[5]=10;j=0x7f;for(i=0;i<=7;i++) //从秒到时的扫描{ P3=j; //选通点亮八个数码管P0=table[table4[i]]; //显示数值delay(10); //调用延时程序j=_cror_(j,1); //循环右移}}//***********************时间子函数*****************************// void shijian(){ if(flag>=20) //判断是否到一秒{ wss=~wss;flag=0; //到了,则标志位清零if(cnt1!=0){ miao4++; //秒加1if( miao4>59) //判断秒是否到60s{ miao4=0; //到了,则清零fen4++; //分加1if(fen4>59) //判断分是否到1min{ fen4=0; //到了,则清零shi4++; //时加1if(shi4>23) //判断时是否到24hshi4=0; //到了,则清零}}}else{ miao++; //秒加1if( miao>59) //判断秒是否到60s{ miao=0; //到了,则清零fen++; //分加1if(fen>59) //判断分是否到1min{ fen=0; // 到了,则清零shi++; //时加1if(shi>23) // 判断时是否到24hshi=0; //到了,则清零}}}}}//**************************键盘扫描子函数************************//void key_scan(){ if(key1==0){ while(!key1) //防止掉显{ if(cnt==1||cnt==2||cnt==3){ display1(); } //key1按了1、2、3次,调用闹钟1子程序if(cnt==4||cnt==5||cnt==6){ display2(); } // key1按了4、5、6次,调用闹钟2子程序if(cnt==7||cnt==8||cnt==9){ display3(); } // key1按了7、8、9次,调用闹钟3子程序if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){ display(); } // key1按了10、11、12、13次,调用计时子程序}cnt++; //记下按键key1按下的次数if(cnt==10&&cnt1==0){ miao4=miao;fen4=fen;shi4=shi;cnt1++;}if(cnt==13){ cnt=0;if(cnt1==1){ miao=miao4;fen=fen4;shi=shi4;}cnt1=0;}}if(key2==0) //判断key2是否按下{ while(!key2) //防止掉显{ if(cnt==1||cnt==2||cnt==3){ display1(); }if(cnt==4||cnt==5||cnt==6){ display2(); }if(cnt==7||cnt==8||cnt==9){ display3(); }if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13) { display(); }}jia(); //调用加1子函数}if(key3==0) //判断key3是否按下{ while(!key3) //防止掉显{ if(cnt==1||cnt==2||cnt==3){ display1(); }if(cnt==4||cnt==5||cnt==6){ display2(); }if(cnt==7||cnt==8||cnt==9){ display3(); }if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13) { display(); }}jian(); //调用减1子函数}if(key4==0) //判断key4是否按下{while(!key4) //防止掉显{ if(cnt==1||cnt==2||cnt==3){ alm1=~alm1;display1();}if(cnt==4||cnt==5||cnt==6){ alm2=~alm2;display2();}if(cnt==7||cnt==8||cnt==9){ alm3=~alm3;display3();}if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)display();}}}//****************************加1子函数*************************** void jia(){ if(cnt==1) //判断key1按下的次数是否为1 { miao1++; //是,则秒加1if(miao1>59) //判断秒是否大于60,是,则秒清零miao1=0;}if(cnt==2) //判断key1按下的次数是否为2 { fen1++; //是,则分加1if(fen1>59) //判断分是否大于60fen1=0; //是,则分清零}if(cnt==3) //判断key1按下的次数是否为3 { shi1++; //是,则时加1if(shi1>23) //判断时是否大于23shi1=0; //是,则时清零}if(cnt==4) //判断key1按下的次数是否为4 { miao2++; //是,则秒加1if(miao2>59) //判断秒是否大于60,是,则秒清零miao2=0;}if(cnt==5) //判断key1按下的次数是否为5 { fen2++; //是,则分加1if(fen2>59) //判断分是否大于60fen2=0; //是,则分清零}if(cnt==6) //判断key1按下的次数是否为6 { shi2++; //是,则时加1if(shi2>23) //判断时是否大于23shi2=0; //是,则时清零}if(cnt==7) //判断key1按下的次数是否为7{ miao3++; //是,则秒加1if(miao3>59) //判断秒是否大于60,是,则秒清零miao3=0;}if(cnt==8) //判断key1按下的次数是否为8 { fen3++; //是,则分加1if(fen3>59) //判断分是否大于60fen3=0; //是,则分清零}if(cnt==9) //判断key1按下的次数是否为9 { shi3++; //是,则时加1if(shi3>23) //判断时是否大于23shi3=0; //是,则时清零}if(cnt==10) //判断key1按下的次数是否为10{ miao++; //是,则秒加1if(miao>59) //判断秒是否大于60,是,则秒清零miao=0;cnt1++;}if(cnt==11) //判断key1按下的次数是否为11 { fen++; //是,则分加1if(fen>59) //判断分是否大于60fen=0; //是,则分清零cnt1++;}if(cnt==12) //判断key1按下的次数是否为12 { shi++; //是,则时加1if(shi>23) //判断时是否大于23shi=0; //是,则时清零cnt1++;}}//***************************减1子函数**************************// void jian(){ if(cnt==1) //判断key1按下的次数是否为1,是则秒减1if(miao1==255) //判断秒是否减到255,是,则秒置59 miao1=59;}if(cnt==2) //判断key1按下的次数是否为2,是则分减1 { fen1--;if(fen1==255) //判断分是否减到255,是,则分置59 fen1=59;}if(cnt==3) //判断key1按下的次数是否为3,是则时减1 { shi1--;if(shi1==255) //判断时是否减到255,是,则时置23 shi1=23;}if(cnt==4) //判断key1按下的次数是否为4,是则秒减1{ miao2--;if(miao2==255) //判断秒是否减到255,是,则秒置59 miao2=59;}if(cnt==5) //判断key1按下的次数是否为5,是则分减1{ fen2--;if(fen2==255) //判断分是否减到255,是,则分置59fen2=59;}if(cnt==6) //判断key1按下的次数是否为6,是则时减1{ shi2--;if(shi2==255) //判断时是否减到255,是,则时置23shi2=23;}if(cnt==7) //判断key1按下的次数是否为7,是则秒减1 { miao3--;if(miao3==255) //判断秒是否减到255,是,则秒置59 miao3=59;}if(cnt==8) //判断key1按下的次数是否为8,是则分减1{ fen3--;if(fen3==255) //判断分是否减到255,是,则分置59fen3=59;}if(cnt==9) //判断key1按下的次数是否为9,是则时减1if(shi3==255) //判断时是否减到255,是,则时置23shi3=23;}if(cnt==10) //判断key1按下的次数是否为10,是则秒减1{ miao--;if(miao==255) //判断秒是否减到255,是,则秒置59miao=59;cnt1++;}if(cnt==11) //判断key1按下的次数是否为11,是则分减1{ fen--;if(fen==255) //判断分是否减到255,是,则分置59fen=59;cnt1++;}if(cnt==12) //判断key1按下的次数是否为12,是则时减1{ shi--;if(shi==255) //判断时是否减到255,是,则时置23shi=23;cnt1++;}}//***************************闹铃子函数***************************//void clock()//判断秒的数值是否相等{ if(miao==miao1&&alm1==0||miao==miao2&&alm2==0||miao==miao3&&alm3 ==0)//是,在判断分是否相等if(fen==fen1&&alm1==0||fen==fen2&&alm2==0||fen==fen3&&alm3==0) //是,再判断时是否相等if(shi==shi1&&alm1==0||shi==shi2&&alm2==0||shi==shi3&&alm3==0){ flag2=0; //是,则标志位,flag2清零while(!(flag2==1200)&&(cnt==0)) //判断flag2是否到1200且不// 为调时状态{if(key4==0) //没有,则继续驱动蜂鸣器响{while(!key4)flag2=1200;}if(flag1>1) //等时方波驱动蜂鸣器{ fmq=~fmq;flag1=0;}shijian(); //调用时间子函数display(); //调用显示子函数}fmq=1; //关闭蜂鸣器}}//**************************主函数********************************// void main(){ init(); //调用初始化子函数while(1){ clock(); //闹钟子函数if(cnt==1||cnt==2||cnt==3) //显示子函数{ display1(); }if(cnt==4||cnt==5||cnt==6){ display2(); }if(cnt==7||cnt==8||cnt==9){ display3(); }if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){ display(); }shijian(); //调用时间子函数key_scan(); //调用键盘扫描子函数}}//**************************定时中断******************************// void time0() interrupt 1{ TH0=0x3c; //初值50ms (65536-50000)/256TL0=0x0b0; // (65536-50000)%256flag++; //标志位flag1++;flag2++;}(此文档部分内容来源于网络,如有侵权请告知删除,文档可自行编辑修改内容,供参考,感谢您的配合和支持)。