lcd实时日历时钟报告

合集下载

实时时钟设计试验报告

实时时钟设计试验报告

实验报告5.按下Key4 Key3执行时,该按键执行加一操作,Led灯按照5秒顺时针一个一个亮。

6.按下Key5 Key3执行时,该按键执行减一操作,Led灯按照5秒顺时针一个一个亮。

7.按下Key6 Key3执行时,该按键执行确定操作,Led灯按照5秒顺时针一个一个亮。

8.按下INT 闹钟关闭。

5、实验总结本次实验是对课本上“电子日历钟设计”的加深。

通过本次试验我对led和led显示有了更加熟悉的认识,能熟练应用它们的功能。

同时我对时钟计数器也有了一定的认识,可以使用定时中断实现实时时钟,更重要的是我的实践能力有很大的提高。

程序设计中遇到的问题(1)、问题:初始完成程序后秒针走的时间很快,不是精确的一秒走一次。

原因:单片机只能用主系统时间,修改fprs后可以真确显示。

(2)、问题:时间切换函数与显示函数和设计的不一样,如只需要显示时,却多显示分。

原因:在仔细看代码后发现每次按键中断都在调用time1()函数,而seeond++在里面,所以每次都会加快秒的运行。

把seeond++移到外面放入time()函数后这个问题就解决了。

(3)、问题:运行时发现按键中断总会加快秒的运行,不是很精确。

原因:最后设置了一个虚拟的key7,当执行完时间指向ease7,然后调用Freshddisplaybuffer函数,这样就很好的解决了这个问题。

在程序调试过程中,设置断点并且在断点处增加一个LED灯,通过判断灯是否亮可以判断程序是否执行到该位置,对程序调试有很大的帮助。

开始WhileKey? 6 1 3 2 4 结束主程序流程图附件程序流程图:Yd_c_inter() Freshddisp laybuffer(); Set_D_T(); noise(); key=7; , 5 NDownNum() ; Freshddispl aybuffer(); Set_D_T(); noise(); key=7; FreshddisplaybufferTime1();Show_Time();Show_Time(); Time1() Freshddis playbuffer ();; Display_D ate(); noise(); 初始化蜂鸣器并关闭蜂鸣器BZOE = 0;初始化 INT 按键 Init_Inter();初始化 Lcd 和 Led; Init_Lcd(),Init_Led();UpNum(); Freshddis playbuffer (); Set_D_T(); noise(); key=7; key = 0; noise(); Time1(); Freshddis playbuffer (); Set_D_T(); noise();初始化按键中断InitKey_INTKR();Time1(); noise();关中断DI ()关中断EI()开中断EI();源代码:#pragma sfr#pragma EI#pragma DI#pragma access#pragma interrupt INTTM000 Time#pragma interrupt INTKR OnKeyPress#pragma interrupt INTP5 OnKeyOver void Init_Led();void InitKey_INTKR();void Init_Lcd();void Init_Inter();void LightOneLed(unsigned char ucNum);void LightOff();int Count_Day(int month);〃定义变量i,是切换时间的标志//定义 key=0 〃用于存放当前月的天数 〃默认的秒second=0 〃默认的分minute=0 〃默认的时hour=12 〃默认的天day=1 〃默认的月month=5 〃默认的年year=2014 〃默认的闹钟时=1 〃默认的闹钟分=1 〃秒的数码显示缓存区 〃分的数码显示缓存区 〃时的数码显示缓存区 〃天的数码显示缓存区 〃月的数码显示缓存区 〃年的数码显示缓存区 〃月,天的数码显示缓存区 〃时,分的数码显示缓存区 〃分,秒的数码显示缓存区 〃闹钟时的数码显示缓存区 〃闹钟分的数码显示缓存区 //INT 中断中间变量LCD_num[10]={0X070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070b);//数字0〜〜9的显示码unsigned char Scond;// ......................................................... 延时函数1 .............................................. //void Delay(int k){int i,j;for(i=0;i<k;i++){for(j=0;j<k;j++){〃使用特殊功能寄存器 〃开中断 〃关中断 〃使用绝对地址指令 〃定义时间中断函数为Time 〃定义按键中断为OnKeyPress //定义INT 中断为OnKeyOverchar i=0;int key=0;int temp=1;int temp1 = 1;int second=0;int minute=0;int hour=12;int day=1;int month=5;int year=2014;int c_hour=1;int c_minute=1;int buffs[2];int buffm[2];int buffh[2];int buffday[2];int buffmonth[2];int buffyear[4];int buffmd[4];int buffhm[4];int buffms[4];int buffch[2];int buffcm[2];unsigned char Que = 0;int// .................................................. 初始化Led函数................ //void Init_Led(){PM13=0XF0; 〃端口13的第四位为输出模式PM14=0XF0; 〃端口14的第四位为输出模式PM15=0XF0; 〃端口15的第四位为输出模式)// ............................................................. 按键中断函数............... •//void InitKey_INTKR(){PM4 = 0x3F; //P4的六个端口设置为输入模式PU4 = 0x3F; 〃接通上拉电阻KRM = 0x3F; 〃允许六个按键中断KRMK = 0;PM3.0 = 1;PU3.0 = 1;EGP.5 = 1;PMK5 = 0;PPR5 = 0;KRPR = 1;)// ............................... 初始化lcd函数............... //void Init_Lcd(){ PFALL=0x0F; 〃所有接lcd引脚指定为lcd引脚LCDC0=0x34; 〃设置原时钟和时钟频率LCDMD=0x30; //设置lcd电压为3/5电压LCDM=0xC0; //4分时1/3偏压模式)// ............................... 初始化定时器Inter函数.............. 〃void Init_Inter(){ CRC00)=0; //CR000为比较寄存器PRM00=0X04; 〃计数时钟为fprs/2A8 CR000=0X7FFF;//时间间隔为1s TMMK010=1;//TMMK010 中断屏蔽TMMK000=0; //TMMK000 中断允许TMC00=0X0C; //TM00和CR000相等时进入清零&启动模式)void Time(){ second++;)// ............................................................. 按键中断函数............... •//void OnKeyPress(){DI();switch(P4&0x3F) 〃判断哪个按键按下{case 0x3e:key=1; //按键keyl按下break;case 0x3d:key=2; //按键key2按下break;case 0x3b:key=3; //按键key3按下break;case 0x37:key=4; //按键key4按下break;case 0x2f:key=5; //按键key5按下break;case 0x1f:key=7; //按键key6按下break;default:break;)EI();)// ............................................................... I NT按键中断函数............... //void OnKeyOver(){DI();Que = 0; //判断Que是否为0BZOE = 0; 〃蜂鸣器关闭EI();)// ................................................... Led小灯函数............... //void LightOneLed(unsigned char ucNum){switch(ucNum){ 〃检测变量ucNumcase 0:case 1:case 2:case 3:P13 |= (unsigned char) 1 << (ucNum);〃如果为0到3中的一个值则让LED1到LED4中的一个亮break;case 4:case 5:case 6:case 7:P14 |= (unsigned char) 1 << (ucNum - 4);〃如果为4到7中的一个值则让LED5到LED8中的一个亮break;case 8:case 9:case 10:case 11:P15 |= (unsigned char) 1 << (ucNum - 8);〃如果为8至U 11中的一个值则让LED9至U LED12中的一个亮break;default:break;))// ................................................... Led小灯熄灭函数............... 〃void LightOff(){P13 = 0;P14 = 0;P15 = 0;)// ............................................. 时间函数.............. 〃void Time1(){if((second % 5) == 0){ 〃秒大于 5 变为0Scond = second / 5 + 1;LightOff(); 〃调用小灯亮函数LightOneLed(Scond % 12);)if(second>=60){minute++; //秒大于60时分加1second=0;if(minute>=60){minute=0;hour++; //分大于60时时加1if(hour>=24){hour=0;day++; 〃时大于24时天加1temp=Count_Day(month);if(day>=temp){day=1;month++; 〃天大于当前月份的天数时月加1if(month>=13){month=1;year++; //月大于12时年加1))))))// ...................................... 计算当前月的天数.............. •//int Count_Day(int month){int day;if((month==4)||(month==6)||(month==9)||(month==11))//4,6,9,11 月为30 天day=30;else if(month==2){if((year%4==0&&year%100==0)||(year%400==0))day=29; 〃闰年2月29天elseday=28; //平年2月28天)elseday=31; //1,3,5,7,8,10,12 月为31 天return (day);)// ................................ 倒计时函数 ...... //void Show_Time(){ pokew(0xFA40,0x00); pokew(0xFA42,0x00); pokew(0XFA48,buffs[1]); pokew(0XFA4A,buffs[0]); pokew(0XFA44,buffm[1]); pokew(0XFA46,buffm[0]); pokew(0xFA4C,0x00); pokew(0xFA4E,0x00); Delay(100);) // ..................................................................... 日期显示函数 ................. •// void Display_Date(){buffm[0]|=0x0800;pokew(0xFA40,buffyear[3]);〃显示年 pokew(0xFA42,buffyear[2]);pokew(0xFA44,buffyear[1]);pokew(0xFA46,buffyear[0]);pokew(0xFA48,buffmonth[1]);〃显示月 pokew(0xFA4A,buffmonth[0]);pokew(0xFA4C,buffday[1]);〃显示日pokew(0xFA4E,buffday[0]);temp1=0;) // .................................................................... 时间显示函数 .............. •//void Display_Time(){ pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0xFA44,buffh[1]);〃显示时 pokew(0xFA46,buffh[0]);pokew(0xFA48,buffm[1]);〃显示分 pokew(0xFA4A,buffm[0]);pokew(0xFA4C,buffs[1]);〃显示秒 pokew(0xFA4E,buffs[0]);)// ..................................................................... 设定时间函数 .............. •//void Set_D_T(){int lcd_addr;lcd_addr = 0xFA40;switch(i){case 1:pokew(lcd_addr,buffyear[3]);〃时间年 pokew(lcd_addr+2,buffyear[2]);pokew(lcd_addr+4,buffyear[1]);pokew(lcd_addr+6,buffyear[0]);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 2:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00);pokew(lcd_addr+6,0x00);pokew(lcd_addr+8,buffmonth[1]);〃时间月 pokew(lcd_addr+10,buffmonth[0]);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 3:pokew(lcd_addr,0x00); //在lcd 右边显示1〃在lcd 右边显示0 〃在lcd 右边显示1 〃在lcd 右边显示0pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00);pokew(lcd_addr+6,0x00);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,buffday[1]); 〃时间日pokew(lcd_addr+14,buffday[0]);break;case 4:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,buffh[1]); 〃时间时pokew(lcd_addr+6,buffh[0]);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 5:pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0xFA44,0x00);pokew(0xFA46,0x00);pokew(0xFA48,buffm[1]); 〃时间分pokew(0xFA4A,buffm[0]);pokew(0xFA4C,0x00);pokew(0xFA4E,0x00);break;case 6:pokew(0xFA40,0xd1);pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x56);pokew(0xFA4C,buffch[1]); 〃闹钟时pokew(0xFA4E,buffch[0]);break;case 7:pokew(0xFA40,0xd1);pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x00);pokew(0xFA4C,buffcm[1]); 〃闹钟分pokew(0xFA4E,buffcm[0]);break;default:break;))// ........................................................ 切换时间函数 .............. …// void d_c_inter(){DI(); 〃关中断i++;if(i>7) 〃切换标志>7, i=1,否则i++i=1;EI(); 〃开中断)// ........................................................ 调整时间加函数 .............. •// void UpNum(){ switch(i){ case 1:year++;case 2:month++;if(month > 12){month = 1;)break;case 3:temp = Count_Day(month);day++;if(temp < day)day = 1;break;case 4:hour++;if(hour > 23)hour = 1;break;case 5:minute++;if(minute > 59)minute = 0;break;case 6:c_hour++;if(c_hour > 23)c_hour = 1;break;case 7:c_minute++;if(c_minute > 59)c_minute = 0;break;default:break;))// ........................................................ 调整时间减函数.............. …// void DownNum(){switch(i){case 1:year--;case 2:month--;if(month < 1){month = 12;)break;case 3:temp = Count_Day(month);day--;if(day < 1)day = temp;break;case 4:hour--;if(hour < 1)hour = 23;break;case 5:minute--;if(minute < 0)minute = 59;break;case 6:c_hour--;if(c_hour < 1)c_hour = 23;break;case 7:c_minute--;if(c_minute < 0)c_minute = 59;break;default: break;))// .................................................. 闹铃以及小灯函数.............. •//void noise(){if(c_hour == hour && c_minute == minute && Que == 1){ 〃闹铃的时,分与系统时,分相等,并且闹钟标志开启CKS=0XE0; 〃开启蜂鸣器输出,输出频率为0.98khz的音频Time1(); 〃调用时间函数))// ........................................................ 显示缓存区刷新时间函数.............. •//void Freshddisplaybuffer(){buffs[1]=LCD_num[second/10];/期的显示码放入秒的数码显示缓存区buffs[0]=LCD_num[second%10];buffm[1]=LCD_num[minute/10];//分的显示码放入分的数码显示缓存区buffm[0]=LCD_num[minute%10];buffm[0]|=0x0800; 〃分的后面显示一个"."buffh[1]=LCD_num[hour/10]; 〃时的显示码放入时的数码显示缓存区buffh[0]=LCD_num[hour%10];buffh[0]|=0x0800; 〃时的后面显示一个"."buffday[1]=LCD_num[day/10];//天的显示码放入天的数码显示缓存区buffday[0]=LCD_num[day%10];buffmonth[1]=LCD_num[month/10];//月的显示码放入月的数码显示缓存区buffmonth[0]=LCD_num[month%10];buffmonth[0]|=0x0800; 〃月的后面显示一个"."buffyear[3]=LCD_num[year/100/10];/^的显示码放入年的数码显示缓存区buffyear[2]=LCD_num[(year/100)%10];buffyear[1]=LCD_num[(year%100)/10];buffyear[0]=LCD_num[(year%100)%10];buffyear[0]|=0x0800; 〃年的后面显示一个"."buffmd[3]=LCD_num[month/10];//月,天的显示码放入月,天的数码显示缓存区buffmd[2]=LCD_num[month%10];buffmd[2]|=0x0800; 〃月,天后显示一个"."buffmd[1]=LCD_num[day/10];buffmd[0]=LCD_num[day%10];buffhm[3]=LCD_num[hour/10];//时,分的显示码放入时,分的数码显示缓存区buffhm[2]=LCD_num[hour%10];buffhm[2]|=0x0800; 〃时,分的后显示一个"."buffhm[1]=LCD_num[minute/10];buffhm[0]=LCD_num[minute%10];buffms[3]=LCD_num[minute/10];/^,秒的显示码放入分,秒的数码显示缓存区buffms[2]=LCD_num[minute%10];buffms[2]|=0x0800; 〃分,秒的后显示一个"."buffms[1]=LCD_num[second/10];buffms[0]=LCD_num[second%10];buffch[1]=LCD_num[c_hour/10];//闹钟时的显示码放入闹钟时的数码显示缓存区buffch[0]=LCD_num[c_hour%10];buffcm[1]=LCD_num[c_minute/10];//闹钟分的显示码放入闹钟分的数码显示缓存区buffcm[0]=LCD_num[c_minute%10];)// ................................. 主函数............... 〃void main(){DI(); 〃关中断PM3.4 = 0; //P3.3,P3.4端口设置为输出模式P3.4 = 1; //led灯初始化为点亮状态PM3.3 = 0;P3.3 = 0;BZOE = 0; 〃蜂鸣器初始化为熄灭Init_Lcd(); 〃初始化lcdInit_Led(); 〃初始化ledInitKey_INTKR(); 〃初始化按键EI(); 〃开中断Init_Inter(); //初始化中断while(1){ Time1(); noise(); switch(key){ case 0: Freshddisplaybuffer(); Time1(); Show_Time();Show_Time(); break; case 1:Time1();Freshddisplaybuffer(); Display_Date(); noise();break;case 2:Time1();Freshddisplaybuffer(); Display_Time(); noise();break;case 3:d_c_inter();Freshddisplaybuffer(); Set_D_T();noise();key=7; break;case 4:UpNum();Freshddisplaybuffer(); Set_D_T();noise();key=7; break;case 5:DownNum();Freshddisplaybuffer(); Set_D_T();noise();key=7; break;case 6:key = 0;if(i > 5)Que = 1;1 = 0;noise();case 7:Time1();Freshddisplaybuffer(); Set_D_T(); 〃调用计算时间函数 〃调用闹钟函数 〃没有按键执行 〃调用刷新函数 〃计算时间 〃调用显示时间函数 //按键1执行 〃计算时间 〃调用刷新函数 〃调用显示日期函数 〃调用闹钟函数 //按键2执行 //计算时间 //调用刷新函数 //调用时间显示函数 //调用闹钟函数 //按键3执行 〃调用时间切换函数 //调用刷新函数 〃调用时间设置函数 //调用闹钟函数 //按键4执行 〃调用时间加函数 //调用刷新函数 //调用时间设置函数 //调用闹钟函数 //按键5执行〃调用时间减函数 //调用刷新函数 //调用时间设置函数//调用闹钟函数//按键6执行〃判断是否确认 //调用闹钟函数〃虚拟按键7 //调用刷新函数//调用时间设置函数〃调用闹钟函数noise();break;。

