基于LCD1602的数字钟程序设计(C语言)

合集下载

C语言Lcd1602万年历闹钟Proteus仿真单片机毕业课程电子设计

C语言Lcd1602万年历闹钟Proteus仿真单片机毕业课程电子设计

C语言Lcd1602万年历闹钟Proteus仿真单片机毕业课程电子设计
C语言Lcd1602万年历闹钟Proteus仿真单片机设计
AT89C51+Lcd1602+DS1302+独立按键+蜂鸣器
Lcd1602万年历闹钟。

时间信息来自DS1302,显示采用
Lcd1602,蜂鸣器提供闹音和按键提示音。

液晶上面显示年月日时分秒星期以及闹钟时间。

有时间调节和闹钟调节,可以调节年月日时分秒星期信息以及闹钟时间。

具体介绍如下。

1.做好的仿真图,如下图所示。

2.启动仿真后,先在液晶屏显示系统信息,然后在第二屏显示需要的万年历闹钟信息。

如下图所示!
3.通过单片机右侧的三个按键,即可设置闹钟。

如下图所示。

4.通过单片机左侧的四个按键,来设置年月日时分秒星期的值。

设置时,参数闪烁,同时会有按键提示音。

5.本设计默认套餐1,具体套餐详情请看下面的发货清单。

如需要其它套餐,请联系客服询问。

详情请:点击此处。

基于51单片机的1602液晶显示温度和时间的C程序

基于51单片机的1602液晶显示温度和时间的C程序

//液晶显示温度#include "AT89X52.H"#define Ddata P0sbit RS=P2^7; //命令数据控制端sbit RW=P2^6; //读写选择端sbit LCDE=P2^5; //液晶使能端sbit DQ=P2^0; //ds18b20与单片机连接口#define uchar unsigned char#define uint unsigned intunsigned char hour=0,min=0,sec=0; //定义初值unsigned int count=0;unsigned char line1[16]={" temp: "}; //16个字符unsigned char line2[16]={" time: 00:00:00"}; //16个字符unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组uchar data disdata[5];uint tvalue; //温度值uchar tflag; //温度正负标志void time();/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);}void delay5ms()//延时5毫秒(不够精确的){unsigned int i;for (i=0;i<1000;i++);}void delay50us(){register int i;for (i=0;i<20;i++);}void delay(){unsigned char m,n;for(m=255;m>0;m--)for(n=255;n>0;n--);}void wr_com(unsigned char comm) //********写控制字符程序E=1 RS=0RW=0 **********//{LCDE=0; //使能端RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

1602LCD显示的秒表 C语言程序

1602LCD显示的秒表 C语言程序

源程序代码://名称:用1602LCD设计的秒表//说明:首先按下K1键时开始计时,自此按下时暂停,第三次按下时继续累积计时,再次按下时停止计时,K2键用于清零秒表。

//#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define delayNOP ( ) ﹛_nop_( ); _nop_( ); _nop_( ); _nop_( );﹜//LCD控制函数void LCD_Initialize( );void LCD_Set_POS(uchar);void LCD_Write_Date(uchar);void Display_String(uchar﹡,uchar);sbit K1 = P1^0;sbit K2 = P1^1;sbit BEEP = P3^0;sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;uchar KeyCount = 0;uchar code msg1[] = ﹛〞Second Watch 0 〞﹜;uchar code msg2[] = ﹛〞>>>> 0 〞﹜;uchar code Prompts[] [16] ={﹛〞:: 1- - - - > 〞﹜,﹛〞:: 1- - - - > ::2 〞﹜,﹛〞:: 1 - >2 ::3- - > 〞﹜,﹛〞:: 1 - >2 ::3- - >4 〞﹜};// 计时缓冲与显示缓冲uchar Time_Buffer[] ={0,0,0,0};uchar LCD_Display_Buffer[]={〞00: 00: 00:00〞}; //// 蜂鸣器//void Beep ()﹛uchar i,j = 70;for (i = 0;i< 180;i++ )﹛while(--j);BEEP = ~BEEP;﹜BEEP = 0;﹜//// 延时//void DelayX(uint ms){uchar i;while(ms--) for (i= 0;i< 120;i++);﹜//// 显示计时//void Show_Second( ){uchar i;LCD_Set_POS(0x45); //设置LCD显示起点for(i = 3;i != 0xff ;i--);{//将两位整数的1/100s,秒,分,时转换为8位数字字符LCD_Display_Buffer[2﹡i+1] = Time_Buffer[i] / 10 + ˊ0 ˊ;LCD_Display_Buffer[2﹡i] = Time_Buffer[i] % 10 + ˊ0 ˊ;//在 = 3,2,1,0时分别显示时,分,秒,1/100sLCD_Writer_Date(LCD_Display_Buffer[2﹡i+1])LCD_Writer_Date(LCD_Display_Buffer[2﹡i])LCD_Writer_Date(ˊ: ˊ)}}//// Time0中断//Void Time0( ) interrupt 1 using 0{THO = -10000 / 256;TLO = -10000 % 256;Time_Buffer[0] ++if(Time_Buffer[0] == 100){Time_Buffer[0] = 0; Time_Buffer[1]++;}if(Time_Buffer[1] == 60) //秒{Time_Buffer[1] = 0; Time_Buffer[2]++;}if(Time_Buffer[2] == 60) //分{Time_Buffer[2] = 0; Time_Buffer[3]++;}if(Time_Buffer[3] == 24) //时Time_Buffer[3] = 0;}////主函数//void main( ){uchar i;IE = 0x82;TMOD = 0x01;THO = -10000 / 256;TLO = -10000 % 256;LCD_Initialize( );Display_String(msg1,0x00);Display_String(msg2,0x40);While(1){if(k1 == 0){DelayX(100);i = ++KeyCount;switch (i){case 1:case 3: TRO = 1;Display_String(Prompts[i-1],0);Break;case 2:case 4: TRO = 0;Display_String(Prompts[i-1],0);break;default:TRO = 0;break;}While (K1 == 0); // 等待释放K1键Beep( );}elseif(K2 == 0){TRO = 0;KeyCount = 0;for(i = 0;i < 4; i++)Time_Buffer [i] = 0; // 清零计数缓冲Display_String(msg1,0);Beep( );DelayX(100);while (K2 == 0); // 等待释放K2键}Show_Second( );}}//// 1602LCD显示驱动函数//#include 〈reg51.h〉#include 〈intrins.h〉#define uchar unsigned char#define uint unsigned int#define DellayNOP( )﹛_nop_( ); _nop_( ); _nop_( ); _nop_( );﹜sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;bit LCD_Busy_Check( );void LCD_Initialize( );void LCD_Set_POS(uchar);void LCD_Write_Command(uchar);void LCD_Write_ Date(uchar);//// 延时//void DelayMS(uint ms){uchar t;while(ms--) for (t =0;t < 120;t++);}//// LCD忙检查//bit LCD_Busy_Check( );{bit Rsult;LCD_RS = 0; LCD_RW = 1; LCD_EN = 1;DelayNOP( );Result = (bit)(p0 ﹠ 0x80);LCD_EN = 0return Result;}//// 向LCD写指令//void LCD_Write_Command(uchar cmd);{while(LCD_Busy_Check() );LCD_RS = 0; LCD_RW = 0; LCD_EN = 0;_nop_( ); _nop_( );pO = cmd; DelayNOP( );LCD_EN = 1;DelayNOP( );LCD_EN = 0;}//// 向LCD写数据//void LCD_Write_Date(uchar str);{while(LCD_Busy_Check() );LCD_RS = 1; LCD_RW = 0; LCD_EN = 0;pO = str; DelayNOP( ); LCD_EN = 1;DelayNOP( );LCD_EN = 0;}//// 初始化LCD//void LCD_Initialize( );{DelayMS(5); LCD_Write_Command(0x38);DelayMS(5); LCD_Write_Command(0x0c);DelayMS(5); LCD_Write_Command(0x06);DelayMS(5); LCD_Write_Command(0x01);DelayMS(5);}//// 设置显示位置//void LCD_Set_POS(uchar Poition){LCD_Write_Command(Position ︱ 0x80);}////显示函数,在LCD指定行上显示字符串//void Display_String(uchar﹡str,uchar LineNO) {uchar k;LCD_Set_POS(LineNO);for (k = 0;k < 16;k++) LCD_Write_Date(str[k]) }。

