单片机数字时钟设计,时分秒天
单片机课程设计数字钟实验报告
单片机课程设计:电子钟一、实现功能1、能够实现准确计时,以数字形式显示时、分、秒的时间。
2、小时以24小时计时形式,分秒计时为60进位,能够调节时钟时间。
3、闹钟功能,一旦走时到该时间,能以声或光的形式告警提示。
4、能够实现按键启动与停止功能。
5、能够实现整点报时功能。
6、能够实现秒表功能。
二、设计思路1、芯片介绍VCC:电源。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。
单片机制作数字钟(含万年历、秒表功能)
数字钟、万年历制作(基于单片机)电路原理图:程序://********************20131206****数字钟程序#pragma SMALL#include <reg51.h>#include <absacc.h>#include <intrins.h>//********************************************************* *********编译预处理void display(unsigned char *p); //显示函数,P为显示数据首地址unsigned char keytest(); //按键检测函数unsigned char search(); //按键识别函数void alarm(); //闹钟判断启动函数void ftion0(); //始终修改函数void ftion1(); //闹钟修改函数void ftion3(); //日期修改函数void cum(); //加1修改函数void minus(); //减1修改函数void jinzhi(); //进制修改函数void riqi(); //日期void stopwatch(); //秒表函数//********************************************************* *******函数声明sbit P2_7=P2^7;//********************************************************* *******端口定义unsigned char clockbuf[3]={0,0,0};unsigned char bellbuf[3]={0,0,0};unsigned char date[3]={1,1,1}; //日期存放数组unsigned char stop[3]={0,0,0};unsigned char msec1,msec2;unsigned char timdata,rtimdata,dtimdata;unsigned char count;unsigned char *dis_p;unsigned char or; //12进制控制标志unsigned char ri; //日期显示控制标志位unsigned char mb; //秒表控制标志位bit arm,rtim,rhour,rmin,hour,min,sec,day,mon,year; //定义位变量//********************************************************* *****全局变量定义void main(){unsigned char a;or=0; //12进制修改标志清零ri=0;mb=0;P2_7=0;arm=0;msec1=0;msec2=0;timdata=0;rtimdata=0;count=0;TMOD=0x12;TL0=0x06;TH0=0x06;TH1=(65536-10000)/256;TL1=(65536-10000)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=0;dis_p=clockbuf;while(1){a=keytest();if(a==0x78) //判断是否有键按下{display(dis_p);if(arm==1) alarm();}else{display(dis_p);a=keytest();if(a!=0x78){a=search();switch(a){case 0x00:ftion0();break;case 0x01:ftion1();break;case 0x02:cum();break;case 0x06:jinzhi();break;case 0x03:riqi();break;case 0x04:ftion3();break;case 0x05:minus();break;case 0x07:stopwatch();break;case 0x09:TR1=1;break;case 0x0a:TR1=0;break;case 0x0b:stop[0]=0;stop[1]=0;stop[2]=0;break;default:break;}}}}}//********************************************主函数【完】void display(unsigned char *p){unsigned char buffer[]={0,0,0,0,0,0};unsigned char k,i,j,m,temp;unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};buffer[0]=p[0]/10;buffer[1]=p[0]%10;buffer[2]=p[1]/10;buffer[3]=p[1]%10;buffer[4]=p[2]/10;buffer[5]=p[2]%10;if((sec==0)&&(min==0)&&(hour==0)&&(rmin==0)&&(rhour==0)&&( day==0)&&(mon==0)&&(year==0)) //没有修改标志,正常显示{for(k=0;k<3;k++){temp=0x01;for(i=0;i<6;i++){P0=0x00; //段选端口j=buffer[i];P0=led[j];P1=~temp; //位选端口temp<<=1;for(m=0;m<200;m++);}}}else //若有修改标志,则按以下标志分别显示{if(sec==1||day==1){P1=0x1f;i=buffer[5];P0=led[i];for(m=0;m<200;m++);P1=0x2f;j=buffer[4];P0=led[j];for(m=0;m<200;m++);}if(min==1||rmin==1||mon==1){P1=0x3b;i=buffer[2];P0=led[i];for(m=0;m<200;m++);P1=0x37;j=buffer[3];P0=led[j];for(m=0;m<200;m++);}if(hour==1||rhour==1||year==1) {P1=0x3e;i=buffer[0];P0=led[i];for(m=0;m<200;m++);P1=0x3d;j=buffer[1];P0=led[j];for(m=0;m<200;m++);}}}//**********************************LED显示函数【完】unsigned char keytest(){unsigned char c;P2=0x78; //检测是否有键按下c=P2;c=c&0x78;return(c);}//******************************************键盘检测函数【完】unsigned char search(){unsigned char a,b,c,d,e;c=0x3f;a=0; //行号while(1){P2=c;d=P2;d=d&0x07;if(d==0x03){b=0;break;} //列号else if(d==0x05){b=1;break;}else if(d==0x06){b=2;break;}a++;c>>=1;if(a==5){a=0;c=0x3f;}}e=a*3+b;do{display(dis_p);}while((d=keytest())!=0x78);return(e);}//***********************************************查键值函数【完】void alarm(){if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1])){P2_7=1;rtim=1;if(count==10){count=0;P2_7=0;arm=0;rtim=0;}}}//****************************************闹钟判断启动函数【完】void ftion0(){TR0=0;rhour=0;rmin=0;dis_p=clockbuf;rtimdata=0;timdata++;switch(timdata){case 0x01:sec=1;break;case 0x02:sec=0;min=1;break;case 0x03:min=0;hour=1;break;case 0x04:timdata=0;hour=0;TR0=1;break;default:break;}}//*********************************************时钟设置函数【完】void ftion1(){if(TR0==0) TR0=1;sec=0;min=0;hour=0;dis_p=bellbuf;timdata=0;rtimdata++;switch(rtimdata){case 0x01:rmin=1;break;case 0x02:rmin=0;rhour=1;break;case 0x03:rtimdata=0;rhour=0;arm=1;dis_p=clockbuf;break;default:break;}}//*********************************************闹钟设置函数【完】void ftion3(){if(TR0==0) TR0=1;day=0;mon=0;year=0;dis_p=date;timdata=0;rtimdata=0;dtimdata++;switch(dtimdata){case 0x01:day=1;break;case 0x02:day=0;mon=1;break;case 0x03:mon=0;year=1;break;case 0x04:dtimdata=0;year=0;dis_p=clockbuf;break;default:break;}}//*************************************************日期修改函数【完】void minus(){if(sec==1){if(0==clockbuf[2]) clockbuf[2]=59;else clockbuf[2]--;}else if(min==1){if(0==clockbuf[1]) clockbuf[1]=59;else clockbuf[1]--;}else if(hour==1){if(or==0) //判断进制{if(0==clockbuf[0]) clockbuf[0]=23;else clockbuf[0]--;}if(or==1){if(1==clockbuf[0]) clockbuf[0]=12;else clockbuf[0]--;}}else if(rmin==1){if(bellbuf[1]==0) bellbuf[1]=59;else bellbuf[1]--;}else if(rhour==1){if(or==0){if(bellbuf[0]==0) bellbuf[0]=23;else bellbuf[0]--;}if(or==1){if(bellbuf[0]==1) bellbuf[0]=12;else bellbuf[0]--;}}else if(day==1){if(date[2]==1) date[2]=31;else date[2]--;}else if(mon==1){if(date[1]==1) date[1]=12;else date[1]--;}else if(year==1){if(date[0]==1) date[0]=99;else date[0]--;}}//*************************************减1修改功能函数【完】void cum(){if(sec==1){if(59==clockbuf[2]) clockbuf[2]=0;else clockbuf[2]++;}else if(min==1){if(59==clockbuf[1]) clockbuf[1]=0;else clockbuf[1]++;}else if(hour==1){if(or==0) //判断进制{if(23==clockbuf[0]) clockbuf[0]=0;else clockbuf[0]++;}if(or==1){if(12==clockbuf[0]) clockbuf[0]=1;else clockbuf[0]++;}}else if(rmin==1){if(bellbuf[1]==59) bellbuf[1]=0;else bellbuf[1]++;}else if(rhour==1){if(or==0){if(bellbuf[0]==23) bellbuf[0]=0;else bellbuf[0]++;}if(or==1){if(bellbuf[0]==12) bellbuf[0]=1;else bellbuf[0]++;}}else if(day==1){if(date[2]==31) date[2]=1;else date[2]++;}else if(mon==1){if(date[1]==12) date[1]=1;else date[1]++;}else if(year==1){if(date[0]==99) date[0]=0;else date[0]++;}}//*************************************加1修改功能函数【完】void jinzhi(){if(or==0) or=1;else or=0;}//***********************************进制修改控制函数【完】void riqi(){if(ri==0){dis_p=date;}if(ri==1){dis_p=clockbuf;}ri++;if(ri==2) ri=0;}//********************************日期控显示函数【完】void stopwatch(){if(mb==0){dis_p=stop;mb=1;}else{mb=0;dis_p=clockbuf;}}//************秒表**********秒表**********秒表函数【完】void clock() interrupt 1{EA=0;if(msec1!=0x14) msec1++; //6MHz晶振定时10mselse{msec1=0;if(msec2!=100) msec2++; //定时1selse{if(rtim==1) count++; //闹钟启动标志计时10smsec2=0;if(clockbuf[2]!=59) clockbuf[2]++;else{clockbuf[2]=0;if(clockbuf[1]!=59) clockbuf[1]++;else{clockbuf[1]=0;if(or==0){if(clockbuf[0]!=23) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}if(or==1){if(clockbuf[0]!=12) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}}}}}EA=1;}//*******************************定时器0中断函数【完】void miaobiao() interrupt 3{TH1=(65536-10000)/256;TL1=(65536-10000)%256;if(stop[2]!=99) stop[2]++;else{stop[2]=0;if(stop[1]!=59) stop[1]++;else{stop[1]=0;if(stop[0]!=59) stop[0]++;else stop[0]=0;}}}//***********************************定时器1中断函数【完】。
基于单片机电子时钟的设计与实现
基于单片机电子时钟的设计与实现一、设计目标设计一个基于单片机的电子时钟,能够准确显示时间并能够进行设置和调整。
二、硬件设计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;//熄灭数码管```四、总结通过以上的硬件设计和软件实现,可以实现一个基于单片机的电子时钟。
51单片机数字钟设计
51单片机数字钟设计是一种常用的电子设计,它使用51单片机作为控制核心,通过数码管显示时间。
以下是一个简单的51单片机数字钟设计步骤:
1. 硬件设计
首先,需要选择一个合适的51单片机型号,如AT89C51、AT89S52等。
然后,需要选择数码管显示模块,可以选择多个数码管显示小时、分钟和秒。
同时,还需要选择适当的电源模块为数码管和单片机提供电源。
2. 软件设计
在软件设计方面,需要编写程序来控制数码管的显示,并实现时间的计数和更新。
可以使用定时器中断来实现时间的计数和更新。
同时,还需要编写程序来读取按键输入,以便用户可以调整时间。
3. 调试
在完成硬件和软件设计后,需要进行调试。
首先,需要检查硬件连接是否正确,然后通过调试程序来检查数码管的显示是否正确,以及时间计数和更新是否正常。
以上是一个简单的51单片机数字钟设计步骤,实际的设计可能需要根据具体需求进行修改和调整。
单片机实验报告数字时钟设计报告
单片机实验报告数字时钟设计报告一、实验目的本次单片机实验的目的是设计并实现一个基于单片机的数字时钟。
通过该实验,深入了解单片机的工作原理和编程方法,掌握定时器、中断、数码管显示等功能的应用,提高综合运用知识解决实际问题的能力。
二、实验原理1、单片机选择本次实验选用了常见的 51 系列单片机,如 STC89C52。
它具有丰富的资源和易于编程的特点,能够满足数字时钟的设计需求。
2、时钟计时原理数字时钟的核心是准确的计时功能。
通过单片机内部的定时器,设定合适的定时时间间隔,不断累加计时变量,实现秒、分、时的计时。
3、数码管显示原理采用共阳或共阴数码管来显示时间数字。
通过单片机的 I/O 口控制数码管的段选和位选信号,使数码管显示相应的数字。
4、按键控制原理设置按键用于调整时间。
通过检测按键的按下状态,进入相应的时间调整模式。
三、实验设备与材料1、单片机开发板2、数码管3、按键4、杜邦线若干5、电脑及编程软件(如 Keil)四、实验步骤1、硬件连接将数码管、按键与单片机开发板的相应引脚通过杜邦线连接起来。
确保连接正确可靠,避免短路或断路。
2、软件编程(1)初始化单片机的定时器、中断、I/O 口等。
(2)编写定时器中断服务程序,实现秒的计时。
(3)设计计时算法,将秒转换为分、时,并进行进位处理。
(4)编写数码管显示程序,将时间数据转换为数码管的段选和位选信号进行显示。
(5)添加按键检测程序,实现时间的调整功能。
3、编译与下载使用编程软件将编写好的程序编译生成可执行文件,并下载到单片机中进行运行测试。
五、程序设计以下是本次数字时钟设计的主要程序代码片段:```cinclude <reg52h>//定义数码管段选码unsigned char code SEG_CODE ={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//定义数码管位选码unsigned char code BIT_CODE ={0x01, 0x02, 0x04, 0x08, 0x10,0x20, 0x40, 0x80};//定义时间变量unsigned int second = 0, minute = 0, hour = 0;//定时器初始化函数void Timer_Init(){TMOD = 0x01; //定时器 0 工作在方式 1 TH0 =(65536 50000) / 256; //定时 50ms TL0 =(65536 50000) % 256;EA = 1; //开总中断ET0 = 1; //开定时器 0 中断TR0 = 1; //启动定时器 0}//定时器 0 中断服务函数void Timer0_ISR() interrupt 1{TH0 =(65536 50000) / 256;TL0 =(65536 50000) % 256;second++;if (second == 60){second = 0;minute++;if (minute == 60){minute = 0;hour++;if (hour == 24){hour = 0;}}}}//数码管显示函数void Display(){unsigned char i;for (i = 0; i < 8; i++)P2 = BIT_CODEi;if (i == 0){P0 = SEG_CODEhour / 10;}else if (i == 1){P0 = SEG_CODEhour % 10;}else if (i == 2){P0 = 0xBF; //显示“”}else if (i == 3){P0 = SEG_CODEminute / 10;else if (i == 4){P0 = SEG_CODEminute % 10;}else if (i == 5){P0 = 0xBF; //显示“”}else if (i == 6){P0 = SEG_CODEsecond / 10;}else if (i == 7){P0 = SEG_CODEsecond % 10;}delay_ms(1);//适当延时,防止闪烁}}//主函数void main(){Timer_Init();while (1){Display();}}```六、实验结果与分析1、实验结果将程序下载到单片机后,数字时钟能够正常运行,准确显示时、分、秒,并且通过按键可以进行时间的调整。
基于C51单片机的数字时钟课程设计(C语言带闹钟)
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。
键盘采用动态扫描方式。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
单片机课程设计实验报告 基于单片机的数字时钟 含完整实验代码..
单片机课程设计报告基于单片机的数字时钟姓名:班级:学号:一、前言利用实验板上的4个LED数码管,设计带有闹铃、秒表功能的数字时钟。
功能要求:a)计时并显示(LED)。
由于实验板上只有4位数码管,可设计成显示“时分”和显示“分秒”并可切换。
b)时间调整功能。
利用4个独立按钮,实现时钟调整功能。
这4个按钮的功能为工作模式切换按钮(MODE),数字加(INC),数字减(DEC)和数字移位(SHITF)。
c)定闹功能。
利用4个独立按钮设定闹钟时间,时间到以蜂鸣器响、继电器动作作为闹铃。
d)秒表功能。
最小时间单位0.01秒。
二、硬件原理分析1.电源部分电源部份采用两种输入接口(如上图)。
a)外电源供电,采用2.1电源座,可接入电源DC5V,经单向保护D1接入开关S1。
b)USB供电,USB供电口输入电源也经D1单向保护,送到开关S1。
注:两路电源输入是并连的,因此只选择一路就可以了,以免出问题。
S1为板子工作电源开关,按下后接通电源,提供VCC给板子各功能电路。
电路采用两个滤波电容,给板子一个更加稳定的工作电源。
LED为电源的指示灯,通电后LED灯亮。
2.蜂鸣器蜂鸣器分为有源和无源两种,有源即两引脚有一个直流电源就可以长鸣,无源则需要一个1K左右的脉冲才可以蜂鸣,因此对于按键的提示音及报警蜂鸣使用有源来得方便。
有源也可以当无源使用,而无源则不能当有源使用,当然用有源蜂鸣器作音乐发声会失真厉害。
如上图:单片机P15输出高低电平经R21连接三极管B极,控制三极管的导通与截止,从而控制蜂鸣器的工作。
低电平时三极管导通,蜂鸣器得电蜂鸣,高电平时三极管截止,蜂鸣器失电关闭蜂鸣。
电路使用一个四位共阳型数码管,四个公共阳级由三极管放大电流来驱动,三极管由P10-P13控制开与关。
数码管的阴级由P0口经过电阻限流连接。
例如,要十位的数码管工作,P12输出0,使三极管Q12导通,8脚得电,当P0口相应位有输出0时,点亮相应的LED灯组合各种字符数字。
单片机课程设计-年月日时分秒设计(汇编语言)带Proteus图
//////////时间控制器/////////////////////////////////////////////***********************************************/ SEC EQU 30HMIN EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HYEAR EQU 35HAMIN EQU 36HAHOUR EQU 37HLEDMIN EQU 38HLEDHOUR EQU 39HS_SET BIT P1.0//秒的调整按键M_SET BIT P1.1//分的调整按键H_SET BIT P1.2//时的调整按键D_SET BIT P1.3//日的调整按键MONTH_SET BIT P1.4//月的调整按键Y_SET BIT P1.5//年的调整按键CLRR BIT P1.6//清0的按键TIME BIT P3.6//闹钟的按键LED BIT P3.7//LED的按键/***********************************************/ORG 0000HLJMP MAINORG 000BH//定时器0入口LJMP INT_T0//定时器中断程序ORG 0010H/***********************************************/ MAIN:MOV DPTR,#TABLEMOV SEC,#0MOV MIN,#0MOV HOUR,#0MOV DAY,#1MOV MONTH,#1MOV YEAR,#0MOV AMIN,#0MOV AHOUR,#12MOV LEDMIN,#30MOV LEDHOUR,#6MOV R0,#0MOV TMOD,#01H //模式1MOV TH0,#3CH ; 设置初值(定时50毫秒)MOV TL0,#0B0HSETB TR0 ;启动定时SETB ET0SETB EA;***************************************************** ;判断是否有控制键按下A0:LCALL ALARM//比较当前时间与闹钟的时间//LCALL ALARM1 //整点报时LCALL LED_L //比较当前时间与设置的LED亮的时间LCALL DISPLAYJNB S_SET,S1 //按下就跳转JNB M_SET,S2 //按下就跳转JNB H_SET,S3 //按下就跳转JNB D_SET,S4 //按下就跳转JNB MONTH_SET,TIAO_S5 //按下就跳转JNB Y_SET,TIAO_S6 //按下就跳转JNB CLRR,TIAO_S7 //按下就跳转JNB TIME,TIAO_S8//按下就跳转JNB LED,TIAO_S9//按下就跳转LJMP A0TIAO_S5:LJMP S5TIAO_S6:LJMP S6TIAO_S7:LJMP S7TIAO_S8:LJMP S8TIAO_S9:LJMP S9//秒调整S1:LCALL DELAY ;去抖动JB S_SET,A0INC SEC ;秒值加1MOV A,SECCJNE A,#60,J0 ;判断是否加到60秒MOV SEC,#0LJMP J0;************************************ ;等待按键抬起J0:JB S_SET,A0LCALL DISPLAYLJMP J0//分调整S2:LCALL DELAY;去抖动JB M_SET,A0K1: INC MIN ;分钟值加1MOV A,MINCJNE A,#60,J1 ;判断是否加到60分MOV MIN,#0LJMP J1;************************************ ;等待按键抬起J1:JB M_SET,A0LCALL DISPLAYLJMP J1//时调整S3:LCALL DELAY;去抖动JB H_SET,A0K2: INC HOUR ;小时值加1MOV A,HOURCJNE A,#24,J2 ;判断是否加到24小时MOV HOUR,#0LJMP J2;************************************ ;等待按键抬起J2:JB H_SET,TIAO_A0LCALL DISPLAYLJMP J2TIAO_A0:LJMP A0//日调整S4:LCALL DELAY;去抖动JB D_SET,TIAO_A0K3: INC DAY ;日值加1MOV A,DAYCJNE A,#31,J3 ;判断是否加到30日MOV DAY,#1LJMP J3;************************************ ;等待按键抬起J3:JB D_SET,TIAO_A0LCALL DISPLAYLJMP J3//月调整S5:LCALL DELAY;去抖动JB MONTH_SET,TIAO_A0K4: INC MONTH ;月值加1MOV A,MONTHCJNE A,#13,J4 ;判断是否加到12月MOV MONTH,#1LJMP J4;************************************ ;等待按键抬起J4:JB MONTH_SET,TIAO_A0LCALL DISPLAYLJMP J4//年调整S6:LCALL DELAY;去抖动JB Y_SET,TIAO_A0K5: INC YEAR ;年值加1MOV A,YEARCJNE A,#100,J5 ;判断是否加到100年MOV YEAR,#0SJMP J5;************************************ ;等待按键抬起J5:JB Y_SET,TIAO_A0LCALL DISPLAYLJMP J5//清0S7:LCALL DELAY;去抖动JB CLRR,TIAO_A0MOV YEAR,#0MOV MONTH,#1MOV DAY,#1MOV HOUR,#0MOV MIN,#0MOV SEC,#0MOV AHOUR,#12MOV AMIN,#0MOV LEDHOUR,#6MOV LEDMIN,#30LJMP J6;************************************ ;等待按键抬起J6://JB CLRR,A0JB CLRR,TIAO_A0LCALL DISPLAYLJMP J6TIAO_A00:LJMP A0TIAO_S812:LJMP S8////////////////////////闹钟按键调整/////////////////S8:JB TIME,TIAO_A00JNB M_SET,S81 //按下就跳转JNB H_SET,S82 //按下就跳转LCALL TIME_DISPLAY//闹钟分调整S81:LCALL DELAY;去抖动JB M_SET,TIAO_S812K71:INC AMIN ;闹钟分钟值加1MOV A,AMINCJNE A,#60,J71 ;判断是否加到60分MOV AMIN,#0LJMP J71;************************************ ;等待按键抬起J71:JB M_SET,TIAO_S812LCALL TIME_DISPLAYLJMP J71//闹钟时调整S82:LCALL DELAY;去抖动JB H_SET,TIAO_S812K72: INC AHOUR ;闹钟小时值加1MOV A,AHOURCJNE A,#24,J72 ;判断是否加到24小时MOV AHOUR,#0LJMP J72;************************************ ;等待按键抬起J72:JB H_SET,TIAO_S812LCALL TIME_DISPLAYLJMP J72TIAO_A000:LJMP A0TIAO_S912:LJMP S9////////////////////////LED按键调整//////////////////////S9:JB LED,TIAO_A000JNB M_SET,S91 //按下就跳转JNB H_SET,S92 //按下就跳转LCALL LED_DISPLAY//LED分调整S91:LCALL DELAY;去抖动JB M_SET,TIAO_S912K81:INC LEDMIN ;LED分钟值加1MOV A,LEDMINCJNE A,#60,J81 ;判断是否加到60分MOV LEDMIN,#0LJMP J81;************************************ ;等待按键抬起J81:JB M_SET,TIAO_S912LCALL LED_DISPLAYLJMP J81//LED时调整S92:LCALL DELAY;去抖动JB H_SET,TIAO_S912K82: INC LEDHOUR ;LED小时值加1MOV A,LEDHOURCJNE A,#24,J82 ;判断是否加到24小时MOV LEDHOUR,#0LJMP J82;************************************ ;等待按键抬起J82:JB H_SET,TIAO_S912LCALL LED_DISPLAYLJMP J82/******************闹钟*************************************/ ALARM:JNB TIME,ALARM_CLOSEMOV A,HOUR ;比较小时CJNE A,37H,TIAO_RET ;不等返回。
基于51单片机的数字时钟,带秒表和时间设置
要求:
使用1个6位共阴数码管,3个按键,1个74LS254和51单片机最小系统制作一个带秒表功能的电子时钟,并要求当使用秒表功能时可以对秒表进行暂停和清零,且秒表精度为100ms以上;显示时钟时要求时、分、秒用数码上的点隔开;设置时钟时可以切换设置“时”和“分”,并在数码管上有相应闪烁以区分
以下是我做的原理图:
刚写的程序,有很详细的注释,希望大家一起学习交流:
以下是仿真文件和C程序,网盘分享给大家:
/share/link?shareid=3375444058&uk=453592216 /share/link?shareid=3375444058&uk=453592216 /share/link?shareid=3375444058&uk=453592216
(上面3个是一样的,怕有些吧友没看到)
希望吧友们一起分享自己的作品。
单片机数字时钟课程设计报告
第1章绪论1. 设计要求(1)系统可以按“秒”进行计时.(2)数字时钟可以显示小时(00-23)、分钟(00-59)和秒(00-59).(3)可通过按键K1来选择设置“小时”、“分钟”和“秒”.设置时可通过“加”和“减”按键(K2、K3)来调整时间;设置过程中时钟停止计时.(4)无键按下三秒后,自动进入时钟的计时程序.2. 设计方案采用AT89C51芯片作为硬件核心,其内部采用Flash ROM,具有4KB ROM 存储空间,能于3V的超低压工作,本系统的计时方案是利用单片机内部的定时/计数器进行中断定时,配合软件延时实现对时、分、秒的计时.整个系统的控制方案是:上电后系统自动进入时间显示,从00:00:00 开始计时.按下P1.0键,进入调秒状态,时钟停止计时;按P1.1或P1.2键可进行加1或减1操作;继续按P1.0键可分别进行分位、时调整;无键按下3秒钟后退出调整状态,自动进入时钟的计时和显示.整个系统的硬件原理框图如图1.1,它采用的是AT89C51单片机,只用了P1口.为了简化硬件电路,LED显示采用了动态扫描的方式实现,LED采用共阳极数码管,驱动电流由三极管9012提供.为了提高计数精度,所采用的晶振频率为12MHz.第2章硬件设计1单片机的选择本课程选用AT89C51型号的单片机. AT89C51 是美国ATMEL 公司生产的低电压,高性能CMOS8 位单片机,片内含4k bytes 的可反复擦写的只读程序存储器(PEROM)和128 bytes 的随机存取数据存储器(RAM ),器件采用ATMEL 公司的高密度、非易失性存储技术生产,兼容标准MCS-51 指令系统,片内置通用8 位央处理器(CPU)和Flash 存储单元,功能强大AT89C51 单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域.主要性能参数:·与MCS-51 产指令系统完全兼容·4k 字节可重擦写Flash 闪速存储器·1000 次擦写周期·全静态操作:0Hz-24MHz·三级加密程序存储器·128×8 字节内部RAM·32 个可编程I /O 口线·2 个16 位定时/计数器2. 显示方案由于系统要显示的内容较简单,显示量不多,所以选用数码管既方便又经济.LED有共阴极和共阳极两种.如图2.2所示.二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压.一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管.当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗.为了保护各段LED不被损坏,需外加限流电阻.图2.2 LED数码管结构原理图众所周知,LED显示数码管通常由硬件7段译码集成电路,完成从数字到显示码的译码驱动.本系统采用软件译码,以减小体积,降低成本和功耗,软件译码的另一优势还在于比硬件译码有更大的灵活性.所谓软件译码,即由单片机软件完成从数字到显示码的转换.从LED数码管结构原理可知,为了显示字符,要为LED显示数码管提供显示段码,组成一个“8”字形字符的7段,再加上1个小数点位,共计8段,因此提供给LED数码管的显示段码为1个字节.各段码位与显示段的对应关系如表2.2.表2.2 各段码位的对应关系需说明的是当用数据口连接LED数码管a~dp引脚时,不同的连接方法,各段码位与显示段有不同的对应关系.通常数据口的D0位与a段连接,D1位与b段连接, (7)与dp段连接,如表1所示,表2.3为用于LED数码管显示的十六进制数和空白字符与P的显示段码.根据AT89C2051单片机灌电流能力强,拉电流能力弱的特点,我们选用共阳数码管.将AT89C2051的P1.0~P1.7分别与共阳数码管的a~g及dp相连,高电平的位对应的LED 数码管的段暗,低电平的位对应的LED数码管的段亮,这样,当P0口输出不同的段码,就可以控制数码管显示不同的字符.例如:当P0口输出的段码为1100 0000,数码管显示的字符为0.表2.3 LED显示段码注:(1)本表所列各字符的显示段码均为小数点不亮的情况.(2)“空白”字符即没有任何显示.数码管显示器有二种工作方式,即静态显示方式和动态扫描显示方式.为节省端口及降低功耗,本系统采用动态扫描显示方式.动态扫描显示方式需解决多位LED数码管的“段控”和“位控”问题,本电路的“段控”(即要显示的段码的控制)通过P0口实现;而每一位的公共端,即LED数码管的“位控”,则由P3口控制.这种连接方式由于多位字段线连在一起,因此,要想显示不同的内容,必然要采取轮流显示的方式,即在某一瞬间,只让其中的某一位的字位线处于选通状态,其它各位的字位线处于断开状态,同时字段线上输出这一位相应要显示字符的字段码.在这一瞬时,只有这一位在显示,其他几位则暗.在本系统中,字位线的选通与否是通过PNP三极管的导通与截止来控制,即三极管处于“开关”状态.第3章软件设计1. 主程序主程序功能主要是初始化、正常现实时间和判断功能转换键.流程图如图3.1所示.图3.1 主程序流程图2. 定时器T0中断服务程序定时器T0用于时间计时.定时溢出中断周期可设为50ms,中断进入后,时钟计时累计20次(即1s)时,对秒计数单元进行加1操作.时钟计数单元在定义的6个单元70H~75H 中,70H~71H 存放秒数据,72H~73H存放分数据,74H~75H存放时数据.最大计时值为23小时59分59秒.在计数单元中采用十进制BCD码计数,秒、分、时之间满60进位.3.显示子程序数码管显示的数据放在内存单元70H~75H中,其中70H~71H存放秒数据,72H~73H]存放分数据,74H~75H存放时数据,每一单元内均为十进制BCD码.由于采用软件动态扫描实现数据显示功能,显示用的十进制BCD码数据的对应段码存放在ROM表中,显示时,先取出70H~75H中的某一地址中的数据,然后查表得对应的显示段码从P0口输出,P2口将对应的数码管位选中供电,就能显示该地址单元的数据值.4.定时器T1中断服务程序进行时间调整是,正在被调整的时间以闪烁的形式表现,定时器T1用于产生闪烁的时间间隔,每隔0.3s闪烁一次.5.调时功能程序通过按键K1来选择设置“小时”、“分钟”和“秒”.通过“加”和“减”按键(K2、K3)来调整时间图3.5时间设置流程图6.延时程序因为系统是动态显示,为了确保系统在有效显示时间范围内必须执行显示程序,所以使用延时程序.7. 结论这次课程设计项目虽然是最简单的数字时钟设计,但用的技术和知识是源于课本又远远高于课本的,比如说AT89C51基本操作知识,汇编语言方面的知识等.我负责的是软件设计的时间设置以及T1中断部分,运用到了按键部分以及定时器/计数器部分的知识.通过这次自己编写程序,使我摆脱了以往单纯的理论知识学习状态,并且在和实际设计的结合锻炼了我的综合运用所学的专业基础知识.不过在这次课设中我也遇到了不少问题,实际操作时才发现课堂知识和实际运用还是有差距的,不过最终还是在老师或同学的帮助下一个一个解决了.通过这次对课程设计,我也认识到自己对单片机应用方面的知识的贫乏,对于书本上的很多理论知识还不能灵活运用,有很多我们掌握的知识在等着我去学习,我会在以后的学习生活中弥补我所缺少的知识.同时还从中学到了一件很重要的东西,那就是如何从理论到实践的转化.此次的课程设计给我奠定了一个实践基础,我会在以后的学习,生活中磨练自己,使自己掌握更多的技术能力.8.参考文献[1]杨忠义.单片机课程设计指导.北京:清华大学出版社,2009.201~217[2]靳达.单片机应用系统开发实例导航.北京:人民邮电出版社,2004.1~37[3]南建辉.MCS-51单片机原理及应用实例.北京:清华大学出版社,2004.92~117[4]刘海成.单片机及应用系统设计原理与实践.北京:北京航天航空大学出版社,2009.129~180附录ORG 0000HAJMP MAINT ;转主程序NOPORG 000BHAJMP INT01 ;转定时器T0中断程序NOPORG 001BHAJMP INT11 ;转定时器T1中断程序NOPMAINT:MOV R0,#7FH ;00H~7FH单元清零CLR AWZ1:MOV @R0,ADJNZ R0,WZ1MOV SP,#30H ;置堆栈指针MOV 5AH,#0AH ;放入“熄灭符”数据MOV TMOD,#11H ;设T0,T1为16位定时器MOV TL0,#0B0H ;置50 ms定时初值MOV TH0,#3CHMOV TL1,#0B0HMOV TH1,#3CHSETB EA ;开中断SETB ET0 ;允许T0中断SETB TR0 ;启动T0MOV R4,#14H ;用于产生1 s定时MAINT1: LCALL XSZCX ;调用显示子程序JNB P1.0,SJTZ0 ;功能键按下,进入调时程序SJMP MAINT******T0中断服务程序******INT01:PUSH ACC ;保护现场PUSH PSWCLR ET0 ;关T0中断CLR TR0 ;关定时器T0MOV A,#0B7H ;修正中断响应时间ADD A,TL0MOV TL0,AMOV A,#3CHADDC A,TH0SETB TR0 ;启动定时器T0DJNZ R4,INT0U ;20次中断未到退出中断AD1:MOV R4,#14H ;R4重新赋值MOV R0,#51H ;指向秒计时单元(50H,51H)LCALL ADD1 ;调用加1 s程序MOV A,R3 ;秒数据放入ACLR C ;清进位标志CJNE A,#60H,AD2 ;小于60 s吗AD2:JC INT0U ;小于60 s退出中断CLR A ;大于或等于60 s,清秒计数单元MOV @R0,ADEC R0MOV @R0,AMOV R0,#57H ;指向分计时单元(56H,57H)ACALL ADD1 ;调用加1 min程序MOV A,R3 ;分数据放入ACLR CCJNE A,#60H,AD3 ;小于60 min吗AD3:JC INT0U ;小于60 min退出中断CLR A ;大于或等于60 min,清分计数单元MOV @R0,ADEC R0MOV @R0,AMOV R0,#59H ;指向小时计时单元(58H,59H)ACALL ADD1 ;调用加1 h程序MOV A,R3 ;小时数据放入ACLR CCJNE A,#24H,AD4 ;小于24 h吗AD4:JC INT0U ;小于24 h退出中断CLR A ;大于或等于24 h清小时计数单元MOV @R0,ADEC R0MOV @R0,AINT0U: MOV 52H,56H ;中断退出时将分、时计时单元数MOV 53H,57H ;据移入对应显示单元MOV 54H,58HMOV 55H,59HPOP PSW ;恢复现场POP ACCSETB ET0 ;开放T0中断RETI ;中断返回******显示子程序******XSZCX:MOV R1,#50H ;显示数据首址MOV R5,#0FEH ;扫描控制字初值MAXY:MOV A,R5 ;扫描控制字送AMOV P2,A ;输出扫描控制字MOV A,@R1 ;取显示数据MOV DPTR,#ABC ;取段码表首地址MOVC A,@A+DPTR ;取对应段码MOV P1,A ;P1口输出段码LCALL YS1MS ;延时1 msINC R1 ;显示地址增1MOV A,R5 ;扫描控制字送AJNB ACC.5,ENDOUT ;ACC.5为0时一次显示结束RL A ;控制字左移MOV R5,A ;制字送回R5中AJMP MAXY ;循环显示下一个数据ENDOUT: MOV P2,#0FFH ;一次显示结束,P2口复位MOV P1,#0FFH ;P1口复位RET ;子程序返回****** T1中断服务程序******INT11:PUSH ACC ;中断保护现场PUSH PSWMOV TL1,#0B0H ;装定时器T1初值MOV TH1,#3CHDJNZ R2,INT1U ;0.3 s未到退出中断MOV R2,#06H ;重装0.3 s定时用初值CPL 02H ;0.3 s定时到,对闪烁标志取反JB 02H,CCC1 ;02H位为1时显示单元“熄灭”MOV 52H,56H ;02H位为0时显示正常MOV 53H,57HMOV 54H,58HMOV 55H,59HINT1U:POP PSW ;恢复现场POP ACCRETI ;退出中断INT0U:POP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器RETI ;中断返回******时钟时间调整程序******SET0:LCALL XSZCX ;通过调用显示时间程序延时消抖动JNB P1.0,SJTZ1SJMP MAINT1 ;功能键没有按下,显示时间SET1: CLR ET0 ;关闭定时器T0中断CLR TR0 ;关闭定时器T0MOV R2,#06H ;进入调时状态,置闪烁定时初值SETB ET1 ;允许T1中断SETB TR1 ;启动T1SET2:JNB P1.0,SET1 ;P1.0端为0(键未释放),等待CLR 01H ;置调分标志位为1SET4:JB P1.0,SET3 ;等待键按下JNB P1.0,HOUR ;有键按下,进入调小时状态JB P1.0,SET10 ;等待键按下JNB P1.0,MINUTE ;有键按下,进入调分状态JB P1.0,SET12 ;等待键按下JNB P1.0,SECOND ;有键按下,进入调秒状态MOV A,R3 ;取要调整的单元数据CLR CKMTES: SETB ET0 ;省电状态,开T0中断SETB TR0 ;启动T0(开时钟)KMA: JB P1.0,$ ;无按键按下,等待LCALL XSZCX ;通过调用显示时间程序延时消抖动JB P1.1,KMA ;是干扰返回等待KMA1: JNB P1.0,$ ;等待键释放LJMP MAINT1 ;返回主程序,显示时间HOUR: JNB P1.0,SET5 ;等待键释放SETB 01H ;置调小时标志位SET6: JB P1.0,SET9 ;等待键按下LCALL TM3s ;有键按下延时3秒LCALL XSZCX ;消抖JNB P1.0,STOP ;按下时间大于3秒,退出调整状态MOV R0,#70H ;小于3秒,调整小时JB P1.1,SET3 ;等待键按下JNB P1.1,ADD1 ;P1.1按下,调时间加1子程序JB P1.2,SET3 ;等待键按下JNB P1.2,SUB-H ;P1.2按下,调小时减1子程序MOV A,R3CLR CCJNE A,#24H,BJ24 ;计时单元与24比较BJ24: JC SET6,;小于24转SET6循环CLR A ;大于或等于24,则清零MOV @R0,ADEC R0MOV @R0,AAJMP SET6 ;转SET6循环MINUTE: JNB P1.0,SET10 ;等待键释放SETB 01H ;置调分钟标志位SET7: JB P1.0,SET11 ;等待键按下LCALL TM3s ;有键按下延时3秒LCALL XSZCX ;消抖JNB P1.0,STOP ;按下时间大于3秒,退出调整状态MOV R0,#70H ;小于3秒,调整分钟JB P1.1,SET11 ;等待键按下JNB P1.1,ADD1 ;P1.1按下,调时间加1子程序JB P1.2,SET11 ;等待键按下JNB P1.2,SUB-M ;P1.2按下,调分减1子程序MOV A,R3CLR CCJNE A,#60H,BJ601 ;计时单元与60比较BJ601: JC SET7,;小于24转SET7循环CLR A ;大于或等于24,则清零MOV @R0,ADEC R0MOV @R0,AAJMP SET7 ;转SET7循环SECOND: JNB P1.0,SET12 ;等待键释放SETB 01H ;置调秒钟标志位SET8: JB P1.0,SET13 ;等待键按下LCALL TM3s ;有键按下延时3秒LCALL XSZCX ;消抖JNB P1.0,STOP ;按下时间大于3秒,退出调整状态MOV R0,#70H ;小于3秒,调整分钟JB P1.1,SET13 ;等待键按下JNB P1.1,ADD1 ;P1.1按下,调时间加1子程序JB P1.2,SET13 ;等待键按下JNB P1.2,SUB-S ;P1.2按下,调时间减1子程序MOV A,R3CLR CCJNE A,#60H,BJ602 ;计时单元与60比较BJ602: JC SET8,;小于24转SET8循环CLR A ;大于或等于24,则清零MOV @R0,ADEC R0MOV @R0,AAJMP SET8 ;转SET8循环OUT: JNB P1.0,SETOUT1 ;退出调时状态,等待键释放LCALL XSZCX ;通过调用显示程序延时消抖动JNB P1.0,SETOUT ;是抖动,返回SETOUT等待MOV 20H,#00H ;清调时标志位CLR TR1 ;关闭T1CLR ET1 ;关T1中断SETB TR0 ;启动T0SETB ET0 ;开T0中断LJMP MAINT1 ;返回主程序SET1: LCALL XSZCX ;键释放等待时,调用显示子程序AJMP SET2 ;防止此时无时钟显示SET3:LCALL XSZCX ;等待调小时按键时时钟显示用AJMP SET4 ;调时等待SET5:LCALL XSZCX ;键释放等待时调用显示程序(调小时)AJMP SETHH ;防止键按下时无时钟显示SET9:LCALL XSZCXAJMP SET6SET10:LCALL XSZCX ;键释放等待时调用显示程序(调分钟)AJMP SETHH ;防止键按下时无时钟显示SET11:LCALL XSZCXAJMP SET7SET12:LCALL XSZCX ;键释放等待时调用显示程序(调秒钟)AJMP SETHH ;防止键按下时无时钟显示SET13:LCALL XSZCXAJMP SET8SETOUT1:LCALL XSZCXAJMP OUT****** 加1子程序******ADD1:MOV A,@R0 ;取出现计时数据放入ADEC R0 ;指向前一单元SWAP A ;A中高4位与低4位互换ORL A,@R0 ;前一单元中数据放入A中低4位ADD A,#01H ;A加1DA A ;十进制调整MOV R3,A ;移入R3寄存器ANL A,#0FH ;高4位变0MOV @R0,A ;放回前一地址单元MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中高4位与低4位互换ANL A,#0FH ;高4位变0MOV @R0,A ;数据存入当前地址单元RET ;子程序返回****** 时减1子程序******SUB-H:MOV A,@R0 ;取当前计时单元数据到ADEC R0 ;指向前一地址SWAP A ;A中数据高4位与低4位交换ORL A,@R0 ;前一地址中数据放入A中低4位JZ SUB-H1 ;00减1为23(小时)DEC A ;A减1操作SUB-H11:MOV R3,A ;移入R3寄存器ANL A,#0FH ;高4位变0CLR C ;清进位标志SUBB A,#0FH;;时个位是否大于9SUB-H111:JC SUB-H110MOV @R0,#09H ;大于等于0AH,为9SUB-H10:MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中数据高4位与低4位交换ANL A,#0FH ;高4位变0MOV @R0,A ;时十位数据放入RET ;子程序返回SUB-H1:MOV A,#23HAJMP SUB-H11SUB-H110:MOV A,R3 ;时个位小于0A不处理ANL A,#0FH ;高4位变0MOV @R0,A ;时个位数据放入AJMP SUB-H10******分减1子程序******SUB-M:MOV A,@R0 ;取当前计时单元数据到ADEC R0 ;指向前一地址SWAP A ;A中数据高4位与低4位交换ORL A,@R0 ;前一地址中数据放入A中低4位JZ SUB-M1DEC A ;A减1操作SUB-M11:MOV R3,A ;移入R3寄存器ANL A,#0FH ;高4位变0CLR C ;清进位标志SUBB A,#0AH;SUB-M111:JC SUB-M110MOV @R0,#09H ;大于等于0AH,为9SUB-M10:MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中数据高4位与低4位交换ANL A,#0FH ;高4位变0MOV @R0,A ;数据放入当前地址单元中RET ;子程序返回SUB-M1:MOV A,#59HSUB-M110:MOV A,R3 ;移入R3寄存器ANL A,#0FH ;高4位变0MOV @R0,AAJMP SUB-M10****** 秒减1子程序******SUB-S:MOV A,@R0 ;取当前计时单元数据到ADEC R0 ;指向前一地址SWAP A ;A中数据高4位与低4位交换ORL A,@R0 ;前一地址中数据放入A中低4位JZ SUB-S1DEC A ;A减1操作SUB-S11:MOV R3,A ;移入R3寄存器ANL A,#0FH ;高4位变0CLR C ;清进位标志SUBB A,#0BH;SUB-S111:JC SUB-S110MOV @R0,#09H ;大于等于0AH,为9SUB-S10:MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中数据高4位与低4位交换ANL A,#0FH ;高4位变0MOV @R0,A ;数据放入当前地址单元中RET ;子程序返回SUB-S1:MOV A,#14HAJMP SUB-S11SUB-S110:MOV A,R3 ;移入R3寄存器ANL A,#0FH ;高4位变0MOV @R0,A******延时子程序******TM1ms:MOV R6,#14H ;延时1 ms子程序TM1:MOV R7,#19HTM2:DJNZ R7,YS2DJNZ R6,YS1RETTM3s:LCALL TM05s ;延时3s子程序LCALL TM05sLCALL TM05sLCALL TM05sLCALL TM05sLCALL TM05sRETTM05s:MOV R3,#51H ;延时0.5 s子程序YS05s1:LCALL XSZCXDJNZ R3,YS05s1RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH END西安建筑科技大学课程设计(论文)目录第1章绪论 (1)1. 设计要求 (1)2. 设计方案 (1)第2章硬件设计 (2)1 单片机的选择 (2)2. 显示方案 (2)第3章软件设计 (5)1. 主程序 (5)2. 定时器T0中断服务程序 (5)3. 显示子程序 (5)4. 定时器T1中断服务程序 (6)5. 调时功能程序 (6)6. 延时程序 (7)7. 结论 (7)8.参考文献 (8)附录 (9)。
基于AT89S52单片机的智能数字电子时钟设计
基于AT89S52单片机的智能数字电子时钟设计
(1)数字钟实现对年、月、日、时、分、秒、星期显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
(2)诸如定时自动报警、时间程序自动控制、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
利用AT89S52单片机和LCD1602电子显示屏实现电子时钟,可由按键进行调时和12/24小时切换。
功能:(1)实现年、月、日、星期、时、分、秒的显示;
(2)实现调时功能;
(3)实现12/24小时制切换;
(4)实现整点报时功能。
设计方案:
器件选择(主要器件)(1)AT89S52单片机
(2)LCD1602液晶屏
AT89S521602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别。
1602LCD主要技术参数:显示容量:162个字符,芯片工作电压:4.55.5V,工作电流:2.0mA(5.0V),模块最佳工作电压:5.0V,字符尺寸:2.954.35(WH)mm
LCD1602引脚图第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生鬼影,使用时可以通过一个10K的电位器调整对比度。
基于51单片机设计的多功能数字时钟毕业设计
基于51单片机多功能数字时钟1系统设计1.1设计要求设计制作一个24小时制多功能数字钟。
1.1.1主要性能指标1、数字显示年、月、周、日、时、分、秒。
1.1.2创意部分要求准确的进行年、月、周、日、时、分、秒的转换,切换两种显示模式。
1.2总体设计方案1.2.1概述及设计思路该设计方案是以MC51单片机为核心,采用LCD液晶屏幕显示系统,温度采集模块、日期提醒、键盘时间调整预设置等模块,所构建的数字时钟系统,能动态显示实时时钟的时、分、秒,数据显示(误差限制在30每天)。
1.2.2方案论证(1)时钟模块【方案一】采用单片机内置定时/计数器。
它的处理过程主要是先设定单片机内部定时/计数器的工作方式,对机器周期计数确定基准时间,然后用另外一个定时器软件计数的方法对基准时间形成秒,秒计60次形成分,分计60次形成小时。
依此类推,获取日期也是采用相同的方法。
该方案在具体实现过程中,计时存在较大的误差。
如果晶振受到其他外界信号干扰,或者基准时间计算不准确,都会导致时间显示错误。
【方案二】采用555多谐振荡器。
由555定时器组成一个多谐振荡器,产生周期为100HZ的脉冲,然后经过两个74LS160组成的分频器得到1HZ的秒脉冲。
多谐振荡器的稳定度及频率的准确度决定了数字钟计时的准确程度,通常选用成品晶振构成振荡器电路。
计时精度取决于振荡器的频率,振荡器频率越高计时精度越高。
【方案三】采用DS1302时钟芯片。
DS1302是一种高性能、超低功耗的实时时钟芯片,附加31字节静态RAM,可以通过串行接口与单片机进行通信。
实时时钟提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。
芯片内部集成备用电源,当外围电路电路有电源供应的时候,备用电源充电储能。
当外围电路掉电时,DS1302芯片工作在休眠状态,以备用电源供电。
当外围电路再次供电,即可唤醒休眠进入正常工作状态,显示时间无任何异常。
基于C51单片机的数字时钟课程设计(C语言,带闹钟).
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录一、数字电子钟设计任务、功能要求说明及方案介绍 (4)1.1 设计课题设计任务 (4)1.2 设计课题的功能要求说明 (4)1.3 设计课的设计总体方案介绍及工作原理说明 (4)二、设计课题的硬件系统的设计 (5)2.1硬件系统各模块功能简要介绍 (5)2.1.1 AT89C52简介 (5)2.1.2 按键电路 (6)三、设计课题的软件系统的设计 (6)3.1 使用单片机资源的情况 (6)3.2 软件系统个模块功能简要介绍 (7)3.3 软件系统程序流程框图 (7)3.4 软件系统程序清单 (7)四、设计课题的设计结论、仿真结果、误差分析 (9)4.1 设计结论及使用说明 (9)4.2 仿真结果 (10)结束语 (12)参考文献 (12)附录 (13)附录A:程序清单 (13)一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
基于单片机的电子时钟的设计与实现
基于单片机的电子时钟的设计与实现电子时钟是一种使用微处理器或单片机作为主控制器的数字时钟。
它不仅能够显示当前时间,还可以具备其他附加功能,如闹钟、日历、温度显示等。
一、设计目标设计一个基于单片机的电子时钟,实现以下功能:1.显示时间:小时、分钟和秒钟的显示,采用7段LED数码管来显示。
2.闹钟功能:设置闹钟时间,到达设定的时间时会发出提示音。
3.日历功能:显示日期、星期和月份。
4.温度显示:通过温度传感器获取当前环境温度,并显示在LED数码管上。
5.键盘输入和控制:通过外部键盘进行时间、日期、闹钟、温度等参数的设置和调整。
二、硬件设计1.单片机选择:选择一款适合的单片机作为主控制器,应具备足够的输入/输出引脚、中断和定时器等功能,如STC89C522.时钟电路:使用晶振为单片机提供稳定的时钟源。
3.7段LED数码管:选择合适的尺寸和颜色的数码管,用于显示小时、分钟和秒钟。
4.温度传感器:选择一款适合的温度传感器,如DS18B20,用于获取环境温度。
5.喇叭:用于发出闹钟提示音。
6.外部键盘:选择一款适合的键盘,用于设置和调整时间、日期、闹钟等参数。
三、软件设计1.初始化:设置单片机定时器、外部中断和其他必要的配置。
2.时间显示:通过定时器中断,更新时间,并将小时、分钟和秒钟分别显示在相应的LED数码管上。
3.闹钟功能:设置闹钟时间,定时器中断检测当前时间是否与闹钟时间一致,若一致则触发警报。
4.日历功能:使用定时器中断,更新日期、星期和月份,并将其显示在LED数码管上。
5.温度显示:通过定时器中断,读取温度传感器的数据,并将温度显示在LED数码管上。
6.键盘输入和控制:通过外部中断,读取键盘输入,并根据输入进行相应的操作,如设置时间、闹钟、日期等。
7.警报控制:根据设置的闹钟时间,触发警报功能,同时根据用户的设置进行控制。
四、测试与调试完成软件设计后,进行系统测试与调试,包括验证显示时间、日期、温度等功能的准确性,以及闹钟和警报功能的触发与控制。
单片机实现电子钟万年历秒表闹铃
sbit ksec=P1^1; /*调整秒/日/秒表开关*/
sbit kmin=P1^2; /*调整分/月/显示秒表*/
sbit khour=P1^3; /*调整时/年的低两位*/
sbit date=P1^4; /*显示日期开关*/
sbit bai=P1^5; /*调整年高二位/整点闹钟开关*/
P2=0xff;
P2=0x0bf;
P0=table[shige]-0x80;//显示.隔时和分
delay(1);
P2=0xff;
P2=0x7f;
P0=table[shishi];delay(1ຫໍສະໝຸດ ;P2=0xff;}
if((i==1)&&(dx==1)&&(j==0))//显示年月日
{
dayge=day%10;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1; /*开启中断总开关*/
ET0=1;/*开启定时器0中断*/
i=0;/*控制显示,开关是否开启过*/
TR0=0;/*关闭定时器*/
void display()
{ if((i==1)&&(j==0)&&(dx==0))//显示时间
{secge=sec%10;
secshi=sec/10;
minge=min%10;
minshi=min/10;
hourge=hour%10;
hourshi=hour/10;
单片机数字时钟设计,时分秒天
单片机数字时钟设计,时分秒天东北石油大学课程设计任务书课程单片机原理及应用课程设计题目电子时钟设计专业应用物理学09—2 姓名赵国鹏学号0909********主要内容、基本要求、主要参考资料等1、主要内容:根据单片机课程所学内容,结合其他相关课程知识,设计电子时钟,以加深对单片机知识的理解,锻炼实践动手能力,为以后的毕业设计和工作打下坚实基础。
2、基本要求:本设计以MCS-51系列单片机为核心,采用常用电子器件设计。
要求能显示出秒、分、时、天,可调整各个时间,可以采用LED显示,也可以采用液晶显示。
3、主要参考资料:[1] 张毅坤,陈善久.单片微型计算机原理及应用.西安电子科技大学出版社,2002.[2] 张友德,赵志英,徐时亮.单片微机原理应用与实验.复旦大学出版社,2000.[3] 张毅刚,彭善元,董继承.单片机原理及应用.高等教育出版社,2003.完成期限2011年7月13日指导教师专业负责人2011 年7 月4 日摘要近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
本次设计中以单片机的发展过程和发展方向为背景,介绍了单片机的输入输出的工作原理和操作方法,中断的工作原理和操作方法,74LS245译码器的工作原理和与,LED连接的方法。
本次做的数字钟是以单片机(AT89C51)为核心,结合相关的元器件(共阴极LED数码显示器、BCD-锁存/7段译码/驱动器74LS245等),再配以相应的软件,是它具有时,分,秒显示的功能,并且时,分,秒还可以调整。
此次设计电子数字钟是为了了解电子数字钟的原理,从而学会制作电子数字钟。
基于AT89C51单片机的数字电子时钟设计
/安徽工程大学机电学院单片机课程设计题目:数字电子时钟设计指导老师:***制作人员:范超学号:************班级:自动化2132日期:7月13日-7月24日总评成绩:课程任务设计书设计题目:数字电子时钟的设计设计任务:1.设计一款时,分,秒可调数字电子时钟可整点报时;2.设计三个按键K1,K2和K3,用于调节时钟的时间;3.用8个、七段LED数码管作为显示设备,开机显示00-00-00;本设计采用AT89C51单片机为核心器件。
具有电子钟显示,时间调整,整点报时等功能。
此数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。
根据60秒为一分、60分为1小时的计数周期,构成秒、分、时的计数,实现计时的功能。
而且能显示清晰、直观的数字符号。
针对数字钟会产生误差的现象,就设计有校准时间的功能。
AT89C51单片机控制的数字钟的硬件结构与软件设计,给出了汇编语言源程序。
此数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。
它的计时周期为24小时,显示满刻度为24时00分00秒,另外应有校时功能。
电路由时钟脉冲发生器、时钟计数器、译码驱动电路和数字显示电路以及时间调整电路组成。
用晶体振荡器产生时间标准信号,这里采用石英晶体振荡器。
根据60秒为1分、60分为1小时、24小时为1天的计数周期,分别组成两个60进制(秒、分)、一个24进制(时)的计数器。
显示器件选用LED八段数码管。
在译码显示电路输出的驱动下,显示出清晰、直观的数字符号。
针对数字钟会产生走时误差的现象,在电路中就设计有有校准时间功能的电路。
关键字:Proteus,Keil uVision,AT89C51,电子钟,整点报时摘要 (3)第1章概述 (5)1.1 设计背景 (5)1.2系统方案论证与设计 (5)第2章系统硬件设计 (7)2.1 系统总电路的设计 (7)2.1.1系统的总框图 ................................................................................................2.1.2芯片的选择 (7)2.2最小系统设计 (9)2.2.1时钟电路的选择与设计 (10)2.2.2复位电路的选择与设计 .............................................. 错误!未定义书签。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
东北石油大学课程设计任务书课程单片机原理及应用课程设计题目电子时钟设计专业应用物理学09—2 姓名赵国鹏学号0909********主要内容、基本要求、主要参考资料等1、主要内容:根据单片机课程所学内容,结合其他相关课程知识,设计电子时钟,以加深对单片机知识的理解,锻炼实践动手能力,为以后的毕业设计和工作打下坚实基础。
2、基本要求:本设计以MCS-51系列单片机为核心,采用常用电子器件设计。
要求能显示出秒、分、时、天,可调整各个时间,可以采用LED显示,也可以采用液晶显示。
3、主要参考资料:[1] 张毅坤,陈善久.单片微型计算机原理及应用.西安电子科技大学出版社,2002.[2] 张友德,赵志英,徐时亮.单片微机原理应用与实验.复旦大学出版社,2000.[3] 张毅刚,彭善元,董继承.单片机原理及应用.高等教育出版社,2003.完成期限2011年7月13日指导教师专业负责人2011 年7 月4 日摘要近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
本次设计中以单片机的发展过程和发展方向为背景,介绍了单片机的输入输出的工作原理和操作方法,中断的工作原理和操作方法,74LS245译码器的工作原理和与,LED连接的方法。
本次做的数字钟是以单片机(AT89C51)为核心,结合相关的元器件(共阴极LED数码显示器、BCD-锁存/7段译码/驱动器74LS245等),再配以相应的软件,是它具有时,分,秒显示的功能,并且时,分,秒还可以调整。
此次设计电子数字钟是为了了解电子数字钟的原理,从而学会制作电子数字钟。
而且通过电子数字钟的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及实用方法。
通过它可以进一步学习与掌握单片机原理与使用方法。
关键词:单片机AT89C51 共阴极LED数码显示器74LS245译码器一数电字子钟的背景、意义、应用20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS 化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
数字钟已成为人们日常生活中:必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时自动报时及自动控制的领域。
二单片机和数字钟的基本知识2.1应用知识简介51单片机:单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
作为嵌入式系统控制核心的单片机具有其体积小、功能全、性价比高等诸多优点。
51 系列单片机是国内目前应用最广泛的单片机之一,随着嵌入式系统、片上系统等概念的提出和普遍接受及应用,51 系列单片机的发展又进入了一个新的阶段。
在今后很长一段时间内51 系列单片机仍将占据嵌入式系统产品的中低端市场。
汇编语言:汇编语言是一种面向机器的计算机低级编程语言,通常是为特定的计算机或系列计算机专门设计的。
汇编语言保持了机器语言的优点,具有直接和简捷的特点,其代码具有效率高实时性强等优点。
但是对于复杂的运算或大型程序,用汇编语言编写将非常耗时。
汇编语言可以与高级语言配合使用,应用十分广泛。
ISP:ISP(In-System Programming)在系统可编程,是当今流行的单片机编程模式,指电路板上的空白元器件可以编程写入最终用户代码,而不需要从电路板上取下元器件。
已经编程的器件也可以用ISP方式擦除或再编程。
本次课程设计便使用ISP方式,直接将编写好的程序下载到连接好的单片机中进行调试。
2.2单片机数字钟的基本原理它是利用单片机的内部的定时/计数器工作与定时方式,对机器周期计数形成基准时间(如10ms)然后用另外一个计数器或软件计数的形式对基准时间进行计数形成秒(如对10ms计数100次),“秒”计数60次“分”,“分”计数60次形成“时”,“时”计数24次形成“天”并清零,然后通过译码器,数码管把他们的内容在相应的位置显示出来。
在具体的设计时定时器采用中断方式工作,对时钟的形成在终中断序中实现,在主程序只是对定时/计数器的定义初始化,调用显示程序和控制程序的初始化。
另外为了使用的方便,也设计了按键,可以通过按键对时分秒进行调整,这样程序就加了按键程序。
三系统硬件电路的设计3.1单片机的基本结构MCS-51单片机内部结构:8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:中央处理器:中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
数据存储器(RAM)8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
程序存储器(ROM):8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
定时/计数器(ROM):8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
并行输入输出(I/O)口:8051共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输。
MCS-51的引脚说明:MCS-52系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
现在我们对这些引脚的功能加以说明:MCS-51的引脚说明:MCS-52系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
现在我们对这些引脚的功能加以说明:图3-2单片机的引脚Pin9:RESET/V pd复位信号复用脚,当8052通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。
初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用寄存器被清“0”。
RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。
然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,8052的初始态。
3.2七段数码管的引脚图及使用:数码管使用条件:a、段及小数点上加限流电阻。
b、使用电压:段:根据发光颜色决定;小数点:根据发光颜色决定。
c、使用电流:静态:总电流80mA(每段10mA);动态:平均电流4-5mA峰值电流100mA上面这个只是七段数码管引脚图,其中共阳极数码管引脚图和共阴极的是一样的。
LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。
右图是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。
将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。
以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。
当然,LED的电流通常较小,一般均需在回路中接上限流电阻。
假如我们将"b"和"c"段接上正电源,其它端接地或悬空,那么"b"和"c"段发光,此时,数码管显示将显示数字“1”。
而将"a"、"b"、"d"、"e"和"g"段都接上正电源,其它引脚悬空,此时数码管将显示“2”。
其它字符的显示原理类同。
3.3硬件电路的设计原则在性价比满足应用系统要求的情况下,选择更可靠,更熟悉的单片机缩短研制周期。
尽可能选择自己较为熟悉的应用电路,以提高系统的可靠性。
单片机内部的资源与外部的扩展资源应在满足系统设计的基础上留有余地,为进一步的升级和扩展提供方便。
应充分的结合软件方案考虑硬件的结构,通常硬件功能较完善,其相应的软件程序就简单,但硬件的成本较高,而功能较低,其相应的软件就复杂,其实际常用软件代替硬件来降低成本。