LCD显示实时时钟

LCD显示实时时钟

1 仿真实验环境1.1采用Proteus6_9_SP5实现单片机及外围器件的仿真如图:1.2使用Keil uVision3编写本日历程序(C语言)如图:2 原理图2.1各部分功能实现:1.以AT89C52作为控制核心,通过P0口连接LM016L液晶的并行数据输入/输出端进行显示数据以及命令的发送与接收。

P2.0、P2.1和P2.2分别连接液晶的数据/命令选择端、读/写控制以及使能端。

通过对这三个端口的操作,来实现液晶的正确显示。

2.DS18B20数字温度传感器以单总线的方式连接到P2.3口,通过正确的时序操作,与单片机进行双向通信,把温度值以串行数字形式发送给单片机。

再正确显示在LCD上。

3.LED灯连接P2.4口,在相应的时间或温度触发下通过电平的高低变化闪烁。

4.单片机的P2.5、P2.6、P2.7分别连接DS1302时钟芯片的复位端、时钟信号以及I/O端。

在相应时序信号的控制下,读出芯片中的内容,并显示在LCD上。

5.该日历的功能操作通过连接在P3.0~P3.3的四个按键实现,四个按键分别为:进入/退出模式键、功能选择键、时加/温度加一键、分加/温度减一键。

6.因为P0口没有上拉电阻,所以加了排阻。

3 程序分析及代码3.1程序分析:3.1.1 程序的优点:1.以模块化的形式把程序分为若干个独立部分。

2.在程序中使用了指针、数组、函数等结合的方法,简化了部分程序。

3.程序中首次使用了二维字符数组的相关操作。

3.1.2 程序的缺点:1.程序总体上写的不够简练。

2.程序的部分功能操作麻烦,如调时或闹钟设置时对时、分的操作只能加。

3.程序的稳定性有待于提高。

4.过多的变量、标志位的定义降低了程序的可读性。

3.1.3 总结:通过该日历程序的编写,自身发现了许多的问题,现总结如下:1.在编写程序的过程中一定要做好程序的备份。

2.在编写某功能函数之前要想好流程再写,最好写出流程图。

3.一定要多写注释,不然连自己都读不懂自己的程序。

单片机电子时钟(LCD显示)综合实验报告

单片机电子时钟(LCD显示)综合实验报告

单片机综合实验报告题目:电子时钟(LCD)显示一、实验内容:以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间:●使用字符型LCD显示器显示当前时间。

●显示格式为“时时:分分:秒秒”。

●用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。

功能键K1~K4功能如下。

●K1—进入设置现在的时间。

●K2—设置小时。

●K3—设置分钟。

●K4—确认完成设置。

程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00:00”,然后开始计时。

二、实验电路及功能说明1)单片机主控制模块以AT89C51单片机为核心进行一系列控制。

2)时钟显示模块用1602为LCD显示模块,把对应的引脚和最小系统上的引脚相连,连接后用初始化程序对其进行简单的功能测试。

测试成功后即可为实验所用,如图:3)时间调整电路用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。

功能键K1~K4功能如下。

K1—进入设置现在的时间。

K2—设置小时。

K3—设置分钟。

K4—确认完成设置。

如图:三、实验程序流程图:主程序:时钟主程序流程子程序:四、实验结果分析实验结果及分析:单片机的晶振可以根据要求设定。

6MHZ为和现实时间显示相同。

实验采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。

当烧入程序后开始运行,根据初始值设定可以观察到显示的时间,这里为了更明显观察显示数据变化把起始值设为23:59:50 运行后显示,K1为进入现在设置时间,当按下K1后显示,和实验要求相比较,实现了按下K1进入现在时间设置,按下K4确认完成时间设置的功能;不同之处: 当进入时间设置时在按下K1设置小时,再次按下K1是设置分钟。

增加功能:进入时间设置并选择设置位置后K2键位数字增加功能,K3键为数字减小功能。

根据仿真结果能够确定编程正确,基本实现了所有功能,而且有所改进。

实时日历时钟显示毕业设计

实时日历时钟显示毕业设计

湖南工程职业技术学院HUNAN ENGINEERING POLYTECHNIC 毕业设计(论文)设计(论文)题目:实时日历时钟显示信息工程系二○一二年五月制2012年5月21日2.选题依据、主要研究内容、研究思路及方案。

在当代繁忙的工作与生活中,时间与我们每一个人都有非常亲密的关系,每个人都受到时间的影响,为了更好的利用我们自己的时间,我们必须对时间有一个度量,因此产生了钟表。

随着社会、科技的发展,人类不断研究、创新。

为了在观测时间的同时能够了解其他与人类密切相关的信息,比如星期、日期等,实时日历时钟诞生了。

随着生活水平的提高,人们越来越追求人性化的事物,传统的时钟已不能满足人们的需求。

单片机技术,增加了调时的功能。

其电路可以由实时时钟模块、人机接口模块,、时钟模块数码管显示模块等部分组成。

利用软件编程尽量做到硬件电路简单稳定,减小电磁干扰和其他环境干扰,充分发挥软件编程的优点。

减小因元器件精度不够引起的误差,但是数字钟还是可以改进和提高如选用更精密的元器件,但与机械式时钟相比已经具有更高的准确性和直观性,且无机械装置具有更长的使用寿命,因此广泛应用于个人家庭、车站、办公室等公共场所,成为人们日常生活中的必需品。

单片机由于体积小、价格低、功耗低、控制功能强且控制逻辑可由软件来实现,可以很方便地完成由一般数字电路很难实现的控制逻辑。

因此,本课题研究的主要目的就是设计一个基于单片机的日历时钟系统,完成对日历时钟的显示,以及在正常工作情况下随时可进行调时、调分、调秒和日期的设置,所设计的实时日历时钟系统将具有以下功能:可以对每月天数进行调整,时钟运行的是 24 小时制,显示满刻度为23时59分59秒。

其中调时功能通过按键实现。

课题需要完成单片机与时钟芯片之间的通信,以及单片机对调时键盘的扫描,以及控制显示电路进行时间显示功能。

本设计采用AT89S52 芯片作为硬件核心,具有功耗小,能以 3V 的超低电压工作,该芯片内部存储器为 8KB ROM 存储空间,同时具有 AT89C51 的功能,且具有在线编程可擦除技术,所以不会对芯片造成损坏。

LCD显示的定时闹钟设计方案

LCD显示的定时闹钟设计方案

LCD显示的定时闹钟设计方案1.设计要求使用AT89C51单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD 时钟,若LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可使用。

定时闹钟的基本功能如下:显示格式为“时时:分分”。

由LED闪动来做秒计数表示。

一旦时间到则发出声响,同时继电器启动,可以扩充控制家电开启和关闭。

程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“ 00:00”,按下操作键K1〜K4动作如下:(1)K1 —设置现在的时间。

(2)K2 —显示闹钟设置的时间。

(3)K3 —设置闹铃的时间。

⑷K4 —闹铃ON/OFF勺状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声。

设置当前时间或闹铃时间如下。

(1)K1 —时调整。

(2)K2 —分调整。

(3)K3 —设置完成。

(4)K4 —闹铃时间到时,发出一阵声响,按下本键可以停止声响。

本项目的难点在于4 个按键每个都具有两个功能,以最终实现菜单化的输入功能。

采用通过逐层嵌套的循环扫描,实现嵌套式的键盘输入。

2.设计方案2.1 原理本LCD定时闹钟,是以单片机及外围接口电路为核心硬件,辅以其他外围硬件电路,用汇编语言设计的程序来实现的。

根据C51单片机的外围接口特点扩展相应的硬件电路,然后根据单片机的指令设计出数字钟相应的软件,再利用软件执行一定的程序来实现数字钟的功能。

由于采用集成芯片性的单片机来制作电子钟,这样设计制作简单而且功能多、精确度高,也可方便扩充其他功能,实现也十分简单。

本设计是利用AT89C51单片机为主控芯片,由LCD晶振、电阻、电容、发光二极管、开关、喇叭等元件组成硬件电路,通过编写软件程序来实现和控制的数字定时闹钟2.2系统总框图2.3原理及工作过程说明(1)定时闹钟的基本功能如下:(a)启动仿真软件,使用LCD液晶显示器来显示现在的时间。

(b)程序执行之后显示“ 00:00”并且LED闪烁,表示开始已经计时。

LCD12864显示实时时钟例程可运行

LCD12864显示实时时钟例程可运行

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。

实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。