51单片机c语言编写的1602液晶显示闹钟

51单片机c语言编写的1602液晶显示闹钟

#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]=" 2012-08-17 MON"; //设定开始显示的时间uchar code table1[]=" 12:30:00";uchar code table2[7][3]= {{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}};//定义二维字符数组sbit wr=P3^6; // 1602液晶的读/写端sbit dula=P2^6; // 数码管段选sbit wela=P2^7; // 数码管位选sbit lcden=P3^4; // 1602液晶使能端sbit lcdrs=P3^5; // 1602液晶命令/数据端sbit key1=P3^0; // 声明s4按键sbit key2=P3^1; // 声明s8按键sbit key3=P3^2; // 声明s12按键sbit key4=P3^3; // 声明s16按键sbit beep=P2^3; // 声明蜂鸣器sbit rd=P3^7; // 声明4个按键的公共端uchar num1,shi=12,fen=30,miao,yue=8,ri=17,shi1,fen1,miao1,keynum1,week; //定义时分秒变量uint nian=2012; //定义年变量void delayms(uint x){uint i,j;for(i=x;i>0;i--) //定义带参数延时函数for(j=110;j>0;j--);}void write_com(uchar com) //1602液晶写指令函数{ wr=0;lcdrs=0;P0=com;delayms(1);lcden=1;delayms(1);lcden=0;}void write_date(uchar date) //1602液晶写数据函数{ wr=0;lcdrs=1;P0=date;delayms(1);lcden=1;delayms(1);lcden=0;}void write_addate1(uchar add,uint date) //定义显示年的函数{ uint qian;uchar bai,shi,ge;qian=date/1000;bai=date%1000/100;shi=date%1000%100/10;ge=date%10;write_com(add+0x80);write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge);}void write_addate2(uchar add,uchar date) //定义显示月、日、时、分、秒函数{uchar shi,ge;shi=date/10;ge=date%10;write_com(add+0x80);write_date(0x30+shi);write_date(0x30+ge);}void write_rq(uchar i) //定义显示星期的函数{ uchar x;for(x=0;x<3;x++){ write_date(table2[i][x]);delayms(1);}}void init () //定义初始化函数{dula=0; // 关闭数码管段、位选端wela=0;TMOD=0x01; // 定时器0工作方式为16位TH0=(65536-45872)/256; // 装初值TL0=(65536-45872)%256;EA=1; // 开总中断ET0=1; // 开定时器0中断write_com(0x38); // 设置16*2显示,5*7点阵,8位数据口write_com(0x06); // 写一个字符后地址指针加1write_com(0x0c); // 设置开显示,不显示光标write_com(0x01); // 显示清0,数据清0write_com(0x80); // 使指针指向第1行第1列}void keyscan() // 定义按键函数{uchar keynum;rd=0; //4个按键公共端为低电平if(key1==0) //s4按键被按下{ delayms(3); //去抖延时if(key1==0) //确认s4按键被按下,进入调时间模式{keynum++;while(!key1); //松手检测}if(keynum==1) //s4按下一次{ TR0=0; //关闭定时器0write_com(0x81); //指针指向第1行2列write_com(0x0f); //开启光标显示,光标闪烁}if(keynum==2){write_com(0x86); //光标跳到月份}if(keynum==3){write_com(0x89); //光标跳到日}if(keynum==4){write_com(0x8c); //光标跳到星期}if(keynum==5){write_com(0xc4); //光标跳到时}if(keynum==6){write_com(0xc7); //光标跳到分}if(keynum==7){write_com(0xca); //光标跳到秒}if(keynum==8){ keynum=0; //退出调时间模式TR0=1; //开启定时器0write_com(0x0c); //关闭光标显示}}if(keynum) //当进入调时间模式时{if(key2==0) //s8按键按下{delayms(3); //去抖延时if(key2==0){if(keynum==1){nian++; //s8每按下一次年份加1if(nian==10000) // 加满清0nian=0;write_addate1(1,nian); // 显示年份write_com(0x81); //写完数据指针指向年份原来位置}if(keynum==2){yue++; //s8每按下一次月份加1if(yue==13)yue=0; //加满清0write_addate2(6,yue); //显示月份write_com(0x86); //写完数据指针指向月份原来位置}if(keynum==3){ ri++;if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) //1,3,5,7,8,10,12月有31天if(ri==32)//加满还原ri=1;if(yue==4||yue==6||yue==9||yue==11) //4,6,9,11月有30天if(ri==31)ri=1;if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0)) //闰年2月有30天if(ri==30)ri=1;if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0)) //非闰年2月有31天if(ri==29)ri=1;write_addate2(9,ri); //显示日write_com(0x89); //写完数据指针指向日原来位置}if(keynum==4){week++;//s8每按下一次星期加1if(week==7)//加满还原week=0;write_rq(week); //显示星期write_com(0x8c); //写完数据指针指向星期原来位置}if(keynum==5){shi++;//s8每按下一次时加1if(shi==24)shi=0;//加满还原write_addate2(0x44,shi); //显示时write_com(0xc4); //写完数据指针指向时原来位置}if(keynum==6){fen++;//s8每按下一次分加1if(fen==60)fen=0;//加满还原write_addate2(0x47,fen); //显示分write_com(0xc7);//写完数据指针指向分原来位置}if(keynum==7){miao++;//s8每按下一次秒加1if(miao==60)miao=0;//加满还原write_addate2(0x4a,miao);//显示秒write_com(0xca);//写完数据指针指向秒原来位置}while(!key2); //松手检测}}if(key3==0){delayms(3);if(key3==0){ //s12按下时减1if(keynum==1){nian--;if(nian==-1)nian=9999;write_addate1(1,nian);write_com(0x81);}if(keynum==2){ yue--;if(yue==-1)yue=12;write_addate2(6,yue);write_com(0x86);}if(keynum==3){ri--;if(ri==0){if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)ri=31;if(yue==4||yue==6||yue==9||yue==11)ri=30;if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0))ri=29;if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0))ri=28;}write_addate2(9,ri);write_com(0x89);}if(keynum==4){week--;if(week==-1)week=6;write_rq(week);write_com(0x8c);}if(keynum==5){shi--;if(shi==-1)shi=23;write_addate2(0x44,shi);write_com(0xc4);}if(keynum==6){fen--;if(fen==-1)fen=59;write_addate2(0x47,fen);write_com(0xc7);}if(keynum==7){miao--;if(miao==-1)miao=59;write_addate2(0x4a,miao);write_com(0xca);}while(!key3); //松手检测}}}if(key4==0) //s16被按下进入调闹钟模式{ delayms(3);if(key4==0){keynum1++;while(!key4);}if(keynum1==1){ write_com(0x01); //清屏,指针清0write_com(0xc6); //在时分之间显示“:”write_date(':');write_com(0xc9); //在分秒之间显示“:”write_date(':');write_com(0x0f); //开启光标write_com(0xc4); //光标指向时}if(keynum1==2){write_com(0xc7);//光标指向分}if(keynum1==3){write_com(0xca); //光标指向秒}if(keynum1==4){ keynum1=0;write_com(0x0c); //关闭光标}}if(keynum1){if(key2==0) //s8按下加1{delayms(3);if(key2==0){if(keynum1==1){shi1++;if(shi1==24)shi1=0;write_addate2(0x44,shi1);write_com(0xc4);}if(keynum1==2){fen1++;if(fen1==60)fen1=0;write_addate2(0x47,fen1);write_com(0xc7);}if(keynum1==3){miao1++;if(miao1==60)miao1=0;write_addate2(0x4a,miao1);write_com(0xca);}while(!key2);}}if(key3==0) //s12每按一次减1{delayms(3);if(key3==0){if(keynum1==1){shi1--;if(shi1==-1)shi1=23;write_addate2(0x44,shi1);write_com(0xc4);}if(keynum1==2){fen1--;if(fen1==-1)fen1=59;write_addate2(0x47,fen1);write_com(0xc7);}if(keynum1==3){miao1--;if(miao1==-1)miao1=59;write_addate2(0x4a,miao1);write_com(0xca);}while(!key3);//松手检测}}}}void main(){ uchar num;init();for(num=0;num<15;num++){ write_date(table[num]);delayms(5);} //显示初始时间write_com(0xc0);for(num=0;num<12;num++){ write_date(table1[num]);delayms(5);}TR0=1; //开启定时器0while(1){ if(shi==shi1&&fen==fen1&&miao==miao1) //闹钟到了蜂鸣器响beep=0;keyscan(); //扫描键盘}}void time() interrupt 1 //中断函数{TH0=(65536-45872)/256;TL0=(65536-45872)%256; //进入中断装初值num1++;if(num1==20) //一秒到了{ num1=0; //清0miao++;if(miao==60) //一分到了{ miao=0; fen++; }if(!keynum1) write_addate2(0x4a,miao); //当调闹钟模式按下时不显示当前时间if(fen==60){ fen=0;shi++;}if(!keynum1) write_addate2(0x47,fen); //当调闹钟模式按下时不显示当前时间if(shi==24){shi=0;ri++;week++;}if(!keynum1) write_addate2(0x44,shi); //当调闹钟模式按下时不显示当前时间if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)if(ri==32){ ri=1; y ue++; }if(yue==4||yue==6||yue==9||yue==11)if(ri==31){ ri=1; yue++; }if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0))if(ri==30){ ri=1; yue++; }if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0))if(ri==29){ ri=1; yue++; }if(!keynum1) write_addate2(9,ri);//当调闹钟模式按下时不显示当前时间if(week==7)week=0;if(!keynum1)//当调闹钟模式按下时不显示当前时间{ write_com(0x8c);write_rq(week);}if(yue==13){ yue=0;nian++;}if(!keynum1)//当调闹钟模式按下时不显示当前时间{write_addate2(6,yue);write_com(0x88);write_date('-');}if(nian==10000)nian=0;if(!keynum1){ write_addate1(1,nian);//当调闹钟模式按下时不显示当前时间write_com(0x85);write_date('-');}}}。

