历史上的今天
今天是:2024年11月07日(星期四)
2019年11月07日 | 基于51单片机的电子时钟课程设计
2019-11-07 来源:51hei
第一章 设计目的及要求 1.目的 通过对电子时钟系统进行编程与Protues仿真,进一步掌握单片机的组成,P1、P0、P2、P3口的应用,蜂鸣器的应用,定时中断程序的编写及应用,对之前学习的单片机课程进行回顾与应用;初步掌握Protues仿真方法以及用keil软件编写程序的方法。 2.题目与要求 本次课程设计的题目为:电子时钟的设计,其具体要求为: (1)能实现时、分、秒的显示; (2)能实现12、24小时制的切换; (3)能设定时间; (4)能设定闹钟; 整个系统要设计键盘和显示器,利用单片机内部时钟完成定时器的定时设计。 第二章 理论基础 1.AT89C52芯片 AT89C52芯片的引脚图如图1所示。 图1 AT89C52芯片引脚 其中主要应用到的引脚口介绍: (1)P0口的第一功能是作为一般I/O口使用,第二功能是在CPU访问外部存储器时,分时提供低8位地址和8位双向数据。 (2)P1口是8位准双向I/O口,51子系列中P1只能用作一般I/O口,52子系列中P1.0和P1.1引脚还具有第二功能。 (3)P2口是8位准双向I/O口,第二功能是在CPU访问外部存储器时,作为高8位地址总线,输出高8位地址。 (4)P3口是8位准双向I/O口,其第一功能是用作一般I/O口,第二功能是作为中断信号和外部数据存储器的读写控制信号。 (5)RES,复位信号高电平有效。 2.Keil的简单介绍 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。此处简单介绍一下Keil 工程的建立等,以Keil μVision2界面为例。 (1)建立一个工程,选择菜单栏中的【Project】下的【New Project】,菜单栏如图2所示。 图2 菜单栏 (2)选择工程要保存的路径并且输入工程名,以电子时钟工程的建立为例,如图3所示。 图3 “保存新工程”对话框 (3)选择系统要用的单片机如图4(a)所示,选择添加启动文件如图4(b)所示。 图4(a)“选择单片机”对话框 图4(b)“添加启动文件”对话框 (4)建立文件,选择菜单【File】下的【New】,出现界面如图5所示。 图5 新建文件界面 (5)保存文件为“*.c”文件,并且添加文件到所建的工程下,保存文件截面图如图6所示,添加文件显示界面如图7所示,右键点击SourceGroup添加。 图6 保存文件界面 图7 添加文件界面 3.Protues的简单介绍 Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件,它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前比较好的仿真单片机及外围器件的工具,可以仿真51系列、AVR、PIC、ARM、等常用主流单片机。在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。 (1)Keil中生成*.HEX的界面如图8所示。 图8 生成HEX文件界面 (2)Protues中加载HEX文件,在Protues界面中双击AT89C51芯片,所示界面如图9所示。 图9 加载HEX文件界面 第三章 设计原理以及方案 1.系统总体框图 本电子时钟主要由单片机、键盘、数码管显示接口电路、蜂鸣器电路和复位电路构成,设计的总体方案如图10所示: 图10 总体方案 2.硬件电路 2.1晶振电路 晶振电路如图11所示。 图11 晶振电路 2.2复位电路 复位电路如图12所示。 图12 复位电路 2.3蜂鸣器电路 蜂鸣器电路如图13所示。 图13 蜂鸣器电路 2.4数码管显示电路 数码管显示电路如图14所示。 图14 数码管显示电路 2.5键盘电路 键盘电路如图15所示。 图15 键盘电路 2.6总体电路 在Protues中仿真的总体电路图如图16所示。 图16 总体电路 3.软件系统设计 3.1单片机的使用情况 设计电子时钟使用单片机资源的情况如下: P0口输出数码管段选信号,P2口输出数码管位选信号;调整功能选择键kgnxz:P3.0口,通过其选择调整时钟还是调整闹钟;调整秒 ksec:P3.1口,按一次使秒加1;调整分kmin:P3.2;按一次使分加1;调整小时khour:P3.3口,按一次使时加1;12与24小时制的转换键kzh:P3.4,默认24小时制,按一次键之后转换为12小时制。具体如下: (1)实现基本的走时间和显示时间的时、分、秒,上电自动显示初始时间00-00-00。 (2)当第一次按下第一个弹性按键时进入时间的调节状态,按下第二个按键时实现秒的加一调节,按下第三个按键时实现分的加一调节,按下第四个按键时实现小时的加一调节。 (3)当第二次按下第一个弹性按键时进入闹钟的调节状态(闹钟初始值设定为01-00-30),按下第二个按键时实现秒的加一调节,按下第三个按键时实现分的加一调节,按下第四个按键时实现小时的加一调节。 (4)当第三次按下第一个弹性按键时进入原显示时间的状态。 (5)按下第五个按键时实现24到12小时制的转换。 (6)当第五次按下第一个弹性按键时返回正常的显示时间走时状态。 3.2软件系统的各个模块 时钟系统的软件设计主要采用以下基本模块来实现,主程序、定时中断服务程序、键盘扫描程序模块、时钟显示模块、闹钟显示模块、转换模块、延时模块和蜂鸣器模块。 主程序:对中断程序初值进行设定,在各种情况下对子函数的调用,保证整个程序的顺序执行。 定时中断服务程序:用于电子时钟的准确运行。 键盘扫描程序模块:用于确定按键并在按键按下时调用相应的程序进行显示。 时钟显示模块:用于显示正常走表的时间。 闹钟显示模块:用于显示设定闹钟的时间。 转换模块:用于将默认的24小时制转换为12小时制。 延时模块:程序中调用延时子程序,用于按键消抖动,数码管消影等。 蜂鸣器模块:用于在设定的闹钟时间与走表的时间相等时,闹钟响起。 3.3软件系统程序流图 主程序的顺序流图如图17所示。 图17 主程序顺序流图 显示程序的顺序流图如图18所示。 图18 显示程序顺序流图 中断程序的顺序流图如图19所示。 图19 中断程序顺序流 第四章 仿真结果与分析 1.仿真结果 上电走表仿真结果图如图20所示。 图20 上电之后走表仿真结果图 按下一次kgnxz键,再分别调整时、分、秒各按键,使得显示时间为15-15-15仿真结果图如图21所示。 图21 调整时分秒仿真结果图 按下kzh键,使得显示时间为03-15-19仿真结果图如图22所示。 图22 24小时制转换为12小时制仿真结果图 按下第二次kgnxz键,再分别调整时、分、秒各按键,即调整的便是闹钟的设定时间(初始设定为01-00-30),仿真结果图如图23所示。 图23 闹钟显示仿真结果图 调整闹钟的设定时间为03-20-30,仿真结果图如图24所示。 图24 闹钟调整显示仿真结果图 按下第三次kgnxz键时,显示走表的时间,并且在到达设定的闹钟时间时蜂鸣器发出声音,即在蜂鸣器发声过程中P1.0口会由原高电平变为低电平,仿真结果图如图25所示。 图25 蜂鸣器发声仿真图 2.仿真结果分析 让手机中的秒表与Protues仿真中的秒同时开始,可以发现他们几乎是同步的(由于个人反应导致按下手机秒表瞬间有微小误差)。而闹钟设定值是完全没有误差的,当时间与设定闹钟时间完全相等时蜂鸣器就会发声。 第五章 总结 本次课程设计利用Keil以及Protues软件,完成了电子时钟系统的程序编写与电路图搭建,并对所设计的电子时钟系统进行了仿真测试。 完成本次课程设计的过程,经历了兴奋、自信、失落、奋发、所悟、完成几个过程。刚开始做课程设计时,仔细阅读设计的题目和要求,想到理论课学得也还差不多,以为没什么太大困难,所用的知识书上都有,各部分程序大都可以参考课本例题完成。开始前两天我就熟悉课本,参考课本内容在稿纸上把自己的思路和各部分程序写了下来,然后就是衔接起来在Keil中编写。经过三天的努力,毫无结果。埋头苦干的过程是痛苦的,尤其是在按自己觉得理论上合理的算法和程序做完,发现根本显示不了的时候,是迷茫,烦躁的。在第三天下午参考别人只是显示出来走表就可以的程序,并且接受别人建议按一步一步调试去编写的情况下,编写运行找错地不断循环中,终于在第五天完善了程序。 通过这次课程设计,我感觉到自己从课本上学到的理论知识和实践仍有很大的差距。学习理论课时也是有实践课的,但当时自己只是追求明白课本例题的程序,几乎很少在Protues上去画例题中的仿真图,导致自己对Protues的应用不熟悉,而且也没深入想过课本上那些小的程序之间的联系应用。所以学习知识不能太局限于理论,要与实践结合。学会了单片机的一般设计过程,通常都要进行系统扩展与配置,因此,要完成一个单片机的设计工作,必须依次做到下述工作: 硬件电路的设计、组装与调试; 应用软件的编写、调试; 完整应用软件的调试、固化和脱机运行。 而在进行硬件系统设计时我们应当尽量做到: 尽可能的选择典型电路,并符合单片机的常规使用方法; 在充分满足系统功能要求前提下,留余地以便于二次开发; 硬件结构设计应与软件设计方案一并考虑; 整个系统相关器件要力求性能的匹配; 硬件上要有可靠性与抗干扰设计; 充分考虑单片机的带载驱动能力。 所以我用单片机编写了上面的程序,因为基础知识学的不怎么好,如有错误之处,还望老师理解,并加以批改。通过这次设计使我对单片机有了更深入的了解。培养了我的动手实践能力。 参考文献 [1] 郭文川,MCS-51单片机原理、接口及应用,电子工业出版社,2014. [2] 朱永金,《单片机应用技术》,中国劳动社会保障出版社. [3] 彭冬明.韦友春,《单片机实验教程》,理工大学出版社. [4] 朱家建,《单片机原理及应用》,机械工业出版社. [5] 胡汉才,《单片机原理及接口技术》,清华大学出版社. [6] 张伟,《单片机原理及应用》,机械工业出版社. 附录: PCB原理图
![]()

