下面是一段12864液晶显示实时时钟的程序:/****************************************************************************** *********时间:2012.11.30晶振:11.0592MHz芯片:STC89C52RC功能描述:在12864上显示年、月、日、星期、时、分和秒等时间信息******************************************************************************* ********/#include<reg52.h>#define uchar unsigned charsbit CLK=P1^4; //DS1302引脚定义sbit IO=P1^5;sbit CE=P1^6;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit RS=P2^4; //12864引脚定义数据口为P0sbit RW=P2^5;sbit EN=P2^6;sbit PSB=P2^1;sbit RET=P2^3;void Input_1byte(uchar TD) //DS1302输入一字节数据{uchar i;ACC=TD;for(i=8;i>0;i--){IO=ACC0;CLK=1;CLK=0;ACC=ACC>>1;}}uchar Output_1byte(void) //DS1302输出一字节数据{uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=IO;CLK=1;CLK=0;}return(ACC);}void Write_DS1302(uchar add,uchar dat)//向DS1302写{CE=0;CLK=0;CE=1;Input_1byte(add);Input_1byte(dat);CE=0;}uchar Read_DS1302(uchar add) //从DS1302读{uchar inf; //信息临时存储变量CE=0;CLK=0;CE=1;Input_1byte(add);inf=Output_1byte();CE=0;return(inf);}/**********************DS1302初始化*****************************/void init_1302(){if(Read_DS1302(0xd1)==0x55) //判断内存单元的内容,是否进行初始化 {return;}else{Write_DS1302(0x8e,0x00); //关闭写保护Write_DS1302(0x90,0x00); //电池充电设置Write_DS1302(0x80,0x00); //秒Write_DS1302(0x82,0x54); //分Write_DS1302(0x84,0x20); //时Write_DS1302(0x86,0x30); //日Write_DS1302(0x88,0x11); //月Write_DS1302(0x8a,0x05); //星期Write_DS1302(0x8c,0x12); //年Write_DS1302(0xd0,0x55); //写RAMWrite_DS1302(0x8e,0x80); //打开写保护}}/**********************延时函数*****************************/ void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/**********************12864判忙*****************************/ void check_busy(){RS=0;RW=1;EN=1;while((P0&0x80)==0x80);EN=0;}/**********************12864写指令*****************************/ void write_com(uchar com){check_busy();RS=0;RW=0;EN=1;P0=com;DelayUs2x(250);EN=0;DelayUs2x(250);}/**********************12864写数据*****************************/void write_data(uchar dat){check_busy();RS=1;RW=0;EN=1;P0=dat;DelayUs2x(250);EN=0;DelayUs2x(250);}/**********************12864初始化函数*****************************/void init(){DelayMs(40); //大于40MS的延时程序PSB=1; //设置为8BIT并口工作模式DelayMs(1); //延时RET=0; //复位DelayMs(1); //延时RET=1; //复位置高DelayMs(200);write_com(0x30); //选择基本指令集DelayUs2x(250); //延时大于100uswrite_com(0x30); //选择8bit数据流DelayUs2x(200); //延时大于37uswrite_com(0x0c); //开显示(无游标、不反白)DelayUs2x(250); //延时大于100uswrite_com(0x01); //清除显示,并且设定地址指针为00HDelayMs(200); //延时大于10mswrite_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动DelayUs2x(250); //延时大于100us}/**********************清屏*****************************/void clrscreen(){write_com(0x01);DelayMs(15);}/*********************************************************主函数********************************************************/void main(){uchar sec,sec1,sec2;uchar min,min1,min2;uchar hour,hour1,hour2;uchar date,date1,date2;uchar mon,mon1,mon2;uchar day;uchar year,year1,year2;uchar table1[]="年月日时分秒星期温度摄氏"; //长度24uchar table2[]={0XD2,0XBB, 0XB6,0XFE, 0XC8,0XFD, 0XCB,0XC4, 0XCE,0XE5, 0XCE,0XF9, 0XC8,0XD5}; //长度14 uchar table3[]="0123456789"; //长度10init(); //液晶初始化clrscreen();DelayMs(200);init_1302(); //1302初始化只初始化一下就可以需要下载两次DelayMs(50);write_com(0x80); //显示20write_data('2');write_data('0');write_com(0x82); //显示年write_data(table1[0]);write_data(table1[1]);write_com(0x84); //显示月write_data(table1[2]);write_data(table1[3]);write_com(0x86); //显示日write_data(table1[4]);write_data(table1[5]);write_com(0x91); //显示时write_data(table1[6]);write_data(table1[7]);write_com(0x93); //显示分write_data(table1[8]);write_data(table1[9]);write_com(0x95); //显示秒write_data(table1[10]);write_data(table1[11]);write_com(0x88); //显示星期write_data(table1[12]);write_data(table1[13]);write_data(table1[14]);write_data(table1[15]);while(1){sec=Read_DS1302(0x81); ////读秒sec1=sec&0x0f; //个位sec2=sec>>4; //十位min=Read_DS1302(0x83); ////读分min1=min&0x0f; //个位min2=min>>4; //十位hour=Read_DS1302(0x85); ////读时hour1=hour&0x0f; //个位hour2=hour>>4; //十位date=Read_DS1302(0x87); ////读日date1=date&0x0f; //个位date2=date>>4; //十位mon=Read_DS1302(0x89); ////读月mon1=mon&0x0f; //个位mon2=mon>>4; //十位year=Read_DS1302(0x8d); ////读年year1=year&0x0f; //个位year2=year>>4; //十位day=Read_DS1302(0x8b); ////读星期write_com(0x94); //送显示内容write_data(table3[sec2]); //秒write_data(table3[sec1]);write_com(0x92);write_data(table3[min2]); //分write_data(table3[min1]);write_com(0x90);write_data(table3[hour2]); //时write_data(table3[hour1]);write_com(0x85);write_data(table3[date2]); //日write_data(table3[date1]);write_com(0x83);write_data(table3[mon2]); //月write_data(table3[mon1]);write_com(0x81);write_data(table3[year2]); //年write_data(table3[year1]);write_com(0x8a);write_data(table2[2*day-2]); //星期write_data(table2[2*day-1]);}}。

用DS与LCD设计的可调式电子日历时钟的设计与实现PPT课件

用DS与LCD设计的可调式电子日历时钟的设计与实现PPT课件

7 D0 数据
15 BLA 背光源正极
8 D1 数据
16 BLK 背光源负极
第12页/共22页
LCD1
LM016L
R2
10k
K1
第13页/共22页
1 2 3
VSS VDD VEE
RS 4 RW 5 EN 6
RS RW E
D0 7 D1 8 D2 9 D3 10 D4 11 D5 12 D6 13 D7 14
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 D0 38 D1 37 D2 36 D3 35 D4 34 D5 33 D6 32 D7
21
RS
22
RW
23
EN
24
25
26
27
28
10 11 12 13 14 15 16 17
U3
AND_4
R2
10k
K1 K2 K3 K4
RS 4 RW 5 EN 6
VSS VDD VEE
D0 7 D1 8 D2 9 D3 10 D4 11 D5 12 D6 13 D7 14
RS 4 RW 5 EN 6
1 2 3
R2
10k
K1
第2页/共22页
RP1
1
D0 2 D1 3 D2 4 D3 5 D4 6 D5 7 D6 8 D7 9
RESPACK-8
(2)显示日历时钟初始值:年、月、日、星期、时、分、秒
第9页/共22页
第10页/共22页
◆液晶显示模块
LCD是一种功耗极低的显示器件,广泛应 用于便携式电子产品中。它不仅省电,而且能 够显示大量的信息,是一种专门用于显示字母、 数字、符号等点阵式LCD,目前常用16*1, 16*2,20*2和40*2行等模块。

实时时钟设计试验报告

实时时钟设计试验报告

实时时钟设计试验报告一、实验目的本实验的目的是设计一个实时时钟系统,具有实时显示时间、日期和闹钟功能。

通过该实验,我们可以了解实时时钟的设计原理、硬件电路连接及软件程序编写方法。

二、实验原理实时时钟系统由时钟芯片、显示模块、按键模块和控制模块组成。

时钟芯片负责计时和日期的记录,显示模块用于显示时间和日期,按键模块用于设置时间和日期,控制模块用于控制各模块之间的协作。

三、实验器材1.STM32开发板2.DS3231时钟模块3.数码管显示模块4.按键模块5.连接线四、实验步骤1.连接硬件电路。

将STM32开发板与DS3231时钟模块、数码管显示模块和按键模块进行连接,确保电路连接正确无误。

2.编写程序。

使用C语言编写程序,通过读取DS3231时钟模块的寄存器获取时间和日期数据,并将其显示在数码管模块上。

同时,设置按键模块的功能,使其可以进行时间和日期的设置。

3.烧录程序。

使用烧录器将编写好的程序烧录到STM32开发板上,并进行调试。

4.运行实验。

接通电源,启动实时时钟系统,观察数码管是否正确显示时间和日期,按下按键模块进行时间和日期的设置,并观察设置是否生效。

五、实验结果经过实验,我们成功设计出了一个实时时钟系统。

系统能够实时地显示当前的时间和日期,并且可以通过按键进行时间和日期的设置。

在设置新的时间和日期后,系统能够正确地更新并显示。

六、实验总结通过本次实验,我们深入地了解了实时时钟系统的设计原理和实现方法。

我们熟悉了DS3231时钟模块的使用方法,并学会了通过C语言编写程序来实现实时时钟系统的功能。

同时,我们也发现了实时时钟系统的一些问题,并加以解决。

我们对实时时钟系统的稳定性和精确性进行了测试,发现系统的计时精度较高,能够达到亚秒级的准确度。

然而,在用户进行时间和日期的设置时,可能由于误操作导致时间和日期出错。

需要在后续的工作中进一步优化系统的操作界面,提高用户设置的便捷性和准确性。

总而言之,实时时钟系统是一种非常有实用价值的设计,可以广泛应用于各种计时需求的场合,如办公室、实验室、车载设备等。

LCD1602+液晶显示数字电子钟+报告书

LCD1602+液晶显示数字电子钟+报告书

LCD1602中文资料介绍用LCD1602 液晶显示数字电子钟,整点蜂鸣器提醒,时间可自行调整。

同时用一个功能键切换显示日期(也可更改调整)和秒表。

本设计有五个按键,第一个是功能键,切换三个功能,分别是日期、时间和秒表;第二个是调整键,按一下屏幕不会变化,只有当按调整加减键时,屏幕就会变化。

例如:一上电显示的是年月日,然后想调整,按一下调整键,屏幕无变化,按调整加减键,屏幕就会变化,date变成tzy,表示正在调整年。

年调整好后,再按一下第二个调整键,屏幕无变化,按调整加减键,屏幕就会变化,tzy变成tzm,表示正在调整月。

其他类似。

第三四个键是加减键;第五个是调整好后的确认键和秒表的确认键。

操作说明:比如要调整日期,先按一下调整p2.1键(左边数第二个键),然后按加1键p2.2或减1键p2.3,第一次是让调整年,年调整后再按调整p2.1键,这次是调整月。

调整后再按调整p2.1键,最后是调整日。

调整好后按确认键p2.4,这样年月日就设置好了。

年月日设置好后按功能切换键p2.0它会回到时间设置上,调整方法和调整年月日类似。

电路原理图:目录扉页答辩许可证毕业设计(论文)任务书中文摘要英文摘要目录文献综述一.选题的目的及意义二.研究领域概况三.文献分析四.研究思路及方案五.进度计划六.参考文献专题论文正文1.引言2.核心芯片简介2.1AT89S51的结构和特点2.1.1芯片引脚及结构特点2.1.2主要功能特性2.1.3AT89S51的新功能2.1.4单片机内部结构及说明2.2 1602液晶显示器的结构及工作原理2.2.1液晶显示器的引脚功能及内部结构图2.2.2CGROM和CGRAM中字符代码与图形对应关系2.2.3液晶模块内部控制器指令说明3.方案设计及论证4.硬件设计4.1.1芯片接口与显示设计4.2.1单片机复位电路设计4.2.2单片机晶振电路设计4.2.3单片机报时电路设计4.2.4单片机下载程序电路设计4.2.5按键功能描述及调试过程5.结论致谢参考文献实习报告外文中文论文缩写电路图§§§基于LCD1602的数字电子钟§§§购物从这里开始:/CD.asp此设计费用为:基本费用155+20(LCD1602)+1(蜂鸣器)+1(电位器)+3(6个12*12*6按键)=180元. 用LCD1602 液晶显示数字电子钟,整点蜂鸣器提醒,时间可自行调整。

液晶数字钟实训报告摘要

液晶数字钟实训报告摘要

本实训报告针对液晶数字钟的设计与制作过程进行了详细的阐述。

通过本次实训,旨在提高学生对数字电子技术、单片机应用以及液晶显示技术的理解和掌握,同时锻炼学生的动手实践能力。

以下为报告的主要内容:一、引言随着科技的不断发展,液晶数字钟因其体积小、功耗低、显示清晰等特点,被广泛应用于家庭、办公、工厂等领域。

本实训项目旨在设计并制作一款具有以下功能的液晶数字钟:实时显示年、月、日、时、分、秒;具有闹钟功能;具有定时开关功能;具有时钟校准功能。

二、设计原理1. 液晶显示原理液晶显示技术是一种利用液晶分子在不同电压下具有不同光学性质来实现显示的技术。

当液晶分子受到电压作用时,液晶分子的排列会发生改变,从而改变光的透射和反射,实现图像显示。

2. 单片机控制原理本实训所使用的单片机为STC89C52,其具有丰富的片上资源,如定时器、计数器、中断系统等。

通过编写程序,实现对液晶显示模块的控制,从而实现时间显示、闹钟、定时开关等功能。

3. 时钟校准原理时钟校准功能主要通过外部晶振产生基准频率,通过单片机内部的定时器实现计数,从而实现时钟的精确计时。

同时,通过外部按键实现时钟的校准。

三、硬件设计1. 液晶显示模块本实训采用12864液晶显示模块,具有128列、64行显示能力,可显示汉字、英文字符以及图形。

通过编写程序,实现时间的显示、闹钟、定时开关等功能。

2. 单片机本实训采用STC89C52单片机,具有丰富的片上资源,如定时器、计数器、中断系统等。

通过编写程序,实现对液晶显示模块的控制,从而实现时间显示、闹钟、定时开关等功能。

3. 时钟电路时钟电路主要由晶振、电容、电阻等元件组成,产生基准频率。

通过单片机内部的定时器实现计数,从而实现时钟的精确计时。

4. 按键电路按键电路由按键和单片机引脚组成,通过按键实现时钟的校准、闹钟设置、定时开关等功能。

四、软件设计1. 主程序设计主程序主要负责初始化单片机各个模块,设置定时器中断,读取按键状态,控制液晶显示模块显示时间、闹钟、定时开关等功能。

单片机LCD1602显示年月日时钟带星期和闹钟

单片机LCD1602显示年月日时钟带星期和闹钟