基于LCD1602数字时钟程序

基于LCD1602数字时钟程序

#include<reg52.h>#define uint unsigned int //宏定义#define uchar unsigned charsbit lcdrs=P1^0;//数据/命令选择端(H/L)sbit lcdrw=P1^1;//读/写选择端(H/L)sbit lcden=P2^5;//使能端sbit cs88=P2^2;sbit du=P2^0;sbit we=P2^1;sbit beep=P2^3;//蜂鸣器sbit s1=P3^2;//选择按钮sbit s2=P3^3;//确定按钮sbit s3=P3^4;//加按钮sbit s4=P3^5;//减按钮uchar code table1[]="2015-07-01 wed."; uchar code table2[]="12:00:00";uchar num,tt,s1num;char hour,minute,second,day,month,year,week; void delay(uchar z)//延时函数{uint x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}void write_com(uchar com)//写lcd1602指令{lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_dat(uchar dat)//写lcd1602数据{lcdrs=1;P0=dat;delay(5);lcden=1;delay(5);lcden=0;}void init()//初始化函数{cs88=0;we=0;du=0;//以上三条程序关闭不需要的模块TMOD=0x01; //设置定时器0工作方式TH0=0x4c;//装初值TL0=0x01;EA=1; //总中断允许开ET0=1;//定时器0中断开TR0=1;//启动定时器0lcdrw=0;lcden=0;P3=0xff;//为键盘检测做准备year=15;month=7;day=1;week=3;hour=12;write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口write_com(0x0c); //开显示write_com(0x06);//读或写一个字符后地址指针加1,且光标加1 write_com(0x01); //清屏write_com(0x80+1);//设置数据指针for(num=0;num<15;num++)//lcd第一行显示2000-00-00 Week{write_dat(table1[num]);}write_com(0x80+0x40+3);for(num=0;num<8;num++)//lcd第二行显示00:00:00{write_dat(table2[num]);}}void write_ymd(uchar add,uchar dat)//年月日{uchar shi,ge;shi=dat/10;//数据求模ge=dat%10;//数据求余write_com(0x80+add);//数据的指针write_dat(0x30+shi);//数据的十位write_dat(0x30+ge);//数据的个位void write_hms(uchar add,uchar dat)//时分秒{uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+0x40+add);write_dat(0x30+shi);write_dat(0x30+ge);}void write_wee(uchar a,uchar b,uchar c,uchar d)//星期{write_dat(a);write_dat(b);write_dat(c);write_dat(d);write_com(0x80+12);}void keyscan()//键盘扫描函数{if(s1==0)//选择按钮{delay(5);//延时消抖if(s1==0){TR0=0;//关闭定时器0s1num++;beep=0;delay(100);beep=1;while(s1==0);//松手检测if(s1num==1)//秒{write_com(0x80+0x40+10);write_com(0x0f);}if(s1num==2)//分{write_com(0x80+0x40+7);write_com(0x0f);}if(s1num==3)//时{write_com(0x80+0x40+4);write_com(0x0f);}if(s1num==4)//星期{write_com(0x80+12);write_com(0x0f);}if(s1num==5)//日{write_com(0x80+10);write_com(0x0f);}if(s1num==6)//月{write_com(0x80+7);write_com(0x0f);}if(s1num==7)//年{write_com(0x80+4);write_com(0x0f);}if(s1num==8)//秒{s1num=1;write_com(0x80+0x40+10);write_com(0x0f);}}}if(s1num!=0){if(s2==0)//确认按钮{delay(5);if(s2==0){s1num=0;TR0=1;write_com(0x0c);beep=0;delay(100);beep=1;}}}if(s1num!=0){if(s3==0)//加按钮{delay(5);if(s3==0){beep=0;delay(100);beep=1;if(s1num==1){second++;if(second==60){second=0;}write_hms(9,second);write_com(0x80+0x40+10);}if(s1num==2){minute++;if(minute==60){minute=0;}write_hms(6,minute);write_com(0x80+0x40+7);}if(s1num==3){hour++;if(hour==24){hour=0;}write_hms(3,hour);write_com(0x80+0x40+4);}if(s1num==4){week++;if(week==8){week=1;}switch(week){case 1: write_wee(0x4d,0x6f,0x6e,0x2e);//Mon.break;case 2: write_wee(0x54,0x75,0x65,0x73);//Tuesbreak;case 3: write_wee(0x57,0x65,0x64,0x2e);//Wed.break;case 4: write_wee(0x54,0x68,0x75,0x72);//Thurbreak;case 5: write_wee(0x46,0x72,0x69,0x2e);//Fri.break;case 6: write_wee(0x53,0x61,0x74,0x2e);//Sat.break;case 7: write_wee(0x53,0x75,0x6e,0x2e);//Sun.break;}}if(s1num==5){day++;if(day==32){day=0;}write_ymd(9,day);write_com(0x80+10);}{month++;if(month==13){month=0;}write_ymd(6,month);write_com(0x80+7);}if(s1num==7){year++;if(year==50){year=0;}write_ymd(3,year);write_com(0x80+4);}while(s3==0);}}}if(s1num!=0){if(s4==0)//减按钮{delay(5);if(s4==0){beep=0;delay(100);beep=1;if(s1num==1){second--;if(second==-1){second=59;}write_hms(9,second);write_com(0x80+0x40+10);}{minute--;if(minute==-1){minute=59;}write_hms(6,minute);write_com(0x80+0x40+7);}if(s1num==3){hour--;if(hour==-1){hour=23;}write_hms(3,hour);write_com(0x80+0x40+4);}if(s1num==4){week--;if(week==0||week==-1){week=7;}switch(week){case 1: write_wee(0x4d,0x6f,0x6e,0x2e);break;case 2: write_wee(0x54,0x75,0x65,0x73);break;case 3: write_wee(0x57,0x65,0x64,0x2e);break;case 4: write_wee(0x54,0x68,0x75,0x72);break;case 5: write_wee(0x46,0x72,0x69,0x2e);break;case 6: write_wee(0x53,0x61,0x74,0x2e);break;case 7: write_wee(0x53,0x75,0x6e,0x2e);break;}}if(s1num==5){day--;if(day==-1){day=31;}write_ymd(9,day);write_com(0x80+10);}if(s1num==6){month--;if(month==-1){month=12;}write_ymd(6,month);write_com(0x80+7);}if(s1num==7){year--;if(year==-1){year=49;}write_ymd(3,year);write_com(0x80+4);}while(s4==0);}}}}void main()//主函数{init();//初始化while(1){keyscan();if(tt==20)//每1秒second加1{tt=0;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24){hour=0;day++;week++;if(week==8){week=1;}write_com(0x80+12);switch(week){case 1: write_wee(0x4d,0x6f,0x6e,0x2e);break;case 2: write_wee(0x54,0x75,0x65,0x73);break;case 3: write_wee(0x57,0x65,0x64,0x2e);break;case 4: write_wee(0x54,0x68,0x75,0x72);break;case 5: write_wee(0x46,0x72,0x69,0x2e);break;case 6: write_wee(0x53,0x61,0x74,0x2e);break;case 7: write_wee(0x53,0x75,0x6e,0x2e);break;}if(day==32){day=0;month++;if(month==13){month=0;year++;if(year==50){year=0;}write_ymd(3,year);//刷新年}write_ymd(6,month);//刷新月}write_ymd(9,day);//刷新日}write_hms(3,hour);//刷新时}write_hms(6,minute);//刷新分}write_hms(9,second);//刷新秒}}}void et0() interrupt 1{TH0=0x4c;//重装初值TL0=0x01;tt++;}。

