基于51单片机定时器的的电子时钟
时间:09-14
来源:互联网
点击:
1、可以显示星期和时间的电子1602液晶电子时钟
2、但没有调整时间的子程序,谁会调整时间的子程序,可以完善。
3. 液晶的端口大家可按你自己的电路随便修改就在程序的上部
4. 此程序在51hei单片机开发板上测试成功全部的代码及头文件
下载地址:http://www.51hei.com/ziliao/51hei-5/电子时钟+1602液晶.rar
#include reg52.h>#include "51hei.h"#define uchar unsigned charsbit RW=P2^7;sbit RS=P3^5;sbit E=P3^4;sbit duan=P2^6;bit at=0;//sbit busy_bit=P1^7;uchar code shen[]={"I love you!!"};uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,
0x39,0x3a,0x20,0x2d,0x00,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07};uchar code ri[]={0x1f,0x19,0x19,0x1f,0x19,0x19,0x1f,0x00}; //自定义符号 :周日 uchar code yi[]={0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00};/*自定义符号:周一 */ uchar code er[]={0x00,0x00,0x0e,0x00,0x1f,0x00,0x00,0x00};/*自定义符号: 周二2*/ uchar code san[]={0x00,0x1f,0x00,0x0e,0x00,0x1f,0x00,0x00};/*自定义符号: 周三2*/ uchar code si[]={0x00,0x1f,0x1a,0x1a,0x11,0x11,0x00,0x00}; //自定义符号 :周四 uchar code wu[]={0x00,0x1f,0x08,0x1f,0x09,0x1f,0x00,0x00}; //自定义符号 :周五 uchar code liu[]={0x08,0x04,0x1f,0x0a,0x11,0x10,0x00,0x00}; //自定义符号 :周五 uchar dispbuf[10],ri1,h,m,s,counter;void delay(){uchar i;for(i=0;i255;i++);}/*******写命令**********/void lcd_wmc(uchar i){P0=i;RS=0;RW=0;E=0;delay();E=1;}/*******写数据***********/void lcd_wmd(uchar i){P0=i;RS=1;RW=0;E=0;delay();E=1;}/*******初始化液晶*******/void lcd_init(){uchar i;lcd_wmc(0x01);lcd_wmc(0x38); //功能设置指令-5 显示模式设置:16×2显示,5×7点阵,
8位数据接口lcd_wmc(0x0c); // 显示开关控制指令 0x0c--显示功能开无光标,即光标不闪烁。
00x0f--显示功能开,有光标并闪烁lcd_wmc(0x06); //显示模式设置:光标右移,字符不移 输入模式设置指令 -3 lcd_wmc(0x82); // 0xc9 =0x80 | 0x49 设置DDRAM地址指令--8
PPt第8 ox82=0x80|0x02 for(i=0;i12;i++)lcd_wmd(shen[i]); //显示 I love you !! 字符串 lcd_wmc(0xc0);}/*******更新缓冲区子程序*******/void newbuf(){dispbuf[0]=s%10;dispbuf[1]=s/10;dispbuf[3]=m%10;dispbuf[4]=m/10;dispbuf[6]=h%10;dispbuf[7]=h/10;dispbuf[9]=ri+13;}/*******显示子程序**********/void disp(uchar dispadd){uchar tmp; //定义 一个uchar 变量 lcd_wmc(dispadd); // 调用 写指令 函数 把DDRAM 地址 指令写进tmp=dispbuf[9]; //星期 //以下同理 tmp=word[tmp];lcd_wmd(tmp);tmp=dispbuf[8];tmp=word[tmp]; lcd_wmd(tmp);tmp=dispbuf[7]; //第2行 把值赋给 tmp tmp=word[tmp]; //把要显示的 数 给tmp lcd_wmd(tmp); //写数据 函数 把要显示的数字 显示在显示屏上 tmp=dispbuf[6]; //以下同理 tmp=word[tmp];lcd_wmd(tmp);tmp=dispbuf[5];tmp=word[tmp]; lcd_wmd(tmp);tmp=dispbuf[4];tmp=word[tmp];lcd_wmd(tmp); //分钟 tmp=dispbuf[3];tmp=word[tmp]; lcd_wmd(tmp);tmp=dispbuf[2]; //显示 是两个点 在闪烁 tmp=word[tmp];lcd_wmd(tmp);tmp=dispbuf[1];tmp=word[tmp]; //秒 lcd_wmd(tmp);tmp=dispbuf[0];tmp=word[tmp];lcd_wmd(tmp); }/*********************初始化子程序**********************/void init(){TMOD=0x01;TH0=0x4c;TL0=0x00;EA=1;ET0=1;TR0=1;counter=0;h=23;m=59;s=0;ri1=6;dispbuf[2]=10;dispbuf[5]=10;dispbuf[8]=12;}/***************************主程序************************/void main(void){ guanled();guandz();init();lcd_init();while(1){if(!at){//闪烁if(counter10) {dispbuf[2]=10;dispbuf[5]=10;}else{ dispbuf[2]=11;dispbuf[5]=11;}//更新显示缓冲区及调用显示程序if(counter==0){newbuf();disp(0xc4);}else if(counter==10)disp(0xc4); }}}/*************************定时器0的中断**********************/void Time0() interrupt 1 using 2 //再次强调中断子程序执行时间越短越好{TH0=(65536-46075)/256;TL0=(65536-46075)%256;counter++;if(counter==20){s++;counter=0;if(s==60){ m++;s=0;if(m==60){h++;m=0;if(h==24)h=0;ri1++;if(ri1==7){ ri1=0;}}}}}
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)