单片机LCD1602显示年月日时钟带星期和闹钟长春工业大学测控技术与仪器专业单片机LCD1602显示年月日时钟带星期和闹钟,可识别闰年下载文档即可完全复制#include#define uchar unsigned char#define uint unsigned intsbit lcdrs = P0^7; //液晶引脚定义sbit led_cs = P0^6;sbit lcden = P0^5;sbit boom = P3^6;sbit key1 = P3^5;sbit key2 = P3^4;sbit key3 = P3^3;sbit keyE = P3^2;ucharnum,key1num,key2num,count,hour,min,sec,day,mon,year,sh i,fen,miao,week;char ye1,ye2;uchar code cg_1602[]={ 0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02, 0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00,0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,};//"年月日"/*延时函数*/void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=114;j>0;j--);}/*1602液晶*/void write_com(uchar com)//写命令{ lcdrs=0;lcden=0;P2=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date)//写数据{ lcdrs=1;lcden=0;P2=date;delay(5);lcden=1;delay(5);lcden=0;}void write_by_xy(uchar x,uchar y)//坐标定位{uchar address;if(y==0)address=0x80+x;//y=0,写第一行elseaddress=0xc0+x;//y=1,写第二行write_com(address);}/*void write_char(uchar x,uchar y,uchar date)//坐标定位显示{ write_by_xy(x,y);//先定位write_data(date);//后写数}*/void write_string(uchar x,uchar y,uchar *s)//写字符串{write_by_xy(x,y);//设定显示位置while(*s)//write character{P2=*s;write_data(*s);s++;}}void write_sfm(uchar add,uchar date)//写时分秒函数{uchar hour,ge;hour=date/10;//分解一个2位数的十位和个位ge=date%10;write_com(0x80+add);//设置显示位置write_data(0x30+hour);//送去液晶显示十位write_data(0x30+ge); //送去液晶显示个位}void write_cg()//写入固定汉字和符号{write_com(0x40); //设定CGRAM地址for(num=0;num<24;num++) //将自定义字型码写入CGRAM 中{write_data(cg_1602[num]);}write_com(0xc4);//年{write_data(0);}write_com(0xc7);//月{write_data(1);}write_com(0xca);//日{write_data(2);}write_string(2,0,":");write_string(5,0,":");write_string(0x0a,0,":");write_string(0x0d,0,":");write_string(0x0c,1,"W");write_string(0x0d,1,"K");}void init_1602()//初始化{led_cs=0;hour=23;min=59;sec=55;key1num=0;count=0;day=28;mon =2;ye1=20;ye2=13;year=ye1*100+ye2;boom=0;shi=0;fen=0;mi ao=0;week=7;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_string(0,1,"2013");write_string(5,1,"02");write_string(8,1,"28");write_sfm(8,shi);write_sfm(0x0b,fen);write_sfm(0x0e,miao);write_sfm(0,hour);write_sfm(3,min);write_sfm(6,sec);write_sfm(0x48,day);write_sfm(0x45,mon);write_sfm(0x40,ye1);write_sfm(0x42,ye2);write_sfm(0x4e,week);write_cg();TMOD=0x01;//设置定时器0工作模式1 TH0=(65536-50000)/256;//定时器装初值TL0=(65536-50000)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0}/*键盘扫描函数*/void keyscan()//按键扫描函数{//keyE =0;if(key1==0){delay(5);if(key1==0)//确认功能键被按下{key1num++;//功能键按下次数记录while(!key1);//释放确认if(key1num==1)//第一次被按下时{TR0=0; //关闭定时器write_com(0x80+7);//光标定位到秒位置write_com(0x0f); //光标开始闪烁}if(key1num==2)//第二次按下光标闪烁定位到分钟位置{ write_com(0x80+4);}if(key1num==3)//第三次按下光标闪烁定位到小时位置{ write_com(0x80+1);}if(key1num==4)//第四次按下光标闪烁定位到日位置{ write_com(0x80+0x49);}if(key1num==5)//第五次按下光标闪烁定位到月位置{ write_com(0x80+0x46);}if(key1num==6)//第六次按下光标闪烁定位到年2位置{ write_com(0x80+0x43);}if(key1num==7)//第七次按下光标闪烁定位到年1位置{write_com(0x80+0x41);}if(key1num==8)//第八次按下光标闪烁定位到星期位置{write_com(0x80+0x4f);}if(key1num==9)//第九次按下{key1num=0;//记录按键数清零write_com(0x0c);//取消光标闪烁TR0=1; //启动定时器使时钟开始走}}}if(key1num!=0)//只有功能键被按下后,增加和减小键才有效{ if(key2==0){.delay(5);if(key2==0)//增加键确认被按下{while(!key2);//按键释放if(key1num==1)//若功能键第一次按下{sec++; //则调整秒加1if(sec==60)//若满60后将清零sec=0;write_sfm(6,sec);//每调节一次送液晶显示一下write_com(0x80+7);//显示位置重新回到调节处}if(key1num==2)//若功能键第二次按下{min++;//则调整分钟加1if(min==60)//若满60后将清零min=0;write_sfm(3,min);//每调节一次送液晶显示一下write_com(0x80+4);//显示位置重新回到调节处} if(key1num==3)//若功能键第三次按下{.hour++;//则调整小时加1if(hour==24)//若满24后将清零hour=0;write_sfm(0,hour);;//每调节一次送液晶显示一下write_com(0x80+1);//显示位置重新回到调节处} if(key1num==4)//若功能键第四次按下{day++;//则调整日加1if(day>31)//若大于31后将置一day=1;write_sfm(0x48,day);//每调节一次送液晶显示一下write_com(0x80+0x48);//显示位置重新回到调节处}if(key1num==5)//若功能键第五次按下{mon++;//则调整月加1if(mon>12)//若大于12后将置一mon=1;write_sfm(0x45,mon);//每调节一次送液晶显示一.下write_com(0x80+0x45);//显示位置重新回到调节处}if(key1num==6)//若功能键第六次按下ye2++;//则调整年加1if(ye2==0x0a)//若满99后将清零ye2=0;year=ye1*100+ye2;write_sfm(0x42,ye2);//每调节一次送液晶显示一下write_com(0x80+0x42);//显示位置重新回到调节处}if(key1num==7)//若功能键第七次按下{ye1++;//则调整年加100if(ye1==0x0a)//若满99后将清零ye1=0;year=ye1*100+ye2;write_sfm(0x40,ye1);//每调节一次送液晶显示一.下write_com(0x80+0x40);//显示位置重新回到调节处}if(key1num==8)//若功能键第八次按下{week++;//则调整周加一if(week>7)//若大于7后置一week=1;write_sfm(0x4f,week);//每调节一次送液晶显示一下write_com(0x80+0x4f);//显示位置重新回到调节处}}}if(key3==0)delay(5);if(key3==0)//确认减小键被按下{while(!key3);//按键释放.if(key1num==1)//若功能键第一次按下{sec--;//则调整秒减1if(sec==-1)//若减到负数则将其重新设置为59 sec=59;write_sfm(6,sec);//每调节一次送液晶显示一下write_com(0x80+7);//显示位置重新回到调节处}if(key1num==2)//若功能键第二次按下{min--;//则调整分钟减1if(min==-1)//若减到负数则将其重新设置为59 min=59;write_sfm(3,min);//每调节一次送液晶显示一下write_com(0x80+4);//显示位置重新回到调节处}if(key1num==3)//若功能键第三次按下{hour--;//则调整小时减1if(hour==-1)//若减到负数则将其重新设置为23 hour=23;write_sfm(0,hour);//每调节一次送液晶显示一下.write_com(0x80+1);//显示位置重新回到调节处}if(key1num==4)//若功能键第四次按下{day--;//则调整日减1if(day==0)//若日为零时将置一day=31;write_sfm(0x48,day);//每调节一次送液晶显示一下write_com(0x80+0x49);//显示位置重新回到调节处}if(key1num==5)//若功能键第五次按下{mon--;//则调整月减1if(mon==0)//若月为零将置一mon=12;write_sfm(0x45,mon);//每调节一次送液晶显示一下write_com(0x80+0x45);//显示位置重新回到调节处}{ye2--;//则调整年减1if(ye2<0)//若小于零后将设置为99ye2=99;year=ye1*100+ye2;write_sfm(0x42,ye2);//每调节一次送液晶显示一下write_com(0x80+0x42);//显示位置重新回到调节处}if(key1num==7)//若功能键第七次按下{ye1--;//则调整年减100if(ye1<0)//若小于零后将设置为99ye1=99;year=ye1*100+ye2;write_sfm(0x40,ye1);//每调节一次送液晶显示一下write_com(0x80+0x40);//显示位置重新回到调节处}{week--;//则调整周减一if(week==0)//若等于0后将置7week=7;write_sfm(0x4f,week);//每调节一次送液晶显示一下write_com(0x80+0x4f);//显示位置重新回到调节处}}}}if(keyE==0){delay(5);if(keyE==0)//确认功能键被按下{key2num++;//功能键按下次数记录while(!keyE);//释放确认if(key2num==1)//第一次被按下时{TR0=0; //关闭定时器write_com(0x80+0x0f);//光标定位到秒位置write_com(0x0f); //光标开始闪烁}if(key2num==2)//第二次按下光标闪烁定位到分钟位置{write_com(0x80+0x0c);}if(key2num==3)//第三次按下光标闪烁定位到小时位置{write_com(0x80+9);}if(key2num==4)//第八次按下{key2num=0;//记录按键数清零write_com(0x0c);//取消光标闪烁TR0=1; //启动定时器使时钟开始走}}}if(key2num!=0)//只有功能键被按下后,增加和减小键才有效{。

基于LCD的电子时钟试验课程设计报告

基于LCD的电子时钟试验课程设计报告

毕业论文声明本人郑重声明:1.此毕业论文是本人在指导教师指导下独立进行研究取得的成果。

除了特别加以标注地方外,本文不包含他人或其它机构已经发表或撰写过的研究成果。

对本文研究做出重要贡献的个人与集体均已在文中作了明确标明。

本人完全意识到本声明的法律结果由本人承担。

2.本人完全了解学校、学院有关保留、使用学位论文的规定,同意学校与学院保留并向国家有关部门或机构送交此论文的复印件和电子版,允许此文被查阅和借阅。

本人授权大学学院可以将此文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本文。

3.若在大学学院毕业论文审查小组复审中,发现本文有抄袭,一切后果均由本人承担,与毕业论文指导老师无关。

4. 本人所呈交的毕业论文,是在指导老师的指导下独立进行研究所取得的成果。

论文中凡引用他人已经发布或未发表的成果、数据、观点等,均已明确注明出处。

论文中已经注明引用的内容外,不包含任何其他个人或集体已经发表或撰写过的研究成果。

对本文的研究成果做出重要贡献的个人和集体,均已在论文中已明确的方式标明。

学位论文作者(签名):年月关于毕业论文使用授权的声明本人在指导老师的指导下所完成的论文及相关的资料(包括图纸、实验记录、原始数据、实物照片、图片、录音带、设计手稿等),知识产权归属华北电力大学。

本人完全了解大学有关保存,使用毕业论文的规定。

同意学校保存或向国家有关部门或机构送交论文的纸质版或电子版,允许论文被查阅或借阅。

本人授权大学可以将本毕业论文的全部或部分内容编入有关数据库进行检索,可以采用任何复制手段保存或编汇本毕业论文。

如果发表相关成果,一定征得指导教师同意,且第一署名单位为大学。

本人毕业后使用毕业论文或与该论文直接相关的学术论文或成果时,第一署名单位仍然为大学。

本人完全了解大学关于收集、保存、使用学位论文的规定,同意如下各项内容:按照学校要求提交学位论文的印刷本和电子版本;学校有权保存学位论文的印刷本和电子版,并采用影印、缩印、扫描、数字化或其它手段保存或汇编本学位论文;学校有权提供目录检索以及提供本学位论文全文或者部分的阅览服务;学校有权按有关规定向国家有关部门或者机构送交论文的复印件和电子版,允许论文被查阅和借阅。

lCD时钟日历设计报告

lCD时钟日历设计报告