基于单片机的lcd1602电子时钟设计

基于单片机的lcd1602电子时钟设计

基于单片机的LCD1602电子时钟设计一、设计任务和目的1.1、设计任务(1):用单片机设计基于LCD1602的电子时钟,显示时间和日期;(2):误差精度控制在1s/天;(3):具有时间和日期的校准功能;(4):能区分某年是闰年或平年,并对应显示2月份的天数;(5):根据月份的不同显示不同的最大日数;(6):搭建仿真电路图,模拟单片机要实现的功能;(7):焊接单片机开发板;(8):编写程序,下载并调试,实现要求的功能。

1.2、设计目的(1):熟练掌握KEIL软件的使用方法;(2):熟练掌握PROTEUS软件的使用方法;(3):掌握单片机I/O接口的工作原理;(4):掌握LCD显示器的工作原理及编程方法;(5):掌握独立式键盘的工作原理及编程使用方法;(6):掌握单片机的下载使用方法。

二、设计思路和方案论证2.1、设计思路电路总体上分为控制和显示部分。

以单片机最小系统作为核心控制电路,控制LCD显示,具体显示内容及方式由软件来完成;由于有时钟和日期的调节功能需要校准电路和基本的复位电路,复位电路采用按键复位,调节键、加1键、减1键三个按键完成,共需四个按键;计时功能由固定频率的晶振完成(采用11.0592MHz);显示部分主要采用LCD1602作为显示。

2.2、方案论证(1):时钟芯片的选择和论证方案一:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、月、年以及闰年补偿的年进行计数,精度也较高,工作电压2.5V~5.5V范围内,功耗也较低,但价格比较贵。

方案二:直接采用单片机定时计数器提供秒信号,使用程序实现秒、分、时、日、月、年计数。

采用此方案实现虽然有一定的时间误差,但可减少芯片的使用,节约成本,易于实现,符合现实选用,所以采用此种作为时钟信号发生器。

(2):显示模块选择方案和论证:方案一:采用点阵式图形LCD12864液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,但是价格昂贵,需要的接口线多,所以在此设计中不采用点阵式图形LCD12864液晶显示屏。

51单片机时钟设计(c语言)

51单片机时钟设计(c语言)

利用51单片机内部定时设计的简易时钟(LCD1602显示)有时间调整功能,按键1切换调整的是时,分,秒。

按键2为加键,按键3为减。

仿真图调整时间C程序#include<reg52.h>unsigned char tab[]=" 23:58:48";unsigned char code tab2[]="hello";#define lcdp P0sbit rs=P3^5;sbit rw=P3^6;sbit en=P3^7;sbit led=P1^7;sbit s1=P1^0;sbit s2=P1^1;sbit s3=P1^2;unsigned char n,count,mu;char ss=23,ff=58,mm=55;void delay(unsigned char z){unsigned char i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}void write_com(unsigned char com)//写指令{rs=0;rw=0;en=0;lcdp=com;delay(5);en=1;delay(5);en=0;}void write_date(unsigned char date)//写数据{rs=1;rw=0;en=0;lcdp=date;delay(5);en=1;delay(5);en=0;}void write_sj(unsigned add,unsigned date){unsigned char shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(shi+0x30);write_date(ge+0x30);}void init() //初始化{write_com(0x38); //设置16x2显示,5x7点阵,8位数据接口write_com(0x06); //写一个字符后地址指针自动加1write_com(0x01); //显示清零,数据指针清零write_com(0x0c); //开显示,不显示光标//write_com(0x08);//write_com(0x0e);//光标开启,但不闪烁write_com(0x80); //显示位置for(n=0;n<10;n++){write_date(tab[n]);delay(1);}write_com(0x80+0x40+3);//第二行显示for(n=0;n<8;n++){write_date(tab2[n]);delay(1);}//定时器初始化TH0=(65536-50000)/256;TL0=(65536-50000)%256;TMOD=0x01;EA=1;ET0=1;TR0=1;}void key(){if(s1==0){delay(5);if(s1==0){mu++;while(!s1);}if(mu==1){TR0=0;write_com(0x80+9);write_com(0x0f);//光标闪烁}if(mu==2){write_com(0x80+6);write_com(0x0f);//光标闪烁}if(mu==3){write_com(0x80+3);write_com(0x0f);//光标闪烁}}if(mu==4){TR0=1;mu=0;write_com(0x0c);//关闭光标}if(mu!=0){if(s2==0){delay(5);if(s2==0){while(!s2);if(mu==1){mm++;if(mm==60)mm=0;write_sj(8,mm);write_com(0x80+9);}if(mu==2){ff++;if(ff==60)ff=0;write_sj(5,ff);write_com(0x80+6);}if(mu==3){ss++;led=!led;if(ss==24)ss=0;write_sj(2,ss);write_com(0x80+3);}}}if(s3==0){delay(5);if(s3==0){while(!s3);if(mu==1){mm--;if(mm==-1)mm=59;write_sj(8,mm);write_com(0x80+9);}if(mu==2){ff--;if(ff==-1)ff=59;write_sj(5,ff);write_com(0x80+6);}if(mu==3){ss--;led=!led;if(ss==-1)ss=23;write_sj(2,ss);write_com(0x80+3);}}}}}void main(){init();while(1){key();}}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==20){count=0;mm++;if(mm==60){mm=0;ff++;if(ff==60){ff=0;ss++;if(ss==24){ss=0;}write_sj(2,ss);}write_sj(5,ff);}write_sj(8,mm);}}。

1602液晶显示电子钟时间C程序

1602液晶显示电子钟时间C程序

