protel51可调电子时钟设计
基于51单片机的多功能电子时钟设计报告及其protel仿真电路及效果
单片机课程设计报告多功能电子数字钟姓名:学号:班级:指导教师:目录一课程设计题目-------------------------------- 3 二电路设计--------------------------------------- 4 三程序总体设计思路概述------------------- 5 四各模块程序设计及流程图---------------- 6 五课程设计心得及体会---------------------- 12 六程序、仿真电路效果见附录------------ 41一题目及要求本次单片机课程设计在Proteus软件仿真平台下实现,完成电路设计连接,编程、调试,仿真出实验结果。
具体要如下:用8051单片机设计扩展6位数码管的静态或动态显示电路,再连接几个按键和一个蜂鸣器报警电路,设计出一个多功能电子钟,实现以下功能:(1)走时(能实现时分秒,年月日的计时)(2)显示(分屏切换显示时分秒和年月日,修改时能定位闪烁显示)(3)校时(能用按键修改和校准时钟)(4)定时报警(能定点报时)本次课程设计要求每个学生使用Proteus仿真软件独立设计制作出电路图、完成程序设计和系统仿真调试,验收时能操作演示。
最后验收检查结果,评定成绩分为:(1)完成“走时+显示+秒闪”功能----及格(2)完成“校时修改”功能----中等(3)完成“校时修改位闪”----良好(4)完成“定点报警”功能,且使用资源少----优秀二电路设计(电路设计图见附件电路图)(1)采用89C51型号单片机(2)采用8位共阴数码管(3)因为单片机输出高电平时输出的电流不足以驱动数码管,所以在P0口与8位数码管之间加74LS373来驱动数码管(4)P2口与数码管选择位直接加74LS138译码器(5)蜂鸣器接P3.7口。
因为单片机输出高电平时输出的电流不足以驱动蜂鸣器所以蜂鸣器,所以P3.7口与蜂鸣器直接接反相器再接蜂鸣器的一端,蜂鸣器的另一端接5V电源。
基于-51单片机可调数字钟的设计
师学院单片机技术课程实践——基于89C51单片机可调数字钟的仿真设计班级::学号:辅导老师:设计时间:1. 设计目的1.1设计目的(1)掌握51系列部定时/计数器的原理和基本应用;(2)掌握使用单片机处理复杂逻辑的方法;(3)掌握多位数码管动态显示的方法;(4)掌握独立式(和矩阵)键盘的编程方法;(5)掌握利用汇编语言编写单片机系统的应用软件的方法;(6) 巩固,加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力;(7) 培养针对课题需要,选择和查阅有关手册,图表及文献资料的自学能力,提高组成系统,编程,调试的动手能力;(8) 熟悉单片机用系统开发,研制的过程,软硬件设计方法,容及步骤.(9) 了解数字钟的组成及工作原理.1.2设计性能(1)用51单片机的定时/计数器TMR0产生一秒的定时时间,作为秒计数时间;(2)当一秒产生时,秒计数加1;(3)开机时,显示00.00.00,并开始连续计时;(4)计时满23.29.59时,返回00.00.00重新开始计时;(5)在以上设计基础上,在单片机的I/O口上分别接入四个按键:K0—控制“秒”的调整,每按一次加1秒;K1—控制“分”的调整,每按一次加1分;K2—控制“时”的调整,每按一次加1小时;K3—时间复位按键。
2.系统电路的方案2.1实现时钟计时的基本方法用AT89C51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1开机时。
显示00-00-00的时间,开始计时;计时满23-59-59时,返回00-00-00重新计时AT89C51单片机的部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。
只要通过设置特殊功能寄存器TMOD,即可完成。
定时/计数器何时工作也是通过TCON特殊功能寄存器来设置的。
在此设计中,选择16位定时工作方式。
51单片机可调时电子时钟程序
//*******************基于51单片机的可调时电子时钟实验**********************////***电子时钟前两位为分钟,后两位为秒钟,逢38秒进1分***********************////***按下调时键第一次,秒钟闪烁,进入编辑状态******************************////***按下调时键第二次,分钟闪烁,进入编辑状态******************************////***按下调时键第三次,则确定**********************************************////***在编辑状态下,按下增/减按钮,闪烁位则进行加/减操作********************////***若在编辑状态下,按下增/减按钮时间超过1S,则闪烁位以0.5秒的速度自加1***//#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit wela1=P2^4;sbit wela2=P2^5;sbit wela3=P2^6;sbit wela4=P2^7;sbit key1=P1^5;sbit key2=P1^6;sbit key3=P1^7;//位定义uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar miao,fen,mode,modeflag;//模式标志位bit flag,flash,miao_long,fen_long;//*********延时子函数*************// void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//********定时器T0和变量的初始化****// void T0_init(){miao=00;fen=00;mode=0;modeflag=0;flash=0;flag=0;P2=0x0f;//锁存允许接口全部置低电平TMOD=0x01;//选择定时器工作方式TH0=(65536-2000)/256;TL0=(65536-2000)%256;//赋初值EA=1;//开总中断ET0=1;//开定时器中断TR0=1;//启动定时器}//*******数码管显示子函数***********// void display(){if(flag==0)//闪烁标志位为0时不闪烁{wela1=1;P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0; //送数给分位显示wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0; //送数给秒位显示}else //闪烁标志位为1时闪烁{if(mode==1)//模式为1,即调秒{if(miao_long==0)//没有长按加、减按钮{if(flash==0)//当闪烁等于0时{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0;}else//当闪烁等于1时{P0=0xff;wela3=0;wela4=1;P0=0xff;wela4=0;}}else//长按了加、减按钮{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0;}}else//模式为2,即调分{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0; //在秒位熄灭的那一刻,按下调时键时,要把秒位点亮if(fen_long==0)//没有长按加、减按钮{if(flash==0){P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0;}else{wela1=1;P0=0xff;wela1=0;wela2=1;P0=0xff;wela2=0;}}else//长按了加、减按钮{wela1=1;P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0;}}}}//*********key1按钮子程序**************//void key1_scan(){if(key1==0){delay(10);//消抖if(key1==0){modeflag++;//模式标志位自加1flag=1;//闪烁标志位打开mode++;//模式自加1if(mode==3)//只在模式1:调秒,模式2:调分中间选择mode=0;while(!key1);//松手检测}}else if(modeflag==3)//按键次数到了第三次{modeflag=0;flag=0;while(!key1);}}//************key2,key3子程序**************//void key23_scan(){if(key2==0)//加数的操作{delay(10);if(key2==0){if(mode==1)//如果是模式1的话,key2键对秒加1{miao++;if(miao==38)//38秒进1分miao=0;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key2){miao_long=1;miao++;if(miao==38)miao=0;delay(200);}miao_long=0;//跳出长按,恢复短按的状态}else if(mode==2)//如果是模式2的话,key2键对分加一{fen++;if(fen==60)//60分钟进1fen=0;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key2){fen_long=1;fen++;if(fen==60)fen=0;delay(200);}fen_long=0;//跳出长按,恢复短按的状态}}else if(key3==0)//减数的操作{delay(10);if(key3==0){if(mode==1)//如果是模式1的话,key3键对秒减一{miao--;if(miao==0)miao=37;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key3){miao_long=1;miao--;if(miao==0)miao=37;delay(200);}miao_long=0;//跳出长按,恢复短按的状态}else if(mode==2)//如果是模式2的话,key3键对分减一{fen--;if(fen==0)fen=59;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key3)fen_long=1;fen--;if(fen==0)fen=59;delay(200);}fen_long=0;//跳出长按,恢复短按的状态}}}}void main(){T0_init();while(1){key1_scan();key23_scan();}}void T0_time() interrupt 1{static uchar t=0;static uint i=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(flag==0)//时间显示调整{i++;if(i==20){i=0;miao++;if(miao==38){miao=0;fen++;if(fen==60){fen=0;}}}}t++;if(t==10){t=0;flash=~flash;//闪烁标志位取反}display();}。
基于汇编语言的51单片机可调数字钟的设计
目录摘要 (3)Abstract (4)引言 (5)第一章绪论 (6)1.1 课题的背景 (6)1.2课题的来源 (7)1.3课题的意义 (7)第二章设计目的及要求 (8)2.1设计目的 (8)2.2设计要求 (8)2.1.1 基本要求 (8)2.1.2 高级要求 (8)2.1.3毕业设计作品要求 (9)第三章系统方案选择与论证 (10)3.1方案选择 (10)3.1.1方案比较 (10)3.1.2 芯片的选择 (10)3.2方案论证 (11)3.2.1显示模块方案选择与论证 (11)3.2.2时钟信号方案选择与论证 (11)3.3电路设计最终方案 (12)第四章系统电路的总体方案 (13)4.1数字钟的工作原理 (13)4.1.1实现时钟计时的基本方法 (14)4.1.2数字钟的时间显示 (15)4.1.3数字钟的启、停及时间调整 (15)4.2总体设计 (16)第五章系统的硬件设计 (17)5.1 AT89C52单片机最小系统 (17)5.2单片机的概念 (17)5.2.1单片机的结构 (17)5.2.2单片机的功能介绍 (20)5.3复位电路 (23)5.4电源电路 (24)5.5时钟振荡电路 (24)5.6键盘控制电路 (24)5.7 LED数码管显示电路 (26)第六章系统的软件设计 (28)6.1系统软件设计流程图 (28)6.2 系统中断流程图 (29)6.3 子程序说明 (31)6.3.1 按键扫描 (31)6.3.2 数码管动态扫描 (32)第七章数字钟元件清单和软件介绍 (33)7.1数字钟元件清单 (33)7.2 软件介绍 (33)7.2.1软件调试 (34)7.2.2硬件调试 (34)第八章总结 (35)参考文献 (36)致谢 (37)附录 (38)附录一系统程序源代码 (38)附录二电路原理图 (44)基于汇编语言的51单片机可调数字钟的设计摘要在当今社会,随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此它特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件相结合,以作完善。
基于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单片机设计的简易电子钟可以显示当前时间,并且实现时间的调整和闹钟设定功能。
但是由于硬件资源有限,只能实现基本的功能,不能进行其他高级功能的扩展,例如闹铃的音乐播放、温度、湿度的显示等。
51单片机电子时钟设计
51单片机电子时钟设计电子时钟是一种非常实用的电子设备,它可以准确地显示时间,并拥有一系列的功能,如闹钟、日历等。
使用51单片机设计电子时钟,可以实现这些功能,同时还能够进行功能扩展,更好地满足用户需求。
首先,我们需要硬件上的准备工作。
51单片机需要与时钟(晶振)和显示器(LCD模块)进行连接。
晶振是提供单片机时钟脉冲的源头,LCD模块用于显示时间和各种功能。
同时,在电路中还需要进行一些扩展,如实时时钟模块(RTC模块)、按键模块等。
在软件设计方面,主要需要考虑以下几个方面:1.时钟脉冲:通过配置晶振的频率,可以生成单片机所需的时钟脉冲。
这个脉冲控制了单片机的运行速度,从而影响到时钟的准确性。
需要根据晶振频率进行相关配置。
2.时间的获取和计算:通过RTC模块可以获取当前的时钟数据(包括年、月、日、时、分、秒)。
在程序中,需要通过相应的接口获取这些数据,并进行计算。
比如,在显示时钟的时候,可以通过获取秒数、分钟数和小时数,并将其转换为相应的字符串进行显示。
3.菜单和按键功能:为了实现更多的功能,我们可以通过按键来实现菜单切换和功能选择。
在程序中,需要对按键进行扫描,判断按键的状态,然后进行相应的操作。
比如,按下菜单键可以进入菜单界面,通过上下键选择不同的功能,再通过确定键进行确认。
4.闹钟功能:闹钟功能是电子时钟中常见的功能之一、通过设置闹钟时间,并进行闹钟的开启或关闭,可以在指定的时间点触发相应的报警动作。
在程序中,需要编写逻辑判断闹钟是否到达指定的时间,然后触发报警。
5.日历功能:除了显示时间,电子时钟还可以显示当前的日期,包括年、月、日。
在程序中,需要编写相关的逻辑来获取日期数据,并进行显示。
通过以上的步骤,我们可以基本实现一个简单的电子时钟功能。
当然,根据用户的需求,还可以进行更多的功能扩展,比如添加温湿度监测、自动调光等功能。
总结起来,51单片机电子时钟的设计主要包括硬件和软件两个方面。
51单片机可调电子时钟
目录摘要 (2)Abstract (3)1.设计目的 (4)2.设计任务 (4)2.1.任务1:开机界面的设置 (4)2.2.任务2:LCD-1602显示日期时间 (4)2.3.任务3:时间与日期的调整 (4)3.硬件设计 (4)3.1.STC89C51(51单片机) (4)3.2.LCD-1602液晶显示屏 (5)4.软件设计 (7)4.1.应用软件 (7)4.2.程序框图 (7)4.3.使用说明 (7)4.4.注意事项 (8)4.5.调试结果 (8)5.收获 (9)附录: (10)附录A.硬件图 (10)附录B.主要程序 (11)摘要电子时钟是单片机系统的一个应用,由硬件和软件相配合使用。
本文通过对单片机的控制实现日历功能电子时钟的设计,以达到学习、了解单片机相关指令在各方面的应用。
硬件由主控器、显示电路、键盘接口等三个模块组成。
该时钟设计以STC-89C51作为主控器,控制显示时钟信息;显示模块用LCD-1602液晶屏;键盘接口电路由普通按键完成。
软件利用C语言编程实现单片机的控制功能。
关键词:电子时钟、单片机、LCD-1602液晶显示AbstractElectronic clock is a single chip microcomputer system application, by the use of hardware and software. In this paper, through the control of single-chip microcomputer to achieve the design of the electronic clock, in order to achieve learning, to understand the microcontroller related instructions in various aspects of the application. The hardware is composed of three modules, such as the main controller, the display circuit, the keyboard interface and so on. The clock is designed with STC-89C51 as the main controller, controlling the display clock information; the display module uses the LCD-1602 LCD screen; the keyboard interface circuit is completed by the ordinary button. Software uses C language programming microcontroller control functions.Key words: electronic clock, single chip microcomputer,LCD-1602 liquid crystal display1.设计目的该电子时钟由C语言编写而成,利用单片机定时器控制时钟运行,实现按键调整时间和日期的功能。
基于51单片机的多功能电子钟设计
基于51单片机的多功能电子钟设计主程序:#include#include#includeCharmiao,shi,fen,day=24,month=12,year1=20,year2=14,cmiao,c shi,cfen,cday,cmonth,cy ear1,cyear2;char jhmiao,jmiao,jfen;uint s1num,s4num,s6num;uchar count,count1,count2;uint a1,b1,c1,d1,e1,f1,g1;uint su,tt,mm,m,n,flag=0,flag2=0,flag3=0,flag4=0;uchar buff[4];char code dis[]={" mode "};char code dis1[]={" time "};char code dis2[]={" date "};char code dis3[]={" stopwatch "};char code dis6[]={"1234567"};charcodedis4[]={*************"};unsigned char pDat[7],pDat1[7];sbit s1=P1^7; //选择位sbit s2=P1^0; //数值加sbit s3=P1^4; //数值减sbit s4=P1^2; // 闹钟设置sbit s5=P1^5; // 凤鸣器sbit s6=P1^6; // 模式选择sbit s7=P1^3; //闹钟停止鸣叫sbit s8=P1^1; //启动sbit s9=P3^6; //温度报警void main(){uint i;s5=1;s8=1;m=0;n=0;init();EX0=1;//init_com(); //包含了对定时器0的设定while(s8) //初始模式设置{moshi();lcd_pos(0x00);for(i=0;i<15;i++){write_date(dis[i]);}lcd_pos(0x40);/* for(i=0;i<15;i++){write_date(dis1[i]);}*/}jhmiao=0;jmiao=0;jfen=0;miao=0;shi=0;fen=0;while(1){lcd_pos(0x02); write_date(0X2e); lcd_pos(0x04); write_date(0Xdf); lcd_pos(0x05); write_date(0X43); if(flag3==1){lcd_pos(0x06);for(i=0;i<10;i++) {write_date(dis1[i]); }write_sfm(10,miao); if(miao%2==0) {lcd_pos(0x46); write_date(0X20); lcd_pos(0x49); write_date(0X20); }else{lcd_pos(0x46); write_date(0X3a); lcd_pos(0x49); write_date(0X3a);}write_sfm(7,fen); write_sfm(4,shi);if(tt>310){s9=0;}if(tt<310)s9=1;}if(flag3==2){lcd_pos(0x40);for(i=0;i<15;i++) {write_date(dis2[i]);}lcd_pos(0x0a);write_date(0X2f);lcd_pos(0x0d);write_date(0X2f); write_sfm2(14,day); write_sfm2(11,month); write_sfm2(6,year1); write_sfm2(8,year2); if(tt>310) {s9=0;} else s9=1;}if(flag3==3){lcd_pos(0x0a);write_date(0X2f);lcd_pos(0x0d);write_date(0X2f);count2=(dis4[month-1]+2+day)%7;lcd_pos(0x4e);write_date(dis6[count2]);if(dis6[count2]=='6'||dis6[count2]=='7') { lcd_pos(0x4d);write_date(0X57);}else{lcd_pos(0x4d);write_date(0X20);}if(month==12&&day==24) {lcd_pos(0x4c);write_date(0X56);}else{lcd_pos(0x4c);write_date(0X20);}write_sfm(10,miao);if(miao%2==0){lcd_pos(0x46);write_date(0X20);lcd_pos(0x49);}else{lcd_pos(0x46);write_date(0X3a);lcd_pos(0x49);write_date(0X3a);}write_sfm(7,fen);write_sfm(4,shi);write_sfm2(14,day);write_sfm2(11,month); write_sfm2(6,year1);write_sfm2(8,year2); naozhong();if(tt>310) {s9=0;} else s9=1; }if(flag3==4){lcd_pos(0x06);for(i=0;i<10;i++){write_date(dis3[i]);}lcd_pos(0x46);write_date(0X3a);lcd_pos(0x49);write_date(0X3a);write_sfm(10,jhmiao); write_sfm(7,jmiao);if(s7==0){delay(5);if(s7==0){flag4++;while(!s7);if(flag4==1) while(1){TR0=0;if(s7==0){delay(5);if(s7==0)while(!s7); break;}}flag4=0;TR0=1;}}}dis_temp(tt);// dis_temp1(mm); keyscan();}}void int_0() interrupt 0{EA=0;IRcvStr(0xa0,n,&pDat1[0],8);//mm=pDat1[0];//mm<<=8; //两个字节组合为1个字 //mm=mm|pDat1[1]; mm=pDat1[0]*100+pDat1[1]*10+pDat1[2];pDat1[0]=0;pDat1[1]=0;pDat1[2]=0;n=n+8;EA=1;}void moshi(){if(s6==0){delay(5);if(s6==0){s6num++;while(!s6);if(s6num==1){flag3 = 1;lcd_pos(0x41);write_date(0X31);}if(s6num==2){flag3 = 2;lcd_pos(0x41);write_date(0X32);}if(s6num==3){flag3 = 3;lcd_pos(0x41);write_date(0X33);}if(s6num==4){flag3=4;lcd_pos(0x41);write_date(0X34);}if(s6num==5){s6num=0;lcd_pos(0x41);write_date(0X35);}}}}void naozhong(){if(miao==cmiao&&fen==cfen&&cshi==shi&&cday==day &&cmonth==month) {flag2++;if(flag2>1){flag2 = 0;s5 =0;lcd_pos(0x40); write_date(0X20); }}if(s7==0){delay(5);if(s7==0)s5=1;}if(s4 == 0){delay(5);if(s4 == 0){s4num ++; while(!s4);if(s4num==1) {TR0=0;a1 = miao;b1 = fen;c1 = shi;d1 = day;e1 = month;f1 = year2;g1 = year1;flag = 1;lcd_pos(0x40);write_date(0Xfc); keyscan();}if(s4num == 2){lcd_pos(0x40);write_date(0X21);cmiao = miao;cfen = fen;cshi = shi;cday = day;cmonth = month;cyear1 = year1;cyear2 = year2; miao = a1; fen = b1;shi = c1;day = d1;month = e1;year2 = f1;year1 = g1;TR0=1;flag=0;s1num=0;s4num=0;}}}}void keyscan(){if(s1==0){delay(5);if(s1==0){ s1num++;while(!s1);if(s1num==1){TR0=0;write_com(0x80+0x40+10); write_com(0x0f);lcd_pos(0x4f);write_date(0X73);}}if(s1num==2){write_com(0x80+0x40+7); lcd_pos(0x4f);write_date(0X6d);}if(s1num==3){write_com(0x80+0x40+4); lcd_pos(0x4f);write_date(0X68);}if(s1num==4){write_com(0x80+14); lcd_pos(0x4f);write_date(0X64); } if(s1num==5){write_com(0x80+11); lcd_pos(0x4f);write_date(0X4d); } if(s1num==6){write_com(0x80+9); lcd_pos(0x4f);write_date(0X79); } if(s1num==7){write_com(0x80+7); lcd_pos(0x4f);write_date(0X59); } if(flag==0){if(s1num==8){s1num=0;write_com(0x0c); lcd_pos(0x4f);write_date(0X38); TR0=1;}}}if(s1num!=0){if(s2==0){delay(5);if(s2==0){while(!s2);if(s1num==1){miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);//指针回原位}if(s1num==2){fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);//指针回原位} if(s1num==3){shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);//指针回原位} if(s1num==4){day++;if(day==31)day=0;write_sfm1(14,day);write_com(0x80+14);//指针回原位}if(s1num==5){month++;if(month==13)month=0;write_sfm1(11,month);write_com(0x80+11);//指针回原位}if(s1num==6){year2++;if(year2==100)year2=0;write_sfm1(9,year1);write_com(0x80+9);//指针回原位}if(s1num==7){year1++;if(year1==100)year1=0;write_sfm1(7,year1);write_com(0x80+7);//指针回原位}}}if(s3==0){delay(5);if(s3==0){while(!s3);if(s1num==1){miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10); }if(s1num==2){fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7); }if(s1num==3){shi--;if(shi==-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+4); } if(s1num==4){day--;if(day==-1)day=30;write_sfm1(14,shi);write_com(0x80+14);}if(s1num==5){month--;if(month==-1)month=12;write_sfm1(11,shi);write_com(0x80+11);}if(s1num==6){year2--;if(year2==-1)year2=99;write_sfm1(9,shi);write_com(0x80+9);}if(s1num==7){year1--;if(year1==-1)year1=99;write_sfm(7,shi);write_com(0x80+7);}}}}}void timer0() interrupt 1。
基于51单片机的电子时钟的设计
基于51单片机的电子时钟的设计电子时钟已经成为我们日常生活中不可或缺的设备之一。
随着科技的不断发展,电子时钟也越来越智能化,功能也越来越强大。
然而,简单的电子时钟也非常实用,可以帮助我们准确地把握时间,安排生活。
本文将基于51单片机,介绍一个简单的电子时钟的设计。
第一步,硬件设计。
要实现电子时钟,我们需要用到一个时钟模块,它可以为我们提供一个准确的时间基准。
同时,我们还需要将时间显示在一个数码管上,所以在硬件设计中我们需要使用数码管。
此外,为了方便调试,我们需要一个串口模块,它可以将调试信息输出到PC端,供我们观察。
具体的硬件设计如下:1.时钟模块我们使用的是DS1302时钟模块,它可以提供准确的时间计算。
DS1302时钟模块有六个引脚,分别是:VCC、GND、CLK、DAT、RST、DS。
其中,VCC和GND分别连接电源正负极,CLK是时钟,DAT是数据,RST是复位,DS是时钟数据存储器。
2.数码管我们使用共阴数码管,它有12个引脚,其中11个引脚是段选线,另外一个引脚是位选线。
为了方便连接,我们可以使用数码管驱动芯片,如74HC595。
它可以将51单片机的串行数据转为并行数据,以驱动数码管。
3.串口模块串口模块是用于通信的模块,它有4个引脚,分别是:VCC、GND、TX、RX。
其中,VCC 和GND连接电源正负极,TX是发送端口,RX是接收端口。
第二步,软件设计。
软件设计主要包括三个部分,分别是时钟模块的驱动程序、数码管的驱动程序和主程序。
我们需要编写一个DS1302时钟模块的驱动程序。
通过驱动程序,我们可以读取当前时间,并将其设置为时钟模块的初始时间。
同时,我们还需要实现定时器中断,以更新时钟显示。
数码管驱动程序是通过74HC595芯片实现的。
我们需要编写一个函数,将当前时间转换为段选数据,再通过74HC595芯片输出到数码管上。
3.主程序主程序主要包括时钟的初始化、时钟的设置、时钟的显示等功能。
基于51单片机的可调数码日历钟的设计与制作毕业设计论文
专科毕业设计(论文)题目基于51单片机的可调数码日历钟的设计与制作摘要单片机以其体积小、编程灵活、控制功能强大、价格低廉等特点被广泛应用在各种电子电器产品中。
单片机技术的出现和发展带来了电子技术和控制领域的一场革命。
单片机课程作为职业院校电子信息类专业一门重要的基础课程,它既是一门很有实用价值、实践性很强且很有趣味性的课程,同时它又是一门集硬件电路设计与软件编程于一体的学科,既要求我们有较好的电工电子技术基础知识,又要求有一定的逻辑思维和软件开发(编程)能力。
通过近几年对单片机的学习,我已掌握单片机的基本知识,并具备了单片机应用系统的初步开发能力。
即将毕业之际,我运用我所掌握的单片机知识设计和制作了一个基于51单片机的可调数码日历钟,这既是对我所学知识的总结与高度概括,同时也将自己所掌握的知识与实际应用结合起来,进一步提高工程实践能力。
数码日历钟是实际生活中应用较多的一个电子计时装置,可供人们查询日期、星期及掌握时间。
本文首先从数码日历钟的功能要求入手,对设计任务进行了分析,并将任务分解为若干个模块,提出在设计与制作过程中要用到的相关知识点,给出了本设计的硬件电路及软件流程,还给出了部分模块的源程序代码。
本设计经过多次调试运行无误,最终提交出一个完整的应用系统产品。
本次毕业设计的数码日历钟能在12864液晶屏上显示出年月日时分秒以及星期几,还能显示当前环境温度,并能通过按键调整日期和时间,在调整日期的同时通过相应算法自动实现星期几的调整,而且无论是否闰年、任何月份,当日期调整时都保证不会出现非法日期。
数码日历钟是一个非常实用的设计与制作,成本低廉,如能进一步完善,具有一定的推广使用价值。
本设计任务比较复杂,要考虑的问题很多,C语言的模块化程序设计思想较好地解决了这个问题,故本设计任务采用C语言编程。
关键词:51单片机,C语言,数码日历钟,毕业设计,制作I河南理工大学毕业设计论文目录摘要 (Ⅰ)1概述 (1)1.1 毕业设计的选题背景及制作意义 (1)1.1.1毕业设计的选题背景 (1)1.1.2毕业设计的制作意义 (1)1.2 数码日历钟的功能要求 (1)1.3 本设计制作的主要内容 (2)2数码日历钟的设计与制作任务分析 (3)2.1数码日历钟的设计与制作任务分析与分解 (3)2.2设计方案的论证及选择 (3)3 相关知识链接 (6)3.1 51单片机简介 (6)3.1.1 51单片机简介 (6)3.1.2 51单片机引脚功能介绍 (8)3.2由已知日期推算星期几 (11)3.2.1如何判断一个年份是否闰年 (11)3.2.2由已知日期如何推算星期几 (11)3.3 12864图形液晶的使用 (13)3.3.1 液晶概述 (13)3.3.2 LCM引脚功能介绍 (14)3.3.3 LCD12864图形液晶显示模块指令集 (15)3.3.4 LCD12864图形液晶显示模块与单片机的接口 (17)3.3.5 LCD12864图形液晶显示模块的基础函数 (17)3.4 51单片机中的中断与定时 (19)3.4.1 51单片机中的中断 (19)3.4.2 51单片机中的定时/计数器 (22)3.5数字温度传感器DS18B20的使用 (28)3.5.1 DS18B20概述 (28)3.5.2 DS18B20的内部结构 (29)3.5.3 DS18B20与单片机的接口电路 (32)3.5.4 DS18B20的操作命令 (32)-1-3.5.5 DS18B20的时序 (33)3.6 矩阵式按键的检测 (36)4系统设计与调试 (44)4.1 硬件系统设计与调试 (44)4.1.1硬件系统设计原理图 (44)4.1.2硬件系统元器件清单 (44)4.1.3硬件系统组装与调试 (45)4.2 软件系统设计与调试 (45)4.2.1软件系统设计 (45)4.2.2软件系统调试与仿真 (47)5结束语 (49)参考文献 (50)致谢 (51)-2-河南理工大学毕业设计论文 1 概述1、概述1.1 毕业设计的选题背景及制作意义1.1.1毕业设计的选题背景单片机以其体积小、编程灵活、控制功能强大、价格低廉等特点被广泛地应用在各种电子电器产品中。
基于C51单片机的实用电子时钟设计Protel课程设计
设计任务书题目:基于C51单片机的实用电子时钟设计初始条件1.一台装有PROTEL软件或以上版本的电脑及使用PROTEL软件绘制电路原理图和印刷电路板的根本技能;2.模拟、数字、高频、单片机、或者一个具有完备功能的电子电路系统。
要求完成的主要任务:1.绘制具有一定规模、一定复杂程度的电路原理图*.sch〔自选〕。
可以涉及模拟、数字、高频、单片机、或者一个具有完备功能的电子电路系统。
2.绘制相应电路原理图的双面印刷幅员*.pcb,对电路原理图进展仿真,给出仿真结果〔如波形*.sdf、数据〕并说明是否到达设计意图。
参考书目:1. 谢自美.电子线路设计·实验·测试(第三版).武汉:华中科技大学出版社2. 康华光. 电子技术根底模拟局部.高等教育出版社,2005时间安排查阅资料2天Protel设计2天电路仿真2天报告撰写1天指导老师签名:2021年月日系主任〔或责任老师〕签名:2021年月日摘要Altium Designer 是业界第一款一体化电子产品设计解决方案,它将设计流程、集成化PCB设计、可编程器件〔如FPGA〕设计和基于处理器的嵌入式软件开发功能整合在一起的产品,是一种能同时进展原理图、PCB和FPGA设计及嵌入式设计的解决方案,具有将设计方案从概念转变为最终产品所需的全部功能。
作为电子专业的学生,掌握EDA软件是非常重要的,纯熟使用各种EDA软件对以后的学习研究、工作都很有帮助。
本次课程设计主要是设计一个基于C51单片机的实用电子时钟。
通过课程设计,掌握Altium Designer的根本使用方法,学会画原理图,进展PCB制作,并给予必要的仿真。
关键词:Altium Designer;原理图;PCB制作;电子时钟AbstractAltium Designer is the industry's first unified electronics design solutions that will design flow, integrated PCB design, programmable devices (eg FPGA) design and processor-based embedded software development capabilities integrated products, is the one kind can simultaneously schematic, PCB and FPGA design and embedded design solutions with the design from concept to final product all the necessary functions.As electronics majors, master EDA software is very important, skilled use of a variety of EDA software for future study and research work are very helpful.The course design is to design a practical C51 microcontroller based electronic clock. Through curriculum design, master the basics of using Altium Designer, learn drawing schematics for PCB production and give the necessary simulation.Keywords:Altium Designer; schematic; PCB design; Electronic clock.目录摘要.......................................................................................................................................... I Abstract .................................................................................................................................. II 1 Altium Designer简介 . (1)1.1 Altium Designer特性 (1)1.2 Altium Designer的组成 (1)1.3 Altium Designer改良方面 (2)2 电子时钟系统设计 (3)2.1 MCU控制器简介 (3)2.2 单片机最小系统 (4)2.3 独立键盘 (4)2.4 LCD1602模块 (5)2.5 DS12C887时钟芯片 (7)2.6 电源模块 (8)3 原理图绘制 (9)3.1 创立新的PCB工程文件 (9)3.2 添加新的原理图空文件 (9)3.3 安装元件库 (10)3.4 放置电路元器件并绘制连线 (10)3.5 完善原理图 (11)3.6 检查电路原理图 (11)3.7 输出元件清单 (11)4 PCB幅员设计 (13)4.1 导入原理图设计数据 (13)4.2 PCB板型设计及元件布局 (13)4.3 PCB网络布线 (13)4.4 设计规那么DRC检查 (14)4.5 覆铜编辑及补泪滴处理 (15)4.6 PCB的3D显示 (16)5 仿真分析 (17)6 小结体会 (19)参考文献 (20)附录局部程序 (21)1Altium Designer简介1.1 Altium Designer特性Altium Designer是美国Altium公司开发的设计电路板软件Protel的晋级版本,其沿袭了Protel以前版本方便易学的特点,内部界面与Protel DXP大体一样,为了适应目前高密度和信号高速度的要求新增加了一些功能模块。
基于51的电子时钟的课程设计(完整)
1,课题设计的目的和意义学校给我们安排为期三周的单片机课程设计,可以说让我们受益匪浅。
细想,其目的及意义主要有以下几点:㈠,目的①通过单片机课程设计,加深对单片机的更深层次的理解,熟悉单片机的内部硬件资源,掌握单片机的编程方法及技巧,要学会对单片机的各部硬件资源的控制,分配,特别是掌握单片机中断,定时器的编程方法。
②通过这次设计,要学会怎么利用所学单片机知识独立设计系统的能力,达到学于致用的目的,要学会发散创造设计编程思想,要学会开发系统的一般过程,并不断创新。
㈡,意义①作为一名自动化专业的大三学生,做单片机课程设计是十分有意义的,而且是十分必要的。
在已度过的大学时间里,我们大多数接触的是专业课。
我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们提供了良好的实践平台。
②在这次课程设计中,我们运用到了以前所学的专业课知识以及一些实践性很强的软件和工具,如:Protel制图、Proteus仿真,WAWE仿真设备,汇编语言编译软件keil、单片机的原理等。
虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一很大收获。
2,系统方案设计及确定㈠,设计思路其中硬件由AT89S51单片机、六位LED驱动及显示电路、独立式键盘电路、蜂鸣器组成,其中显示采用动态显。
时钟的定时用定时器T0以50MS中断20次,从而实现一秒准确记时。
秒表的定时用定时器T1以10ms 中断1次记时。
精度达到0.01秒。
键盘将采用查询的方式判别。
最终成品是以可整电报时,调时,省电模式的时钟为主体,另外还可切换到秒表的电子钟系统。
①时钟功能利用单片机片内定时器(如T0)产生1s计时,自行设定时钟计数单元地址,包括秒单元、分单元、时单元,最大计数值为23时59分59秒。
用6位LED数码管显示时、分、秒,以24<小>时计时方式运行;使用按键可实现时、分调整,可增加“熄灭符”用于时间调整时的闪烁功能②秒表功能能通过按键实现秒表/时钟功能之间的转换;利用单片机内部定时器(如T1)实现秒表的计时,自行设定秒表计数单元地址,包括10ms单元、秒单元、分单元,通过4位LED数码管显示,最大计数值为99.99秒。
C51数字可调时钟设计
基于AT89C51+DS1602的数字可调时钟设计项目报告课程:单片机系统开发题目:基于AT89C51+DS1602的数字可调时钟专业:嵌入式系统开发姓名:翟霓学号:2009821104数字可调时钟设计1.1项目概述随着现代科技日新月异的发展,单片机的应用越来越广。
单片机仪器体积小、重量轻、功能强大、功耗低等特点而备受青睐。
在这个效率第一的时代,把握好时间是关键,数字时钟体积小,安装使用方便,不仅可以作为家用电子钟,而且可以广泛用于车站,体育场馆等公共场所。
1.2 项目要求设计基于AT89C51单片机的数字可调时钟,晶振采用12HZ,要求如下:(1)设计采用DS1602液晶显示两行字。
(2)可以显示星期及时、分、秒,24小时制。
(3)具有校时功能:可以对小时和分单独校时,对分校时的时候,停止分向小时的进位。
(4)具有整点提醒功能。
1.3系统设计数字时钟以AT89C51为核心,通过按键调试时间。
由复位电路模块,按键模块,显示模块组成。
1.3.1 框图设计1.3.2 知识点本项目通过学习和查阅资料,了解和掌握以下知识:●电源原理及设计。
●单片机复位电路工作原理及设计。
●DS1602液晶显示器的特性及使用。
●按键的应用。
●AT89C51单片机引脚。
●单片机C语言及程序设计。
●信号灯的原理及使用。
1.4 硬件设计基于AT89C51单片机数字可调时钟的元件清单如表1-1所示:表1-2 数字可调时钟电路图表1-1 基于AT89C51 单片机数字可调时钟元件清单元件名称型号数量用途单片机AT89C51 1个控制核心电解电容10uF 1个复位电路电阻10kΩ9个上拉电阻液晶显示DS1602 1个显示模块按键4个按键电路电源+5V/0.5A 1个提供+5V电源LED信号灯LED-RED 1个整点提醒1.5 软件设计1.5.1 程序流程图1、主程序如图1所示,初始化时LCD 第一行显示年、月、日,第二行显示时、分、秒(2011-03-23 week3 12:59:32)。
51单片机设置的电子闹钟(可调时间和闹钟)
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define LED P0 // 数码管的段选#define LIGHT P1 // 时分秒位的指示灯#define WS P2 // 数码管的位选sbit key1=P3^0; // 时间暂停/开始sbit key2=P3^1; // 时间/闹钟设置sbit key3=P3^2; // 增加sbit key4=P3^3; // 减少sbit alarm=P3^6; // 闹铃uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0-9uchar tab_dp[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // 0.-9.(带小数点)uchar data1[]={0,0,0,0,0,0};uchar data2[]={0,0,0,0,0,0};uint t,k,kk,k1,flag;uint bbh,bbm,bbs,bbh1,bbm1,bbs1;uint sec,min,hour,sec1,min1,hour1; // 定义秒,分,时void init();void display();void display_bb();void delay( uint );void keyscan();void main(){init();while(1){keyscan();if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if((bbh==hour)&&(bbm==min)&&data1[4]==0&&data1[5]==5) // 5s报时{alarm=~alarm;delay(1);}if((bbs==sec)&&(bbm==min)&&(bbh==hour)) // 可调报时{alarm=~alarm;delay(1);}}}void init(){WS=LIGHT=flag=0;sec=min=hour=0; // 将0赋给时分秒TMOD=0x01; // 方式1 P129(见课本)TH0=0x3c; // 65536-50000=15536=0x3cb0(50ms) P128(见课本)TL0=0xb0;EA=1; // 开总中断P161(见课本)TR0=1; // 定时/计数器0开启ET0=1; // 定时器/计数器0溢出中断启动P161(见课本)}void delay( unsigned int t) // 延时函数{unsigned int i;while(t--)for(i=0;i<125;i++);}void display() // 显示时间函数{if(TF0==1) // 定时器/计数器溢出P130(见课本){TF0=0; // 清中断标志位t++;if(t==20) // (50ms*20=1s){t=0;sec++; // 秒加1if(sec==60) // 秒为60,则清零,分加1{sec=0;min++;}if(min==60) // 分为60,则清零,时加1{min=0;hour++;}if(hour==24)// 时为24,则清零{hour=0;}}}data1[5]=sec%10;data1[4]=sec/10;data1[3]=min%10;data1[2]=min/10;data1[1]=hour%10;data1[0]=hour/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data1[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data1[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data1[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data1[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data1[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data1[0]];delay(1);}void display_bb() // 显示闹钟函数{data2[5]=bbs%10;data2[4]=bbs/10;data2[3]=bbm%10;data2[2]=bbm/10;data2[1]=bbh%10;data2[0]=bbh/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data2[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data2[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data2[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data2[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data2[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data2[0]];delay(1);}void keyscan() // 键盘扫描{if(key1==0) // 暂停/开始{++kk;while(!key1){display();if(kk==1){TR0=0;if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if(key2==0) // 模式选择(调节时间/闹钟){k1++;while(!key2){if(k1==1) // 第1次按下{sec1=sec; // 保存秒的数值sec=88; // 显示88,表示可以调节秒的数值了display(); // 显示88sec=sec1; // 恢复前一刻秒的数值}if(k1==2){min1=min;min=88;display();delay(1);min=min1;}if(k1==3){hour1=hour;hour=88;delay(1);hour=hour1;}if(k1==4){sec1=bbs; // 保存秒的数值bbs=66; // 显示66,表示可以调节秒的数值了display_bb(); // 显示66bbs=sec1; // 恢复前一刻秒的数值}if(k1==5){min1=bbm;bbm=66;display_bb();delay(10);bbm=min1;}if(k1==6){hour1=bbh;bbh=66;display_bb();delay(10);bbh=hour1;}if(k1==7){k1=0;display();}}}if(key3==0) // 时间/闹钟增加设置{while(!key3){if(k1==1){sec++;// 秒加1if(sec==60)sec=0;display();}if(k1==2){min++;delay(60);if(min==60)min=0;display();}if(k1==3){hour++;delay(60);if(hour==24)hour=0;display();}if(k1==4){bbs++; // 秒加1delay(60);if(bbs==60)bbs=0;display_bb();}if(k1==5){bbm++;delay(60);if(bbm==60)bbm=0;display_bb();}if(k1==6){bbh++;delay(60);if(bbh==24)bbh=0;display_bb();if(k1==7){k1=0;display();}}}if(key4==0) // 时间/闹钟减少设置{while(!key4){if(k1==1){sec--; // 秒加1delay(60);if(sec==0)sec=60;display();}if(k1==2){min--;delay(60);if(min==0)min=60;display();}if(k1==3){hour--;delay(60);if(hour==0)hour=24;display();}if(k1==4){bbs--; // 秒减1delay(60);if(bbs==0)bbs=60;display_bb();if(k1==5){bbm--;delay(60);if(bbm==0)bbm=60;display_bb();}if(k1==6){bbh--;delay(60);if(bbh==0)bbh=24;display_bb();}if(k1==7){k1=0;display();}}}}}if(kk==2){kk=0;k1=0;TR0=1;}}}。
51单片机做可调时钟(带秒表)另附proteus仿真图
/*********************信息学院09级电一***********************/
/**************************柳剑*******************************/
void display(uchar hour,uchar min,uchar sec)
{
unsigned char i;
TempData[0]=duanma[hour/10];
TempData[1]=duanma[hour%10];
TempData[2]=0x40;
TempData[3]=duanma[min/10];//用于显示分
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit menu=P3^2;
sbit reset=P1^0;//清零,秒表状态下也是清零
sbit add_min=P1^1;//调分时加一
sbit add_hour=P1^2;//调时时加一,秒表时按下不动跑表,松开暂停,再次按下继续跑表
hour0++;
if(hour0==24)
hour0=0;
}
}
}
}
/*************按键扫描1****************/
void keyscan1()
{
//display(hour0,min0,sec0);
if(reset==0)
{
51单片机制作的电子时钟的proteus仿真
通过proteus仿真51单片机制作的电子钟----------by lyz这是一个利用proteus仿真简易电子钟的例子,通过c51单片机和一块1602液晶显示屏来工作,十分简单,这样的实践是初学者不错的练习。
第一步:首先,点开isis.exe(切记不是ARES.EXE),如图1通过proteus把原理图布好。
单片机可以选用AT89c51,液晶显示可通过搜索关键字LM016L得到。
由于本电路选用P0口,因此加上了RP1排阻作为上拉电阻。
图1第二步:编写程序如下,时间略有误差(us级),可通过keil中的debug调试地更为精确:#include<reg52.h>typedef unsigned char uchar;typedef unsigned int uint;sbit rs=P3^2;sbit wr=P3^3;sbit lcden=P3^4;uchar timecount=0;void delay(uint i){uint a,b;for(a=i;a>0;a--)for(b=10;b>0;b--);}/********************1602*****************/ void write_com(uchar com){P0=com;rs=0;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void write_date(uchar date){P0=date;rs=1;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void init(){wr=0;write_com(0x38);delay(20);write_com(0x0f);delay(20);write_com(0x06);delay(20);write_com(0x01);delay(20);}/*********************************************************主函数**********************************************************/void main(){uchar a,second=0,minute=0,hour=0;uchar table[8];TMOD|=0x01; //定时/计数器0工作于定时器模式,方式1TH0=(65536-5000)/256;TL0=(65536-5000)%256; //50ms定时常数EA=1; //开总中断ET0=1; //允许定时/计数器0 中断TR0=1; //启动定时/计数器0 中断P0=0;P2&=0x1F;init();while(1){if(timecount>19) //*****20乘50为1000ms {timecount=0;second++;}if(second==60){second=0;minute++;}if(minute==60){minute=0;hour++;}if(hour==24){hour=0;}table[0]=hour/10+48; //***数字加上48对应的它的ascll码,用来显示在液晶上table[1]=hour%10+48;table[2]=58; //***58对应冒号table[3]=minute/10+48;table[4]=minute%10+48;table[5]=0;table[6]=second/10+48;table[7]=second%10+48;write_com(0x80);delay(20);for(a=0;a<8;a++){write_date(table[a]);delay(20);}}}/*********************************************************中断服务函数**********************************************************/void Time0(void) interrupt 1 // using 0{TH0=(65536-5000)/256;TL0=(65536-5000)%256; //50ms定时常数timecount++;}/*********************************************************/第三步:双击电路图中的单片机,如下添加hex文件。
基于51单片机电子时钟设计
基于51单片机电子时钟设计51单片机是一种非常常见的单片机,被广泛应用于各种电子设备中。
在本文中,我将基于51单片机设计一个电子时钟。
首先,我们需要收集各种元器件,包括51单片机、数码管显示模块、电容、电阻、晶体振荡器等。
接下来,我们将进行硬件连接。
首先,将数码管显示模块连接到单片机的相应引脚上。
数码管显示模块通常由多个七段数码管组成,每个七段数码管有共阴极和共阳极两种类型,根据具体的数码管型号选择适当的连接方式。
接下来,连接晶体振荡器到单片机上。
晶体振荡器通常用于提供时钟信号,给单片机提供准确的时钟频率。
选择适当的晶体振荡器频率,将其连接到单片机的相应引脚上。
同时,还需要连接其他的元件,如电容和电阻。
电容用于稳定电压,在电路中通常用作滤波器。
选择合适的电容,将其连接到电源引脚上。
电阻用于限制电流和调整电压,根据需要选择合适的电阻值,并将其连接到相应的引脚上。
接下来,我们将进行软件编程。
首先,我们需要在编程环境中选择适当的编程语言,比如C语言。
然后,我们需要编写代码来实现时钟的各种功能。
首先,我们需要初始化单片机的引脚。
这可以通过设置相应的寄存器来实现,以确保单片机正常工作。
接下来,我们需要编写代码来实现时钟的显示功能。
我们可以使用循环来不断刷新数码管显示,以确保显示的时钟数值实时更新。
可以通过读取单片机内部的计时器或使用外部的定时模块来获取当前的时间,并将其转换为数码管可以显示的格式。
除了显示功能之外,还可以添加其他功能,比如闹钟、定时器等。
闹钟功能可以通过检测当前时间和设置的闹钟时间来触发相应的提醒。
定时器功能可以用来设置特定的时间间隔,并在到达设定时间时触发相应的操作。
总结起来,基于51单片机设计一个电子时钟需要进行硬件连接和软件编程。
通过合理的硬件连接和编写精确的代码,我们可以实现一个功能齐全的电子时钟,满足各种需求。
基于51单片机的电子时钟设计
基于51单片机的电子时钟设计
电子时钟是一种使用电子元件和计算机技术制造的时计,它可以显示年、月、日、时、分、秒等时间信息,并且具有显示精确、功能齐全、操
作简便等特点。
本文将基于51单片机设计一个电子时钟。
一、硬件设计:
1.时钟模块:我们可以使用DS1302时钟模块作为实时时钟芯片,它
可以提供精确的时间信息,并且可以通过单片机与之进行通信。
2.显示模块:我们可以使用共阳数码管进行时间的显示,将时钟设计
成6位7段显示器。
3.按键模块:我们可以使用按键作为输入方式,通过按键调整时间信息。
二、软件设计:
1.初始化:首先,我们需要初始化时钟模块和显示模块,使它们正常
工作。
同时,设置时钟的初始时间为系统当前时间。
2.获取时间:通过与时钟模块的通信,获取当前的时间信息,包括年、月、日、时、分、秒等。
3.显示时间:将获取到的时间信息通过显示模块显示出来,分别显示
在6个数码管上。
4.时间调整:通过按键模块的输入,判断用户是否需要调整时间。
如
果需要,可以通过按键的不同组合来调整时、分、秒等时间信息。
5.刷新显示:通过不断更新显示模块的输入信号来实现时钟的流动性,保持秒针不断运动的效果。
6.时间保存:为了保证时钟断电后依然能够保持时间,我们需要将时
钟模块获取到的时间信息保存在特定的EEPROM中。
7.闹钟功能:可以通过按键设置闹钟,当到达闹钟时间时,会通过蜂
鸣器发出响声。
以上就是基于51单片机的电子时钟设计方案。
通过对硬件和软件的
综合设计,我们可以实现一个功能齐全的电子时钟。
51可调电子时钟系统设计_最终版
基于51单片机的可调电子时钟系统设计一.系统设计概况1.系统总体结构本设计使用AT89C52单片机作为电子时钟主机的微控制器,系统由最小系统、键盘与显示和RS232通信模块等几部分组成。
系统实现的总体结构框图如图1所示。
图1系统总体结构框图2. 系统实现的功能此电子时钟设计以单片机AT89C52为系统核心控制器,采用8255扩展芯片,可以实现日常时、分、秒时钟运行。
开机时钟时间默认为6位0,日期默认为110101,通过调节按键可实现时位和分位的加减,并且可以一键切换为日期年月日显示和日减,拥有开始、暂停和复位功能。
选用74LS245驱动6位7段LED 数码管,设计以RS-232总线实现单片机和主机的信息交换电路。
二.硬件设计1.系统总体方案方案一:以CPLD或FPGA为控制核心的设计方案。
此方案主要具有以下的优点:控制器拥有丰富的硬件资源,可实现强大的逻辑功能,可减少系统外围电路的数量,提高系统的稳定性;直接由硬件实现逻辑功能,并行执行,从而能使系统的响应速度速度大大提高。
此种方案的缺点是:芯片使用方法复杂,其中FPGA的编程信息还需存放在外部存储器上。
方案二:以单片机为控制核心的设计方案。
此方案主要具有以下的优点:单片机一般芯片面积非常小,工作频率很低,所以系统的整体功耗低,采用单片机为核心控制器的可调时钟系统具有成本低、效益高的优点。
另外,单片机控制系统在灵活性和程序的可移植性方面拥有明显优势。
考虑到题目要求及性价比,我们选择方案二。
AT89C52最小系统所谓单片机的最小应用系统是指能维持单片机运行的最简单配置的系统,即组成单片机系统所必需的一些元器件,无论完成什么任务,这些东西都是必须的。
由于AT89C52芯片内部已有8KB程序存储器,本设计的程序也不长,所以只连接了晶体振荡电路、复位开关和电源部分等几个必须的功能部件,如图4所示。
图2 最小系统2. 显示器键盘模块方案显示器键盘是是单片机控制系统的输入输出通道,是系统与使用人员间信息传递的窗口,单片机系统常用显示器键盘设计方案如下:方案一:采用Intel8279可编程键盘/显示控制接口芯片。
基于51单片机的多功能电子时钟设计
单片机应用设计入门课程设计尹康2012029010010一. 题目利用51单片机设计一个电子时钟要求:能够用数码管显示小时、分钟、秒,各2位数字;系统应具有复位电路、电源电路等基本组成部分;能够进行时间设定;能够进行日期设定。
二. 方案设计1.系统框图直流电源复位电路独立按键控制部分STC89C51显示部分(8位共阴数码管)2.设计说明用单片机定时器完成计时功能,定时器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定时1秒的中断计数初值为100,每中断一次中断计数初值减1,当减到0时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h 到了。
采用动态显示法实现LED显示:通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。
由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。
该电子时钟由STC89C51,BUTTON,共阴数码管等构成,采用晶振电路作为驱动电路,晶振电路的晶振频率为12MHZ。
60秒为一分钟,60分钟为一小时,24小时为一天,又重00:00:00开始计时。
没有按键按键按下时,时钟正常运行。
当按下调节时钟按键change,时钟就会进入设置时间界面(时钟不会停止工作),重复按下change 键,系统状态在调整小时、调整分钟、正常显示之间切换。
按add或reduce键,就可以数值进行加1或减1操作。
三. 电路设计1.整体电路:2.8位共阴数码管电路:3.单片机系统:4.独立按键电路:5.晶振6.复位电路:7.电源电路:四. 程序设计#include<reg52.h> //包含单片机寄存的头文件sbit led1=P1^0; sbit led2=P1^2; sbit led5=P1^5; sbit du=P2^6;//段选sbit we=P2^7;//位选sbit s1=P3^4;sbit s2=P3^5;sbit s3=P3^6;sbit s4=P3^7;sbit beep=P2^3; sbit dot=P0^7; unsigned char shi,fen,miao,unit,keyv,key,av,ashi,afen,ami ao;void delay() //1ms{unsigned char a,b;for(b=102;b>0;b--)for(a=3;a>0;a--);}void delay5(void) //误差5ms{unsigned char a,b;for(b=15;b>0;b--)for(a=152;a>0;a--);}void delayhalf (void) //误差0.5s{unsigned char a,b,c;for(c=23;c>0;c--)for(b=152;b>0;b--)for(a=70;a>0;a--);}void display( unsigned char h,f,s){unsigned char codeduma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x77,0x38}; unsigned char codemawei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0 xbf,0x7f};unsigned char shiwan,wan,qian,bai,shi,ge;shiwan=h/10;wan=h%10;qian=f/10;bai=f%10;shi=s/10;ge=s%10;P0=duma[shiwan];du=1;du=0;P0=mawei[0];we=1;we=0;delay();P0=duma[wan];dot=1;du=1;du=0;dot=0;P0=mawei[1];we=1;we=0;delay();P0=duma[qian]; du=1;du=0;P0=mawei[2];we=1;we=0;delay();P0=duma[bai]; dot=1;du=1;du=0;dot=0;P0=mawei[3];we=1;we=0;delay();if(key!=1&&key!=2) {P0=duma[shi];du=1;du=0;P0=mawei[4];we=1;we=0;delay();P0=duma[ge];du=1;du=0;P0=mawei[5];we=1;we=0;delay();}if(key==1||key==2) {P0=duma[10];du=1;du=0;P0=mawei[4]; we=1;we=0;delay();P0=duma[11]; du=1;du=0;P0=mawei[5]; we=1;we=0;delay();}P0=0xff;we=1;we=0;}passtime(){if(unit==100) {miao++;unit=0;led1=!led1;led2=!led2; }if(miao==60) {fen++;miao=0;}if(fen==60) {shi++;fen=0;}if(shi==24) {shi=0;} }void InitTimer0(void)//10ms{TMOD = 0x01;TH0 = 0x0DC;TL0 = 0x00;EA = 1;ET0 = 1;TR0 = 1;unit=0;}void Timer0Interrupt(void) interrupt 1 {TH0 = 0x0DC;TL0 = 0x00;unit++ ;//add your code here! passtime();}void adjustment(void){if(s1==0){delay5();if(s1==0){while(!s1);amiao=0;key++;led5=0;if(key==5){key=0;TR0=1;led5=1;}}}//s1 countif(s2==0){delay5();if(s2==0){while(!s2);if(key==1)//alram{ashi++;if(ashi==24){ashi=0;}}if(key==2){afen++;if(afen==60){afen=0;}}//alramif(key==4)/////{miao=0;TR0=0;fen++;if(fen==60){fen=0;}}if(key==3)///{miao=0;TR0=0;shi++;if(shi==24){shi=0;}}}}//adj +///////////////////adj-if(s3==0) {delay5();if(s3==0){while(!s3);if(key==1)//alram{ashi--;if(ashi==-1){ashi=23;}}if(key==2){afen--;if(afen==-1){afen=59;}}//alramif(key==4)//{miao=0;TR0=0;fen--;if(fen==-1){fen=59;}}if(key==3)///{miao=0;TR0=0;shi--;if(shi==-1){shi=23;}}}}//adj -}void alarm(void){if(fen!=afen){av=0;}if(av==0){if(shi==ashi&&fen==afen){beep=0;delayhalf();beep=1;delayhalf();beep=0;delayhalf();beep=1;delayhalf();}}//av==0}********************************* 主函数*********************************void main(void){ashi=7;afen=0;InitTimer0();led2=0;while(1){if(keyv==0)//close display{if(s4==0){delay5();if(s4==0){while(!s4);keyv=1;av=1;}}}if(keyv==1){if(s4==0){delay5();if(s4==0){while(!s4); keyv=0; } }}//close displayif(keyv==0){adjustment();if(key!=1&&key!=2){display(shi,fen,miao);}if(key==1||key==2){display(ashi,afen,amiao);}}if(key==0||key==3||key==4){alarm();}}//while}五. 实物仿真六. 心得体会1.单片机,是集CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器,自20世纪70年代问世以来,以其极高的性价比,受到人们的重视和关注,应用很广、发展很快。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51可调电子时钟系统设计一.实验目的1、熟悉protel软件的使用方法。
2、掌握LM324集成运放电路对放大器性能的影响。
3、学习掌握软硬件设计4、学会protel PCB制板二.实验步骤1.系统总体结构本设计使用AT89C52单片机作为电子时钟主机的微控制器,系统由最小系统、键盘与显示和RS232通信模块等几部分组成。
系统实现的总体结构框图如图1所示。
图1系统总体结构框图2. 系统实现的功能此电子时钟设计以单片机AT89C52为系统核心控制器,采用8255扩展芯片,可以实现日常时、分、秒时钟运行。
开机时钟时间默认为6位0,日期默认为110101,通过调节按键可实现时位和分位的加减,并且可以一键切换为日期年月日显示和日减,拥有开始、暂停和复位功能。
选用74LS245驱动6位7段LED 数码管,设计以RS-232总线实现单片机和主机的信息交换电路。
三.硬件设计1.系统总体方案方案一:以CPLD或FPGA为控制核心的设计方案。
此方案主要具有以下的优点:控制器拥有丰富的硬件资源,可实现强大的逻辑功能,可减少系统外围电路的数量,提高系统的稳定性;直接由硬件实现逻辑功能,并行执行,从而能使系统的响应速度速度大大提高。
此种方案的缺点是:芯片使用方法复杂,其中FPGA的编程信息还需存放在外部存储器上。
方案二:以单片机为控制核心的设计方案。
此方案主要具有以下的优点:单片机一般芯片面积非常小,工作频率很低,所以系统的整体功耗低,采用单片机为核心控制器的可调时钟系统具有成本低、效益高的优点。
另外,单片机控制系统在灵活性和程序的可移植性方面拥有明显优势。
考虑到题目要求及性价比,我们选择方案二。
AT89C52最小系统所谓单片机的最小应用系统是指能维持单片机运行的最简单配置的系统,即组成单片机系统所必需的一些元器件,无论完成什么任务,这些东西都是必须的。
由于AT89C52芯片内部已有8KB程序存储器,本设计的程序也不长,所以只连接了晶体振荡电路、复位开关和电源部分等几个必须的功能部件,如图4所示。
图2 最小系统2. 显示器键盘模块方案显示器键盘是单片机控制系统的输入输出通道,是系统与使用人员间信息传递的窗口,单片机系统常用显示器键盘设计方案如下:方案一:采用Intel8279可编程键盘/显示控制接口芯片。
Intel8279是一个专用的显示器键盘接口芯片,由硬件完成对显示器和键盘的扫描,大大方便了用户,是程序变得简洁、易读和模块化。
但其缺点是8279为并行接口芯片,占用CPU 端口多,需要CPU有较强的负载携带能力。
方案二:采用硬件译码器驱动数码管,如7407 TTL集电极开路六正相高压驱动器等,考虑到该电子时钟系统的人机交互并不复杂,不需要设置太多的按键,键盘采用普通的矩阵式行列扫描,此硬件实现简单,程序代码也不复杂。
所以选择了方案二。
显示与键盘电路本设计中,LED数码管采用共阴极动态显示,由7407选择位码,74LS245译码器将BCD码转化为LED七段码,硬件电路连接如图3所示。
图3 LED显示所需键盘数目比较少,故采用的是矩阵式行列扫描识别按键。
其键盘示意图如下:图4 键盘电路3. 主从机通信方式方案方案一:无线方案。
采用基于电信运营商的GSM或CDMA网络或蓝牙。
其中蓝牙实现的方案只适合短距离的传输,而基于电信运营商网络的虽然不受传输距离的限制,但会给客户带来向运营商交费的额外的费用。
方案二:有线方案。
采用基于电信运营商的电话网络或Internet互联网或使用总线技术。
对比方案一和方案二都有其各自的特点,从用户的角度及结合题目系统应用的场合,选择方案二,通过RS-232总线实现单片机和计算机的通信。
RS-232通信模块RS-232通信接口具有的噪声抑制能力、数据传输速率较快、电缆长度及可靠性较好等特点。
本系统采用的RS-232通信芯片是MAXIM公司生产的MAX232。
MAX232收发器在总线传送线上进行双向数据通信。
RS-232支持全双工模式。
图5 RS-232通信电路4. 整机电路5. 整机电路PCB板四.软件设计本系统程序分为主程序和各种功能子程序,系统程序结构如图6所示。
图6 系统程序结构框图主程序设计r主要完成系统的初始化、接收键值并根据键号输出相应的处理。
程序流程图如图所示。
中断服务程序包括外部中断INT0、INT1和定时/计数器1的中断服务程序,外部中断INT0的中断服务程序实现键盘扫描。
1.主程序设计从机主程序设计流程图如图7所示,初始以后送显,等待中断的发生。
图7 从机主程序流程图2. 键盘扫描子程序图8 键盘扫描流程图3.显示子程序4.程序清单#include<reg52.h>#include<absacc.h> //用来定义XBYTE的头文件#define P_8255 XBYTE[0x7fff] // 写控制字的地址#define PA_8255 XBYTE[0x7cff] // 8255 PA 口的地址#define PB_8255 XBYTE[0x7dff] // PB 口地址#define PC_8255 XBYTE[0x7eff] // PC口的地址code unsigned char TAB[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; // 数码管的字符表data unsigned char LEDcash[6]; // 显示缓冲区unsigned char sec,min,hour,day,month,year,key; //定义时分秒年月日data unsigned char buffer,flag;bit off_on; // 暂停与开始 off_on 为 1时开始工作为0时暂停工作bit swi; //年月日转换 swi 为1 显示小时分秒 swi为0显示年月日//延时1msvoid Delay1ms(){unsigned char i;i = 0;while (--i);}//显示Display(){unsigned char i = 0xfe;unsigned char j;for (j = 0; j < 6; j++){PB_8255 = i;PA_8255 =TAB[LEDcash[j]];i =(i<<1)|0x01; // 循环移位显示Delay1ms();}}void Delay10ms() // 延时 10ms{unsigned i,j,k;for(i=0;i<0x0a;i++)for(j=0;j<0x04;j++)for(k=0;k<0xf9;k++);}void Refreshdisplay() // 刷新显示缓冲区{if(swi){ // 如果 swi 为 1 把时分秒送入显示缓冲区LEDcash[0] = sec % 10; // 秒的个位LEDcash[1] = sec / 10; // 秒的十位LEDcash[2] = min % 10;LEDcash[3] = min /10;LEDcash[4] = hour % 10;LEDcash[5] = hour / 10;}else{ // 否则当 swi 为 0 时把月日年送入显示缓冲区LEDcash[0] = day % 10;LEDcash[1] = day / 10;LEDcash[2] = month % 10;LEDcash[3] = month /10;LEDcash[4] = year % 10;LEDcash[5] = year / 10;}}// 计算时分秒年月日之间的关系的函数void yunsuan(){if(sec>=60) // 如果秒大于或等于60 则把秒置零,分加一{sec=0;min++;if(min>=60){min=0;hour++;if(hour>=24){hour=0;day++;if(day > 30){day = 0;month++;if(month > 12){year++;month = 0;}}}}}}//50ms中断服务函数void INT_Timer0(void) interrupt 1{TH0=(65536-50000)/256; //设置定时器0的TH0TL0=(65536-50000)%256;flag++;if(flag==20){ // 每次定时器溢出计时50ms flag=20 则循环20次 20 乘以 50ms 等于 1 sflag=0;sec++;yunsuan(); // 计算时分秒年月日之间的关系的函数}Refreshdisplay();}// 判断按下了那个键盘以及各个键盘的处理void Key_Find(){PC_8255=0xc0; // 把 Pc口的 PC6 PC7 置一if((PC_8255&0xc0)!=0xc0) // 如果 PC口和0x0c 相与不等于 0x0c 了说明有键按下{Delay10ms(); // 延时10ms后再判断是为了消除键盘抖动if((PC_8255&0xc0)!=0xc0) // 再次判断PC_8255=0xfe; // 设置8255PC0口为零其余都为1if((PC_8255&0xc0)==0x80){ // 读取PC口的值然后和0x0c相与如果等于0x08 则取键值key = 1key=1;// 以下为时针加1 的处理if(hour == 23){ // 如果时针本来为23了则hour = 0; // 把时针置零天数加1day = day + 1;if(day > 30){ // 如果天数大于30了day = 0; // 把天数置零月数加1month = month + 1;}}else{hour = hour + 1; // 如果时针本来没有等于23 则按正常情况时针加1}}if((PC_8255&0xc0)==0x40){key=2; // 键值为2 的时候// 以下为时针减 1 的处理if(hour == 0){hour = 23;}else{hour = hour - 1;}}PC_8255=0xfd;if((PC_8255&0xc0)==0x80){key=3;// 以下为分针加1 的处理if(min == 59){ // 如果分针本来就等于59 则时针加1 然后把分针置零hour = hour + 1;min = 0;}else{ // 否则按正常情况分针加1min = min + 1;}}if((PC_8255&0xc0)==0x40){ // fen jian 1key=4;// 以下为分针减1 的处理if(min == 0){ // 如果分针本来就等于零则减 1 时把分针置为59min = 59;}else{min = min - 1; // 否则按正常情况分针减1}}PC_8255=0xfb;if((PC_8255&0xc0)==0x80){ //切换年月日时分秒key=5;// 以下为切换年月日的处理swi = ~swi; // 把swi 取反}if((PC_8255&0xc0)==0x40){ //ri jiankey=6;// 以下为天数减1 的处理if(day == 0){ // 如果天本来就等于0 则天减1 的话把天置为 30 day = 30;}else{ // 否则按正常情况把天数减1day = day -1;}}PC_8255=0xf7;if((PC_8255&0xc0)==0x80){key=7;// 以下为复位的处理sec = 0;min = 0;hour = 0;}if((PC_8255&0xc0)==0x40){key=8;// 以下为时分秒与年月日切换的处理off_on = ~off_on; // 把 off_on 标志取反if(off_on){TR0 = 1; // 如果 off_on 为1 则 TR0=1 开始计数器}else{TR0 = 0; // 否则 TR0 =0 停止计数器}}}yunsuan(); // 执行一次计算时分秒年月日之间的关系的函数Refreshdisplay(); // 刷新显示缓冲区}void main(){ unsigned char i;TH0=(65536-50000)/256; // 设置定时器0 的 TH0 TL0TL0=(65536-50000)%256;TMOD = 0x01; // 设置定时器模式ET0=1;EA=1; // 开中断TR0=1; // 开始计时sec = min = hour = 0; // 初始化时分秒day = month = 1; // 初始化月日year = 11;key = 8;off_on = 1;swi = 1;for (i = 0; i < 6; i++){ LEDcash[i] = 0; // 初始化显示缓冲区全部设置为0}P_8255=0x88; // 设置8255控制字为0x88 即 PA口 PB 口为输出 PC口高四位为输入低四位为输出while(1){Refreshdisplay(); // 刷新显示缓冲区Display(); // 调用显示函数Key_Find(); // 调用键盘查找函数}}五.设计总结及心得体会回顾起此次课程设计,我学到很多很多的东西,不仅巩固了以前所学过的知识,加深了multisim和protel硬件设计的理解,而且学到了很多在书本上所没有学到过的内容。