需要显示,还是用显示功能更好的液晶显示器比 较好,它能显示更多的数据,用162液晶显示数 据有限,显示数据的可读性不好,用可以显示汉 字的12864液晶显示器还可以增加显示信息的可 读性,让人看起来会很方便。另外它们在价格上 差距很大,考虑成本我们首选162。所以选择方 案2。 2.4 报警系统的方案比较 方案1:用单片机板上长鸣的蜂鸣器实现定 时闹钟功能。 方案2:用喇叭加语音芯片实现定时闹钟功 能。 用喇叭加语音芯片成本很高,但声音还不 错,再有喇叭体积庞大。用用单片机板上蜂鸣 器,节约了成本和设计的时间。限于设计所需要 的功能,用蜂鸣器是最佳选择。所以我们采用方 案1. 2.5 键盘控制方案选择 方案1:采用矩阵键盘,采用矩阵形式连接。 方案2:采用单片机实验板上固有的按键作为 校时调整控制。 虽然矩阵键盘调整简单快速,考虑到程序设 计的便捷但我们觉得还是用方案2。 二、硬件系统方框图
/********************液晶初始化函数************************/ void LCD_init(void) { delay_nms(5); LCD_write_char(0x28,0); //4位显示 LCD_write_char(0x0c,0); //显示开 LCD_write_char(0x06,0); LCD_write_char(0x01,0); //清屏 } /********************液晶使能函数************************/ void LCD_en_write(void) { LCD_EN=0; delay_nus(2); LCD_EN=1; delay_nus(2); LCD_EN=0; } /*********************写命令或写数据函数*******************/ void LCD_write_data(unsigned char Data_command) { unsigned char temp; temp=Data_command; LCD_DATA_PORT&=0X0f; //LCD_DATA_PORT=LCD_DATA_PORT&0X0f LCD_DATA_PORT|=temp&0xf0; //写高四位 LCD_en_write(); temp=temp<<4; LCD_DATA_PORT&=0x0f; LCD_DATA_PORT|=temp&0xf0; //写低四位 LCD_en_write();

lcd实时日历时钟评测研究报告

lcd实时日历时钟评测研究报告

课程设计说明书课程名称:单片机原理及应用设计题目:LCD日历院系:学生姓名:学号:专业班级:2011年3月1日目录摘要错误!未定义书签。

b5E2R。

一.设计任务和要求4二.方案论证4三.核心元件地性能41.AT89C5141.1 功能特性概括:51.2 管脚说明:52.DS130272.1DS1302引脚功能72.2DS1302地控制字82.3 DS1302地寄存器92.4 DS1302地数据输入输出10p1Ean。

四.理论分析与计算9DXDiT。

五.电路与程序设计9RTCrp。

1.系统硬件设计95PCzV。

1.1系统总原理图9jLBHr。

1.2主控部分(单片机MCS-51)9xHAQX。

1.3 计时部分(实时时钟芯片DS1302)错误!未定义书签。

LDAYt。

1.4Proteus仿真图错误!未定义书签。

Zzz6Z。

2.系统软件设计错误!未定义书签。

dvzfv。

2.1程序流程图错误!未定义书签。

rqyn1。

2.2程序源代码错误!未定义书签。

Emxvx。

六.结果分析错误!未定义书签。

SixE2。

七.设计体会总结24参考文献25摘要此次课程设计地要求是通过LCD与单片机地连接模块能够显示数字(如时间)、字符(如英文)和图形等,这就需要专门地时钟芯片-----DS1302.DS1302是一种高性能、低功耗、带RAM地实时时钟芯片,它能够对时,分,秒进行精确计时,它与单片机地接口使用同步串行通信,仅用3条线与之相连接,就可以实现MCS-51单片机对其进行读写操作,把读出地时间数据送到LM044L上显示.程序运行时,必须先对LM044L进行初始设置,然后,通过单片机从DS1302中获取时间并通过LM044L显示.同时,进行循环赋值,使LCD动态显示当前地时间.关键字:AT89C51、DS1302,LM044L显示器一.设计任务和要求1.利用DS1302实现年月日时分秒,并用LCD显示.2.通过LCD模块与单片机地接口,能显示数字(如时间)、字符(如英文).3. 硬件设计部分,根据设计地任务选定合适地单片机,根据控制对象设计接口电路.设计地单元电路必须有工作原理,器件地作用,分析和计算过程;4. 软件设计部分,根据电路工作过程,画出软件流程图,根据流程图编写相应地程序,进行调试并打印程序清单;5.原理图设计部分,根据所确定地设计电路,利用Protel工具软件绘制电路原理图,提供元器件清单.6计算说明书部分包括方案论证报告打印版或手写版,程序流程图具体程序等7. 图纸部分包括具体电路原理图打印版8. 设计要求还包括利用一天时间进行资料查阅与学习讨论,利用5天时间在实验室进行分散设计,最后三天编写报告.最后一天进行成果验收.二.方案论证实现数字电子钟地设计有以下两种基本方案,现就两种基本方案地优劣进行具体论证,从而说明选择方案二地理由.方案一:直接用单片机地内部定时器来实现时间.该方案以MCS-51单片机为主控芯片,以MCS-51地内部定时器产生地1s中断作为时钟地驱动,然后再通LCD液晶显示器来组成数字钟电路.但是此方案最大地缺点在于单片机89C51产生地1s中断存在误差,如果工作时间长地话,数字时钟显示地时间将会出现严重地偏差,不够精确.方案二:使用串行接口时钟芯片DS1302设计时钟电路.该设计方案以MCS-51单片机为主控芯片,以串行时钟芯片DS1302为核心计时芯片,然后再通过一个LCD液晶显示器组成数字时钟电路.更重要地是,DS1302时钟芯片地加入大大提高了数字钟时间地准确性,而且该电路在断电后不丢失时间和数据信息时也使得该方案地研究与提升更具有开发地意义.三.核心芯片功能介绍1.AT89C52AT89S52[3]美国ATMEL公司生产地低功耗,高性能CMOS 8位单片机,片内含4K BytesISP(In-system programmable)地可反复擦写1000次地Flash只读程序存储器,器件采用ATMEL公司地高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及AT89C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元.单片机AT89S51强大地功能可为许多嵌入式控制应用系统提供高性价比地解决方案.AT89C51芯片地引脚结构如图1所示:1.1功能特性概括:AT89S51提供以下标准功能:40个引脚、4K Bytes Flash片内程序存储器、128 Bytes地随机存取数据存储器(RAM)、32个外部双向输入/输出(I/O)口、5个中断优先级2层中断嵌套中断、2个数据指针、2个16位可编程定时/计数器、2个全双工串行通信口、看门狗(WDT)电路、片内振荡器及时钟电路.此外,AT89S51可降至0Hz地静态逻辑操作,并支持两种软件可选地节电工作模式.空闲模式下,图1AT89C51引脚图CPU暂停工作,而RAM、定时/计数器、串行通信口、外中断系统可继续工作.掉电模式冻结振荡器而保存RAM地数据,停止芯片其它功能直至外中断激活或硬件复位.同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品地需求.1.2 管脚说明:P0口:P0口为一个8位漏级开路双向I/O口,也即地址/数据总线复用口.作为输出口用时,能驱动8个TTL逻辑门电路.对端口写“1”时,被定义为高阻输入.在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻.在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻.P1口:P1口是一个带内部上拉电阻地8位双向I/O口,P1口地输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对端口写“1”,通过内部地上拉电阻把端口拉到高电平,此时可作输入口.作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会).输出一个电流(IIL在Flash,如表1所示:表1 P1口部分引脚第二功能P2口:P2口是一个带有内部上拉电阻地8位双向I/O口, P2口地输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对端口写“1”,通过内部地上拉电阻把端口拉到高电平,此时可作输入口.作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(I).IL在访问外部程序存储器或16位地址地外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据.在访问8位地址地外部数据寄存器(例如执行MOVX@Ri指令)时,P2口线上地内容(也即特殊功能寄存器(SFR)区中P2寄存器地内容),在整个访问期间不改变.在Flash编程或校验时,P2亦接收高位地址和其它控制信号.P3口: P3口是一个带有内部上拉电阻地双向8位I/O口, P3口地输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对P3口写“1”时,它们被内部地上拉电阻拉高并可作).为输入端口.作输入口使用时,被外部信号拉低地P3口将用上拉电阻输出电流(IIL P3口除了作为一般地I/O口线外,更重要地用途是它地第二功能,如表2所示:P3口还接收一些用于Flash闪速存储器编程和程序校验地控制信号.表2 P3口引脚第二功能RST:复位输入.当振荡器工作时,RST引脚出现两个机器周期以上地高电平时间将使单片机复位.WDT溢出将使该引脚输出高电平,设置SFR AUXR地DISRTO位(地址8EH)可打开或关闭该功能. DISRTO位缺省为RESET输出高电平打开状态.ALE/PROG:当访问外部存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址地低8位字节.即使不访问外部寄存器,ALE仍以时钟振荡频率地1/6输出固定地正脉冲信号,因此它可对外输出时钟或用于定时目地.值得注意地是:每当访问外部数据存储器时将跳过一个ALE脉冲.对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG).如有必要,可通过对特殊功能寄存器(SFR)区中地8EH单元地D0位置位,可禁止ALE操作.该位置位后,只要一条MOVX和MOVC指令才会激活ALE.此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效.PSEN:程序存储允许(PSEN)输出是外部程序存储器地读选通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲.当访问外部数据存储器时,没有两次有效地PSEN信号.EA/VPP:外部访问允许.欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA 端必须保持低电平(接地).需要注意地是:如果加密位LB1被编程,复位时内部会锁存EA端状态.如EA端保持高电平(接VCC端),CPU则执行内部程序存储器中地指令.Flash存储器编程期间,该引脚用于施加+12V编程电压(VPP).XTAL1:反向振荡放大器地输入及内部时钟工作电路地输入端.XTAL2:反向振荡放大器器地输出端.2.DS1302DS1302[1]是美国DALLAS公司推出地一种高性能、低功耗、带RAM地实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V.时钟可工作在24小时格式或12小时(AM/PM)格式. DS1302与单片机地接口使用同步串行通信,仅用3条线与之相连接.可采用一次传送一个字节或突发方式一次传送多个字节地时钟信号或RAM数据.DS1302内部有一个31×8地用于临时性存放数据地RAM寄存器.DS1302是DS1202地升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电地能力.2.1DS1302引脚功能DS1302地引脚功能如表3所示,管脚图如图2所示表3 DS1302引脚功能表通过把RST输入驱动置高电平来启动所有地数据传送.RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供了终止单字节或多字节数据地传送手段.当RST为高电平时,所有地数据传送被初始化,允许对DS1302进行操作.如果在传送过程中置RST为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态.上电运行时,在Vcc≥2.5V之前,RST必须保持低电平.只有在SCLK为低电平时,才能将RST置为高电平.2.2DS1302地控制字DS1302地控制字节如图3所示:图3控制字节如图控制字节地最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中.位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元地地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出.2.3 DS1302地寄存器DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放地数据位为BCD 码形式.其日历、时间寄存器及其控制字见表5.此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM 相关地寄存器等.时钟突发寄存器可一次性顺序读写除充电寄存器外地所有寄存器地内容. DS1302与RAM相关地寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位地字节,其命令控制字为C0H--FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下地RAM寄存器,此方式下可一次性读写所有地RAM地31个字节,命令控制字为FEH(写)、FFH(读).表5 DS1302地日历、时钟寄存器及其控制字 2.4 DS1302地数据输入输出在控制指令字输入后地下一个SCLK 时钟地上升沿时数据被写入DS1302,数据输入从低位即位0开始.同样,在紧跟8位地控制指令字后地下一个SCLK 脉冲地下降沿读出DS1302 图4 读写数据如图所示地数据,读出数据时从低位0位至高位7,数据读写时序如图4所示:四.理论分析与计算本次设计地电路由主控部分(单片机MCS-51)、计时部分(实时时钟芯片DS1302)、显示部分(LM044L )3个部分组成.各部分之间相互协作,构成一个统一地有机整体,实现数字时钟地计时功能.现就各部分地硬件电路设计作出如下分析:1. 主控部分(单片机MCS-51)MCS-51单片机作为主控芯片,控制整个电路地运行.通过分析我们发现要想显示时间,必须先把DS1302中地时间信息通过单片机获取,存放到40H 到46H 等RAM 单元.并且是实时存放,刷新时间.2. 计时部分(实时时钟芯片DS1302)时钟芯片DS1302能够准确地记录当前地时间,所以,通过单片机向其写入命令来获取相应地时间,而且一个命令字节控制读一个时间. 7654176543211A4A3A2A1DATA I/O BYTE2DATA I/O BYTE1R/C A0R/W I/ORSTSCLK3. 显示部分LM044L能够显示简单地汉字及数字,功能十分强大,而且属于动态显示,所以将单片机中存地时间信息传送到LM044L中.另外还需要循环赋值.五.电路与程序设计1.、系统硬件设计本次设计地硬件电路由主控部分(单片机MCS-51)、计时部分(实时时钟芯片DS1302)、显示部分(LM044L)3个部分组成.各部分之间相互协作,构成一个统一地有机整体,实现数字时钟地计时功能.现就各部分地硬件电路设计作出如下论述.1.1系统总原理图1.2 主控部分(单片机MCS-51)MCS-51单片机作为主控芯片,控制整个电路地运行.其外围电路主要有两部分:复位电路和晶体振荡器.复位电路地功能是:系统上电时提供复位信号,直至系统电源稳定后,撤消复位信号.为可靠起见,电源稳定后还要经一定地延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起地抖动而影响复位.该设计采用含有二极管地复位电路,复位电路可以有效地解决电源毛刺和电源缓慢下降(电池电压不足)等引起地问题,在电源电压瞬间下降时可以使电容迅速放电,一定宽度地电源毛刺也可令系统可靠复位.晶体振荡电路:MCS-51单片机中有一个用于构成内部振荡器地高增益反相放大器,引脚XTAL1和XTAL2分别为该反向放大器地输入端和输出端.这个反向放大器与作为反馈元件地片外石英晶体或陶瓷谐振器一起构成自激振荡器.外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器地反馈回路中构成并联振荡电路.对外接电容C1、C2虽然没有十分严格地要求,但电容容量地大小会轻微影响振荡频率地高低、振荡器工作地稳定性、起振地难易程度及温度稳定性.如果使用石英晶体,1.33条线I/O相连,P1.1用来作为RST输入驱动置RST接通控制逻DS1302并且I/O RST必须保持低电平.图2.CR).在SCLK线上地数据被送入输出数据在I/O线上.写和读各需要一个程序,写DS1302程序流程图如图8所示,读DS1302程序流程图如图9所示.2.1程序流程图图8 写DS1302流程图图9读DS1302流程图2.2程序源代码IO B IT P 1.0 S C LK B IT P 1.1 R S T B IT P 1.2 RW B IT P 1.6 R S B IT P 1.7 E B IT P 1.5 O R G 0000H J M P M A IN O R G 000B H LJ M P DV TOO R G 0100HM A IN:M O V S P,#5FHM O V TM O D,#01HM O V TH0,#4EHM O V T L0,#20HM O V R7,#01M O V R0,#30HM O V 30H,#01H;秒M O V 31H,#01H;分M O V 32H,#01H;时M O V 33H,#01H;日M O V 34H,#01H;月M O V 35H,#01H;星期M O V 36H,#10H ;N IA N年LC A LL IN IT ;对LC D进行初始化LC A LL K E YS ET B E T0S ET B EAS ET B TR0S J M P $D V TO:LC A LL LO P5LC A LL A B CR ET IN TO:M O V T H0,#4E HM O V T L0,#20HS ET B TR0R ET IK E Y:C LR R S TC LR S C LKS ET B R S TM O V B,#8E HC A LL W R IT EM O V B,#00HC A LL W R IT ES ET B S C LKC LR R S TM O V R0,#30HM O V R7,#7M O V R1,#80HLO O P:C LR R S TC LR S C LKS ET B R S TM O V B,R1C A LL W R IT EM O V A,@R0M O V B,AC A LL W R IT EIN C R0IN C R1IN C R1S ET B S C LKC LR R S TDJ N Z R7,LO O PC LR R S TC LR S C LKS ET B R S TM O V B,#8E HC A LL W R IT EM O V B,#80HC A LL W R IT ES ET B S C LKC LR R S TR E TIN IT:M O V A,#01HC A LL W R CM O V A,#38HC A LL W R CM O V A,#0C HC A LL W R CM O V A,#98HC A LL W R CM O V A,#83H ;D DR AM地地址进行设置,选择从哪里开始显示C A LL W R CM O V A,#54H ;T地AS C II码C A LL W R DM O V A,#49H ;I地A S C II码C A LL W R DM O V A,#4D H ;M地AS C II码C A LL W R DM O V A,#45H ;E地AS C II码C A LL W R DM O V A,#3A H ;:地AS C II码C A LL W R DM O V A,#097H ;D DR AM地地址进行设置,选择从哪里开始显示C A LL W R CM O V A,#30HC A LL W R DM O V A,#38HC A LL W R DM O V A,#32HC A LL W R DM O V A,#3A HC A LL W R DM O V A,#4C H ;L地A S C I I码C A LL W R DM O V A,#49H ;I地A S C IIC A LL W R DM O V A,#20H ;地AS C II码C A LL W R DM O V A,#4A H ;J地AS C IIC A LL W R DM O V A,#49H ;I 地AS C II码C A LL W R DM O V A,#41H ;A地AS C II码C A LL W R DM O V A,#4e HC A LL W RD ;N地AS C II码M O V A,#20H ;地AS C II码C A LL W R DC A LL W R DM O V A,#57H ;W地A S C II码C A LL W R DM O V A,#45H ; E 地A S C II码C A LL W R DM O V A,#49H ;I 地AS C II码C A LL W R DM O V A,#20H ;地AS C II码C A LL W R DM O V A,#0D B H ;D DR AM地地址进行设置,选择从哪里开始显示C A LL W R CM O V A,#48H ;H地AS C II码C A LL W R DM O V A,#45H ;E地AS C II码C A LL W R DM O V A,#10H ;地A S C II码C A LL W R DM O V A,#42H ;B地AS C II码C A LL W R DM O V A,#4F H ;O地AS C II码C A LL W R DR E T ;对液晶显示器初始功能设置LO P5:M O V 50H,#8 ;以下为将DS1302地数据存到单片机地40H到46H中M O V R7,#7M O V R0,#30HM O V R1,#81HLO P:C LR R S TC LR S C LKS ET B R S TM O V B,R1A C A LL W R IT EAC A LL R E A DM O V @R0,AIN C R0IN C R1IN C R1DJ N Z R7,LO P ;读出DS1302中地数据存到单片机中R ETA B C: M O V A,#88H ;取出42H中地数据(小时)并显示C A LL W R CM O V A,32H ;显示小时A N L A,#0F0HS WAP AA D D A,#30HA C A LL W R DM O V A,32HAN L A,#0FHA D D A,#30HA C A LL W R DM O V A,#8A H ;对D DR A M地址进行设置C A LL W R CM O V A,#3A H ;:地AS C II码C A LL W R DM O V A,31H ;显示分钟A N L A,#0F0HS WAP AA D D A,#30HA C A LL W R DM O V A,31HA N L A,#0FHA D D A,#30HAC A LL W R DM O V A,#8D H ;对D DR A M地址进行设置C A LL W R CM O V A,#3A H ;:地AS C II码C A LL W R DM O V A,30H ;显示秒A N L A,#0F0HS WAP AA D D A,#30HAC A LL W R DM O V A,30HA N L A,#0FHAD D A,#30HLC A LL W R DM O V A,#0D4H ;对D DR AM地址进行设置C A LL W R CM O V A,#58H ;X地AS C I I码C A LL W R DM O V A,#51H ;Q地AS C II码C A LL W R DDE C45HM O V A,35H ;显示星期A N L A,#0FHA D D A,#30HA C A LL W R DM O V A,#0C3HC A LL W R CM O V A,#44H ;D地AS C II码C A LL W R DM O V A,#41H ;A地AS C I I码C A LL W R DM O V A,#54H ;T地AS C II码C A LL W R DM O V A,#45H ;A地AS C I I码C A LL W R DM O V A,#3A H ;:地AS C II码C A LL W R DM O V A,36H ;显示年A N L A,#0F0HS WAP AA D D A,#30HAC A LL W R DM O V A,36HAN L A,#0FHA D D A,#30HA C A LL W R DM O V A,#0C A H ;对D DR A M地址进行设C A LL W R CM O V A,#2D H ;-地AS C II码C A LL W R DM O V A,34H ;显示月A N L A,#0F0HS WAP AAD D A,#30HLC A LL W R DM O V A,34HAN L A,#0FHAD D A,#30HA C A LL W R DM O V A,#0C D H ;对D DR A M地址进行设置C A LL W R CM O V A,#2D H ;-地AS C I I码C A LL W R DM O V A,33H ;显示日AN L A,#0F0HS WAP AAD D A,#30HAC A LL W R DM O V A,33HA N L A,#0FHA D D A,#30HA C A LL W R DAJ M P LO P5R ETW R IT E:;以下全为子程序M O V 50H,#8LO P1: M O V A,BR R C AM O V B,AM O V P1.0,CS ET B P1.1C LR P1.1DJ N Z 50H,LO P1R E T ;写入命令子程序DS1302R E AD: M O V 50H,#8C LR AC LR CLO P2:M O V C,P1.0R R C AS ET B P1.1C LR P1.1DJ N Z 50H,LO P2R E T ;读出数据子程序D S1302W R C:C LR R SC LR RWS ET B EM O V P2,AC LR EC A LLDE LAYR E T ;写入LC D命令地程序W R D: S E T B R SC LR RWS ET B EM O V P2,AC LR EC A LLDE LAYR E T ;写入LC D要显示地数据地D E LAY: M O V R7,#030HLP1:M O V R6,#03HDJ N Z R6,$DJ N Z R7,LP1R E T ;显示数据地延时EN D参考文献:1.《单片机原理及应用教程》(第2版)赵全利肖兴达主编机械工业出版社2008年6月2.《电子设计自动化技术基础》马建国、孟宪元编清华大学出社2004年4月3.《实用电子系统设计基础》姜威 2008年1月4.《单片机系统地PROTEUS设计与仿真》张靖武 2007年4月版权申明本文部分内容,包括文字、图片、以及设计等在网上搜集整理.版权为个人所有This article includes some parts, including text, pictures, and design. Copyright is personal ownership.DJ8T7。