#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;sbit key1=P2^3;sbit key2=P2^4;sbit key3=P2^5;void delay(void);void init(void);void wc51r(uchar i);void wc51ddr(uchar i);void fbusy(void);void LCD_xianshi(void);void delay_zs(uint z);void tiaoshi(void);uchar hour,hour1,min,min1,sec,sec1,aa,bb,num1,num2,num3,flag;uchar year1,year2,year3,year4,month,month1,month2,day,day1,day2; unsigned int year;uchar tab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};void main(){init();while(1){LCD_xianshi();}}void init(){// key1=1;key2=1;key3=1;num1=12;year=2010;month=11;day=15;// wc51r(0x01);wc51r(0x38);wc51r(0x0c);wc51r(0x06);TMOD=0x01; //工作方式1TH0=(65536-5000)/256; //定时器高位装初值计数溢出一次为50ms TL0=(65536-5000)%256; //定时器低位装初值EA=1; //CPU开中断ET0=1; //允许T0中断// ET1=1;TR0=1; //启动T0工作// TR1=1;}void fbusy(){RW=1;RS=0;E=1;while(!P1&0x80);E=0;delay();}void wc51r(uchar j){fbusy();E=0;RS=0;RW=0;E=1;P1=j;E=0;delay();}void wc51ddr(uchar j){fbusy();E=0;RS=1;RW=0;E=1;P1=j;E=0;delay();}void delay(){uchar i,j;for(j=0;j<10;j++)for(i=0;i<10;i++);}/*void delay_zs(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}*/void LCD_xianshi(){year1=year/1000;year2=year/100%10;year3=year%100/10;year4=year%10;month1=month/10;month2=month%10;day1=day/10;day2=day%10;hour=num1/10;hour1=num1%10;min=num2/10;min1=num2%10;sec=num3/10;sec1=num3%10;wc51r(0x84); //起始地址为第1行第1列,0x85为第1行第6列;0xc0为第2行第1列wc51ddr(tab[hour]); //显示1wc51ddr(tab[hour1]); //显示2wc51ddr(0x3a); //显示:wc51ddr(tab[min]); //显示0wc51ddr(tab[min1]); //显示0wc51ddr(0x3a); //显示:wc51ddr(tab[sec]);wc51ddr(tab[sec1]);wc51r(0xc3);wc51ddr(tab[year1]);wc51ddr(tab[year2]);wc51ddr(tab[year3]);wc51ddr(tab[year4]);wc51ddr('-');wc51ddr(tab[month1]);wc51ddr(tab[month2]);wc51ddr('-');wc51ddr(tab[day1]);wc51ddr(tab[day2]);}/*void tiaoshi(void){while(key1){TR0=0;if(key2==0){LCD_xianshi;num3++;if(num3==60){num3=0;num2++;}}else if(key3==0)num2++;}// while(key1);// if(key1==0){ET0=1;TR0=1;flag=0;}}*///************************定时器中断程序**************************// void timer0() interrupt 1{TH0=(65536-50000)/256; //重装计数初值TL0=(65536-50000)%256;aa++;if(aa==20) //计数20次后恰为20x50ms==1s{aa=0;num3++; //秒加1if(num3==60) //秒计数到60后清零{num3=0;num2++;if(num2==60){num2=0;num1++;if(num1==24){num1=0;day++;if(month%2==0){if(day==31){day=0;month++;if(month==13){month=0;year++;}}}else if(month%2==1){if(day==32){day=0;month++;if(month==13){month=0;year++;}}}}}}}}//************************定时器中断程序**************************// /*void timer1() interrupt 3{TH1=(65536-50000)/256; //重装计数初值TL1=(65536-50000)%256;bb++;if(bb%20==0){if(key1==0){ET0=0;TR0=0;flag=1;}}}*/#include <msp430g2452.h>unsigned char table[] ={"0123456789"};unsigned char hanzi1[8]={0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02};//年 unsigned char hanzi2[8]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x11};//月 unsigned char hanzi3[8]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00};//日unsigned char num;void delay_1ms(void){unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n){unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}void write_com(unsigned int com){//lcdrs = 0;P2OUT&= 0xfd; P1OUT = com; delay_nms(5); //lcden = 1;P2OUT|= 0x01; delay_nms(5); P2OUT&= 0xfe; }void write_dat(unsigned int dat) {//lcdrs = 1;P2OUT |= 0x02; P1OUT = dat; delay_nms(5); //lcden=1;P2OUT|= 0x01; delay_nms(5); // lcden=0;P2OUT&= 0xfe; }void init() {write_com(0x38);// write_com(0x0f);// write_com(0x01);// write_com(0x06);// // write_com(0x07);//整屏移动 delay_nms(10); }void CGRAM_LCD(unsigned char *hz,unsigned char temp) {unsigned char s; for(s=0;s<8;s++) {write_com(temp+s);write_dat(*(hz+s)); } }void main(void) {WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR |= 0xff; // P1.2 output P2DIR |= 0xff; init();CGRAM_LCD(hanzi1,0x40); CGRAM_LCD(hanzi2,0x48); CGRAM_LCD(ha nzi3,0x50);write_com(0x80); write_dat(table[2]); delay_nms(100);write_com(0x80+0x01); write_dat(table[0]); delay_nms(100);write_com(0x80+0x02); write_dat(table[1]); delay_nms(100);write_com(0x80+0x03); write_dat(table[2]);delay_nms(100);write_com(0x80+0x04); write_dat(0); delay_nms(100);write_com(0x80+0x06); write_dat(table[6]); delay_nms(100);write_com(0x80+0x07); write_dat(1); delay_nms(100);write_com(0x80+0x09); write_dat(table[2]); delay_nms(100);write_com(0x80+0x0a); write_dat(2); while(1); }。

1602LCD时钟C程序

1602LCD时钟C程序

#include<reg52.h>#include <intrins.h>sbit rs=P2^0;sbit rw=P2^1;sbit e=P2^2;//使能信号输入端sbit sset=P1^0;//设置按钮sbit sadd=P1^1;//加按钮sbit sdel=P1^2;//减按钮unsigned char second,minute,hour,count,keycount=0;unsigned char code table0[]="The Time Is:";//第一行显示unsigned char code table1[]=" : : "; //第二行显示unsigned char code table2[]="0123456789";void delay(unsigned int x)//延时{unsigned int a,b;for(a=x;a!=0;a--){for(b=20;b!=0;b--){;}}}void del10ms()//延时10ms{unsigned int a,b;for(a=20;a!=0;a--){for(b=248;b!=0;b--){;}}}void writecomm(unsigned char comm)//写入指令寄存器{rs=0;P0=comm;e=0;delay(5);//写,下降沿有效e=1;delay(5);e=0;}void writedat(unsigned char dat)//写入数据寄存器{rs=1;P0=dat;e=0;delay(5);//写,下降沿有效e=1;delay(5);e=0;}void writesmh(unsigned char add,unsigned char date)//显示个位和十位数据{unsigned char shi,ge;shi=date/10;ge=date%10;writecomm(0xc0+add);delay(5);writedat(table2[shi]);delay(5);writedat(table2[ge]);delay(5);}void keyscan()//{if(sset==0){del10ms();if(sset==0){keycount++;while(sset==0){;}if(keycount==1){TR0=0;writecomm(0xcb);writecomm(0x0f);}if(keycount==2){writecomm(0xc8);writecomm(0x0f);}if(keycount==3){writecomm(0xc5);writecomm(0x0f);}if(keycount==4){keycount=0;writecomm(0x0c);TR0=1;}}}if(keycount!=0){if(keycount==1)//编辑秒{if(sadd==0)//数值加1{del10ms();if(sadd==0){second++;if(second==60){second=0;}while(sadd==0){;}}writesmh(10,second);}if(sdel==0)//数值减1{del10ms();if(sdel==0){if(second==0){second=60;}second--;while(sdel==0){;}}writesmh(10,second);}writecomm(0x0f);writecomm(0xcb);}if(keycount==2)//编辑分钟{if(sadd==0)//数值加1{del10ms();if(sadd==0){minute++;if(minute==60){minute=0;}while(sadd==0){;}}writesmh(7,minute);}if(sdel==0)//数值减1{del10ms();if(sdel==0){if(minute==0){minute=60;}minute--;while(sdel==0){;}}writesmh(7,minute);}writecomm(0xc8);writecomm(0x0f);}if(keycount==3)//编辑小时{if(sadd==0)//数值加1{del10ms();if(sadd==0){hour++;if(hour==24){minute=0;}while(sadd==0){;}}writesmh(4,hour);}if(sdel==0)//数值减1{del10ms();if(sdel==0){if(hour==0){hour=24;}hour--;while(sdel==0){;}}writesmh(4,hour);}writecomm(0xc5);writecomm(0x0f);}}}void init()//初始化{unsigned char i;writecomm(0x38);delay(5);writecomm(0x0c);delay(5);writecomm(0x06);delay(5);writecomm(0x01);delay(5);writecomm(0x82);delay(5);for(i=0;i<12;i++){writedat(table0[i]);delay(5);}writecomm(0xc4);delay(5);for(i=0;i<8;i++){writedat(table1[i]);delay(5);}writesmh(4,hour);delay(5);writesmh(7,minute);delay(5);writesmh(10,second);delay(5);TMOD=0x01;TH0=0x3C;TL0=0xB0;EA=1;ET0=1;TR0=1;}void main(){rw=0;init();while(1){keyscan();}}void time0() interrupt 1 using 0 {TH0=0x3C;TL0=0xB0;count++;if(count==20){count=0;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24){hour=0;}writesmh(4,hour);}writesmh(7,minute);}writesmh(10,second);}}。