单片机源程序如下:
#include #include #include sbit kgnxz=P3^0; //功能选择键,按一次设定时间,按两次设定闹钟时间,按三次又显示时间表 sbit ksec=P3^1;//调整秒 sbit kmin=P3^2;//调整分 sbit khour=P3^3;//调整时 sbit kzh=P3^4;//24与12小时制转换 sbit bear=P1^0;//蜂鸣器控制口 unsigned char secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0,flag=0,//flag是按键的计数 secshi1=0,secge1=0,minshi1=0,minge1=0,hourshi1=0,hourge1=0;//定义存储时间和闹钟时分秒的个位和十位 unsigned int num=0,sec=0,min=0,hour=0,sec1=30,min1=0,hour1=1, num1=0;//定义时间和闹钟的时分秒 unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段控口 void keyscan();//键盘扫描函数 void display();//时钟显示函数 void display1();//闹钟显示函数 void clock();//闹钟函数即蜂鸣器函数 /***延时函数****/ void delay(unsigned char z) {unsigned char x,y; for(x=z;x>0;x--) for(y=255;y>0;y--); } /***中断函数****/ void time0() interrupt 1 {num++; TH0=(65536-50000)/256; TL0=(65536-50000)%256; if(num==20) {num=0; sec++; if(sec==60) {sec=0; min++; if(min==60) {min=0; hour++; if(hour==24) {hour=0; } } } display(); } } /******时钟显示函数******/ void display() { secge=sec%10; secshi=sec/10; minge=min%10; minshi=min/10; hourge=hour%10; hourshi=hour/10; P2=0xfe; P0=table[secge]; delay(5); P2=0xfd; P0=table[secshi]; delay(5); P2=0xfb; P0=0x40; delay(5); P2=0xf7; P0=table[minge]; delay(5); P2=0xef; P0=table[minshi]; delay(5); P2=0xdf; P0=0x40; delay(5); P2=0xbf; P0=table[hourge]; delay(5); P2=0x7f; P0=table[hourshi]; delay(5); } /*****闹钟显示函数****/ void display1() { secge1=sec1%10; secshi1=sec1/10; minge1=min1%10; minshi1=min1/10; hourge1=hour1%10; hourshi1=hour1/10; P2=0xfe; P0=table[secge1]; delay(10); P2=0xfd; P0=table[secshi1]; delay(15); P2=0xfb; P0=0x40; delay(15); P2=0xf7; P0=table[minge1]; delay(15); P2=0xef; P0=table[minshi1]; delay(15); P2=0xdf; P0=0x40; delay(15); P2=0xbf; P0=table[hourge1]; delay(15); P2=0x7f; P0=table[hourshi1]; delay(15); } /*****键盘扫描*********/ void keyscan() {if(kgnxz==0) //功能选择键是否按下 { delay(10);//延时消抖 if(kgnxz==0)//再次判断键是否按下 {flag++;} //计数,功能选择键按键次数加一 while(!kgnxz);} //释放键 if(flag==1)//功能选择键 {if(ksec==0)//秒调整键 {delay(10);//延时消抖 if(ksec==0)//再次判断键是否按下 {sec++;//秒加加 if(sec>=60)//如果秒大于60 sec=0;//秒清零 } while(ksec==0)//释放键 display();} if(kmin==0) {delay(10); if(kmin==0) {min++; if(min>=60) min=0; } while(kmin==0) display(); } if(khour==0) {delay(10); if(khour==0) {hour++; if(hour==24) hour=0; } while(khour==0) display(); } } if(flag==2)//闹钟调整 {if(ksec==0) {delay(5); if(ksec==0) {sec1++; if(sec1==60) sec1=0;} while(!ksec) {display1();delay(50);} } if(kmin==0) {delay(5); if(kmin==0) {min1++; if(min1==60) min1=0;} while(!kmin) {display1();} } if(khour==0) {delay(5); if(khour==0) {hour1++; if(hour1==24) hour1=0;} while(!khour) {display1();} } }} /*****蜂鸣器*********/ void clock() { unsigned int i; for(i=1000;i>0;i--) {bear=1; P1=0xfe; delay(10); bear=0; P1=0xff; ……………………
史海拾趣
|
一、 闭路监视电视系统简介: CCTV系统结构: 电视监控系统(Closed Circuit Television,简称CCTV),一般由以下三部分组成: 前端部分: 主要由黑白(彩色)摄像机、镜头、云台、防 ...… 查看全部问答> |
|
高人可以帮我看下我的这个拨码开关程序老有点小我问题,,十万火急 process(clk_a) VARIABLE cnt_a : std_logic_vector(7 downto 0):=\"11111111\"; begin if (clk_a\'event and clk_a=\'1\') then if cnt_a=\"11111111\" then cnt_a:=d; full_a… 查看全部问答> |
|
Altium Designer 使用 —— 快速制作原理图封装当制作引脚数比较多的器件的原理图封装时,可以使用AD提供的“smart grid insert”功能快速制作原理图封装库。本文以制作K9F1G08为例,进行简单说明。K9F1G08的引脚分布如图1所示:1. 打开 excel ,按 ...… 查看全部问答> |
|
新建一个wince 的mfc exe,怎么在对话框中添加一个ie控件,浏览一个url(本地页面),thanks 新建的时候,选择,WCE MFC appWizard[exe] ,然后再选择Dialog base, 怎么样在该Dialog上添加一个ie控件,然后去浏览一个本地url? thanks… 查看全部问答> |
|
本人从朋友那里得到一份cadence(allegro)视频教程15.5板本,是一个培训班的内部视频讲义,清晰度很高,很具体详细,是自学的好资料。如果您没时间看书或者想很快学会allegro的话就请联系:13783696474 或者QQ:20247125 ...… 查看全部问答> |
|
1.最近我用sci调试RS485的时候遇到一个怪现象: 有时候(不是全部,重新加载程序的时候一般都是)cpu明明有数据发出来,SCIRX,SCITX波形正常,可是485驱动芯片出来的两线信号发不出来,示波器只能看到负半波.只要我把与其通信的人机界面的通讯口拔出来 ...… 查看全部问答> |
|
最近在学习FPGA方面知识,对时钟触发有了了解,但有好多问题有些不明白。希望大虾解释 如: always(posedge CLK) begin //执行任务块 end 假如时钟的周期为50nS,占空比50%;所执行的任务块比较耗时间,超过50nS,而此时任务块尚未完全执行完 ...… 查看全部问答> |