基于单片机的多功能LCD时钟

基于单片机的多功能LCD时钟

基于单片机的多功能LCD时钟
该时钟的设计思路是通过单片机控制液晶显示器,实时更新时间、日期、温度等信息;同时,结合外部输入信号,实现闹钟功能。

首先,该时钟通过单片机内部定时器实现时间的计时。

通过精确定时器,可以实现秒、分、时的显示和更新。

单片机内部具有RTC(Real-
Time Clock)模块,可实现对日期和时间的实时监控。

其次,该时钟通过温度传感器获取环境温度,并通过单片机控制液晶
屏实时显示。

温度传感器可以是热敏电阻、热敏电容等。

另外,该时钟具有闹钟功能,用户可以设置闹钟时间。

当时间到达设
定的闹钟时间时,时钟会发出报警声音,提醒用户。

此外,该时钟还可以显示日历。

通过单片机计算当前日期,并显示在
液晶屏上。

时钟基于单片机的控制,具有灵活性高、功能强大、可靠性较好等优点。

其通过外设接口与用户进行交互,使得用户操作简单、方便。

整个时钟的设计和制作过程分为硬件设计和软件设计两个部分。

其中,硬件设计包括电路原理图设计、PCB布局设计、外设选型等;软件设计则
包括单片机程序设计、液晶显示程序设计、闹钟功能实现等。

总结起来,基于单片机的多功能LCD时钟是一种功能强大的电子时钟,通过单片机控制液晶显示器实现时间、日期和温度的显示和更新,同时结
合闹钟功能,提供给用户全方位的时间与日期信息。

LCD数字时钟word精品文档6页

LCD数字时钟word精品文档6页

; LCD显示时钟,第一行显示设定日期" DATE XXXX-XX-XX " ,第二行显示设定时间" TIME XX-XX-XX " ,开始时两行并列逐字;显示日期和时间,然后定格,时钟继续运行。

祝亚森(0515074240),朱大三(0515074239)RS EQU P3.0 ;写入数据(1)或指令(0)选择端RW EQU P3.1 ;读(1)写(0)控制E EQU P3.2; ;使能LCD EQU P2 ;LCD数据口BF EQU P2.7 ;忙标志YEA1 EQU 30H ;日期储存地址YEA2 EQU 31HMON EQU 32HDAY EQU 33HHOU EQU 34H ;时间储存地址MIN EQU 35HSEC EQU 36HCOUNT EQU 3CB0H ;T0初值COUNT1 EQU 20 ;20*50us=1SSECCOUN EQU 10H ;存放20的地址LEDBUF EQU 40H ;显示数据首地址ORG 0000HLJMP MAINORG 000BH ;T0中断入口LJMP STIME ;调用定时器T0中断服务子程序MAIN: ;装入固定点显示字母或符号SETB PSW.5MOV LEDBUF, #12 ;DMOV LEDBUF+1, #13 ;AMOV LEDBUF+2, #14 ;TMOV LEDBUF+3, #15 ;EMOV LEDBUF+4, #16 ;空格MOV LEDBUF+9, #10 ;-MOV LEDBUF+12,#10 ;-MOV LEDBUF+15,#17 ;TMOV LEDBUF+16,#18 ;IMOV LEDBUF+17,#19 ;MMOV LEDBUF+18,#15 ;EMOV LEDBUF+19,#16 ;空格MOV LEDBUF+20,#16 ;空格MOV LEDBUF+23,#11 ;:MOV LEDBUF+26,#11 ;:MOV LEDBUF+29,#16 ;空格;---------LCD1602初始化-------------------MOV A, #00000001B ;发送清屏操作指令;CALL W_CMD ;调写入指令子程序MOV A, #00001111B ;发送显示开/关控制ACALL W_CMD ;指令,有光标,有闪烁MOV A, #00011100B ;发送光标移动指令ACALL W_CMD ;光标和字一起移动,光标自动右移MOV A, #00111100B ;发送功能设置指令CALL W_CMD ;8位DB,双行,5x7字符MOV DPTR, #TAB ;装入查表地址;---------LCD1602初始化结束---------------------;---------T0定时初始化--------------------------MOV YEA1,#20H ;设置日期初始值MOV YEA2,#08HMOV MON, #10HMOV DAY, #12HMOV HOU,#12H ;设置时间初始值MOV MIN,#59HMOV SEC,#50HMOV TMOD,#01H ;设置T0定时,模式1MOV TH0,#HIGH(COUNT) ;装入高4位初始值MOV TL0,#LOW(COUNT) ;装入低4位初始值SETB EA ;开中断SETB ET0 ;开T0中断允许位SETB TR0 ;开始定时MOV SECCOUN,#COUNT1 ;把数值20放到10H单元中;---------T0定时初始化结束------------------------MOVBUF1: ;日期"年"前两位处理MOV A,YEA1ANL A,#0F0H ;取高四位SW AP A ;高四位和低四位调换MOV LEDBUF+5,A ;把处理的数存放到相应地址中MOV A,YEA1ANL A,#0FH ;取低四位MOV LEDBUF+6,A ;把处理的数存放到相应地址中MOV A,YEA2 ;日期"年"后两位处理ANL A,#0F0HSW AP AMOV LEDBUF+7,AMOV A,YEA2ANL A,#0FHMOV LEDBUF+8,AMOV A,MON ;日期"月"处理ANL A,#0F0HSW AP AMOV LEDBUF+10,AMOV A,MONANL A,#0FHMOV LEDBUF+11,AMOV A,DAY ;日期"日"处理ANL A,#0F0HSW AP AMOV LEDBUF+13,AMOV A,DAYANL A,#0FHMOV LEDBUF+14,AMOV A,HOU ;时间"时"处理ANL A,#0F0HSW AP AMOV LEDBUF+21,AMOV A,HOUANL A,#0FHMOV LEDBUF+22,AMOV A,MIN ;时间"分"处理ANL A,#0F0HSW AP AMOV LEDBUF+24,AMOV A,MINANL A,#0FHMOV LEDBUF+25,AMOV A,SEC ;时间"秒"处理ANL A,#0F0HSW AP AMOV LEDBUF+27,AMOV A,SECANL A,#0FHMOV LEDBUF+28,AJMP2DIS:LCALL DISPLAYLCD ;调用显示子程序SJMP MOVBUF1;-------------定时器T0中断服务子程序----------STIME: MOV TH0,#HIGH(COUNT) ;重新装入高4位初始值MOV TL0,#LOW(COUNT) ;重新装入低4位初始值DJNZ SECCOUN,TIMEEND ;判断是否够1秒(20*50us=1S)MOV SECCOUN,#COUNT1 ;重新装入20PUSH ACC ;堆栈SECCHA: MOV A,SEC ;"秒"处理ADD A,#1 ;秒加1DA A ;十进制调整MOV SEC,ACJNE A,#60H,TIMEEND1 ;判断是否够60秒MOV SEC,#0 ;够60秒后,秒位清0MINCHA: MOV A,MIN ;"分"处理ADD A,#1DA AMOV MIN,ACJNE A,#60H,TIMEEND1MOV MIN,#0HOUCHA: MOV A,HOU ;"时"处理ADD A,#1DA AMOV HOU,ACJNE A,#24H,TIMEEND1MOV HOU,#0DAYCHA: MOV A,DAY ;"日"处理MOV A,#1DA AMOV DAY,ACJNE A,#24H,TIMEEND1MONCHA: MOV A,MON ;"月"处理MOV A,#1DA AMOV MON,ACJNE A,#12H,TIMEEND1YEA2CHA:MOV A,YEA2 ;"年"后两位处理MOV A,#1DA AMOV YEA2,ACJNE A,#99H,TIMEEND1YEA1CHA:MOV A,YEA1 ;"年"前两位处理MOV A,#1DA AMOV YEA1,ACJNE A,#99H,TIMEEND1TIMEEND1:POP ACC ;弹出堆栈TIMEEND:RETI;-------------定时器T0中断服务子程序结束-------------;------------------LCD1602显示子程序------------------DISPLAYLCD:MOV R0, #LEDBUF ;显示首地址MOV R1, #LEDBUF+15MOV R2, #0 ;显示第一个字MOV R3, #10000001B ;发送第一行DDRAM地址设置指令MOV R4, #11000001B ;发送第二行DDRAM地址设置指令LOOP1:MOV A,R3ACALL W_CMDMOV A, @R0MOVC A, @A+DPTR ;查表ACALL W_DA TA ;调用LCD显示字子程序INC R0 ;显示下一个字INC R3MOV A,R4ACALL W_CMDMOV A, @R1MOVC A, @A+DPTR ;查表ACALL W_DA TA ;调用LCD显示字子程序INC R1 ;显示下一个字INC R2 ;下一个数INC R4JNB PSW.5,TGCALL DELAYTG:CJNE R2, #15, LOOP1CLR PSW.5LOOP:MOV A, #00001100B ;发送显示开/关控制ACALL W_CMD ;指令,无光标,无闪烁LJMP EXIT ;跳出LCD1602显示子程序TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 2DH,3AH,44H,41H,54H,45H,20H,54H,49H,4DH W AIT:MOV LCD, #0FFH ;令P2作输入口使用CLR RSSETB RWCLR ENOPSETB EJB BF, WAIT ;判断LCD忙标志RETW_CMD: ;入口参数AACALL WAITMOV LCD, ACLR RSCLR RWSETB ENOPCLR ERETW_DA TA: ;入口参数AACALL WAITMOV LCD, ASETB RSCLR RWSETB ENOPCLR ERETEXIT:RET;------------------LCD1602显示子程序结束------------------ DELAY: MOV R6,#00H ;延时子程序MOV R7,#00HDELAY1: NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETEND图片看不清的可以放大,这个应该会的,不多说。