lcd1602液晶显示数字钟

lcd1602液晶显示数字钟

{
time[1]=0;//超过,分清零
time[0]++;//小时加1
if(time[0]>23)//是否超过23
{
time[0]=0; //小时清零
•}

}
时间计算
• void main(void)
•{

uchar i;


while(1)

{
• 计时
for(i=0;i<250;i++)//循环调用显示程序250次,实现1秒
display_code[]={0x3f,0x60,0x5b,0x4 f,0x66,0x5d,0x7d,0x07,0x7f,0x6f,0x 40}; • uchar time[4]={0,0,0,0}; //时间初 值全为0
• void delay(void);//延时0.5毫秒 •{
定时1秒
• uchar i;
• for(i=250;i>0;i--);
•}
• void display()
/*程序用于P0口接数码管的断码,P2接数码管的位码*/
•{

uchar i,k;

k=0x80;
//k初始化,指向第一位数码管

for(i=0;i<8;i++) //循环8次,i值为0~7

{

P2=0;
//关闭显示

P0=display_code[time[i]/10]; //输出十位数的断码


{

display();//调用动态显示,动态显示一次约4毫秒

}

1602LCD简单时钟显示实验C语言

1602LCD简单时钟显示实验C语言
lcd_wmd(tmp);
tmp=dispbuf[1];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[0];
tmp=word[tmp];
lcd_wmd(tmp);
}
/*********************键盘子程序***********************/
uchar keypro(void)
{
uchar scanl,scanh;
P1=0xf0;
if((P3&0xf0)!=0xf0)
{
delay();
if((P1&0xf0)!=0xf0)
{
scanl=0xfe;
while((scanl&0x10)!=0)
{
P1=scanl;
if((P3&0xf0)!=0xf0)
{
scanh=(P1&0xf0)|0x0f;
return (~scanh)+(~scanl);
}
else scanl=(scanl<<1)|0x01;
}
/*******写命令**********/
void lcd_wmc(uchar i)
{
P0=i;
RS=0;
RW=0;
E=0;
delay();
E=1;
}
/*******写数据***********/
void lcd_wmd(uchar i)
dispbuf[5]=11;
}
//更新显示缓冲区及调用显示程序
if(counter==0)

基于单片机的LCD1602电子时钟设计

基于单片机的LCD1602电子时钟设计

基于单片机的LCD1602电子时钟设计近年来,随着物联网和智能设备的快速发展,电子时钟作为一种常见的智能设备,广泛应用于家庭、办公室等各种场合。

本文将基于单片机设计一款LCD1602电子时钟,实现时间显示、闹钟设置等功能。

一、硬件设计1.单片机选择在本设计中,选择常用的51系列单片机AT89C51,具有丰富的外设资源和强大的处理能力。

该单片机具有8位数据总线、16位地址总线,并且集成了定时/计数器、中断控制器和串行通信接口等外设。

2.显示模块选择3.时钟模块选择通过接入DS1302时钟模块,可以实现实时时钟的功能。

DS1302模块具有时钟计数器、电压检测电路、串行通信接口等,并且具有低功耗特点。

4.控制板设计根据LCD1602的引脚连接方式,设计一个控制板,用于将单片机、显示模块和时钟模块等连接在一起。

同时,需注意设计供电电路、外设输入输出电平等电路。

二、软件设计1.初始化设置通过单片机的GPIO口配置,将LCD1602和DS1302对应的引脚设置为输出模式,同时初始化LCD显示屏并进行清屏操作。

此外,需设置DS1302时钟模块的时钟、日期、闹钟等参数。

2.时间显示通过读取DS1302时钟模块的计数器,获得当前的小时、分钟和秒数,然后将其格式化为HH:MM:SS的形式,并通过LCD显示出来。

3.时间设置通过单片机的外部中断,当用户按下设置按钮后,进入时间设置模式。

在时间设置模式下,用户可以通过按下不同的按键来调整小时、分钟和秒数。

调整完成后,再次按下设置按钮即可保存设置。

4.闹钟设置通过单片机的定时器中断,设定一个闹钟定时器。

当闹钟定时器触发时,触发相应的中断,然后通过LCD显示闹钟提示。

此外,用户也可以通过按下按钮来设置闹钟时间,并通过单片机的外部中断进行处理。

5.闹钟响铃当闹钟时间到达时,触发相应的中断,通过LCD显示闹钟提示,并通过蜂鸣器发出响铃声。

总结通过本设计,可以实现一款功能齐全的LCD1602电子时钟。

(完整word版)1602液晶时钟程序(51单片机)

(完整word版)1602液晶时钟程序(51单片机)

1602液晶时钟程序程序按郭天袢《新概念51单片机C语言教程》第十四章扩展显示年、月、日、星期调节功能。

1)时间显示在1602液晶上,并按秒实时更新2)能调节按键调整时、分、秒、年、月、日和星期3)每次按键按下时有短滴声响声4)断电后下次上电会接着上次断电前的时间数继续运行原理图如图//原代码如下:#include<reg52.h>//#include"24c02.h"#define uchar unsigned char#define uint unsigned int#include"24c02.h"sbit dula=P2^6;sbit wela=P2^7;sbit LCDEN=P3^4;sbit LCDRS=P3^5;sbit s1=P3^0;//定义按键--功能键sbit s2=P3^1;//定义按键--增大键sbit s3=P3^2;//定义按键--减小键sbit rd=P3^7;//按键公共脚sbit beep=P2^3;//定义蜂鸣器脚uchar count,s1_num;//定义中断次数计数变量功能键按键次数变量uchar week,day,month,year;//定义变量:星期日月年char miao,shi,fen;//定义秒分时变量uchar code table[]=" 2012-11-28 Wed";//void write_week(char we);//显示星期几函数void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void di()//蜂鸣器响一声函数{beep=0;delay(100);beep=1;}void write_com(uchar com) //液晶写命令函数{LCDRS=0;P0=com;delay(5);LCDEN=1;delay(5);LCDEN=0;}void write_date(uchar date) //液晶写数据函数{LCDRS=1;P0=date;delay(5);LCDEN=1;delay(5);LCDEN=0;}void write_week(char we) //写星期几显示函数{write_com(0x80+12);switch(we){case 1: write_date('M');delay(5); //星期一Mondaywrite_date('o');delay(5);write_date('n');delay(5);break;case 2: write_date('T');delay(5); //星期二Tuesdaywrite_date('u');delay(5);write_date('e');delay(5);break;case 3: write_date('W');delay(5); //Wednesdaywrite_date('e');delay(5);write_date('d');delay(5);break;case 4: write_date('T');delay(5); //Thursdaywrite_date('h');delay(5);write_date('u');delay(5);break;case 5: write_date('F');delay(5); //星期五Fridaywrite_date('r');delay(5);write_date('i');delay(5);break;case 6: write_date('S');delay(5); //星期六Saturdaywrite_date('a');delay(5);write_date('t');delay(5);break;case 7: write_date('S');delay(5); //星期日Sundaywrite_date('u');delay(5);write_date('n');delay(5);break;default: break;}}void write_sfm(uchar add,uchar date) //写时分秒函数{uchar shiwei,gewei;shiwei=date/10;gewei=date%10;write_com(0x80+0x40+add);//设置显示位置write_date(0x30+shiwei);//加上0x30是因为数字变成字符串需要加上0x30,看ASCII码值与字符的关系write_date(0x30+gewei);}void write_year_month_day(uchar add,uchar day) //写年月日数函数{uchar shi,ge;shi=day/10;ge=day%10;write_com(0x80+add);//设置显示位置write_date(0x30+shi);//加上0x30是因为数字变成字符串需要加上0x30,看ASCII码值与字符的关系write_date(0x30+ge);}void init() //初始化函数{uchar num;rd=0;beep=1;dula=0;wela=0;LCDEN=0;//将使能端置0以完成高脉冲fen=0;miao=0;shi=0;count=0;//计数初始为0init_24c02();write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口write_com(0x0c);//设置开显示,不显示光标write_com(0x06);//写一个字符后地址指针自动加1write_com(0x01);//显示清0,数据指针清0write_com(0x80); //设置显示初始坐标for(num=0;num<15;num++) //显示年月日{write_date(table[num]);delay(5);}write_com(0x80+0x40+6); //写出时间显示部分的两个冒号write_date(0x3a);delay(5);write_com(0x80+0x40+9);write_date(0x3a);delay(5);miao=read_add(1);//开机上电时读取24c02 IIC的数据赋值fen=read_add(2);shi=read_add(3);week=read_add(4);//读取星期几day=read_add(5);//读取多少日month=read_add(6);year=read_add(7);write_sfm(10,miao);//分别送去液晶显示write_sfm(7,fen);write_sfm(4,shi);write_week(week);//开机从24c02读取的星期几数从新写入液晶显示出来write_year_month_day(9,day);write_year_month_day(6,month);write_year_month_day(3,year);//定时器初始化TMOD=0x01; //设置定时器0工作模式1TH0=(65536-45876)/256; //定时器装初值TL0=(65536-45876)%256;EA=1; //开总中断ET0=1; //打定时器0中断TR0=1; //启动定时器0}void keyscan() //按键扫描函数{if(s1==0){delay(5);if(s1==0){s1_num++; //功能键按下次数记录while(!s1); //按键释放确认di();if(s1_num==1) //只按一次按键时TR0=0; //关闭定时器write_com(0x80+0x40+11);write_com(0x0f); //打开光标闪烁}if(s1_num==2) //第二次按下光标闪烁定位到分钟位置{write_com(0x80+0x40+8);}if(s1_num==3) //第三次按下光标闪烁定位到小时位置{write_com(0x80+0x40+5);}/**************************************if(s1_num==4) //第三四次按下退出{s1_num=0;write_com(0x0c); //取消光标闪栎TR0=1; //启动定时器使时钟开始走}***************************************/if(s1_num==4) //光标处星期{write_com(0x80+14);}if(s1_num==5) //光标处日{write_com(0x80+10);}if(s1_num==6) //光标处月{write_com(0x80+7);}if(s1_num==7) //光标处年{write_com(0x80+4);}if(s1_num==8) //当第八次按功能键时退出光标闪烁及开始计时{s1_num=0;write_com(0x0c); //取消光标闪栎TR0=1; //启动定时器使时钟开始走}}if(s1_num!=0){if(s2==0)//增加键确认按下{delay(5);if(s2==0){while(!s2);di();if(s1_num==1){miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+11);write_add(1,miao);}if(s1_num==2){fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+8);write_add(2,fen);}if(s1_num==3){shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+5);write_add(3,shi);}if(s1_num==4)//按四次功能键后光标至星期几处,可调节星期几{week++;if(week==8)week=1;write_week(week);write_com(0x80+14); //写一个字符后光标会移一位,所以要重新定义光标位置write_add(4,week);}if(s1_num==5) //光标至显示日处,可调节多少日{day++;if(day==32)day=1;write_year_month_day(9,day);write_com(0x80+10);write_add(5,day);}if(s1_num==6) //光标至显示月处调节月份{month++;if(month==13)month=1;write_year_month_day(6,month);write_com(0x80+7);write_add(6,month);}if(s1_num==7){year++;if(year==100)year=00;write_year_month_day(3,year);write_com(0x80+4);write_add(7,year);}}}if(s3==0) //确认减小键被按下{delay(5);//按键防抖延时if(s3==0) //确认减小键被按下{while(!s3);di();if(s1_num==1){miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+11);write_add(1,miao);}if(s1_num==2){fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+8);write_add(2,fen);}if(s1_num==3){shi--;if(shi==-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+5);write_add(3,shi);}if(s1_num==4){week--;if(week==0)week=7;write_week(week);write_com(0x80+14); //写一个字符后光标会移一位,所以要重新定义光标位置write_add(4,week);}if(s1_num==5)//光标至显示日处,可调节多少日{day--;if(day==0)day=31;write_year_month_day(9,day);write_com(0x80+10);//光标位置移回在显示多少日的个位write_add(5,day);}if(s1_num==6) //光标至显示月处调节月份{month--;if(month==0)month=12;write_year_month_day(6,month);write_com(0x80+7);write_add(6,month);}if(s1_num==7){year--;if(year==-1)year=99;write_year_month_day(3,year);write_com(0x80+4);write_add(7,year);}}}}}void main(){init();//首先初始化各数据while(1){keyscan(); //按键扫描函数}}void timer0() interrupt 1 //定时器0中断服务程序{TH0=(65536-45876)/256;TL0=(65536-45876)%256;count++; //中断次数累加,计数if(count==20) //50微秒乘以20等于1秒{count=0;miao++;if(miao==60) //秒加到60则进位分钟{miao=0; //同时秒数清0fen++;if(fen==60) //分钟加到60则进位小时{fen=0; //同时分钟清0shi++;if(shi==24) //小时加到24则小时清0{shi=0;}write_sfm(4,shi);//小时若变化则重新写入write_add(3,shi);//写入24c02存储起来,小时数的写入地址为3 }write_sfm(7,fen);//分钟若变化则重新写入write_add(2,fen);}write_sfm(10,miao);//秒若变化则重新写入write_add(1,miao);}}/***********************************24C02.h头文件,将以下源代码需存为与保存的C代码根目录下。

