89C51单片机最小系统设计(电子时钟,秒表,按键计数的单片机设计)
基于单片机AT89C51的电子时钟的课程设计
![基于单片机AT89C51的电子时钟的课程设计](https://img.taocdn.com/s3/m/604af12c05087632301212da.png)
目录第一章电子时钟 (1)1.1电子时钟简介 (1)1.2电子时钟的基本特点 (1)1.3电子时钟的原理 (1)第二章单片机识的相关知识 (2)2.1单片机简介 (2)2.2单片机的发展史 (2)2.3单片机的特点 (3)2.489C51单片机介绍 (3)第三章控制系统的硬件设计 (6)3.1单片机型号的选择 (6)3.2数码管显示工作原理 (6)3.3键盘电路设计 (7)3.4系统工作原理 (7)3.5整个电路原理图 (9)第四章控制系统的软件设计 (10)4.1程序设计 (10)4.2程序流程图 (13)4.3伟福硬件仿真器简介 (14)4.4仿真图及结果分析 (15)第五章附录程序 (17)第六章结束语 (19)参考文献 (20)第一章电子时钟1.1 电子时钟简介本作品采用Atmel公司的AT89C51单片机,以汇编语言为程序设计的基础,设计一个用四位数码管显示时、分的时钟。
现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。
从而达到计时的功能,是人民日常生活补课缺少的工具。
1.2 电子时钟的基本特点现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
1.3 电子时钟的原理该电子时钟由89C51,BUTTON,六段数码管等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。
而电路中唯一的一个控制键却拥有多种不同的功能,按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。
基于89C51单片机的秒表课程设计(论文)
![基于89C51单片机的秒表课程设计(论文)](https://img.taocdn.com/s3/m/f04f2d12de80d4d8d15a4f2a.png)
摘要随着电子技术的发展,电子技术在各个领域的运用也越来越广泛,人对它的认识也逐步加深。
秒表计时器秒表计时器常常用于体育竞赛及各种其他要求有较精确时间的各领域中。
其中启/停开关的使用方法与传统的机械计时器相同,即按一下启/停开关,启动计时器开始计时,再按一下启/停开关计时终止。
而复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时应立即终止,并对计时器清零。
本设计就是利用所学到的电子元器件将脉冲源用数码管显示出来,以制承诺简易的秒表。
以单片机为核心,设计一个秒表,具有计时功能,按键有启动计时、数据清零、停止、时间显示。
采用3个LED数码管显示时间,计时范围设置为0~99.9秒,即精确到0.1秒,用按键控制秒表的“开始”、“暂停”、“复位”,按“开始”按键,开始计时;按“暂停”按键,系统暂停计时;再按“开始”键,系统继续计时;数码管显示当前计时值;按“复位”按键,系统清零。
毕业论文(设计)原创性声明本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果。
据我所知,除文中已经注明引用的内容外,本论文(设计)不包含其他个人已经发表或撰写过的研究成果。
对本论文(设计)的研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示谢意。
作者签名:日期:毕业论文(设计)授权使用说明本论文(设计)作者完全了解**学院有关保留、使用毕业论文(设计)的规定,学校有权保留论文(设计)并向相关部门送交论文(设计)的电子版和纸质版。
有权将论文(设计)用于非赢利目的的少量复制并允许论文(设计)进入学校图书馆被查阅。
学校可以公布论文(设计)的全部或部分内容。
保密的论文(设计)在解密后适用本规定。
作者签名:指导教师签名:日期:日期:注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
基于89C51系列单片机的电子钟设计
![基于89C51系列单片机的电子钟设计](https://img.taocdn.com/s3/m/5d24fe3367ec102de2bd897a.png)
电子钟原理框图
主要器件:
• STC89C51
• 电源
稳压芯片:7805、LM1117-2.85
• USB转串口芯片:PL2303HX • 通讯芯片:MAX232 • 储存芯片:IIC协议控制芯片AT24C02 (EEPROM) • 时钟芯片:SPI协议控制芯片DS1302 • 温度传感器:1-WIRE协议控制芯片DS18B20 • 液晶显示芯片:1602
储存芯片:EEPROM (AT24C02)
AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节, CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有 一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门 的写保护功能。
PL2302(USB转RS232控制器)
//显示温度、秒、时、分数据: write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示 write_sfm(8,miao); write_sfm(5,fen); write_sfm(2,shi);
//显示日、月、年数据: write_nyr(9,ri);//日期,从第二行第9个字符后开始显示 write_nyr(6,yue); write_nyr(3,nian); write_week(week);}
液晶显示1602
LCD1602初始化流程图
液晶写入指令、数据函数
液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面 • • • • • • • • • • write_1602com(uchar com)//****液晶写入指令函数**** { rs=0;//数据/指令选择置为指令 rw=0; //读写选择置为写 P0=com;//送入数据 delay(1); en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1); en=0;//en由高变低,产生下降沿,液晶执行命令 }
基于AT89C51单片机的电子时钟课程设计
![基于AT89C51单片机的电子时钟课程设计](https://img.taocdn.com/s3/m/03e83db0fd0a79563c1e7232.png)
基于AT89C51单片机的电子时钟课程设计一.设计任务与要求1. 该课程设计是利用MCS-51单片机的定时/计数器T0、中断系统、以及外围的按键和LED显示器等部件,设计一个单片机电子时钟。
设计的电子时钟通过两片4位数码管显示,并能通过按键实现时,分的设置,秒的清零和暂停、启动的控制。
2. 让同学掌握PRETUSS软件,进行程序设计并调试,并在程序烧录的cpu 后,在面包板中实现实物连接,实现电子钟的功能。
二、元器件清单及简介1.四位共阳LED数码管当数码管正面向上时,其引脚按逆时针方向从1—>12,对应的引脚为6->3->2->12为公共位选端2.元器件清单三、设计原理分析1.总体设计流程图2.子程序显示本程序运用定时器/计数器T0中断实现时间,并用两个4位数码管,从右到左依次显示秒个位、秒十位、横线、分个位、分十位、横线、时个位和时十位。
数码管显示的信息用8个内存单元存放,这8个内存单元称为显示缓冲区,其中秒个位和秒十位、分个位和分十位、时个位和时十位分别由秒数据、分数据和小时数据分拆得到,数码管显示采用软件译码动态显示。
在内存中首先建立一张显示信息的字段码表,显示时,先从显示缓冲区中取出显示的信息,然后通过查表程序在字段码表中查出所显示的信息的字段码,从P0口输出,同时在P2口将对应的位选码输出选中显示的数码管,就能在相应的数码管上显示显示缓冲区的内容。
3.按键功能实现按键处理设置为:如没有按键,则时钟正常走时。
当按下k0按键时,时钟停止,进入时间调整状态;按K1可K2按键可对小时进行加1或减1操作;继续按K0键后可对分进行加1或减1操作;按K3键可将秒位进行清零;第三次按K0后,时钟在当前状态下重新开始计时运行。
按键功能的实现,是通过对P1.0, P1.1, P1.2, P1.7脚的电位判断进行程序跳转。
其接法如下图所示:按键接法图4. 数码管接线图如上图所示为数码管的接法,为了保护LED数码管,在P0口接数据端提供低电压,接上拉电阻;P2口提供位选信号为高电压,增加驱动电阻,以提高灌流大小,使LED达到额定电流工作状态。
AT89C51单片机电子时钟的设计
![AT89C51单片机电子时钟的设计](https://img.taocdn.com/s3/m/163601a9988fcc22bcd126fff705cc1755275f06.png)
AT89C51单片机电子时钟的设计1.硬件设计首先,我们需要选择合适的外设硬件进行设计。
以下是一些常见的硬件组件:-AT89C51单片机-蜂鸣器-DS1302时钟模块-按键开关和对应的电阻液晶模块的连接方式如下:-VSS->GND-VDD->VCC-V0->电位器-RS->P0.7-R/W->P0.6-E->P0.5-DB0-DB7->P2.0-P2.7蜂鸣器的连接方式如下:-正极->P3.0-负极->GNDDS1302时钟模块的连接方式如下:-VCC->VCC-GND->GND-CE->P1.7-IO->P1.6-SCLK->P1.5按键开关的连接方式如下:-第一个按键->P3.1-第二个按键->P3.2-第三个按键->P3.32.软件设计在软件设计方面,我们将使用C语言编程来编写程序。
首先,我们需要定义和初始化必要的变量,例如小时、分钟和秒钟等计时变量。
然后,我们需要编写一个初始化函数来配置单片机的各种外设和寄存器。
在这个函数中,我们需要设置计时器/计数器、I/O口和中断等。
接下来,我们需要编写一个定时器中断函数,来更新计时变量并实现计时功能。
我们可以使用定时器中断来定期更新秒钟,并在需要时更新小时和分钟。
在主循环中,我们需要编写代码来控制液晶模块、蜂鸣器和按键开关等外设。
通过液晶模块,我们可以实现显示时间的功能。
通过蜂鸣器,我们可以实现头每秒发出一次滴答声的功能。
通过按键开关,我们可以实现设置时间的功能。
3.程序实现以下是AT89C51单片机电子时钟的程序框架:```c#include <reg51.h>#include <intrins.h>//定义和初始化计时变量unsigned char second = 0;unsigned char minute = 0;unsigned char hour = 0;//初始化函数void ini//配置计时器/计数器,设置定时器中断//配置I/O口和中断等//...//定时器中断函数//更新计时变量//...//主函数void mai//初始化init(;//主循环while (1)//控制液晶模块//控制蜂鸣器//控制按键开关//...}```在具体的代码实现中,我们需要根据液晶模块、蜂鸣器和按键开关等外设的具体规格和功能来编写相应的代码。
89C51单片机课程设计之秒表设计实验报告
![89C51单片机课程设计之秒表设计实验报告](https://img.taocdn.com/s3/m/1bf1b5d55ef7ba0d4a733b99.png)
单片机课程设计报告单片机秒表系统课程设计班级:课程名称:秒表设计成员:实训地点:北校机房实训时间:6月4日至6月15日目录1课程设计的目的和任务1.1 单片机秒表课程设计的概述1.2课程设计思路及描述1.3 课程设计任务和要求2硬件与软件的设计流程2.1系统硬件方案设计2.2所需元器件3 程序编写流程及课程设计效果3.1源程序及注释3.2原理图分析3.3课程设计效果4 心得体会1. 课程设计的目的和任务1.1单片机秒表课程设计的概述一、课程设计题目秒表系统设计——用STC89C51设计一个4位LED数码显示“秒表”,显示时间为000.0~9分59.9秒,每10毫秒自动加一,每1000毫秒自动加一秒。
二、增加功能增加一个“复位”按键(即清零),一个“暂停”和“开始”按键。
三、课程设计的难点单片机电子秒表需要解决几个主要问题,一是有关单片机定时器的使用;二是如何实现LED的动态扫描显示;三是如何对键盘输入进行编程;四是如何进行安装调试。
四、课程设计内容提要本课程利用单片机的定时器/计数器定时和记数的原理,结合集成电路芯片8051、LED数码管以及课程箱上的按键来设计计时器。
将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。
其中本课程设计有三个开关按键:其中key1按键按下去时开始计时,即秒表开始键,key2按键按下去时数码管清零,复位为“00.00”. key3按键按下去时数码管暂停。
五、课程设计的意义1)通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。
2)掌握定时器、外部中断的设置和编程原理。
3)通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。
4)该课程通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义1.2课程设计思路及描述该课程设计要求进行计时并在数码管上显示时间,则可利用MCS-51系列单片机的芯片AT89C51的P3.2,P3.3,RST作为按键的入口;定时器T1作为每0.1秒加一的定时器。
电子时钟基于AT89c51单片机设计电路图及程序
![电子时钟基于AT89c51单片机设计电路图及程序](https://img.taocdn.com/s3/m/6ba1953a49649b6649d7470b.png)
电子时钟基于AT89c51单片机的设计电子时钟原理图开机显示仿真图: 当按下仿真键时电子时钟开机页面显示第一行显示JD12102Class--16,第二行显示动态TINE:12:00:04。
电子时钟调时间仿真图:当按下K1为1次时,光标直接跳到电子时钟的秒,可以按下K2进行调节。
当按下K1为2次时,光标直接跳到电子时钟的分,可以按下K2进行调节。
当按下K1为3次时,光标直接跳到电子时钟的时,可以按下K2进行调节。
当按下K1为4次时,光标直接跳完,电子时钟可以进行正常计时。
电子时钟闹钟调节仿真:当按下K3为1次时,直接跳到闹钟显示界面00:00:00,按下K2可以对闹钟的秒进行调节。
当按下K3为2次时,可以调到分,按下K2可以对闹钟的分进行调节。
当按下K3为3次时,可以调到时,按下K2可以对闹钟的时进行调节。
当按下K3为4次时,直接跳到计时界面,对闹钟进行到计时,时间到可以发出滴滴声。
#include<reg51.h>#define uchar unsigned char //预定义一下#define uint unsigned intuchar table[]="JD12102Class--21"; //显示内容sbit lcden=P3^4; //寄存器EN片选引脚sbit lcdrs=P3^5; //寄存器RS选择引脚sbit beep=P3^6; //接蜂鸣器extern void key1();extern void key2();extern void key3();uchar num,hour=12,minite,second,ahour,aminite,asecond,a,F_k1,F_k2,F_k3; //定义变量void delay(uint z) //延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){lcdrs=0;P0=com; //送出指令,写指令时序delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date){lcdrs=1;P0=date; //送出数据,写指令程序delay(5);lcden=1;delay(5);lcden=0;}void write_add(uchar add,uchar date){uchar aa,bb;aa=date/10;bb=date%10;write_com(0x80+add);write_data(0x30+aa);write_data(0x30+bb);}void init() //初始化{lcden=0;write_com(0x38); //设置16*2显示,5*7点阵write_com(0x0c); //开显示,不显示光标write_com(0x06); //地址加1,写入数据是光标右移1位write_com(0x01); //清屏write_com(0x80); //起点为第一行第一个字符开始}void display(uchar h,uchar m,uchar s) //显示设计程序{{write_com(0x80+0x16);}{write_com(0xC0+0x00);write_data('T');write_data('I');write_data('M');write_data('E');write_data(':');write_data(0x30+(h/10));write_data(0x30+(h%10));write_data(':');write_data(0x30+(m/10));write_data(0x30+(m%10));write_data(':');write_data(0x30+(s/10));write_data(0x30+(s%10));write_data(' ');write_data(' ');write_data(' ');} }void main(){init();TMOD=0X01; //设置T0定时方式1 TH0=(65535-50000)/256; //设置初值TL0=(65535-50000)%256;EA=1; //开总中断TR0=1; //启动T0ET0=1;for(num=0;num<16;num++) //依次读出数据{write_data(table[num]);}while(1){key1();key2();key3();if(ahour==hour&&aminite==minite&&second<10) //时间到闹钟响{beep=~beep;}if(F_k1==0&F_k3==0) //K1和K3按下次数为零就直接显示时分秒display(hour,minite,second);}}void timer0() interrupt 1 //T0中断函数{TH0=(65535-50000)/256; //装载计数器初值TL0=(65535-50000)%256;a++;if(a==20){ //进位设置60秒进1分,60分进1时,24时进0时a=0;second++;if(second==60){second=0;minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}}#include <reg51.h> //调时间程序#define uchar unsigned char#define uint unsigned intsbit k1=P1^0; //定义3个变量sbit k2=P1^1;sbit k3=P1^2;extern uchar F_k1,F_k3,second,minite,hour,ahour,aminite,asecond; //预定义变量extern void write_com(uchar com);extern void write_add(uchar add,uchar date);extern void display(uchar h,uchar m,uchar s);void delay_key(int i){while(i--);}void key1(){if(k1==0) //按下K1零次时,直接计时与开机显示{delay_key(100);if(k1==0){TR0=0;while(!k1);F_k1++;if(F_k1==4){F_k1=0;write_com(0x0c);TR0=1;}}}if(F_k1==1|F_k3==1){write_com(0xC0+0x0c);write_com(0x0f);}if(F_k1==2|F_k3==2)write_com(0xC0+0x09);if(F_k1==3|F_k3==3)write_com(0xC0+0x06);}void key2(){if(k2==0){delay_key(100);while(!k2);if(F_k1==1) //按下K1一次时设置闹钟的秒{second++;if(second==60)second=0;write_add(0x4b,second);}if(F_k1==2) //按下K3两次时设置闹钟的分{minite++;if(minite==60)minite=0;write_add(0x48,minite);}if(F_k1==3) // 按下K1三次时设置闹钟的时{hour++;if(hour==24)hour=0;write_add(0x45,hour);}if(F_k3==1) //按下K3一次时设置闹钟的秒{asecond++;if(asecond==60)asecond=0;write_add(0x4b,asecond);}if(F_k3==2) //按下K3两次时设置闹钟的分{aminite++;if(aminite==60)aminite=0;write_add(0x48,aminite);}if(F_k3==3) //按下K3三次时设置闹钟的时{ahour++;if(ahour==24)ahour=0;write_add(0x45,ahour);}}}void key3(){if(k3==0){delay_key(100);if(k3==0){while(!k3);F_k3++;if(F_k3==4) //K3等于四次时直接跳入闹钟显示{F_k3=0;write_com(0x0c);}if(F_k3==1)display(ahour,aminite,asecond);}}}。
89S51最小系统的制作
![89S51最小系统的制作](https://img.taocdn.com/s3/m/6a12bfe69b89680203d82588.png)
51单片机最小系统1.设计框图2.硬件电路设计3.元件清单共阴极数码管2只(分立)10UF电解电容2只(限压16V)30PF瓷片电容2只220欧的电阻9只4.7K的电阻1只1.2K的电阻1只4.7K的排阻1只12MHZ的晶振1只S8550三极管1只单排针2排自锁小按键1只蜂名器1只(长音)STC89C52单片机1片(别买AT的)常开按钮开关1只(轻触开关)40引脚紧锁座或40引脚芯片插槽1只(前者方便单片机取下来的,但价格较贵;后者便宜,不便于拔插)发光二极管(5MM,红色)10只电路板1张(单孔锡板,带九针串口座的焊盘)USB转串口线1根(笔记本电脑必买、台式电脑选买)USB头一个(如下一页实物图所示)双头USB线1根(两头都能插入USB头里面)细导线2米(单芯、铁线)2CM铜柱8根(一头凸起,一头凹下)104瓷片电容5片MAX232芯片1片串口头1个(母头、9孔式)更正:(加粗的3样台式、笔记本都买)串口线1根(一端9孔、一端9针)***台式电脑用,笔记本电脑别买***注意:有的元器件(如电阻、瓷片电容等)非常便宜,一般按10个为单位买,否则别人不卖。
必备工具:万用表、电烙铁、焊锡丝、松香、吸锡器、斜口钳、镊子相关软件:Protel 99 SE、Keil 3、单片机烧录软件4.程序下载电路STC89C521、电源:这当然是必不可少的了。
单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。
2、振荡电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。
只要买来晶振,电容,连上就可以了。
3、复位(RST,第9引脚):至于复位是何含义及为何需要复位,在单片机功能中介绍。
4、EA(31引脚):EA引脚接到正电源端。
至此,一个单片机就接好,通上电,单片机就开始工作了。
5、P1口发光管电路:P1.0-P1.7(第1-8引脚)连接到8个470欧电阻驱动8个发光管。
基于at89c51的电子时钟设计
![基于at89c51的电子时钟设计](https://img.taocdn.com/s3/m/3423122b6bd97f192279e95e.png)
课程设计2:设计一个数字时钟。
要求如下:1.利用51开发板上LED数码管,LED灯,按键等设备,设计一个电子时钟。
2.电子钟使用4位数码管显示小时(24小时制)和分钟,秒可以使用LED灯或其他形式表现。
3.具有设置时钟功能,设置时间时,时间停止计时。
需要设置的位置数码管处于闪烁状态,如你想设置小时的数值时,显示小时的数码管需要处于闪烁状态,而显示分钟的数码管不可以处于闪烁状态,应处于正常显示状态。
4.按键可以选择独立键盘或矩阵键盘。
5.其他扩展功能(选做,能力强的可以做):如闹钟,时制切换等。
一.key.c#include "reg52.h"#include "key.h"extern unsigned char min_flag ;//标志位,控制分数码管闪烁extern unsigned char hour_flag ;//标志位,控制时数码管闪烁extern unsigned char shi ;extern unsigned char fen ;unsigned char key_flag = 0;//标志位,有按键被按下unsigned char key_con = 0;//控制位,控制按键(K1)被按下/*独立按键P12连接到51单片机P1端口k1对应的端口为P1.3k2对应的端口为P1.2k3对应的端口为P1.1k4对应的端口为P1.0*/code unsigned char arr[]={0xf7,0xfb,0xfd,0xfe};unsigned char read_key(unsigned char key){unsigned char i;for(i=0;i<8;i++){if(!(key & 1)){return i+1;}key>>=1; //key = key >> 1 ;}return 0;}void key_scan2(void){unsigned char temp;//键盘扫描temp = key4_scan();if(temp){if(!key_flag){if(temp==4)//K1被按下{key_con++;if(key_con==1) //第一次按下调整小时的数值{hour_flag=1;min_flag =0;}else if(key_con==2) //第二次按下调整分的数值{hour_flag=0;min_flag =1;}else //第三次按下取消调整{hour_flag=0;min_flag =0;key_con = 0;}}if(temp == 3) //增加数值{if(hour_flag){shi++;if(shi>23){shi = 0;}}else if(min_flag){fen++;if(fen>59){fen = 0;}}}if(temp == 2) //减少数值{if(hour_flag){shi--;if(shi>250){shi = 23;}}else if(min_flag){fen--;if(fen>250) //非负数,减的时候不会小于0{fen=59;}}}}key_flag = 1;}else{key_flag = 0;}}/*扫描独立键盘,输入参数:无返回值:有键按下时:返回对应的数字没有按键:返回0*/unsigned char key4_scan(void){unsigned char temp;P1 = 0xf;if(P1 != 0xf)//有按键被按下{temp = P1 & 0xf;//1110return read_key(temp);}return 0;}unsigned char sub_key_scan(unsigned char key) {unsigned char temp;P1 = key; //判断第一行temp = P1 >> 4;if(temp != 0xf){return read_key(temp);}return 0;}/*矩阵键盘硬件连接:P13连接到51单片机P1端口P1.0对应P13的1脚P1.1对应P13的2脚P1.2对应P13的3脚……P1.7对应P13的8脚输入参数:无返回值:有键按下时:返回对应的数字没有按键:返回0*/unsigned char key16_scan(void){unsigned char temp;unsigned char i=0;P1 = 0xf0;if(P1 != 0xf0)//有按键被按下{for(i=0;i<4;i++)//用函数扫描4行{temp = sub_key_scan(arr[i]);if(temp){return temp+(i*4);}}}return 0;}二.Key.h#ifndef KEY_H#define KEY_Hunsigned char key4_scan(void); unsigned char key16_scan(void);void key_scan2(void);#endif三.Led_reg.c#include "reg52.h"/*P2连接位码,P2.0连接Q4B,P2.1连接Q3B,P2.2连接Q2B,P2.3连接Q1B P0端口连接段码,P0.0连接A,。
基于单片机AT89C51控制的电子时钟课程设计报告
![基于单片机AT89C51控制的电子时钟课程设计报告](https://img.taocdn.com/s3/m/0d195c196edb6f1aff001f33.png)
单片机电子时钟设计报告实现功能:显示时、分、秒,刚打开电源时,显示的数据为12:00:00,然后电路会自动开始计时。
电路中有时、分、秒各自单独的调整按钮,时间调整按钮每按一次,相应的显示时间加1。
所需材料:89C51单片机,多位数码管,数码管显示译码器74LS48,3线8线译码器74LS138,3个按钮,100Ω、22KΩ电阻若干,12MHZ晶振一个,30pf无极电容2个,10uf 有极电容一个,敷铜板。
电路设计:用P1端口的P1.0~P1.3来作为数码管显示数据的输出引脚,用P1.4~P1.6引脚作为3线8线译码器的控制输入引脚,用P0端口的P0.0~P0.2来分别作为时、分、秒的时间调整按钮。
当按下按钮时,相应的输入引脚上就会有低电平输入单片机。
3线8线译码器的控制端,Y0、Y1、Y2、Y3、Y4、Y5分别控制了数码管的显示控制线。
电路如下图1-1图1-1流程图:程序设计:ORG 00H 主程序起始地址JMP START 主程序STARTORG 0BH 定时器T0中断起始地址JMP TIM0 定时器T0中断子程序TIM0 START:MOV SP,#70H 设置堆栈指针MOV 28H,#00 设置显示位数扫描指针初值为0 MOV 2AH,#12H 设置时钟显示寄存器初值为12H MOV 2BH,#00 设置分钟显示寄存器初值为00H MOV 2CH,#00 设置秒钟显示寄存器初值为00H MOV TMOD,#01H 设置定时器T0工作在方式1 MOV TH0,#0F0H 定时4ms的初值,即0F060H MOV TL0,#60H 初值的低位MOV IE,#82H 定时器T0中断允许MOV R4,#250 保证后面实现中断250次,即1秒的延时SETB TR0 启动定时器T0LOOP:JB P0.0,N2 若没有按键,就转去下一步检查分CALL DELAY 延时5ms,消除抖动MOV A,2CH 将秒寄存器的值载入累加器AADD A,#01H A的内容加1DA A 十进制调整MOV 2CH,A A的值存入秒寄存器CJNE A,#60H,N1 看是否已经是60秒,若不是就继续检查MOV 2CH,#00 已经是60秒,就清空秒寄存器的值N1:JNB P0.0,$ 秒按键还没有放开就循环等待CALL DELAY 延时5ms,消除抖动N2:JB P0.1,N4 若分没有按键,就转去下一步检查分CALL DELAY 延时5ms,消除抖动MOV A,2BH 将分寄存器的值载入累加器AADD A,#01H A的内容加1DA A 十进制调整MOV 2BH,A A的值存入寄存器CJNE A,#60H,N3 看是否已经是60分,若不是就继续检查MOV 2BH,#00H 已经是60分,就清空寄存器的值N3:JNB P0.1,$ 分按键还没有放开就循环等待CALL DELAY 延时5ms,消除抖动N4:JB P0.2,LOOP 若时没有按键,就转回去继续检查看是否有按键CALL DELAY 延时5ms,消除抖动MOV A,2AH 将时寄存器的值载入累加器AADD A,#01H A的内容加1DA A 十进制调整MOV 2AH,A A的值存入时寄存器CJNE A,#24H,N5 看是否已经是24时,若不是就继续检查MOV 2AH,#00H 已经是24时,就清空是寄存器的值N5:JNB P0.2,$ 时钟按键还没有放开就循环等待CALL DELAY 延时5ms,消除抖动JMP LOOP 返回重新检查看是否有按键******定时器T0中断子程序*******TIM0:MOV TH0,#0F0H 定时初值重设MOV TL0,#60HPUSH ACC 将累加器A的值暂存于堆栈PUSH PSW 将PSW的值暂存于堆栈DJNZ R4,X2 计时中断不满1s就退出继续中断MOV R4,#250 计时1sCALL CLOCK 调用计时器子程序CLOCKCALL DISP 调用显示子程序DISPX2:CALL SCAN 调用扫描子程序SCANPOP PSW 到堆栈取回PSW的值POP ACC 到堆栈取回累加器ACC的值RETI 返回主程序******扫描子程序*******SCAN:MOV R0,#28HINC @R0 显示位数扫描值加1CJNE @R0,#6,X3 扫描位数不为6就准备控制输出MOV @R0,#0 扫描位数为6,就令其置为0X3:MOV A,@R0 扫描位数载入AADD A,#20H A加上20H(显示寄存器地址)=各时间显示区地址MOV R1,A 各时间显示区地址存入AMOV A,@R0 扫描位数存入ASWAP A 将A的高低4位交换(其高4位为扫描的位数,低4位为显示数值)ORL A,@R1 将扫描值与显示数据组合MOV P1,A 显示输出RET******计时子程序*******CLOCK:MOV A,2CH 秒寄存器值载入AADD A,#1 加1sDA A 十进制调整MOV 2CH,A A的值存入秒寄存器CJNE A,#60H,X4 A不等于60秒,就跳出程序去显示MOV 2CH,#00H 已经是60秒,就清0MOV A,2BH 分寄存器值载入AADD A,#1 加1分DA A 十进制调整MOV 2BH,A A的值存入分寄存器CJNE A,#60H,X4 A不等于60分,就跳出程序去显示MOV 2BH,#00H 已经是60分,就清0MOV A,2AH 时寄存器值载入AADD A,#1 加1小时DA A 十进制调整MOV 2AH,A A的值存入时寄存器CJNE A,#24H,X4 A不等于24时,就跳出程序去显示MOV 2AH,#00H 已经是24时,就清0X4:RET******显示子程序*******DISP:MOV R1,#20H 20H为显示寄存器单元MOV A,2CH 将秒寄存器的内容存入AMOV B,#10H 设B累加器的值为10HDIV AB A/B,商存入A(十位数),余数存入(个位数)MOV @R1,B 将显示的个位数存入20H显示寄存器单元INC R1MOV @R1,A 将显示的十位数存入21H显示寄存器单元INC R1MOV A,2BH 将分寄存器的内容存入AMOV B,#10H 设B累加器的值为10HDIV AB A/B,商存入A(十位数),余数存入(个位数)MOV @R1,B 将显示的个位数存入22H显示寄存器单元INC R1MOV @R1,A 将显示的十位数存入23H显示寄存器单元INC R1MOV A,2AH 将时寄存器的内容存入AMOV B,#10H 设B累加器的值为10HDIV AB A/B,商存入A(十位数),余数存入(个位数)MOV @R1,B 将显示的个位数存入24H显示寄存器单元INC R1MOV @R1,A 将显示的十位数存入25H显示寄存器单元RET******延时5ms消除抖动*******DELAY:MOV R6,#60D1:MOV R7,#248DJNZ R7,$DJNZ R6,D1RETEND原理图:PCB图:。
基于AT89C51单片机的定时闹钟设计
![基于AT89C51单片机的定时闹钟设计](https://img.taocdn.com/s3/m/e8768626a5e9856a5612604e.png)
学号: 班级: 姓名:基于89C51单片机的电子闹钟设计一、设计要求(1)设计并实现一个具有计时功能的电子时钟系统,电子表的时间精确到秒,并可以显示年、月、日、时、分、秒。
(2)利用液晶显示器显示定时器的日期和时间。
(3)使用键盘进行设置时间和设置闹钟。
(4)定时时间到通过蜂鸣器报警和发光二极管闪烁通知,并持续60s 。
二、硬件设计(1)系统设计框图(2)选择硬件设备单片机:选择AT89C51;液晶显示器:具有16字符显示功能的1601 键盘:选择4行*4列的矩阵键盘 LED :选择红色的发光二极管 E 2PROM :X2545基本元件:蜂鸣器,电容,晶体振荡器 ,电阻,开关 电源:使用+5v 直流稳压源 基本模块的构成①时钟信号发生单元如右图2 利用晶振和电容以及单片机内部 电路,构成晶体并联振荡器,产 生12MHz 的时钟频率 ②复位电路如右图3利用一个简单的电容和按键实现*SI SO SCK CSR/S R/W E 单片机 89C51液晶显示蜂鸣器LED E 2PROM X2545 512*8bit键盘P2口P1口图1定时器系统框图数码管显示统P0口P3.0P3.6、P3.7基本模块图2时钟信号发生单元实现对系统的复位功能由此基本模块可以实现最小的单片机系统(3)电子时钟硬件原理图图4硬件电路原理电路(4)主要器件的原理①液晶显示原理液晶显示器种类繁多,按输出样式分为,图案式,数码式,点阵式。
本设计方案利用的是点阵式液晶显示器,而液晶驱动方式又和数码管驱动截然不同,虽然比数码管需要更小的工作电压,但是其结构所需要的扫描方式较数码管来说,是比较复杂的,而且输入输出数据速度慢,市场上是常用点阵式液晶驱动器的,常用的有1601、1602……,“16”代表显示字符共有几列,“01”、“02”代表输出字符共有几行。
下面是驱动1601的驱动方法。
驱动1601的一个很重要的方面就是液晶显示器的初始化,主要是利用控制、数据复用总线来输入指令,进行初始化。
AT89C51最小系统制作
![AT89C51最小系统制作](https://img.taocdn.com/s3/m/6d833fd333d4b14e85246808.png)
51最小系统模块
(红色字体为网络标号,标有相同网络标号的引线要连接在一起。
)
将四组I/0口用八针排针引出,方便后续实验的引出使用。
由于P0口没有内部上拉电阻(有时候会驱动不足),所以可以使用一个1K的排阻做上拉电阻,排阻有字的一头白点下对应的引脚接入单片机的40脚(VCC),排阻的其余八个引脚分别接入PO口。
另外,建议在电源(VCC GND)输入端接两组两针排线方便以后实验中将电源从最小系统引到其他模块。
LLS:实践部内下的。
复位电路电阻可用100 1K 电容4.7uf组合(可参考课本P37证明可用)
都是排针,(也可以是专门的两针头)可多接几个,为其他模块供电,后面模块数量不止一个。
芯片用AT89S51可支持在线编程。
LED灯可不接在最小系统模块里。
单独起来用。
用1K电阻的接法(圈是排针的脚)
先不接排阻,留个位置以后器件补上后直接接到后面。
基于单片机89C51的计时器或秒表
![基于单片机89C51的计时器或秒表](https://img.taocdn.com/s3/m/2eb3a5d4b9f3f90f76c61bb1.png)
基于单片机89C51的计时器或秒表AT89C51单片机秒表程序和电路图要求就是这样的了:1. 设计中采用的单片机以及显示器件,用AT89C51设计一个2位LED数码显示秒表,有开始,停止,清零就行。
2. 设计实现的基本功能,系统显示时间为00~99秒,每秒自动加1,设计越简单越好。
求电路图和相应的C程序,过程最好能详细些,因为要写实验报告~~希望高手帮忙悬赏分:50 - 解决时间:2010-6-1 15:51就是那个秒表问题,你给我的设计,汇编程序能改成C吗?悬赏分:0 - 解决时间:2010-6-1 18:25//---------------------------------------------下面是00-99秒计数的语言C程序。
#include<reg52.h>#include<intrins.h>unsigned char i, j;unsigned char code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,0x92, 0x82, 0xf8, 0x80, 0x90};bit k;//---------------------------------------------void main( ){TMOD = 0x01; //;T0定时方式1TH0 = (65536-50000) / 256; //;50ms@12MHzTL0 = (65536-50000) % 256;TR0 = 1; //;定时器初始化结束ET0 = 1; //;开启定时中断EX0 = 1;EX1 = 1;EA = 1;i = 0;j = 0;P0 = 0xC0;P2 = 0xC0;while(1);}//---------------------------------------------void timer0(void) interrupt 1{TL0 = (65536-50000) % 256;TH0 = (65536-50000) / 256; //;50ms@12MHzif (k) {j++;if (j == 20) {j = 0;i++;if (i == 100) i = 0;P0 = table[i / 10];P2 = table[i % 10];}}}//--------------------------------------------- void x0(void) interrupt 0{k = ~k;}//--------------------------------------------- void x1(void) interrupt 2{i = 0;j = 0;P0 = 0xC0;P2 = 0xC0;}//---------------------------------------------。
基于AT89C51单片机的最小系统设计
![基于AT89C51单片机的最小系统设计](https://img.taocdn.com/s3/m/7970308a680203d8ce2f249f.png)
基于AT89C51单片机的最小系统设计组员:田竹、王维、袁倍明摘要:本次实验课题为设计一个基于AT89C51单片机的最小系统。
用P1口设计流水灯,用P2口和P0口分别作段选和位选设计了六位数码管的静动态显示和简易的电子钟,用P3口设计了一个4*4的矩阵键盘,并用蜂鸣器实现了唱歌功能和键盘按下的声响,用62256扩展内部RAM,还扩展并实现了LCD1602的静动态显示,最后通过ADC0809和DAC0832分别实现了A/D、D/A转换功能。
一、系统电源用MC7805集成稳压器将输入电压转为+5V稳压给系统供电。
二、晶振(12MHZ)及复位电路采用12MHz的外部晶振,给系统提供时钟信号。
并采用了按键复位电路。
三、流水灯功能描述:让8个led灯循环闪烁源程序:流水灯ORG 0000HLJMP MAINORG 0100HMAIN:MOV A,#11111110B LOOP:MOV P1,A;给P1口送值LCALL DLYRL A ;循环左移LJMP LOOPDL Y:MOV R7,#250 ;延时子程序DLY1: MOV R6,#200DJNZ R6,$DJNZ R7,DLY1RETEND四、数码管功能描述:数码管动态显示1~6源程序:ORG 0000HLJMP STARTORG 0100HSTART:MOV P0,#0MOV P2,#0F9HSETB P0.0LCALL DELAYCLR P0.0MOV P2,#0C4HSETB P0.1LCALL DELAYCLR P0.1MOV P2,#0D0HSETB P0.2LCALL DELAYCLR P0.2MOV P2,#99HSETB P0.3LCALL DELAYCLR P0.3MOV P2,#92HSETB P0.4LCALL DELAYCLR P0.4MOV P2,#82HSETB P0.5LCALL DELAYCLR P0.5LJMP STARTDELAY: MOV R5,#10D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND五、4*4矩阵键盘和蜂鸣器功能描述:通过按键让数码管显示0-F,按键按下时,蜂鸣器响一下。
基于单片机STC89C516RD+的电子钟设计
![基于单片机STC89C516RD+的电子钟设计](https://img.taocdn.com/s3/m/32ae0a6501f69e31433294bb.png)
单片机课程设计实验报告——基于STC89C516RD+的电子钟设计学院:电气与电子工程学院班级:姓名: ===学号:时间: 2015.06目录1.实验内容及要求………………………………………………/012.课题研究目的和意义及介绍……………………………../013.设计思路及描述………………………………………………/024.硬件设计………………………………………………………../035.软件设计………………………………………………………../066.实验心得及体会………………………………………………/107.总结………………………………………………………………./11一、实验内容及要求1.实验内容用STC89C516RD+设计一个用电子屏显示的电子钟,可以显示年、月、日以及时、分、秒,且时间时时刻刻在变化,秒数每秒加一且可以进行分钟进位小时进位。
另外该电子钟还可以设置闹钟,闹钟到达指定时刻时便自动进行闹铃,间断响铃持续一分钟后停止,而在其过程中若是按下键盘上的#号键可以将闹钟关闭,不仅如此#号键就是闹钟的总开关,按下一次闹钟关闭,再按一次闹钟开启。
对应键盘上的*号键功能为设置闹钟,按下*号键再用键盘输入四位数字如“0909”,9时9分就成为了电子钟的闹铃时间。
2.实验要求了解89C51系列芯片的工作原理和工作方式,使用该种芯片对LCD数字显示屏进行显示控制,实现用单片机的端口控制显示屏,显示时间年月日时分秒,并且能通过按键来设置一个闹钟,并可以控制开启和关闭闹钟。
要求选用定时器的工作方式,画出使单片机控制LCD显示屏的电路图,并实现硬件电路,最后用软件编程完成闹钟设置、闹钟提醒、闹钟开关功能。
二、课题研究目的和意义及介绍1.目的意义1)通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。
2)掌握定时器、外部中断的设置和编程原理。
3)通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。
基于89C51单片机的秒表课程设计
![基于89C51单片机的秒表课程设计](https://img.taocdn.com/s3/m/7dbe8d8f50e2524de5187ef0.png)
单片机原理及系统课程设计专业:电气工程及其自动化班级:姓名:学号:指导教师:兰州交通大学自动化与电气工程学院年月日1 引言随着电子技术的发展,电子技术在各个领域的运用也越来越广泛,人们对它的认识也逐步加深。
秒表计时器常常用于体育竞赛及各种其他要求有较精确时间的各领域中。
其中启/停开关的使用方法与传统的机械计时器相同,即按一下启/停开关,启动计时器开始计时,再按一下启/停开关计时终止。
而复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时应立即终止。
2 设计方案及原理以单片机为核心,设计一个秒表,具有计时功能,按键有启动计时、数据清零、停止、时间显示。
采用3个LED数码管显示时间,计时范围设置为0~99.9秒,即精确到0.1秒,用按键控制秒表的“开始”、“暂停”、“复位”,按“开始”按键,开始计时;按“暂停”按键,系统暂停计时;再按“开始”键,系统继续计时;数码管显示当前计时值;按“复位”按键,系统清零。
3 硬件设计MCS-51系列单片机是8位单片机产品,89C51是其中的典型代表,基本模块包括以下几个部分:(1)CPU:89C51的CPU是8位的,另外89C51内部有1个位处理器;(2)R0M:4KB的片内程序存储器,存放开发调试完成的应用程序;(3)RAM:256B的片内数据存储器,容量小,但作用大;(4)I/O口:P0-P3,共4个口32条双向且可位寻址的I/O口线;(5)中断系统:共5个中断源,3个内部中断,2个外部中断;(6)定时器/计数器:2个16位的可编程定时器/计数器;(7)通用串行口:全双工通用异步接收器/发送器;(8)振荡器:89C51的外接晶振与内部时钟振荡器为CPU提供时钟信号;(9)总线控制:89C51对外提供若干控制总线,便于系统扩展。
89C51单片机内部的振荡电路是一个高增益反相放大器,引线XTAL1和XTAL2分别为反相振荡放大器的输入及内部时钟工作电路的输入和来自反相振荡器的输出,该反相放大器可以配置为片内振荡器。
【毕业设计】基于AT89C51单片机的电子时钟
![【毕业设计】基于AT89C51单片机的电子时钟](https://img.taocdn.com/s3/m/836afd5be418964bcf84b9d528ea81c758f52ece.png)
昆明工业职业技术学院系统软件设计内容提要单片计算机即单片微型计算机。
由RAM ,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
而51系列单片机是各单片机中最为典型和最有代表性的一种。
这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
本设计主要设计了一个基于AT89C51单片机的电子时钟。
应用定时器实现秒定时,在此基础上实现时钟的计时功能,并通过数码管输出时分秒信息,并设计按键调时功能。
关键字:单片机;电子时钟;键盘控制目录1绪论单片机在多功能数字钟中的应用已是非常普遍的,人们对电子时钟的功能及工作顺序都非常熟悉。
但是却很少知道它的内部结构以及工作原理。
由单片机作为电子时钟的核心控制器,可以通过它的时钟信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。
通过键盘可以进行校时、定时等功能。
输出设备显示器可以用液晶显示技术或数码管来显示技术。
本系统利用单片机实现具有计时、校时等功能的数字时钟,是以单片机AT89S51为核心元件同时采用LED数码管显示器动态显示“时”,“分”,“秒”的现代计时装置。
与传统机械表相比,它具有走时精确,显示直观等特点。
另外具有校时功能,秒表功能,和定时器功能,利用单片机实现的数字时钟具有编程灵活,便于功能的扩充等优点。
1.1所做题目的意义:数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成数字钟电路的设计,因此进行数字钟的设计是必要的。
在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力。
at89c51单片机课程设计_数字电子时钟
![at89c51单片机课程设计_数字电子时钟](https://img.taocdn.com/s3/m/7e55f8d2ba4cf7ec4afe04a1b0717fd5360cb22c.png)
课程设计课程名称 : 单片机课程设计单片机课程设计单片机电子时钟题目名称 : 单片机电子时钟学 院 :电气工程及其自动化 专 业 : 电气工程及其自动化金鱼 姓 名 : 金鱼学 号 :指导教师 :中断服务程序3、定时器/计数器T0中断服务程序T0用于计时,选中方式一,重复定时,定时时间设为50ms,定时时间到则中断,在中断服务程序中用一个计数器对50ms计数,计20次则对秒单元加一。
秒单元加到60则对分单元加一,同时秒单元清0;分单元加到60则对时单元,标 加一,同时分单元清0;时单元加到24则对时单元清0,标志一天时间计满。
在对各单元计数的同时,把他们的值放到存储器单元的指定位置。
流程图如下:4、按键处理模块、按键处理模块按键设置为:如果没有按键吗,则时钟正常走时。
现场保护,现场保护,重置初值,重置初值,启动下一个50ms是开始开始显示单元清T0、T1设为16位计数模式位计数模式允许T0中断中断调用显示子程序调用显示子程序进入功能程序进入功能程序按下键否按下键否开始开始中断返回中断返回50ms 计数器加一计数器加一秒单元加一,50ms 计数器清0分单元加一,秒单元清0时单元加一,分单元清0时单元清050ms 计数器=20?秒单元=60?分单元=60?时单元=24?主程序流程图主程序流程图T0中断服务程序中断服务程序NONONONO当按下K0键时,进入调分状态,时钟停止走动;按K1和K2按键可以进行加一和减一操作;继续按K0键可以分别进行分和小时的调整;最后按K0键启动计时。
键启动计时。
5、汇编语言程序、汇编语言程序ORG 0000HLJMP ST ARTORG 000BHLJMP INIT0主程序开始ST ART: MOV R0,#70H ;主程序开始MOV R7,#0CHINIT: MOV @R0,#00HINC R0DJN Z R7,INITMOV 72H,#10 ;对连字符进行装值对连字符进行装值MOV 75H,#10MOV TMOD,#01H ;选择定时器/计数器T0的方式1MOV TL0,#0B0H ;对低位赋初值对低位赋初值MOV TH0,#03CH ;高位赋初值高位赋初值SETB EASETB ET0SETB TR0ST ART1: LCALL SCANLCALL KEYSCANSJMP ST ART1子程序DL1MS: MOV R6,#14H ;延时1子程序DL1: MOV R7,#19HDL2: DJNZ R7,DL2DJNZ R6,DL1RETDL20MS: ACALL SCAN ;延时20ms子程序子程序ACALL SCANACALL SCAN数码管显示程序开始RET ;数码管显示程序开始SCAN: MOV A,78HMOV B,#0AHDIV AB ;时间秒的十位送给A,时间秒的个位送BMOV 71H,A ;时间秒要显示的十位时间秒要显示的十位时间秒要显示的个位MOV 70H,B ;时间秒要显示的个位MOV A,79HMOV B,#0AHDIV AB ;时间分的十位送给A,时间分的个位送B时间分要显示的十位送地址MOV 74H,A ;时间分要显示的十位送地址时间分要显示的个位送地址MOV 73H,B ;时间分要显示的个位送地址MOV A,7AHMOV B,#0AHDIV AB ;时间时的十位送给A,时间时的个位送B时间时显示的十位送地址MOV 77H,A ;时间时显示的十位送地址时间时要显示的个位送地址MOV 76H,B ;时间时要显示的个位送地址MOV R1,#70HMOV R5,#0FEHMOV R3,#08H数码管的显示程序SCAN1: MOV A,R5 ;数码管的显示程序MOV P2,AMOV A,@R1MOV DPTR,#TAB对字段表取值显示MOVC A,@A+DPTR ;对字段表取值显示MOV P0,AMOV A,R5LCALL DL1MSINC R1MOV A,R5RL AMOV R5,ADJNZ R3,SCAN1MOV P2,#0FFHMOV P0,#0FFHRET ;"0~9"和"-"的字段表的字段表TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH;定时/计数器T0中断程序中断程序INIT0: PUSH ACCPUSH PSWCLR ET0CLR TR0MOV TL0,#0B0HMOV TH0,#03CHSETB TR0INC 7BHMOV A,7BHCJNE A,#14H,OUTT0 ;50ms是否到20次,没有到就继续执行50ms的延时的延时 MOV 7BH,#00INC 78HMOV A,78HCJNE A,#3CH,OUTT0 ;一秒的延时是否计到60次,没有就继续执行次,没有就继续执行 MOV 78H,#00INC 79HMOV A,79HCJNE A,#3CH,OUTT0MOV 79H,#00INC 7AHMOV A,7AH次,没有就CJNE A,#18H,OUTT0 ;60分钟的延时是否计到24次,没有就继续执行程序继续执行程序MOV 7AH,#00OUTT0:SETB ET0 ;启动定时器T0POP PSWPOP ACCRETI;按键处理程序按键处理程序KEYSCAN:CLR EA有按键按下则跳转到子程序JNB P1.0,KEYSCAN0 ;P1.0有按键按下则跳转到子程序有按键按下则跳转到子程序JNB P1.1,KEYSCAN1 ;P1.1有按键按下则跳转到子程序有按键按下则跳转到子程序JNB P1.2,KEYSCAN2 ;P1.2有按键按下则跳转到子程序KEYOUT: SETB EARET的延时消抖KEYSCAN0:LCALL DL20MS ;20ms的延时消抖JB P1.0,KEYOUT松手就往下执行程序松手就往下执行程序判断按键是否松手,W AIT0: JNB P1.0,W AIT0 ;判断按键是否松手,INC 7CHMOV A,7CHCLR ET0CLR TR0按下第一次和第二次对时、分选定CJNE A,#03H,KEYOUT ;按下第一次和第二次对时、分选定MOV 7CH,#00 ;按下第三次时就启动计时按下第三次时就启动计时SETB ET0SETB TR0SJMP KEYOUTKEYSCAN1:LCALL DL20MS ;按键加一的程序按键加一的程序JB P1.1,KEYOUTW AIT1: JNB P1.1,W AIT1MOV A,7CH如果功能键按下则对时加一调整CJNE A,#02H,KSCAN11 ;如果功能键按下则对时加一调整INC 79H则清零CJNE A,#3CH,KEYOUT ;如果加到60则清零MOV 79H,#00SJMP KEYOUT如果功能键是按下第KSCAN11:INC 7AH ;如果功能键是按下第二次则对分进行加一调整二次则对分进行加一调整MOV A,7AHCJNEA,#18H,KEYOUT MOV7AH,#00 SJMPKEYOUT KEYSCAN2:LCALL DL20MS ;延时消抖程序延时消抖程序JBP1.2,KEYOUT W AIT2: JNB P1.2,W AIT2 ;判断是否放开按键判断是否放开按键MOVA,7CH CJNE A,#02H,KSCAN21 ;如果功能键是按下第一次对时进行减一如果功能键是按下第一次对时进行减一 DEC79H MOVA,79H CJNE A,#0FFH,KEYOUT MOV79H,#3BH SJMPKEYOUT KSCAN21:DEC 7AH ;如果功能键是按下第二次则对分进行减一如果功能键是按下第二次则对分进行减一CJNEA,#0FFH,KEYOUT MOV7AH,#17H SJMPKEYOUT END6、软件编译环境:Keil uVision2确保生成确保生成 ". Hex"文件文件五、系统硬件电路的设计五、系统硬件电路的设计系统的硬件主要包括单片机芯片,数码管显系统的硬件主要包括单片机芯片,数码管显 示,按键开关电路,它的硬件电路如下图所示,单片机采用广泛使用的AT89C52AT89C52,系统时钟采用,系统时钟采用12MHz 的晶振,八个数码管显示,小时与分钟与秒钟间用短横线,采用共阳极七段式数码管,P0口为段选码输出端,P2口为位选码输出端。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、电子时钟、秒表和计数器的设计1、实现的功能:1)有key0,key1两个功能按键,复位后,数码管会默认显示时钟模式HH.MM 。
(HH表示小时,MM表示分钟),key0短按一次就进入到了秒表模式,数码管显示格式S.SS.S,(分别表示百秒,秒,毫秒)key0再短按一次就进入到了计数器模式,数码管显示格式CCCC(分别为千位百位十位个位)。
key0再短按一次,又进入到了时钟显示模式,就这样由key0控制模式的转换。
2)有RST复位键,本身电路设计有上电自动复位功能,按下RST后,电路复位。
3)有ckey0,ckey1 两个计数按键,按下ckey0,计数加一,按下ckey1,计数减一。
4) 电子时钟和秒表时间计时方法是采用89S52内部计时器0的一种工作方式(详见后面的代码分析),通过计时器0中断来控制时间的运行。
5)计数器是采用外部中断0和外部中断1这两个外部中断实现加1和减1的操作。
(1)电子时钟模式:(以下“长按”表示按下按键的时间大于1秒,“短按”表示按下的时间小于0.7 秒)1)长按key1一次,会进入到调整分钟的模式,短按key1一次,分钟会加一。
第二次长按key1,会进入到调整小时的模式,短按key1一次,小时加一。
第三次长按key1,重新回到时钟显示模式,这时再短按key1,时间不会变化2)长按key0一次,会进入到显示秒的模式(2)秒表模式:1)由key0控制进入秒表模式后,短按key1一次,秒表计时开始,再短按key1一次计时结束2)长按key1一次,秒表清零(3)计数器模式1)按ckey0一下,计数加一,数码管相应的显示的数值加一,按ckey1一下,计数减一,数码管相应的显示的数值减一,由于数码管的位数限制,最大只能显示到9999,此时按下ckey0无反应;考虑到实际计数功能,没有设置负数,所以最小显示0000,这时按下ckey1 ,无反应。
2)长按key1一次计数器清零。
2、电路原理图(1)使用片内振荡器(2)具有上电复位和手动复位两个功能(3)key0,key1分别接P1.0和P1.1引脚(4)由P0.0~P0.7输出到七段数码显示管(5)由P2.0~P2.3接三极管,驱动共阳七段数码显示管(6) ckey0,ckey1接P3.2和P3.3两个引脚,为两个外部中断4.电路焊接实物图(1)正面(2)反面:由于显影、腐蚀过程做得不好,导致电路板过度腐蚀,但是经过修改之后,电路可以正常运行,并无大碍,只是不美观。
(4)电路板工作时。
此时为显示时钟的秒显示时钟显示秒表显示计数器5、程序设计分析(1)程序代码#include<Reg51.h>sbit key0=P1^0;sbit key1=P1^1; //定义key0,key1接口unsigned char flag,con,mcount; //flag为计数到一秒时给时钟发的信号unsigned char count = 0;unsigned char seccount =0; //作为时钟的秒的计量单位unsigned char hour = 0; //时钟的时unsigned char min = 0; //时钟的分unsigned char sec = 0; //时钟的秒unsigned char keypress0,keypress1,mode,ms,s,ss,start;unsigned charDisplaynum[]={0x14,0xd7,0x4c,0x45,0x87,0x25,0x24,0x57,0x04,0x05, 0x10,0xd3,0x48,0x41,0x83,0x21,0x20,0x53,0x00,0x01,0xff,0xfb};//数码管十六进制译码表unsigned char controlnum[]={0x08,0x04,0x02,0x01}; //控制四个数码管显示unsigned char DisplayBuff[]={0x00, 0x00, 0x00, 0x00}; //每个数码管的值void display_state(); //数码管显示子程序void keyscan(); //键盘扫描子程序void timer(); //秒表子程序unsigned char count1,flag1,t_adjust=0,tm_adjust=0;unsigned charbKey0Pressed = 0, bKey1Pressed = 0;unsigned char ucStatus = 0;void main(){TMOD = 0x01; //定时器0工作在模式1,GATE=0,C/t=0,16位模TH0= (2^16-5000)/256;//定时器0 预存值,TL0= (2^16-5000)%256;TR0= 1; //定时器0 启动ET0= 1; //定时器中断0 允许EA= 1; //开中断IT0=1; //外部中断0下降沿触发IT1=1; //外部中断1 下降沿触发EX0=1; //外部中断0允许EX1=1; //外部中断1允许PX1=1; //外部中断1 为高优先级中断while(1) //死循环,{if(flag == 1) //时钟显示{flag = 0;sec++;if(sec ==60){sec = 0;min++;if(min ==60){min = 0;hour ++;if(hour == 24){hour = 0;}}}}display_state();keyscan();timer();}}//////////////////////////////////ISR中断服务程序,每5ms产生一个定时器0 中断void Display() interrupt 1{TH0 = (2^16-5000)/256;TL0 = (2^16-5000)%256;seccount ++;mcount ++;keypress0++;keypress1++;P2=0x00; //P2口先清零P0 = Displaynum[DisplayBuff[count]]; //P0口输出P2 = controlnum[count]; //P2口输出count++;if(count==4)count=0;if(seccount == 200) //200*5ms=1s{ seccount =0;flag =1; //每过1秒给时钟信号加一秒}}///////////////////////////////////////////void display_state(){if(mode == 0) //时钟模式,显示时间{DisplayBuff[0] = hour/10;DisplayBuff[1] = (hour%10)+10; //“+10”是为了显示加点的数字DisplayBuff[2] = min/10;DisplayBuff[3] = min%10;}if(mode == 1) //秒表模式,显示秒表{DisplayBuff[0] = ss +10; //“+10”是为了显示加点的数字DisplayBuff[1] = s/10;DisplayBuff[2] = (s%10)+10;DisplayBuff[3] = ms;}if(mode == 2) // 计数器模式,显示计数{DisplayBuff[0] = count1/1000; //千位DisplayBuff[1] = (count1-(count1/1000)*1000)/100; //百位DisplayBuff[2] = (count1-(count1/100)*100)/10; //十位DisplayBuff[3] = count1%10; //个位}if(mode==3) //显示时钟的秒,{DisplayBuff[0] = 20; //第一位不显示DisplayBuff[1] = 21; //第二位显示一个点DisplayBuff[2] = sec/10;//显示秒的十位DisplayBuff[3] = sec%10;//显示秒的个位}}//**************////键盘扫描子程序////**************//void keyscan(){if(!key0 && bKey0Pressed == 0) //检测到key0按下{keypress0 = 0;bKey0Pressed = 1; //防止重入此判断while(!key0); //如果没放开,就等下去}if(key0 && bKey0Pressed == 1) //检测到key0放开{bKey0Pressed = 0; //防止重入此判断if (keypress0<120) //如果是短按{if(ucStatus == 0x02){ucStatus = 0x00;mode = 0; //时钟模式t_adjust=0;}else if(ucStatus == 0x00){ucStatus = 0x01;mode = 1; //秒表模式}else if(ucStatus == 0x01){ucStatus = 0x02;mode = 2; //计数模式}}else if(keypress0>200) //如果是长按mode=3; //显示时钟的秒的模式}////////////////////////////////if(mode == 0) //进入时钟模式后{if(!key1 && (bKey1Pressed == 0)){ keypress1 = 0;bKey1Pressed = 1;while(!key1);}if(key1 && (bKey1Pressed == 1)){bKey1Pressed = 0;if(keypress1 >= 200) //如果是长按{t_adjust++;if(t_adjust==3)t_adjust=0;}else if(keypress1 < 120) 如果是短按switch (t_adjust){case 1:{ //调整分min++;sec = 0;if(min == 60)min = 0;}break;case 2: { //调整时hour ++ ;sec = 0;if(hour == 24)hour = 0;}break;default:break;}}}else if(mode == 1) //进入秒表模式{if(!key1 && bKey1Pressed == 0){keypress1 = 0;bKey1Pressed = 1;while(!key1);}if(key1 && bKey1Pressed == 1){bKey1Pressed = 0;if(keypress1 < 120) //短按{if(flag1==0) { start=2;flag1=1;} //start=2代表秒表开始计时else {start=0;flag1=0;} //start=0,秒表停止计时}else if(keypress1>200) //长按start=1; //秒表清零}}}void timer() //秒表子程序{if(mode==1) //进入秒表模式才执行{if(start==1) //清零{ms = 0;s = 0;ss = 0;mcount=0;}if(start==2) //秒表开始计时{if(mcount==20) //20*5ms=0.1s{mcount=0;ms++;if(ms == 10) // 10*0.1s=1s,s++{ms = 0;s ++;if(s == 100) //100s{s = 0;ss ++;if(ss == 10){ss = 0;s = 0;ms = 0;}}}}}if(start==0);//秒表停止}}//////////////////////void it0(void) interrupt 0 using 1 //外部中断0 服务程序{if(mode==2) //只有在计数模式才执行{count1++; //每响应一次,计数加一if(count1==10000) //超出四位时,不能再加count1 =9999;}}void it2(void) interrupt 2 using 2 //外部中断0 服务程序{if(mode==2) //只有在计数模式才执行{if(count1!=0){count1--;} //计数减一,不显示负数,当减到零时便不能再减 }}。