lcd实时日历时钟报告

lcd实时日历时钟报告

课程设计说明书课程名称:单片机原理及应用设计题目:LCD日历院系:学生姓名:学号:专业班级:2011年3月1日目录摘要 (4)一.设计任务和要求 (4)二.方案论证 (4)三.核心元件的性能 (4)1.AT89C51 (4)1.1 功能特性概括: (5)1.2 管脚说明: (5)2.DS1302 (7)2.1 DS1302引脚功能 (7)2.2 DS1302的控制字 (8)2.3 DS1302的寄存器 (9)2.4 DS1302的数据输入输出 (10)四.理论分析与计算 (12)五.电路与程序设计 (12)1.系统硬件设计 (12)1.1系统总原理图 (12)1.2 主控部分(单片机MCS-51) (12)1.3 计时部分(实时时钟芯片DS1302) (13)1.4 Proteus仿真图 (13)2.系统软件设计 (14)2.1 程序流程图 (13)2.2 程序源代码 (13)六.结果分析 (23)七.设计体会总结 (24)参考文献 (25)摘要此次课程设计的要求是通过LCD与单片机的连接模块能够显示数字(如时间)、字符(如英文)和图形等,这就需要专门的时钟芯片-----DS1302。

DS1302是一种高性能、低功耗、带RAM的实时时钟芯片,它能够对时,分,秒进行精确计时,它与单片机的接口使用同步串行通信,仅用3条线与之相连接,就可以实现MCS-51单片机对其进行读写操作,把读出的时间数据送到LM044L上显示。

程序运行时,必须先对LM044L进行初始设置,然后,通过单片机从DS1302中获取时间并通过LM044L显示。

同时,进行循环赋值,使LCD 动态显示当前的时间。

关键字:AT89C51、DS1302,LM044L显示器一.设计任务和要求1.利用DS1302实现年月日时分秒,并用LCD显示。

2.通过LCD模块与单片机的接口,能显示数字(如时间)、字符(如英文)。

3. 硬件设计部分,根据设计的任务选定合适的单片机,根据控制对象设计接口电路。

万年历与LCD时间显示

万年历与LCD时间显示