答辩材料-基于LCD1602的数字钟程序设计(C语言)

答辩材料-基于LCD1602的数字钟程序设计(C语言)

答辩材料一、LCD1602概要LCD1602液晶显示模块是一种字符型显示模块,16引脚,5*7点阵,高电平点亮,可显示2行×16个字符。

LCD1602具有如下特性:⏹+5v电压,对比度可调⏹内含复位电路⏹提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能⏹有80字节显示数据存储器DDRAM⏹内建有160个5*7点阵的字型的字符发生器CGROM⏹8个可有用户自定义的5*7的字符发生器CGRAM二、硬件说明1、单片机最小显示系统;..2、 电源电路;....3、 下载电路;...4、 蜂鸣器电路;5、 LCD 显示电路。

三、 软件说明1、程序流程图:定义第一行要显示的内容···显示第一行要现实的内容···定义第二行要显示的内容···显示第二行要现实的内容···对第一行要显示的内容进行“加减”操作···对第二行要显示的内容进行“加减”操作···在第一行显示内容的基础上进行音乐加载···通过按键切换画面显示内容···2、LCD1602 初始化:0x38 设置16*2显示,5*7点阵,8位数据接口0x08 只开显示0x01 清屏0x0c 开显示,不显示光标0x06 地址加1,当写入数据的时候光标右移3、操作时序四、显示结果通过软硬件结合,最终在LCD显示屏上显示出如下结果:第一步:上电后,可以发现LCD显示板上显示“Come On(第一行)、Baby!(第二行)”。

5秒后,LCD显示板上显示学号“1006043129(第一行)、1006043130(第二行)”;第二步:按键S1(k1)切换画面。

按第一次S1,显示画面:“23:59:50 T(第一行)、2012年12月30日(第二行)”;按第二次S1,显示画面:“23:59:50(第一行)、2012年12月30日D(第二行)”;按第三次S1,显示画面:“1006043129(第一行)、1006043130(第二行)”;然后依次循环······第三步:当LCD显示板上的时间行更新到“00:00:00”时,蜂鸣器播放歌曲“让我们荡起双桨”。

LCD1602单片机数字钟设计(含附件)

LCD1602单片机数字钟设计(含附件)

基于单片机89C52的液晶数字钟设计摘要设计采用定时计数器工作方式1进行数值上的累加,经过延时程序,lcd1602驱动程序和时间格式转换程序,实现了数字钟的正常运转以及显示。

添加整点报时,用1个if 语句设置整点条件调用蜂鸣器程序实现功能;添加闹钟功能,通过当前时间与闹钟时间的对比促使蜂鸣器发声。