> ds1302+LCD1602.rar > 万年历.C/******************************************************************** * 标题: xl 系列单片机实验仪1602 液晶万年历演示程序** 文件: XLLCDWNL.c ** 日期: 2006-1-5 ** 版本: 3.0 (试验通过版)可用xl600-xl1000 单片机综合试验仪试验** 作者: 部分程序参考网上修改而成,本站最终改编测试,特别对原作致敬!* * 邮箱: sxj1974@ ** 网站: ********************************************************************** *日历时钟**按K1,进入设置状态**按k2, 停止闹钟声音**按k3, 依次进入闹钟功能是否启用,闹钟时,分秒,年,月,日及时间时,分,秒的设置,**直到退出设置状态**按k4, 调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字**LCD 第二排中间显示小喇叭,表示启用闹钟功能,无则禁止闹钟功能* 8888*(可在调整状态进行设置)**正常状态,LCD 上排最前面显示自定义字符,LCD 下排最前面闪动"XUELIN" * *设置状态,LCD 上排最前面显示"P", 下排最前面在设置闹钟时间时显示"alarm:", **其它状态显示"time" **年代变化2000--2099, 星期自动转换**程序中有自定义字符写入********************************************************************** * 【版权】Copyright(C) 深圳市学林电子有限公司 ** 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! ** 【技术支持】请访问/bbs/index.asp 官方论坛********************************************************************** #include <reg51.h>#include <intrins.h>unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"}; unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5}; // 星期月参变数unsigned char data dis_buf1[16]; //lcd 上排显示缓冲区unsigned char data dis_buf2[16]; //lcd 下排显示缓冲区unsigned char data year,month,date,week;// 年、月、日、星期unsigned char data armhour,armmin,armsec;// 闹钟时、分、秒unsigned char data hour,min,sec,sec100;// 时、分、秒、百分之一秒unsigned char data flag,vkey,skey;// 设置状态计数标志、按键先前值、按键当前值bit alarm; //标识是否启用闹钟,1--启用,0--关闭sbit rs = P2^0; //LCD 数据/命令选择端(H/L)sbit rw = P2^1; //LCD 读/写选择端(H/L)sbit ep = P2^2; //LCD 使能控制sbit PRE = P1^0; //调整键(k3)sbit SET = P1^1; //调整键(k4)sbit SPK = P2^3;void delayms(unsigned char ms); // 延时程序bit lcd_busy(); //测试LCD 忙碌状态程序void lcd_wcmd(char cmd); //写入指令到LCD 程序void lcd_wdat(char dat); //写入数据到LCD 程序void lcd_pos(char pos); //LCD 数据指针位置程序void lcd_init(); //LCD 初始化设定程序void pro_timedate(); //时间日期处理程序void pro_display(); //显示处理程序void pro_key(); //按键处理程序void time_alarm(); //定时报警功能(闹钟)unsigned char scan_key(); //按键扫描程序unsigned char week_proc(); //星期自动计算与显示函数bit leap_year(); //判断是否为闰年void lcd_sef_chr(); //LCD 自定义字符程序void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s); //更新显示缓冲区函数// 延时程序void delay(unsigned char ms){ while(ms--){ unsigned char i;for(i = 0; i< 250; i++){_nop_(); //执行一条_nop_() 指令为一个机器周期_nop_();_nop_();_nop_();}}}//测试LCD 忙碌状态bit lcd_busy(){bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();_nop_();result =(bit)(P0&amt;0x80); //LCD 的D0--D7 中,D7=1 为忙碌,D7=0 为空闲ep = 0;return result;}//写入指令到LCDvoid lcd_wcmd(char cmd)while(lcd_busy()); //当lcd_busy 为1 时,再次检测LCD 忙碌状态,lcd-busy 为0 时,开始写指令rs = 0;rw = 0;ep = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}//写入数据到LCDvoid lcd_wdat(char dat){while(lcd_busy()); //当lcd_busy 为1 时,再次检测LCD 忙碌状态,lcd-busy 为0 时,开始写数据rs = 1;rw = 0;ep = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}//LCD 数据指针位置程序void lcd_pos(char pos){lcd_wcmd(pos|0x80); // 数据指针=80+ 地址码(00H~27H,40H~67H)}//设定二个自定义字符,(注意:LCD1602 中自定义字符的地址为0x00--0x07, 即可定义8 个字符)//这里我们设定把一个自定义字符放在0x00 位置(000),另一个放在0x01 位子(001)void lcd_sef_chr(){ //第一个自定义字符lcd_wcmd(0x40);lcd_wdat(0x1f);lcd_wcmd(0x41); //"01 000 001" 第2 行地址lcd_wdat(0x11); //"XXX 10001" 第2 行数据lcd_wcmd(0x42); //"01 000 010" 第3 行地址lcd_wdat(0x15); //"XXX 10101" 第3 行数据lcd_wcmd(0x43); //"01 000 011" 第4 行地址lcd_wdat(0x11); //"XXX 10001" 第4 行数据lcd_wcmd(0x44); //"01 000 100" 第5 行地址lcd_wdat(0x1f); //"XXX 11111" 第5 行数据lcd_wcmd(0x45); //"01 000 101" 第6 行地址lcd_wdat(0x0a); //"XXX 01010" 第6 行数据lcd_wcmd(0x46); //"01 000 110" 第7 行地址lcd_wdat(0x1f); //"XXX 11111" 第7 行数据lcd_wcmd(0x47); //"01 000 111" 第8 行地址lcd_wdat(0x00); //"XXX 00000" 第8 行数据//第二个自定义字符lcd_wcmd(0x48); //"01 001 000" 第1 行地址lcd_wdat(0x01); //"XXX 00001" 第1 行数据lcd_wcmd(0x49); //"01 001 001" 第2 行地址lcd_wdat(0x1b); //"XXX 11011" 第2 行数据lcd_wcmd(0x4a); //"01 001 010" 第3 行地址lcd_wdat(0x1d); //"XXX 11101" 第3 行数据lcd_wcmd(0x4b); //"01 001 011" 第4 行地址lcd_wdat(0x19); //"XXX 11001" 第4 行数据lcd_wcmd(0x4c); //"01 001 100" 第5 行地址lcd_wdat(0x1d); //"XXX 11101" 第5 行数据lcd_wcmd(0x4d); //"01 001 101" 第6 行地址lcd_wdat(0x1b); //"XXX 11011" 第6 行数据lcd_wcmd(0x4e); //"01 001 110" 第7 行地址lcd_wdat(0x01); //"XXX 00001" 第7 行数据lcd_wcmd(0x4f);//"01 001 111" 第8 行地址lcd_wdat(0x00); //"XXX 00000" 第8 行数据}//LCD 初始化设定void lcd_init(){lcd_wcmd(0x38); //设置LCD 为16X2 显示,5X7 点阵,八位数据借口delay(1);lcd_wcmd(0x0c); //LCD 开显示及光标设置(光标不闪烁,不显示"-")delay(1);lcd_wcmd(0x06); //LCD 显示光标移动设置(光标地址指针加1,整屏显示不移动) delay(1);lcd_wcmd(0x01); //清除LCD 的显示内容delay(1);}//闰年的计算bit leap_year(){bit leap;if((year>4==0&amt;&amt;year>100!=0)||year>400==0)// 闰年的条件leap=1;elseleap=0;return leap;}//星期的自动运算和处理unsigned char week_proc(){ unsigned char num_leap;unsigned char c;num_leap=year/4-year/100+year/400;// 自00 年起到year 所经历的闰年数if( leap_year()&amt;&amt; month<=2 ) //既是闰年且是1 月和2 月c=5;elsec=6;week=(year+para_month[month]+date+num_leap+c)>7;// 计算对应的星期return week;}//更新显示缓冲区void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s){ dis_buf1[0]=t1; //dis_buf1[1]=0x20; //空格dis_buf1[2]=50; //'2'dis_buf1[3]=48; //'0'dis_buf1[4]=year/10+48;dis_buf1[5]=year>10+48;dis_buf1[6]=0x2d;dis_buf1[7]=month/10+48;dis_buf1[8]=month>10+48;dis_buf1[9]=0x2d; //'-'dis_buf1[10]=date/10+48;dis_buf1[11]=date>10+48;dis_buf1[12]=0x20;dis_buf1[13]=dis_week[4*week];dis_buf1[14]=dis_week[4*week+1];dis_buf1[15]=dis_week[4*week+2];dis_buf2[0]=t2[0];dis_buf2[1]=t2[1];dis_buf2[2]=t2[2];dis_buf2[3]=t2[3];dis_buf2[4]=t2[4];dis_buf2[5]=t2[5];dis_buf2[6]=0x20; //空格if (alarm)dis_buf2[7]=0x01; //alarm=1,显示闹钟启用标致(第二个自定义字符)elsedis_buf2[7]=0x20; //alarm=0,不显示闹钟启用标致dis_buf2[8]=dis_h/10+48;dis_buf2[9]=dis_h>10+48;dis_buf2[10]=0x3a; //':'dis_buf2[11]=dis_m/10+48;dis_buf2[12]=dis_m>10+48;dis_buf2[13]=0x3a;dis_buf2[14]=dis_s/10+48;dis_buf2[15]=dis_s>10+48;}//时间和日期处理程序void pro_timedate(){sec++;if(sec > 59){sec = 0;min++;if(min>59){min=0;hour++;if(hour>23){hour=0;date++;if(month==1||month==3||month==5||month==7||month==8||month==10||month== 12)if (date>31) {date=1;month++;} //大月31 天if (month==4||month==6||month==9||month==11)if (date>30) {date=1;month++;} //小月30 天if (month==2){if( leap_year()) //闰年的条件{if (date>29) {date=1;month++;}} //闰年2 月为29 天else{if (date>28) {date=1;month++;}} //平年2 月为28 天}if (month>12) {month=1;year++;}if (year>99) year=0;}}}week_proc();if (sec==armsec &amt;&amt; min==armmin &amt;&amt; hour==armhour) {if (alarm)TR1=1; //闹钟启用时,报警时间到,启动Timer1}}//显示处理程序void pro_display(){ unsigned char i;lcd_pos(0x00);for (i=0;i<=15;i++){lcd_wdat(dis_buf1[i]);}lcd_pos(0x40);for (i=0;i<=15;i++){lcd_wdat(dis_buf2[i]);}}//Timer0 中断处理程序,秒的产生void timer0() interrupt 1{TH0=0xdc; //Timer0 置10ms 定时初值dc00H(2^16=65536D,dc00H=56320D)TL0=0x00; //定时时间=(65536-56320)*(1/11.0592)*12=10ms (f0=11.0592Mhz) sec100++;if(sec100 >= 100) //1 秒时间(100*10ms=1000ms=1s){sec100 = 0;pro_timedate();// 调用时间和日期处理程序}if (sec&amt;0x01) //"XUELIN" 闪一秒,停一秒update_disbuf(0x00," ",hour,min,sec); //0x00 表示显示00 位置的自定义字符elseupdate_disbuf(0x00,"XUELIN",hour,min,sec);pro_display(); //调用显示处理函数}//按键扫描程序unsigned char scan_key(){skey=0x00; //给变量vkey 置初值skey|=PRE; //读取PRE 键的状态skey=skey<<1; //将PRE 键的状态存于skey 的B1 位skey|=SET; //读取SET 键的状态,并存于skey 的B0 位return skey; //返回skey 的键值(即PRE,SET 的状态)}//外部中断INT0 中断处理程序void int0() interrupt 0{TR0=0; //禁止Timer0IE=0; //禁止中断lcd_wcmd(0x0e); //显示光标"_", 整个光标不闪烁alarm=1;update_disbuf(0x50,"alarm:",armhour,armmin,armsec); // 更新显示数据,0x50 表示要显示"P"pro_display(); //调用显示处理程序lcd_pos(0x47); //使光标位于第一个调整项下flag=0;vkey=0x03;while(flag^0x0a){skey = scan_key(); //扫描按键状态if (skey^vkey) //若skey 与vkey 相同,跳出循环,相异执行循环体{ delay(10); //去按键抖动skey = scan_key(); //转回扫描按键状态if (skey^vkey) //若skey 与vkey 相同,跳出循环,相异执行循环体{ vkey=skey; //将skey 的值付给vkeyif (skey==0x01) //PRE 键按下{ flag++; //调整标志位加1switch (flag) //将光标置于相应调整位置{case 1: lcd_pos(0x49);break; //光标置小时报警设置位置case 2: lcd_pos(0x4c);break; // 光标置分钟报警设置位置case 3: lcd_pos(0x4f);break; // 光标置秒时报警设置位置case 4: update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x05);break; // 光标置年调整位置case 5: lcd_pos(0x08);break; // 光标置月调整位置case 6: lcd_pos(0x0b);break; // 光标置日调整位置case 7: lcd_pos(0x49);break; //光标置时调整位置case 8: lcd_pos(0x4c);break; // 光标置分调整位置case 9: lcd_pos(0x4f);break; // 光标置秒调整位置default:break;}}if (skey==0x02) //SET 键按下{ pro_key(); //转设置按键处理程序}}} }lcd_wcmd(0x0c); //设置LCD 开显示及光标不闪烁,不显示"-"lcd_wcmd(0x01);IE=0x8f;TR0=1;//清除LCD 的显示内容//CPU 开中断,INT0,INT1, 开中断//Timer0 启动}//主程序,初始化及初值设定void main(){lcd_init(); //初始化LCDlcd_sef_chr(); //写入自定义字符号hour=0;min=0;sec=0; //开机时的时,分,秒显示armhour=0;armmin=0;armsec=0; //开机时的时,分,秒报警初值year= 5; month=1;date=1; //开机时的年,月,日,星期显示week_proc();alarm=1; //初始开机,启用闹钟IE = 0x8f; //CPU 开中断,INT0,INT1,Timer0,Timer1 开中断IP = 0x04; //设置INT0 为中断最高优先级IT0=0;IT1=0; //外部INT0,INT1 设置为电平触发方式(注意,触发不要选边沿方式,)TMOD = 0x11; //Timer0,Timer1 工作于模式1, 16 位定时方式TH0 = 0xdc;TL0 = 0x00; //Timer0 置10ms 定时初值TH1 = 0xff;TL1 = 0x00; //Timer1 置初值TR0 = 1; //Timer0 启动TR1 = 0;while(1);}//设置按键处理程序void pro_key(){switch (flag){case 0:alarm=!alarm; //启用或关闭闹钟(alarm=1: 启用,alarm=0: 关闭)update_disbuf(0x50,"alarm:",armhour,armmin,armsec); // 更新显示数据pro_display(); //调用显示处理lcd_pos(0x47);break; //光标回到原调整位置case 1:armhour++;if (armhour>23) armhour=0;update_disbuf(0x50,"alarm:",armhour,armmin,armsec); // 更新显示数据pro_display(); //调用显示处理lcd_pos(0x49);break; //光标回到原调整位置if (armmin>59) armmin=0;update_disbuf(0x50,"alarm:",armhour,armmin,armsec);pro_display();lcd_pos(0x4c);break;case 3:armsec++;if (armsec>59) armsec=0;update_disbuf(0x50,"alarm:",armhour,armmin,armsec);pro_display();lcd_pos(0x4f);break;case 4:year++;if (year> 99) year= 0;week_proc(); //星期自动运算update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x05);break;case 5:month++;if (month>12) month=1;week_proc(); //星期自动运算update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x08);break;case 6:date++;if(month==1||month==3||month==5||month==7||month==8||month==10||month== 12)if (date>31) date=1; //大月31 天if (month==4||month==6||month==9||month==11)if (date>30) date=1; //小月30 天if (month==2){if(leap_year()) //闰年的条件{if (date>29) date=1;} //闰年2 月为29 天else{if (date>28) date=1;}} //平年2 月为28 天week_proc(); //星期自动运算update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x0b);break;if (hour>23) hour=0;update_disbuf(0x50,"time: ",hour,min,sec); pro_display();lcd_pos(0x49);break;case 8:min++;if (min>59) min=0;update_disbuf(0x50,"time: ",hour,min,sec); pro_display();lcd_pos(0x4c);break;case 9:sec++;if (sec>59) sec=0;update_disbuf(0x50,"time: ",hour,min,sec); pro_display();lcd_pos(0x4f);break;default: break ;}}//Timer1 中断处理程序,产生报警的声音void timer1() interrupt 3{TH1=0xff;TL1=0x00;SPK=~SPK;}//外部中断INT1 中断处理程序,停止报警声音void int1() interrupt 2{if(TR1)TR1=0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计说明书课程名称:单片机原理及应用设计题目:LCD日历院系:学生姓名:学号:专业班级:2011年3月1日目录摘要 (4)一.设计任务和要求 (4)二.方案论证 (4)三.核心元件的性能 (4)1.AT89C51 (4)1.1 功能特性概括: (5)1.2 管脚说明: (5)2.DS1302 (7)2.1 DS1302引脚功能 (7)2.2 DS1302的控制字 (8)2.3 DS1302的寄存器 (9)2.4 DS1302的数据输入输出 (10)四.理论分析与计算 (12)五.电路与程序设计 (12)1.系统硬件设计 (12)1.1系统总原理图 (12)1.2 主控部分(单片机MCS-51) (12)1.3 计时部分(实时时钟芯片DS1302) (13)1.4 Proteus仿真图 (13)2.系统软件设计 (14)2.1 程序流程图 (13)2.2 程序源代码 (13)六.结果分析 (23)七.设计体会总结 (24)参考文献 (25)摘要此次课程设计的要求是通过LCD与单片机的连接模块能够显示数字(如时间)、字符(如英文)和图形等,这就需要专门的时钟芯片-----DS1302。

DS1302是一种高性能、低功耗、带RAM的实时时钟芯片,它能够对时,分,秒进行精确计时,它与单片机的接口使用同步串行通信,仅用3条线与之相连接,就可以实现MCS-51单片机对其进行读写操作,把读出的时间数据送到LM044L上显示。

程序运行时,必须先对LM044L进行初始设置,然后,通过单片机从DS1302中获取时间并通过LM044L显示。

同时,进行循环赋值,使LCD 动态显示当前的时间。

关键字:AT89C51、DS1302,LM044L显示器一.设计任务和要求1.利用DS1302实现年月日时分秒,并用LCD显示。

2.通过LCD模块与单片机的接口,能显示数字(如时间)、字符(如英文)。

3. 硬件设计部分,根据设计的任务选定合适的单片机,根据控制对象设计接口电路。

设计的单元电路必须有工作原理,器件的作用,分析和计算过程;4. 软件设计部分,根据电路工作过程,画出软件流程图,根据流程图编写相应的程序,进行调试并打印程序清单;5.原理图设计部分,根据所确定的设计电路,利用Protel工具软件绘制电路原理图,提供元器件清单。

6计算说明书部分包括方案论证报告打印版或手写版,程序流程图具体程序等7. 图纸部分包括具体电路原理图打印版8. 设计要求还包括利用一天时间进行资料查阅与学习讨论,利用5天时间在实验室进行分散设计,最后三天编写报告。

最后一天进行成果验收。

二.方案论证实现数字电子钟的设计有以下两种基本方案,现就两种基本方案的优劣进行具体论证,从而说明选择方案二的理由。

方案一:直接用单片机的内部定时器来实现时间。

该方案以MCS-51单片机为主控芯片,以MCS-51的内部定时器产生的1s中断作为时钟的驱动,然后再通LCD液晶显示器来组成数字钟电路。

但是此方案最大的缺点在于单片机89C51产生的1s中断存在误差,如果工作时间长的话,数字时钟显示的时间将会出现严重的偏差,不够精确。

方案二:使用串行接口时钟芯片DS1302设计时钟电路。

该设计方案以MCS-51单片机为主控芯片,以串行时钟芯片DS1302为核心计时芯片,然后再通过一个LCD液晶显示器组成数字时钟电路。

更重要的是,DS1302时钟芯片的加入大大提高了数字钟时间的准确性,而且该电路在断电后不丢失时间和数据信息时也使得该方案的研究与提升更具有开发的意义。

三.核心芯片功能介绍1.AT89C52AT89S52[3]美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含4K BytesISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及AT89C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元。

单片机AT89S51强大的功能可为许多嵌入式控制应用系统提供高性价比的解决方案。

AT89C51芯片的引脚结构如图1所示:1.1 功能特性概括:AT89S51提供以下标准功能:40个引脚、4K Bytes Flash片内程序存储器、128 Bytes的随机存取数据存储器(RAM)、32个外部双向输入/输出(I/O)口、5个中断优先级2层中断嵌套中断、2个数据指针、2个16位可编程定时/计数器、2个全双工串行通信口、看门狗(WDT)电路、片内振荡器及时钟电路。

此外,AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。

空闲模式下,图1 AT89C51引脚图CPU暂停工作,而RAM、定时/计数器、串行通信口、外中断系统可继续工作。

掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。

同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。

1.2 管脚说明:P0口:P0口为一个8位漏级开路双向I/O口,也即地址/数据总线复用口。

作为输出口用时,能驱动8个TTL逻辑门电路。

对端口写“1”时,被定义为高阻输入。

在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。

在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。

P1口:P1口是一个带内部上拉电阻的8位双向I/O口,P1口的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。

对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。

作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(I)。

IL在Flash编程和程序校验期间,P1接收低8位地址。

部分端口还有第二功能,如表1所示:表1 P1口部分引脚第二功能P2口:P2口是一个带有内部上拉电阻的8位双向I/O口, P2口的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。

对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。

作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时)。

会输出一个电流(IIL在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。

在访问8位地址的外部数据寄存器(例如执行MOVX@Ri指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期间不改变。

在Flash编程或校验时,P2亦接收高位地址和其它控制信号。

P3口: P3口是一个带有内部上拉电阻的双向8位I/O口, P3口的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。

对P3口写“1”时,它们被内部的上拉电阻拉高并可作)。

为输入端口。

作输入口使用时,被外部信号拉低的P3口将用上拉电阻输出电流(IIL P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如表2所示:P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。

表2 P3口引脚第二功能RST:复位输入。

当振荡器工作时,RST引脚出现两个机器周期以上的高电平时间将使单片机复位。

WDT溢出将使该引脚输出高电平,设置SFR AUXR的DISRTO位(地址8EH)可打开或关闭该功能。

DISRTO位缺省为RESET输出高电平打开状态。

ALE/PROG:当访问外部存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。

即使不访问外部寄存器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。

值得注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。

对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。

如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。

该位置位后,只要一条MOVX和MOVC指令才会激活ALE。

此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。

PSEN:程序存储允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。

当访问外部数据存储器时,没有两次有效的PSEN信号。

EA/VPP:外部访问允许。

欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA 端必须保持低电平(接地)。

需要注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。

如EA端保持高电平(接VCC端),CPU则执行内部程序存储器中的指令。

Flash存储器编程期间,该引脚用于施加+12V编程电压(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入端。

XTAL2:反向振荡放大器器的输出端。

2.DS1302DS1302[1]是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。

时钟可工作在24小时格式或12小时(AM/PM)格式。

DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。

可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

2.1 DS1302引脚功能DS1302的引脚功能如表3所示,管脚图如图2所示表3 DS1302引脚功能表CR图2 DS1302管脚图通过把RST输入驱动置高电平来启动所有的数据传送。

RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供了终止单字节或多字节数据的传送手段。

当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。

如果在传送过程中置RST为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态。

上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。

只有在SCLK为低电平时,才能将RST置为高电平。

2.2DS1302的控制字DS1302的控制字节如图3所示:图3控制字节如图控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

相关文档
最新文档