关键词定时计数器 LCD1602 闹钟单片机89C521.电路设计1.1主体设计1.1.1设计原理端,使用P0端要外接上拉电阻,这里放置10k阻值的排阻。

蜂鸣器需要三极管放大后方可使用。

开关用四脚独立按键,接P1端。

使用12MHz的晶振。

1.2各部分设计1.2.1时钟设计单片机的时钟有两种方式产生,分别是内部方式和外部方式。

设计采用内部方式。

产生时钟的是振荡电路。

由一个12MHz的晶振和两个30pF的串联着的电容并联在一起,形成谐振电路。

晶振和电容大小涉及电路振荡频率的稳定性和大小,以及起振响应速度。

1.2.2复位设计复位有两种,区别在于是否有开关。

按一次开关,电位变化形成一次脉冲,使单片机复位。

采用10k电阻和10uF的电解电容。

1.2.3按键设计有三种模式,分别是工作模式,当前时间设置模式,闹铃时间设置模式。

(1)工作模式。

就是正常数字钟功能,有整点报时功能。

(2)当前时间设置模式。

1键进入该模式,之后,1键调时,2键调分,3键确认。

(3)闹铃时间设置模式。

3键进入该模式,之后,1键调时,2键调分,3键确认,4键打开闹铃。

工作模式2键可以查看闹铃时间。

1.2.4lcd1602设计Lcd1602的DB端接单片机的P0端,2和15脚接5v,其他的接地。

加10k排阻,程序正确,电路无差错,可正常使用。

1.2.5蜂鸣器设计蜂鸣器通过三极管放大后使用,作用有闹铃和整点报时的发声。

三极管采用pnp型规格。

1.3软件仿真Proteus 7.5图1.3仿真图图1.4PCB 设计设计仿真用到的器件在此版本软件上都能找到。

基于LCD1602电子时钟课程设计报告

基于LCD1602电子时钟课程设计报告

信息与电子工程学院课程设计报告课程单片机技术应用设计题目基于LCD1602电子时钟专业班级姓名学号分工成绩成员指导老师答辩日期目录一、课程设计概述 (3)1.1课程设计背景 (3)1.2课程设计内容 (3)1.3课程设计技术指标 (3)二、方案的选择及确定 (3)2.1单片机芯片的选择 (3)2.2显示模块的选择 (4)2.3实时时间计算模块的选择 (4)2.4实时环境温度采集模块选择 (4)2.5电路设计最终方案决定 (5)三、系统硬件设计 (5)3.1主控模块 (5)3.2LCD显示模块设计 (6)3.3时间计算模块设计 (6)3.4实时环境温度检测模块 (7)3.5报警模块 (7)3.6设置模块 (8)3.7电源接口部分 (8)四、系统软件设计 (8)4.1主函数 (8)4.2设置模块 (9)4.31602液晶屏 (10)4.4软件原理图 (11)五、系统调试过程 (11)5.1软件调试 (11)5.2硬件调试 (12)六、结论 (12)七、遇到的问题及解决方法和总结 (12)7.1硬件方面 (12)7.2软件方面 (13)7.3总结 (13)八、参考文献 (13)九、附录 (14)一、课程设计概述1.1 课程设计背景随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。

单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。

而电子万年历作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很常用的题目。

因为它有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。

而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。

1.2 课程设计内容利用单片机、时钟芯片DS1302、温度传感器DS18B20、1602液晶屏等实现日期、时间、温度的显示,即是一个电子时钟。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
lcd_wdat(*(p++));
}
void Displaystrings3(uchar Address,uchar *p)
{
uchar length;
length=10;
DDRAM_Address_Set(Address);
for(;length;length--)
lcd_wdat(*(p++));
uchar i=68,x;
uchar code pinlv[]={131,110,98, 87, 73, 87, 110,98, 131,0,110,
98, 87, 73, 73, 65, 98, 87,87,87,73,65,73,65,55,58,
65,73,65,87,110,98,87,73,110,131,110,98,87,65,73,73,
void update()
{
if(++sec==60)
{
sec=0;
if(++min==60)
{
min=0;
if(++hour==24)
{
hour=0;
if(++day==31)
{
day=1;
if(++mon==13)
}
}
/*-------zhongduan--------*/
void timer0_isr()interrupt 1
{
TH0=0x3C;
TL0=0xB0;
if(++count==20)
{
flag=1;
count=0;
}
}
/*---------gengxin---------*/
min=59;
if(--hour==-1)
{
hour=23;
}
}
}
}
if(j==0)
{
lcd_wcom(0xcf);
lcd_wdat(zifu[14]);
}
void Displaystrings4(uchar Address,uchar *p)
{
uchar length;
length=11;
DDRAM_Address_Set(Address);
for(;length;length--)
lcd_wdat(*(p++));
uchar table[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02, //年
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11, //月
0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00}; //日
110,131,147,2,131,147,330,392,440,524,247,220,196,165,880, 880};
uchar year,mon,day,hour,min,sec,count,flag,m,j=0;
uchar zifu[]={'0','1','2','3','4','5','6','7','8','9',':',0x00,0x01,0x02,' '};
}
void main()
{
hour=23;min=59;sec=50;count=0;flag=0;
year=2;mon=12;day=30;
TMOD=0x01;
TH0=0x3C;
TL0=0xB0;
TR0=1;
EA=1;
ET0=1;
lcd_init();
DDRAM_Address_Set(Address);
for(;length;length--)
lcd_wdat(*(p++));
}
void Displaystrings1(uchar Address,uchar *p)
{
uchar length;
length=6;
DDRAM_Address_Set(Address);
year--;
}
}
}
}
if(hour==0&&min==0&&sec==0)
{
for(x=0;x<i;x++)
{
yanzou(pinlv[x],jiepai[x]);
if(flag==1)
time[2]=zifu[10];
time[3]=zifu[min/10];
time[4]=zifu[min%10];
time[5]=zifu[10];
}
void DDRAM_Address_Set(uchar DDRAM_Address)
{
lcd_wcom(DDRAM_Address);
}
void Displaystrings0(uchar Address,uchar *p)
{
uchar length;
length=7;
}
Displaystrings3(0x82,time);
Displaystrings4(0xC2,date);
lcd_wcom(0x8f);
lcd_wdat(0x54);
delay(5);
if(k2==0)
{
while(k2==0);
for(;length;length--)
lcd_wdat(*(p++));
}
void Displaystrings2(uchar Address,uchar *p)
{
uchar length;
length=11;
DDRAM_Address_Set(Address);
for(;length;length--)
while(1)
{
if(k1==0)
{
while(k1==0);
if(++j==3)
j=0;
}
if(j==1)
{
if(flag==1)
{
flag=0;
update();
chaifen();
{
flag=0;
update();
chaifen();
}
Displaystrings3(0x82,time);
Displaystrings4(0xC2,date);
}
fmq=0;
}
#include<reg52.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char
sbit fmq=P2^0;
sbit RS=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
sbit k1=P3^2;
sbit k2=P3^3;
sbit k3=P3^4;
uchar kaiji0[]="Come On";
uchar kaiji1[]="baby !";
uchar chen[11]="1006043129 "; //diyihang
uchar cui[11]="1006043130 "; //dierhang80};
}
Displaystrings3(0x82,time);
Displaystrings4(0xC2,date);
lcd_wcom(0x8f);
lcd_wdat(zifu[14]);
lcd_wcom(0xcf);
lcd_wdat(0x44);
{
RS=1;
RW=0;
P0=dat; delay(5); Nhomakorabea E=1;
E=0;
}
void lcd_init()//chushihua
{
lcd_wcom(0x38);
lcd_wcom(0x0c);
lcd_wcom(0x06);
lcd_wcom(0x01);
{
mon=1;
++year;
}
}
}
}
}
}
/*-------chaifen------*/
void chaifen()
{
time[0]=zifu[hour/10];
time[1]=zifu[hour%10];
lcd_wcom(0x40);
for(m=0;m<24;m++)
{
lcd_wdat(table[m]);
}
Displaystrings0(0x82,kaiji0);
Displaystrings1(0xC2,kaiji1);
delay(3000);
delay(5);
if(k2==0)
{
while(k2==0);
if(++day==31)
相关文档
最新文档