1602电子时钟电路_原理图_PCB图
51单片机实现电子时钟功能_1602液晶显示09032
第一章 设计要求及系统组成1.1 设计要求利用单片机最小系统设计一个电子时钟,显示方式为**:**:**,并且可以任意修改时间。
1.2系统组成原理框图如图1.1图1.1 系统原理框图第二章 系统设计方案2.1 系统设计方案电路原理图如图2.1所示图2.1 电路原理图2.2 电路模块组成及其工作原理2.2.1 时钟电路系统时钟源由内部时钟方式产生,时钟电路由12MH晶振和两个30PF瓷片电容组成,构成自激振荡,形成振荡源提供给单片机。
电容可在5PF到30PF 之间选择,电容的大小对振荡频率有微小影响,可起频率微调作用。
时钟电路如图2.2所示图2.2 时钟电路2.2.2 复位电路单片机复位有上电复位和手动复位两种方式,上电复位是接通电源后利用RC充电来实现复位。
手动复位是通过人为干预,强制系统复位。
复位电路如图2.3所示,可以实现上电复位和手动复位功能。
图2.3 复位电路2.2.3 按键电路在单片机的P1.0、P1.1、P1.2三个I/O口接三个简易按键,通过不断检测按键状态,识别按键的按下顺序和次数即可实现时间的任意修改。
按键电路如图2.4所示。
2.2.4 1602液晶显示模块电路本设计是通过对1602液晶显示屏的控制来实现时间的显示。
1602液晶显示模块的驱动如下所述:图2.4 1602液晶屏实物图1602采用标准的16脚接口,其中:第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
1602资料和程序电路图-文档
lcd1602中文资料在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
10.8.1 液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
1602电子时钟电路_原理图_PCB图
1602电子时钟电路_原理图_PCB图XXXXX学院电子线路课程设计【带LCD显示的电子时钟】班级:XX姓名:XX学号:XX指导老师:XXXX年XX月XX 日摘要在当代繁忙的学习与生活中,数字钟已成为人们日常生活中必不可少的必需品,被广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
数字电路采用数字电路,实现对时、分、秒时钟显示的计时装置,具有走时准确、性能稳定、携带方便等优点它还用于计时、自动报时及自动控制等各个领域。
单片机具有体积小、功能强可靠性高、价格低廉等一系列优点基于单片机的定时器功能完成的数字钟电路的设计,结构简单,便于携带。
也利于我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路、写程序、调试电路的能力。
研究数字钟以及扩大其应用,具有非常现实的意义。
此设计中的数字钟不仅可以显示普通的年、月、日、时、分、秒外,还可加入蜂鸣器、按键复位等功能。
关键字:LCD1602 单片机电子时钟定时复位一( 任务要求设计一个时钟电路。
以单片机为核心模块,LCD1602为显示模块,通过控制使1602显示时间、字符。
1.1 基本要求1).第一行显示自己的名字2).第二行显示时间1.2 发挥部分1).加入按键,实现调时功能2).加入蜂鸣器,实现闹钟功能二(系统分析2.1 系统总体方框图显示电路复位电路ST89C51外部中断晶振电路2.2 系统总体分析本设计由ST89C51单片机、复位电路、晶振电路、外部中断和显示电路5个模块组成。
其中以单片机模块为核心模块,主导其余四个模块工作,1602显示模块用来显示秒、分、时计数单位中的值。
利用AT89c51单片机内部的定时/计数器进行中断定时,配合软件延时,实现电路的总体功能。
三、硬件设计3.1、晶振电路图3.1 晶振电路一般的晶振振荡电路都是在一个反相放大器的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容。
LCD1602电子钟-有图有真相
亲测有效!顺利通过课程设计!有图有真相#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit rs= P0^5; //寄存器类型,1表示数据寄存器,2表示指令寄存器sbit rw = P0^6; //读写选择,1表示读,0表示写sbit ep = P0^7; //读写使能,下降沿使能sbit pcf8563_scl=P0^4;sbit pcf8563_sda=P0^3;sbit setup=P1^0;sbit shi=P1^1;sbit fen=P1^2;sbit led=P1^6;uchar num[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //数字uchar sg;uchar sd;uchar fg;uchar fd;uchar mg;uchar md;uchar ng;uchar nd;uchar yg;uchar yd;uchar rg;uchar rd;uchar hou=14;uchar min=30;uchar sec=0;uchar year=12;uchar mon=12;uchar day=12;uchar week=3;uchar number;bit busy;void start_pcf8563(void);void send_pcf8563_byte(void);void lcd_init(void);void lcd_pos(uchar pos);void lcd_wdat(uchar dat);bit lcd_busy();void display0(void);void display(void);void stop_pcf8563(void);void receive_pcf8563_byte(void);void spit_time(void);void update(void);void scan(void);void delay(uchar ms);void delay(uint t) //单位延时1ms,总延时1ms*t.(121为实验测试值){uint i,j;for(i=0;i<t;i++)for(j=0;j<121;j++);}bit lcd_busy() //判断LCD是否忙碌,1忙碌{bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();result = (bit)(P2 & 0x80);ep = 0;return result;}void lcd_wcmd(uchar cmd) //写指令{while(lcd_busy());//判断LCD是否忙碌rs = 0;rw = 0;ep = 0;_nop_();_nop_();P2 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}void lcd_pos(uchar pos) //显示地址{lcd_wcmd(pos | 0x80);}//写数据void lcd_wdat(uchar dat){while(lcd_busy());//判断LCD是否忙碌rs = 1;rw = 0;ep = 0;P2 = dat;_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}void lcd_wstr(const uchar *s) //写字符串{unsigned char i = 0;while(s[i] != '\0'){lcd_wdat(s[i]);// 显示字符delay(250);i++;}}void lcd_init() //LCD初始化{lcd_wcmd(0x3c); //功能设定delay(1);lcd_wcmd(0x0c); //显示器开关delay(1);lcd_wcmd(0x06); //设定进入模式delay(1);lcd_wcmd(0x01); //清除显示屏,把光标移至左上角delay(1);}void display0() //显示时钟背景{lcd_pos(0x00);lcd_wstr("20");lcd_pos(0x04);lcd_wdat('-');lcd_pos(0x07);lcd_wdat('-');lcd_pos(0x46);lcd_wdat(':');lcd_pos(0x49);lcd_wdat(':');}void display()//显示年、月、日、时间和星期{uchar temp12;uchar temp11;uchar temp10;uchar temp9;uchar temp8;uchar temp7;uchar temp6;uchar temp5;uchar temp4;uchar temp3;uchar temp2;uchar temp1;lcd_pos(0x02);temp12=num[ng];lcd_wdat(temp12);lcd_pos(0x03);temp11=num[nd];lcd_wdat(temp11);lcd_pos(0x05);temp10=num[yg];lcd_wdat(temp10);lcd_pos(0x06);temp9=num[yd];lcd_wdat(temp9);lcd_pos(0x08);temp8=num[rg];lcd_wdat(temp8);lcd_pos(0x09);temp7=num[rd];lcd_wdat(temp7);lcd_pos(0x0c);switch(week%7){case 0:lcd_wstr("SUN");break;case 1:lcd_wstr("MON");break;case 2:lcd_wstr("TUE");break;case 3:lcd_wstr("WED");break;case 4:lcd_wstr("THU");break;case 5:lcd_wstr("FRI");break;case 6:lcd_wstr("SAT");break;}lcd_pos(0x44);temp6=num[sg];lcd_wdat(temp6);lcd_pos(0x45);temp5=num[sd];lcd_wdat(temp5);lcd_pos(0x047);temp4=num[fg];lcd_wdat(temp4);lcd_pos(0x48);temp3=num[fd];lcd_wdat(temp3);lcd_pos(0x4a);temp2=num[mg];lcd_wdat(temp2);lcd_pos(0x4b);temp1=num[md];lcd_wdat(temp1);}void update() //更新时间{if(sec>59){min++;sec=0;}if(min>59){hou++;min=0;}if(hou>23){day++;week++;hou=0;}if(day>30){mon++;year=0;}if(mon>12){year++;mon=0;}if(year>99)year=0;}void spit_time(){ng=(int)year/10; //年的高位nd=(int)year%10;// 年的低位yg=(int)mon/10; //月的高位yd=(int)mon%10; // 月的低位rg=(int)day/10;rd=(int)day%10;sg=(int)hou/10;sd=(int)hou%10;fg=(int)min/10;fd=(int)min%10;mg=(int)sec/10;md=(int)sec%10;}void scan() //扫描键盘{if(setup==0){delay(1);}if(setup==0){led=0;if(shi==0){delay(1);}if(shi==0){hou++;led=1;shi=1;}if(fen==0){delay(10);}if(fen==0){min++;led=1;fen=1;}}}void Send_pcf8563_byte(uchar bb) //向PCF8563发送一个字节{uchar aa;pcf8563_scl=0;for(aa=0;aa<8;aa++){if((bb&0x80)==0x80){pcf8563_sda=1;}else{pcf8563_sda=0;}pcf8563_scl=1;pcf8563_scl=0;bb=bb<<1;}_nop_();_nop_();pcf8563_sda=1;pcf8563_scl=1;busy=0;if(pcf8563_sda){busy=1;}else{_nop_();_nop_();pcf8563_scl=0;busy=0;}}void write_pcf8563(uchar subadd,uchar dat)// 向PCF8563对应地址写数据{start_pcf8563();Send_pcf8563_byte(0xa2);if(!busy){Send_pcf8563_byte(subadd);if(!busy){Send_pcf8563_byte(dat);}}stop_pcf8563();}void read_pcf8563() //读当时的时,分,钞{start_pcf8563();Send_pcf8563_byte(0xa2);if(!busy){Send_pcf8563_byte(0x02);if(!busy){start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();sec=number&0x7f;start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();min=number&0x7f;start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();hou=number&0x3f;}}stop_pcf8563();}void receive_pcf8563_byte() //从PCF8563接受一个字节{uchar CC;pcf8563_sda=1;number=0;for(CC=0;CC<8;CC++){number<<=1;pcf8563_scl=0;pcf8563_scl=1;_nop_();_nop_();number= number|pcf8563_sda;}pcf8563_scl=0;_nop_();_nop_();}void start_pcf8563() //开启PCF8563IIC{pcf8563_sda=1;pcf8563_scl=1;pcf8563_sda=0;//SCL为低,SDA执行一个上跳pcf8563_scl=0;//SCL为低,嵌住数据线}void stop_pcf8563() //关闭PCF8563IIC{pcf8563_sda=0;pcf8563_scl=1;pcf8563_sda=1;//SCL为高,SDA执行一个上跳pcf8563_scl=0;//SCL为低,嵌住数据线}void main(void){lcd_init();// 初始化LCDdelay(10);lcd_pos(0x00);//设置显示位置//i = 0;lcd_wstr("HELLO WORLD!");lcd_pos(0x40);lcd_wstr("GOODBYE2012!");delay(5000);lcd_wcmd(0x01);display0();while(1){write_pcf8563(0x08,year); //写年write_pcf8563(0x07,mon); //写月write_pcf8563(0x05,day); //写日write_pcf8563(0x02,sec); //写钞write_pcf8563(0x03,min); //写分write_pcf8563(0x04,hou); //写时spit_time();display();delay(420);sec++;while(setup==0){scan();update();spit_time();display();}led=1;update();}}里面有关PCF8563的程序其实没作用,纯属凑数顺便发了个烟雾弹。
1602时钟程序和原理图
XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX 2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52X1CRYSTALC127pC227pR110kR21kC310uD 714D 613D 512D 411D 310D 29D 18D 07E 6R W 5R S 4V S S 1V D D 2V E E3LCD1LM016LRV11k用1602显示时钟,能调节时分秒,周年月日,P1^0是调节显示位置按一下到秒,第二下到分,。
依次第七次到年,每到一个位置可以通过P1^1、 P1^2来调节对应位置的数据,P1^1是加数据P1^2是减数据。
#include<reg52.h>#define uchar unsigned char #define uint unsigned int sbit rs=P2^0; sbit lcden=P2^2; sbit s1=P1^0; sbit s2=P1^1; sbit s3=P1^2;uchar count,s1num;uchar shi,fen,miao,zhou,ri,yue,nian; uchar code table[]=" 2001-01-01 1"; uchar code table1[]=" 00:00:00"; void delay(uint z) { uint x,y; for(x=0;x<z;x++) for(y=0;y<110;y++); }void w_com(uchar com) { rs=0; lcden=0; P3=com; delay(5); lcden=1;//给高脉冲 delay(5); lcden=0; }/********************************* 写指令*********************************/ void w_data(uchar date) { rs=1; lcden=0; P3=date; delay(5); lcden=1; delay(5); lcden=0; }/********************************* 写数据*********************************/ void init(){uchar num;lcden=0;//初始化使能为0//fen=59;//miao=52;//shi=23;zhou=1;ri=1;yue=1;nian=1;w_com(0x38);//写入显示模式指令码w_com(0x0c);//写入显示开/关及光标指令码w_com(0x06);//当写一个字符后,地址指针加一,光标加一,不动光标不闪烁w_com(0x01); //清零作w_com(0x80);//代表第一行第一位for(num=0;num<15;num++){w_data(table[num]);delay(5);}w_com(0x80+0x40);//代表第二行第一位for(num=0;num<12;num++){ w_data(table1[num]);delay(5);}TMOD=0x01;TH0=0x3c;TL0=0xb0;EA=1;ET0=1;TR0=1;}/*********************************初始化函数*********************************/void w_sfm(uchar add,uchar date)//时分秒{uchar shi,ge;shi=date/10;ge=date%10;w_com(0x80+0x40+add);w_data(0x30+shi);w_data(0x30+ge);}void w_zhou(uchar add,uchar date)//周{uchar z;z=date;w_com(0x80+add);w_data(0x30+z);}void w_ryn(uchar add,uchar date)//日{uchar shi,ge;shi=date/10;ge=date%10;w_com(0x80+add);w_data(0x30+shi);w_data(0x30+ge);}void keyscan(){if(s1==0)//闪烁位置{delay(5);if(s1==0){s1num++;while(!s1);if(s1num==1)//s1键按一下依次从秒分周日月时向左移{TR0=0;w_com(0x80+0x40+0x0b);w_com(0x0f);//左移光标开始闪烁}if(s1num==2){w_com(0x80+0x40+0x08);//w_com(0x0f);TR0=1;}if(s1num==3){w_com(0x80+0x40+0x05);//w_com(0x0f);TR0=1;}if(s1num==4){w_com(0x80+0x0e);TR0=1;}if(s1num==5){w_com(0x80+0x0b);TR0=1;}if(s1num==6){w_com(0x80+0x08);TR0=1;}if(s1num==7){w_com(0x80+0x05);TR0=1;}if(s1num==8){s1num=0;w_com(0x80+0x40+12);w_com(0x0c);//光标恢复原样,不闪烁TR0=1;}}}if(s1num!=0)//用于调节年月日时分秒{if(s2==0){delay(10);if(s2==0){while(!s2);if(s1num==1)//秒升调节{miao++;if(miao==60)miao=0;w_sfm(10,miao);w_com(0x80+0x40+11);}if(s1num==2)//分升调节{fen++;if(fen==60)fen=0;w_sfm(7,fen);w_com(0x80+0x40+8);}if(s1num==3)//时升调节{shi++;if(shi==24)shi=0;w_sfm(4,shi);w_com(0x80+0x40+5);}if(s1num==4)//周升调节{zhou++;if(zhou==8)zhou=1;w_zhou(14,zhou);w_com(0x80+14);}if(s1num==5)//日升调节{ri++;if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12){if(ri==32)ri=1;w_ryn(10,ri);w_com(0x80+11);}if(yue==2){if(ri==29)ri=1;w_ryn(10,ri);w_com(0x80+11);}if(yue==4||yue==6||yue==9||yue==11){if(ri==31)ri=1;w_ryn(10,ri);w_com(0x80+11);}}if(s1num==6)//月升调节{yue++;if(yue==13)yue=1;w_ryn(7,yue);w_com(0x80+8);}if(s1num==7)//年升调节{nian++;if(nian==99)nian=1;w_ryn(4,nian);w_com(0x80+5);}}}if(s3==0){delay(5);if(s3==0){while(!s3);if(s1num==1)//秒降调节{miao--;if(miao==-1)miao=59;w_sfm(10,miao);w_com(0x80+0x40+11);}if(s1num==2)//分降调节{fen--;if(fen==-1)fen=59;w_sfm(7,fen);w_com(0x80+0x40+8);}if(s1num==3)//时降调节{shi--;if(shi==-1)shi=23;w_sfm(4,shi);w_com(0x80+0x40+5);}if(s1num==4)//周降调节{zhou--;if(zhou==0)zhou=7;w_zhou(14,zhou);w_com(0x80+14);}if(s1num==5)//日降调节{ri--;if(ri==0)ri=31;w_ryn(10,ri);w_com(0x80+11);}if(s1num==6)//月降调节{yue--;if(yue==0)yue=12;w_ryn(7,yue);w_com(0x80+8);}if(s1num==7)//年降调节{nian--;if(nian==0)nian=99;w_ryn(4,nian);w_com(0x80+5);}}}}}void main(){init();while(1){keyscan();if(count==16){count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;zhou++;ri++;if(zhou==8){zhou=1;}w_zhou(14,zhou);if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12){if(ri==32){ri=1;yue++;if(yue==13){yue=1;nian++;if(nian==100)nian=1;w_ryn(4,nian);}w_ryn(7,yue);}w_ryn(10,ri);}if(yue==2){if(ri==29){ri=1;yue++;if(yue==13){yue=1;nian++;if(nian==100)nian=1;w_ryn(4,nian);}w_ryn(7,yue);}w_ryn(10,ri);}if(yue==4||yue==6||yue==9||yue==11){if(ri==31){ri=1;yue++;if(yue==13){yue=1;nian++;if(nian==100)nian=1;w_ryn(4,nian);}w_ryn(7,yue);}w_ryn(10,ri);}}w_sfm(4,shi);}w_sfm(7,fen);}w_sfm(10,miao);}}}void timer0() interrupt 1{TH0=0x3c;TL0=0xb0;count++;}。
1602液晶+DS1302时钟芯片+DS18B20温度传感器汇编源程序 原理图
附A: 原理图附B:汇编源程序; ―――――――――――――――――――――――――――――――; 温度值存放单元TEMP_ZH EQU 24H ;实时温度值存放单元TEMPL EQU 25H ;低温度值存放单元TEMPH EQU 26H ;高温度值存放单元TEMPHC EQU 29H ;存十位数BCD码TEMPLC EQU 2AH ;存个位数BCD码;―――――――――――――;=====DS1302通信引脚定义=====RST BIT p1.5SCLK BIT p1.7IO BIT p1.6;=====定义数据存储地址========DS1302_ADDR DATA 30H ;地址寄存器DS1302_DATA DA TA 31H ;数据寄存器TIME_YEAR DATA 32H ;年寄存器TIME_MONT DATA 33H ;月寄存器TIME_DAY DATA 34H ;天寄存器WEEK_DATA DATA 35H ;星期寄存器HOUR DATA 36H ;小时寄存器MINTUE DA TA 37H ;分钟寄存器SECOND DA TA 38H ;秒钟寄存器;=========显示数据缓冲地址============YEAR_HBUF DATA 40HYEAR_LBUF DATA 41HMONT_HBUF DATA 42HMONT_LBUF DA TA 43HDAY_HBUF DA TA 44HDAY_LBUF DATA 45HWEEK_HBUF DATA 46HWEEK_LBUF DA TA 47HHOUR_HBUF DA TA 48HHOUR_LBUF DA TA 49HMINTUE_HBUF DATA 4AHMINTUE_LBUF DA TA 4BHSECOND_HBUF DATA 4CHSECOND_LBUF DATA 4DH;===============================================X EQU 2FH ;LCD 地址变量;―――――――――――――;LCD控制引脚RS EQU P2.5RW EQU P2.6E EQU P2.7;―――――――――――――DQ EQU p1.0;=============主程序==============MAIN:ACALL SET_LCD ;LCD初始化设置子程序ACALL SET_1302 ;1302初始化TOOP: ACALL RESET_1820 ;调用18B20复位子程序ACALL TEMP_BJ ;显示温度标记"℃"ACALL MEU_OK ;调用显示"OK"信息子程序TOOP2:ACALL RE_TEMP ;调用读取温度数据子程序ACALL SET_DA TA ;调用处理显示温度数据子程序ACALL TEMP_BJ ;显示温度标记子程序LCALL RD_DS1302LCALL DATA_BUFLCALL DISPLAYSJMP TOOP2 ;循环;--------――读取温度数据子程序--------――RE_TEMP:ACALL RESET_1820 ;18B20复位子程序MOV A,#0CCH ;跳过ROM匹配ACALL WRITE_1820 ;写入子程序MOV A,#44H ;发出温度转换命令ACALL WRITE_1820 ;调写入子程序ACALL RESET_1820 ;调复位子程序MOV A,#0CCH ;跳过ROM匹配ACALL WRITE_1820 ;写入子程序MOV A,#0BEH ;发出读温度命令ACALL WRITE_1820 ;写入子程序ACALL READ_1820 ;调用读取子程序RET;--------温度数据处理显示子程序----------SET_DATA:ACALL CONV_TEMP ;处理温度BCD 码子程序ACALL DISP_BCD ;显示区BCD 码温度值刷新子程序ACALL CONV ;LCD显示子程序RET;―――――――――――――;----------处理温度BCD 码子程序----------CONV_TEMP:MOV A,TEMPH ;判温度是否零下ANL A,#80HJZ TC1 ;温度零转TC1处CLR C ;C=0MOV A,TEMPL ;二进制数求补(双字节)CPL A ;取反加1ADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,AJMP TC2;―――――――――――――TC1: MOV TEMPHC,#0AHTC2: MOV A,TEMPHCSW AP A ;高、低位交换MOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;乘0.0625MOV DPTR,#DOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=小数部分BCD ;―――――――――――――MOV A,TEMPL ;整数部分ANL A,#0F0H ;取出高四位SW AP A ;高、低位交换MOV TEMPL,AMOV A,TEMPHANL A,#0FH ;取出低四位SW AP A ;高、低位交换ORL A,TEMPL ;重新组合MOV TEMP_ZH,ALCALL HEX2BCD1MOV TEMPL,AANL A,#0F0H ;取出高四位SW AP A ;高、低位交换ORL A,TEMPHC ;TEMPHC LOW = 十位数BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;取出低四位SW AP A ;高、低位交换ORL A,TEMPLC ;TEMPLC HI = 个位数BCDMOV TEMPLC,AMOV A,R4JZ TC3ANL A,#0FH ;取出低四位SW AP A ;高、低位交换MOV R4,AMOV A,TEMPHC ;TEMPHC HI = 百位数BCDANL A,#0FH ;取出低四位ORL A,R4MOV TEMPHC,ATC3: RET;―――――――――――――HEX2BCD1:MOV B,#064H ;十六进制-> BCDDIV AB ;B= A % 100MOV R4,A ;R4 = 百位数MOV A,#0AHXCH A,BDIV AB ;B = A % BSW AP A ;高、低位交换ORL A,BRET;―――――――――――――; 小数部分码表DOTTAB:DB 00H,00H,01H,01H,02H,03H,03H,04HDB 05H,05H,06H,06H,07H,08H,08H,09H;--------显示区BCD 码温度值刷新子程序--------DISP_BCD:MOV A,TEMPLC ;个位数BCD码送入AANL A,#0FH ;取低位码MOV 70H,A ;小数位MOV A,TEMPLCSW AP A ;高、低位交换ANL A,#0FH ;取结果数的高位MOV 71H,A ;个位MOV A,TEMPHCANL A,#0FH ;取低位码MOV 72H,A ;十位MOV A,TEMPHCSW AP A ;高、低位交换ANL A,#0FH ;取结果数的高位MOV 73H,A ;百位MOV A,TEMPHCANL A,#0F0H ;取低位码CJNE A,#010H,DI0JMP DI2;―――――――――――――DI0: MOV A,TEMPHCANL A,#0FH ;取低位码JNZ DI2 ;十位数是0MOV A,TEMPHCSW AP A ;高、低位交换ANL A,#0FH ;取结果数的高位MOV 73H,#0AH ;符号位不显示MOV 72H,A ;十位数显示符号DI2: RET;==================================================;==========读1302子程序=================RD_DS1302:MOV DS1302_ADDR,#8DH ;读DS1302中的年LCALL READ ;调用读DS1302子程序MOV TIME_YEAR, DS1302_DA TA ;把读出的年数据存入年寄存器中MOV DS1302_ADDR,#8BH ;读DS1302中的星期LCALL READMOV WEEK_DA TA, DS1302_DA TA ;把读出的星期数据存入星期寄存器中MOV DS1302_ADDR,#89H ;读DS1302中的月LCALL READMOV TIME_MONT, DS1302_DATA ;把读出的月数据存入月寄存器中MOV DS1302_ADDR,#87H ;读DS1302中的天LCALL READMOV TIME_DAY, DS1302_DATA ;把读出的天数据存入天寄存器中MOV DS1302_ADDR,#85H ;读DS1302中的小时LCALL READMOV HOUR, DS1302_DATA ;把读出的天数据存入小时寄存器中MOV DS1302_ADDR,#83H ;读DS1302中的分钟LCALL READMOV MINTUE, DS1302_DATA ;把读出的天数据存入分钟寄存器中MOV DS1302_ADDR,#81H ;读DS1302中的秒钟LCALL READMOV SECOND, DS1302_DATA ;把读出的天数据存入秒钟寄存器中RET;===========按键子程序=================;=========数据分离后送显示缓存==================DA TA_BUF:MOV R0,TIME_YEAR ;年数据分离,送显示缓存LCALL DIVIDE ;调用数据分离子程序MOV YEAR_HBUF,R1MOV YEAR_LBUF,R2MOV R0,TIME_MONT ;月数据分离,送显示缓存LCALL DIVIDEMOV MONT_HBUF,R1MOV MONT_LBUF,R2MOV R0,TIME_DAY ;日数据分离,送显示缓存LCALL DIVIDEMOV DAY_HBUF,R1MOV DAY_LBUF,R2MOV R0,WEEK_DATA ;星期数据分离,送显示缓存LCALL DIVIDEMOV WEEK_HBUF,R1MOV WEEK_LBUF,R2MOV R0,HOUR ;小时数据分离,送显示缓存LCALL DIVIDEMOV HOUR_HBUF,R1MOV HOUR_LBUF,R2MOV R0,MINTUE ;分钟数据分离,送显示缓存LCALL DIVIDEMOV MINTUE_HBUF,R1MOV MINTUE_LBUF,R2MOV R0,SECOND ;秒钟数据分离,送显示缓存LCALL DIVIDEMOV SECOND_HBUF,R1MOV SECOND_LBUF,R2RET;=========日历显示子程序==========;===============年显示===============DISPLAY:MOV A,#10000001B ;设定年第1位的显示地址为第1行,第1列LCALL WR_COMM ;调用写指令到液晶子程序MOV A, #32H ;数字2的ASCII码LCALL WR_DATA ;调用写数据到液晶子程序MOV A,#10000010B ;设定年第2位的显示地址为第1行,第2列LCALL WR_COMMMOV A, #30H ;数字0的ASCII码LCALL WR_DATAMOV A,#10000011B ;设定年第3位的显示地址为第1行,第3列LCALL WR_COMMMOV A, YEAR_LBUF ;年的低位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DA TAMOV A,#10000100B ;设定年第4位的显示地址为第1行,第4列LCALL WR_COMMMOV A, YEAR_HBUF ;年的高位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DA TA; =====================斜线显示======================== MOV A,#10000101B ;设定斜线的显示地址为第1行,第5列LCALL WR_COMMMOV A,#2FH ;斜线的ASCII码LCALL WR_DA TA;================显示月============MOV A,#10000110B ;设定月第1位的显示地址为第1行,第6列LCALL WR_COMMMOV A, MONT_LBUF ;月的低位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DA TAMOV A,#10000111B ;设定月第2位的显示地址为第1行,第7列LCALL WR_COMMMOV A, MONT_HBUF ;月的高位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DA TA;=======================斜线显示============================ MOV A,#10001000B ;设定斜线的显示地址为第1行,第8列LCALL WR_COMMMOV A,#2FH ;斜线的ASCII码LCALL WR_DA TA;==============================天显示======================= MOV A,#10001001B ;设定天第1位的显示地址为第1行,第9列LCALL WR_COMMMOV A, DAY_LBUF ;天的低位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DA TAMOV A,#10001010B ;设定天第2位的显示地址为第1行,第10列LCALL WR_COMMMOV A, DAY_HBUF ;天的高位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DA TA;========================星期显示====================== MOV A,#10001111B ;设定星期第2位的显示地址为第1行,第13列LCALL WR_COMMMOV A, WEEK_DATA ;星期的高位缓存数据SUBB A,#1ADD A,#30H ;加30H修正取ASCII码LCALL WR_DATA;=======================小时显示============================ MOV A,#11000000B ;设定小时第1位的显示地址为第2行,第0列LCALL WR_COMMMOV A, HOUR_LBUF ;小时的低位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DA TAMOV A,#11000001B ;设定小时第2位的显示地址为第2行,第1列LCALL WR_COMMMOV A, HOUR_HBUF ;小时的高位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DATA;====================== 冒号的显示========================== MOV A,#11000010B ;设定冒号的显示地址为第2行,第2列LCALL WR_COMMMOV A, #3AH ;冒号的ASCII码LCALL WR_DATA;==================== 分钟显示======================MOV A,#11000011B ;设定分钟第1位的显示地址为第2行,第3列LCALL WR_COMMMOV A, MINTUE_LBUF ;分钟的低位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DA TAMOV A,#11000100B ;设定分钟第2位的显示地址为第2行,第4列LCALL WR_COMMMOV A, MINTUE_HBUF ;分钟的高位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DATA;====================== 冒号的显示=========================== MOV A,#11000101B ;设定冒号的显示地址为第2行,第5列LCALL WR_COMMMOV A, #3AH ;冒号的ASCII码LCALL WR_DATA;===================== 秒钟显示============================= MOV A,#11000110B ;设定秒钟第1位的显示地址为第2行,第6列LCALL WR_COMMMOV A, SECOND_LBUF ;秒钟的低位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DATAMOV A,#11000111B ;设定秒钟第2位的显示地址为第2行,第7列LCALL WR_COMMMOV A, SECOND_HBUF ;秒钟的高位缓存数据ADD A,#30H ;加30H修正取ASCII码LCALL WR_DA TARET;――――――――DS18B20复位初始化子程序――――――――――RESET_1820: ;复位(有具体的时序要求)SETB DQNOPCLR DQ;―――――――――――――;主机发出延时537微秒的复位低脉冲MOV R1,#3DL Y: MOV R0,#107DJNZ R0,$DJNZ R1,DL Y;―――――――――――――;然后拉高数据线SETB DQNOPNOPNOP;―――――――――――――;等待DS18B20回应MOV R0,#25HT2: JNB DQ ,T5DJNZ R0, T2;―――――――――――――;时序要求延时一段时间T5: MOV R0,#117T6: DJNZ R0,T6;――――――――――――――T7: SETB DQRET;=======================================================;========DS1302初始化===========SET_1302:MOV DS1302_ADDR, #8EH ;写DS1302控制指令MOV DS1302_DA TA, #00H ;写数据到DS1302的8E控制寄存器中,允许对其进行写操作LCALL WRITE ;调用写DS1302子程序MOV DS1302_ADDR, #90H ;写DS1302控制指令MOV DS1302_DA TA,#0A6H ;写数据到DS1302的90控制寄存器中,对电池涓流充电,充电电流为1.1mALCALL WRITE ;调用写DS1302子程序RET;=========查询忙碌标志============CHECK_BUSY:PUSH ACCBUSY_LOOP:CLR ESETB RWCLR RSSETB EMOV A, p0JB p0.7,BUSY_LOOPPOP ACCLCALL DELRET;---------------------------------------------------------------------------------------------- ;===========延时程序===================DEL:MOV R6,#5L1:MOV R7,#248DJNZ R7,$DJNZ R6,L1RET;――――――――――写入DS18B20子程序―――――――――――;写入DS18B20(有具体的时序要求)WRITE_1820:MOV R2,#8 ;一共8位数据CLR C ;C=0WR1:CLR DQ ;总线低位,开始写入MOV R3,#6DJNZ R3,$ ;保持16微秒以上RRC A ;把字节DATA分成8个BIT环移给CMOV DQ, C ;写入一个BITMOV R3,#23DJNZ R3,$ ;等待SETB DQ ;重新释放总线NOPDJNZ R2,WR1 ;写入下一个BITSETB DQ ;释放总线RET;――――――――――读出DS18B20子程序―――――――――――;将温度值从DS18B20中读出(有具体的时序要求)READ_1820:MOV R4,#4MOV R1,#TEMPL ;存入25H、26H、27H、28HRE0:MOV R2,#8 ;数据一共有8位RE1:CLR CSETB DQNOPNOPCLR DQ ;读前总线保持为低位NOPNOPNOPSETB DQ ;总线释放;―――――――――――――MOV R3,#9DJNZ R3,$ ;延时18微妙MOV C, DQ ;从总线读到一个BIT ;―――――――――――――MOV R3,#23 ;DJNZ R3,$ ;等待50微秒RRC A ;把读得的位值环移给ADJNZ R2,RE1 ;读下一个BITMOV @R1,AINC R1 ; R1内数据递增DJNZ R4,RE0RET;===========LCD 1602 显示程序===========;初始化设置SET_LCD:CLR ECALL INIT_LCD ;初始化LCDCALL STORE_DA TA ;将自定义字符存入LCD的CGRAMRET;-----------LCD 初始化子程序-----------INIT_LCD:MOV A,#38H ;设置8位、2行、5x7点阵ACALL WR_COMM ; 调用写指令子程序ACALL DELAY1 ;调用延时子程序MOV A,#0CH ;开显示,光标不闪烁ACALL WR_COMM ;调用写指令子程序;ACALL DELAY1 ;调用延时子程序MOV A,#01H ;清除LCD 显示屏ACALL WR_COMM ;调用写指令子程序;ACALL DELAY1 ;调用延时子程序RET;----------显示温度标记子程序-----------TEMP_BJ:MOV A, #0CEH ;设定第二行起始地址ACALL WR_COMM ;调用写指令子程序MOV DPTR,#BJ ;存代码表MOV R1 ,#0 ;使指针指到表中第一个码MOV R0 ,#2 ;取码次数Tp0:MOV A,R1 ;A为0MOVC A,@A+DPTR ;取码ACALL WR_DATA ;调用写数据子程序INC R1 ;R1值加1DJNZ R0,Tp0 ;判断是否将代码读取完?RET;―――――――――――――BJ: ;代码表DB 00H,"C";-----------自定义字符子程序-----------;将自定义字符写入LCD1602的CGRAM中STORE_DATA:MOV A,#40H ;指定CG RAM起始地址ACALL WR_COMM ;将指令写入LCDMOV R2,#08H ;图形数据长度8个字节MOV DPTR,#TAB ;存代码表MOV R3,#00H ;使指针指到表中第一个码S_D: MOV A,R3 ;A为0MOVC A,@A+DPTR ;读取表代码ACALL WR_DA TA ;调用写入数据指令INC R3 ;R3值加1DJNZ R2, S_D ;判断是否将代码读取完?RET ;;―――――――――――――TAB: ;代码表DB 0CH,12H,12H,0CHDB 00H,00H,00H,00H;-----------显示"OK"信息子程序---------MEU_OK:MOV DPTR,#M_OK1 ;指针指到显示消息MOV A,#1 ;显示在第一行ACALL LCD_PRINT ;LCD显示MOV DPTR,#M_OK2 ;指针指到显示消息MOV A,#2 ;显示在第一行ACALL LCD_PRINT ;LCD显示RET;――――――――――――――M_OK1:DB " - - WK: " ,0M_OK2:DB " - - ",0;------―――――菜单显示子程序―――――――-----;在LCD的第一行或第二行显示字符LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行LINE1:ACALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD 的第一行地址ACALL WR_COMM ;写入命令JMP FILLLINE2:ACALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置LCD 的第二行地址ACALL WR_COMMFILL:CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1:ACALL WR_DATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;---------―LCD显示子程序----------CONV:MOV A,73H ;加载百位数据MOV X,#9 ;设置位置CJNE A,#1,CO1JMP CO2CO1:MOV A,#" "MOV B,XACALL LCDP2JMP CO3CO2:ACALL SHOW_LINE2 ;显示数据CO3: INC X ;位加1MOV A,72H ;十位ACALL SHOW_LINE2 ;显示数据INC X ;位加1MOV A, 71H ;个位ACALL SHOW_LINE2 ;显示数据INC X ;位加1MOV A,#'.'MOV B,XACALL LCDP2 ;显示字符MOV A,70H ;加载小数点位INC X ;设置位置ACALL SHOW_LINE2 ;显示数据RET;-----――显示第二行-----―――;在LCD 的第二行显示数字SHOW_LINE2:ADD A,#30HMOV B,XACALL LCDP2RETLCDP2: ;在LCD的第二行显示字符PUSH ACC ;放入堆栈MOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址ACALL WR_COMM ;写入命令POP ACC ;由堆栈取出AACALL WR_DATA ;写入数据RET;-----――――――写指令子程序――――――――――--WR_COMM:MOV p0,A ;写入指令CLR RS ;RS=0,选择指令寄存器CLR RW ;RW=0,选择写模式SETB E ;E=1,允许读/写LCMACALL DELAY1 ;延时5MSCLR E ;E=0,禁止读/写LCMRET;---------―――写数据子程序------------WR_DATA:MOV p0,A ;写入数据SETB RS ;RS=1,选择数据寄存器CLR RW ;RW=0,选择写模式SETB E ;E=1,允许读/写LCMACALL DE ;延时0.5MSCLR E ;E=0,禁止读/写LCMACALL DE ;延时0.5MSRET;----------清除LCD 的字符-------------CLR_LINE:MOV R0,#24 ;设置计数值CL1: MOV A,#' ' ;载入空格符至LCDACALL WR_DATA ;输出字符至LCDDJNZ R0,CL1 ;判断RET;--------------CLR_LINE1: ;清除LCD的第一行字符MOV A,#80H ;设置LCD 的第一行地址ACALL WR_COMM ;调用写指令子程序MOV R0,#24 ;设置计数值C1: MOV A,#' ' ;载入空格符至LCDACALL WR_DA TA ;输出字符至LCDDJNZ R0,C1 ;计数结束RET;========================================================= ;***********写1302程序*************WRITE:CLR SCLKNOPSETB RSTNOPMOV A,DS1302_ADDRMOV R4,#8WRITE1:RRC A ;送地址给1302NOPNOPCLR SCLKNOPNOPNOPMOV IO,CSETB SCLK ;送入地址在时钟上升沿有效NOPNOPNOPNOPDJNZ R4,WRITE1CLR SCLKNOPMOV A,DS1302_DA TAMOV R4,#8WRITE2:RRC ANOP ;送数据给1302,时钟上升沿,数据输入CLR SCLKNOPNOPMOV IO,CNOPNOPNOPSETB SCLKNOPNOPDJNZ R4,WRITE2CLR RSTCLR ARET;**********读1302程序************READ:CLR SCLKNOPNOPSETB RSTNOPMOV A,DS1302_ADDRMOV R4,#8READ1:RRC ANOPMOV IO,CNOPNOPNOPSETB SCLK ;送入地址在时钟上升沿有效NOPNOPNOPCLR SCLKNOPNOPDJNZ R4,READ1 ;判断8位数据是否传送完?MOV R4,#8READ2:CLR SCLKNOPNOPNOPMOV C,IONOPNOPNOPNOPNOP ;从ds1302中读取数据,时钟下降沿有效RRC ANOPNOPNOPNOPSETB SCLKNOPDJNZ R4,READ2 ;判断8位数据是否传送完?MOV DS1302_DATA,ACLR RSTRET;==========分离数据子程序=========DIVIDE:MOV A,R0ANL A,#0FH ;屏蔽掉低4位,留下高4位MOV R1,AMOV A,R0SW AP A ;A中数据高4位与低4位互换ANL A,#0FH ;实际上是屏蔽掉了高4位,留下低4位MOV R2,ARET;========延时2秒子程序=============DELAY2:MOV R5,#20D3:MOV R6,#200D2:MOV R7,#250DJNZ R7,$DJNZ R6,D2DJNZ R5,D3RET;-------------鸣响子程序------------DEX1: MOV R7,#180DE2: NOPDJNZ R7,DE2RET;-------------延时子程序-------------DELAY: ;延时时间为:R5×10MSDL1: MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R5,DELAYRET;―――――――――――――DELAY1: ;延时时间为5MSMOV R6,#25DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RET;―――――――――――――DE:MOV R7,#250 ;延时时间为0.5MSDJNZ R7,$RET;-----------――END。
89C51+LCD1602+DS1302+DS18B20多功能电子钟综合
实验二十三LCD1602+DS1302+DS18B20多功能电子钟综合实验一.实验目的:做一个可以显示温度的多功能电子钟。
二.实验电路图:键盘接线图LCD1602接线图华南理工大学无线电爱好者协会F D R 工作室Ds1302和ds18b20接线图三、硬件接线图:1602及18b20的连接华南理工大学无线电爱好者协会F D R 工作室蜂鸣器连接按键及ds1302连接四、实验原理:华南理工大学无线电爱好者协会F D R 工作室前面我们做了那么多的实验,好像都只是不实用的东西。
现在这个就实用了,LCD1602+DS1302+DS18B20多功能电子钟综合实验 。
DS1302的精度可达到一天只差一秒,(当然在常温下,其精度取决于你的晶振的精度。
)而DS18B20的测温精度是0.0625度。
所以整个系统的精度还是很高的。
我们还要什么功能呢?可以显示时间和温度了,那时间慢了,怎么办?所以要键盘啦,可以修改时间。
还要什么功能呢?闹钟,可以通过键盘来设定闹钟。
闹钟的声音通过蜂鸣器发出来。
那么这个系统就完善了。
当然可以用蜂鸣器发出音乐来,这里我就不加这个进去了,让你们来加吧。
下面我就先介绍一下这个系统的用法了。
首先,显示屏(LCD1602)上要显示时间温度,第一行显示:DAT :日期 星期,第二行显示:时间 温度。
其次,我们可以修改时间,包括修改闹钟的时间:按下0修改秒,按下1修改分,按下2修改时,按下3修改日,按下4修改月份,按下5修改星期,按下6修改年份,按下7修改闹钟的时间。
进入修改界面后,键15是确定键,键14是取消键,键13是推出键,键13是闹钟的功能取消(如果想再开闹钟的话,重新修改闹钟时间就行了)。
修改界面中,第一行是提示修改什么,第二行显示你要修改的内容的当前数据和你键入的数据。
闹钟响了之后按下按键8-15中的任意一个就可以使闹钟停止闹铃了.五、源程序: #include <reg52.h> #include <intrins.h> #define MSB 0x80 //读忙位 #define HIGH 1 #define LOW 0//*****************************************#define DATA_MODE 0x28 //LCD 模式设置,0x28位四位数据线模式#define OPEN_SCREEN 0x0C //打开LCD 显示 #define DISPLAY_ADDRESS 0x80 //写地址指令#define CLEARSCREEN LCD_en_com(0x01) //清屏//***********//LCD1602的接线//***************************** #define LCDIO P0 //LCD1602的高四位接在P0口的高四位sbit LCD1602_RS=P0^0; //RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
1602电子时钟电路_原理图_PCB图
1602电子时钟电路_原理图_PCB图一、引言电子时钟作为现代生活中常见的时间显示设备,广泛应用于各个领域。
本篇文章将着重介绍1602电子时钟的电路原理图和PCB设计图,旨在让读者了解该电子时钟的工作原理和实现方法。
二、电路原理图1602电子时钟的电路主要由以下几个模块组成:时钟源、微处理器、液晶显示屏和按键控制模块。
下面将对每个模块进行详细的介绍。
1. 时钟源模块时钟源模块是电子时钟的核心,用于提供准确的时间信号。
常见的时钟源模块有晶振和RTC(实时时钟)芯片。
晶振通常使用32.768kHz的石英晶体,通过振荡脉冲产生稳定的时间基准。
而RTC芯片则内部集成了时钟电路,能够提供准确的时间信号。
2. 微处理器模块微处理器模块负责控制整个电子时钟的运行。
常用的微处理器有单片机和微控制器。
单片机通常具有丰富的外设接口和可编程功能,适用于复杂的时钟控制需求。
而微控制器则在单芯片上集成了微处理器核心、存储器和外设接口,更加简易和紧凑。
3. 液晶显示屏模块液晶显示屏模块用于将时间信息以数字形式显示出来。
1602液晶显示屏是基于字符型液晶显示技术,具有两行十六个字符的显示能力。
其工作原理是通过外部电压的作用,控制液晶分子的排列来实现显示效果。
4. 按键控制模块按键控制模块允许用户通过按键来设定和调整电子时钟的功能和显示参数。
它通常包括多个按键、键盘扫描接口和按键控制电路。
三、PCB图设计PCB图是电子时钟电路的物理实现图,能够直观地显示所有元器件之间的连接和布局关系。
本节将介绍1602电子时钟的PCB图设计过程。
1. 元器件布局在PCB设计之前,需要对各个元器件进行布局。
首先,将时钟源模块与微处理器模块放置在一起,以便于时钟信号的输入和处理。
其次,根据液晶显示屏的位置要求,将其与微处理器模块相连接。
最后,将按键控制模块与微处理器模块相连,并设置按键的位置。
2. 连接导线通过导线将各个元器件进行连接。
导线的设计应考虑信号的传输距离、屏蔽和抗干扰等因素,以保证电子时钟的稳定性和可靠性。
用1602LCD设计的可调式电子钟
单片机应用课程设计说明书用1602LCD设计的可调式电子钟专业自动化学生姓名班级自动化142学号 14100指导教师蒋完成日期 20年1 月23 日目录1 概述 (3)2 课题研究背景与意义 (3)2.1 课题研究背景 (3)2.2 课题研究意义 (3)3 系统方案设计与主要设计工作 (3)3.1 设计任务 (3)3.2 功能要求说明 (4)4设计课题总体方案 (4)4.1硬件设计方案 (5)4.2系统软件设计 (7)5. 软件仿真及实物设计调试 (9)5.1PROTUES仿真软件介绍 (9)5.2仿真运行结果说明 (10)5.3实物设计结果与调试 (11)6课程设计实验总结 (11)参考文献 (13)附录 (14)附录1:程序清单 (14)附录2:系统电路原理图 (21)附录3:元器件清单 (22)用1602LCD设计电子钟1 概述数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。
数字钟的精度、稳定度远远超过老式机械钟。
在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,定时器计数。
在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。
数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
2 课题研究背景与意义2.1 课题研究背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
LCD1602液晶电子时钟
物理与电子信息学院课程设计报告书姓名:班级:学号:时间:2010年11月电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过三个模块:键盘、芯片、显示屏即可满足设计要求。
原理如图一所示。
3.2.各部分功能实现3.2.1.控制部分(AT89C52)单片机采用52系列单片机。
由ATMEL公司生产的AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
在单芯片上,拥有灵巧的8 位CPU 和在线系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。
AT89S52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
而且,它还具有一个看门狗(WDT)定时/计数器,如果程序没有正常工作,就会强制整个系统复位,还可以在程序陷入死循环的时候,让单片机复位而不用整个系统断电,从而保护你的硬件电路。
单片机最小系统单片机最小系统主要由复位电路,晶振电路,电源等几部分组成。
1)复位电路复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方式。
如图二所示:图二复位电路2)晶振电路晶振电路原理图三:图三晶振模块原理图选取原则:电容选取30pF,晶振为12MHz。
3)电源AT89S52单片机的供电电源是5V的直流电。
4)EA非/Vpp 脚我们没有用外部扩展ROM,因此EA非/Vpp为高电平,即接+5V电源。
Arduino入门笔记(5):1602液晶实验(实现时钟)
Arduino⼊门笔记(5):1602液晶实验(实现时钟)欢迎加⼊讨论群 64770604⼀、本次实验所需器材2、1602液晶板:也叫1602字符型液晶,它是⼀种专门⽤来显⽰字母、数字、符号等的点阵型液晶模块。
它由若⼲个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显⽰⼀个字符,每位之间有⼀个点距的间隔,每⾏之间也有间隔,起到了字符间距和⾏间距的作⽤,正因为如此所以它不能很好地显⽰图形。
⽬前,尽管各⼚家对其各⾃产品命名不尽相同,但均提供⼏乎都同样规格的1602模块或者兼容模块。
1602最初采⽤的LCD控制器是HD44780,在各⼚家⽣产的1602模块中,基本上也都采⽤了与之兼容的控制IC,所以从特性上基本上是⼀样的。
因此,我们买到的1602模块,在端⼝标记上可能有所不同,有的从左向右,有的从右向左,但特性上是⼀样的。
本实验中使⽤的1602板,最⾥⾯的孔为1号,最靠近边上的那个为16号。
1602实物图⽚:1602的规格情况:显⽰容量16*2个字符芯⽚⼯作电压 4.5-5.5V⼯作电流2,0MA(5.0V)模块最佳⼯作电压 5.0V字符尺⼨ 2.95*4.35(WXH)mm1602管脚介绍:第1脚:VSS为电源负极第2脚:VCC接5V电源正极第3脚:V0为液晶显⽰器对⽐度调整端,接正电源时对⽐度最弱,接地电源时对⽐度最⾼(对⽐度过⾼时会产⽣“⿁影”,使⽤时可以通过⼀个10K的电位器调整对⽐度,本实验使⽤了⼀个1KΩ电阻)。
第4脚:RS为寄存器选择,⾼电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,⾼电平(1)时进⾏读操作,低电平(0)时进⾏写操作。
第6脚:E(或EN)端为使能(enable)端,⾼电平(1)时读取信息,负跳变时执⾏指令。
第7~14脚:D0~D7为8位双向数据端。
第15~16脚:背灯电源。
15脚背光正极,16脚背光负极。
1602字符集介绍:1602液晶模块内部的字符发⽣存储器已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英⽂字母的⼤⼩写、常⽤的符号、和⽇⽂假名等,每⼀个字符都有⼀个固定的代码,⽐如⼤写的英⽂字母“A”的代码是01000001B(41H),显⽰时模块把地址41H中的点阵字符图形显⽰出来,我们就能看到字母“A”。
用1602LCD设计的可调式电子钟
单片机应用课程设计说明书用1602LCD 设计的可调式电子钟专业 自动化学生 班级 自动化142 学号 14100 指导教师完成日期 20年1月23 日目录1 概述 (3)2 课题研究背景与意义 (3)2.1 课题研究背景 (3)2.2 课题研究意义 (3)3 系统方案设计与主要设计工作 (3)3.1 设计任务 (3)3.2 功能要求说明 (4)4设计课题总体方案 (4)4.1硬件设计方案 (5)4.2系统软件设计 (7)5. 软件仿真及实物设计调试 (9)5.1PROTUES仿真软件介绍 (9)5.2仿真运行结果说明 (10)5.3实物设计结果与调试 (11)6课程设计实验总结 (11)参考文献 (13)附录 (14)附录1:程序清单 (14)附录2:系统电路原理图 (21)附录3:元器件清单 (22)用1602LCD设计电子钟1 概述数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。
数字钟的精度、稳定度远远超过老式机械钟。
在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,定时器计数。
在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。
数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
2 课题研究背景与意义2.1 课题研究背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
制作一个采用LCD1602显示的电子钟
计算机科学与工程系实验报告实验题目:制作一个采用LCD1602显示的电子钟班级:姓名:学号:日期:一、实验目的掌握单片机使用定时器/计数器控制字符型液晶显示器LCD1602的设计与软件编程二、实验要求在LCD上显示当前的时间。
显示格式为“时时:分分:秒秒”。
设有4个功能键k1~k4,功能如下:(1)k1——进入时间修改。
(2)k2——修改小时,按一下k2,当前小时增1。
(3)k3——修改分钟,按一下k3,当前分钟增1。
(4)k4——确认修改完成,电子钟按修改后的时间运行显示。
三、实验要求提交的实验报告中应包括:电路原理图、实验设计思路、C51源程序(含注释语句)、运行效果(含运行截图与说明)、实验小结三、硬件电路原理图的设计四、编程思路及C51源程序编程思路:1、实现当按下K1之后,使中断T0停止计数2、实现当按下K2之后,使小时加一3、实现当按下K3之后,使分钟加一4、实现当按下K4之后,使中断T0恢复计数源程序:#include<reg51.h>#ifndef LCD_CHAR_1602_2005_4_9#define LCD_CHAR_1602_2005_4_9#define uchar unsigned char#define uint unsigned intsbit lcdrs = P2^0;sbit lcdrw = P2^1;sbit lcden = P2^2;void delay(uint z)//延时函数,此处使用晶振为11.0592MHz {uint x,y;for(x=z;x>0;x--){for(y=110;y>0;y--){;}}}void write_com(uchar com) //写入指令数据到lcd{lcdrw=0;lcdrs=0;P3=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date) //写入字符显示数据到lcd{lcdrw=0;lcdrs=1;P3=date;delay(5);lcden=1;delay(5);lcden=0;}void init1602()//1602液晶初始化设定{lcdrw=0;lcden=0;write_com(0x3C);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);}/*void write_string(uchar *pp,uint n)//采用指针的方法输入字符,n为字符数目{int i;for(i=0;i<n;i++)write_data(pp[i]);}*/void write_sfm(uchar add,uchar date)//向指定地址写入数据{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}#endif#define uchar unsigned char#define uint unsigned intsbit Key1 = P1^0;sbit Key2 = P1^1;sbit Key3 = P1^2;sbit Key4 = P1^3;uchar int_time;//定义中断次数计数变量uchar second;//秒计数变量uchar minute;//分钟计数变量uchar hour;//小时计数变量uchar code date[]=" H.I.T. CHINA ";//LCD第1行显示的内容uchar code time[]=" TIME 23:59:55 ";//LCD第2行显示的内容uchar second=55,minute=59,hour=23;void clock_init(){uchar i,j;for(i=0;i<16;i++){write_data(date[i]);}write_com(0x80+0x40);for(j=0;j<16;j++){write_data(time[j]);}}void clock_write( uint s, uint m, uint h){write_sfm(0x47,h);write_sfm(0x4a,m);write_sfm(0x4d,s);}void Keyscan1(){if(Key1==0) {delay(10);if(Key1==0) while(!Key1); TR0=0;}if(Key4==0) {delay(10);if(Key4==0) while(!Key4); TR0=1;}if(Key3==0){delay(10);if(Key3==0)while(!Key3);minute++;if(minute==60)minute=0;} if(Key2==0){delay(10);if(Key2==0)while(!Key2);hour++;if(hour==24)hour=0;}}void main(){init1602();//LCD初始化clock_init();//时钟初始化TMOD=0x01;//设置定时器T0为方式1定时EA=1; // 总中断开ET0=1; // 允许T0中断TH0=(65536-46483)/256;//给T0装初值TL0=(65536-46483)%256;TR0=1;int_time=0;//中断次数、秒、分、时单元清0second=55;minute=59;hour=23;while(1){clock_write(second ,minute, hour);Keyscan1();}}void T0_interserve(void) interrupt 1 using 1 //T0中断服务子程序{int_time++;//中断次数加1if(int_time==20) //若中断次数计满20次{int_time=0; //中断次数变量清0second++;//秒计数变量加1}if(second==60)//若计满60s{second=0; //秒计数变量清0minute ++;//分计数变量加1}if(minute==60)//若计满60分{minute=0;//分计数变量清0hour ++;//小时计数变量加1}if(hour==24){hour=0;//小时计数计满24,将小时计数变量清0 }TH0=(65536-46083)/256;//定时器T0重新赋值TL0=(65536-46083)%256;}五、仿真运行效果展示仿真初始状态按下k1键,进入修改模式六、实验小结通过本次实验,我掌握了LCD1602编程的方法,将所学知识运用到实践中,这是一件慢慢的过程,首先要把理论知识理解透彻,然后就是例题看懂,弄懂举一反三。
基于proteus仿真1602液晶电子时钟(附1602字符液晶详细资料)
基于proteus仿真1602液晶电子时钟(附1602字符液晶详细资料)#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a};sbit rs=P2^0;sbit rw=P2^1;sbit e=P2^2;uchar hshi,hge, mshi,mge,shi, ge,num,num1,num2,aa;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void lcd_com(uchar com) {rs=0;rw=0;P1=com;delay(1);e=1;e=0;}void lcd_dat(uchar dat) {rs=1;rw=0;P1=dat;delay(1);e=1;e=0;}void init(){lcd_com(0x38);delay(1);lcd_com(0x0c);delay(1);lcd_com(0x01);delay(1);TMOD=0X01;TH1=(65536-50000)/256; TL1=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void display(uchar hshi,uchar hge,uchar mshi,uchar mge,uchar shi,uchar ge){lcd_com(0x80);lcd_dat(table[hshi]);lcd_com(0x81);lcd_dat(table[hge]);lcd_com(0x82);lcd_dat(table[10]);lcd_com(0x83);lcd_dat(table[mshi]);lcd_com(0x84);lcd_dat(table[mge]);lcd_com(0x85);lcd_dat(table[10]);lcd_com(0x86);lcd_dat(table[shi]);lcd_com(0x87);lcd_dat(table[ge]);}void main(){init();while(1){if(aa==20){aa=0;num++;num2=3;num1=34;if(num==60){num=0;num1++;if(num1==60){num1=0;num2++;if(num==24) {num2=0;}}}hshi=num2/10;hge=num2%10;mshi=num1/10;mge=num1%10;shi=num/10;ge=num%10;}display(hshi,hge,mshi,mge,shi,ge);}}void timer0() interrupt 1{TH0=(65536-50000)/256;TH0=(65536-50000)/256;aa++;}所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。
基于1602液晶的电子时钟设计
2012 ~ 2013 学年第2 学期《单片机原理及应用》课程设计报告题目:基于1602液晶的电子时钟设计专业:自动化班级:电气工程系2011年5月12日1、任务书课题名称基于1602液晶的电子时钟设计指导教师(职称)执行时间2012~2013 学年第2学期第10 周学生姓名学号承担任务摘要电子时钟在日常生活和工农业生产中是必不可少的。
所以本文利于89C51单片机作为核心控制芯片,设计了一款基于1602LCD液晶显示的电子时钟。
该时钟具有键盘控制的暂停和启动,时钟、分钟和秒钟的手动调节功能;同时具备到整时(如1点整,2点整)时蜂鸣器发出“滴答”声,并且一个发光二极管发出闪烁。
所以设计最后在Protues仿真软件上仿真,验证该设计的正确性,关键词:电子时钟,LCD1602液晶,仿真。
基于1602液晶的电子时钟设计目录摘要 (2)绪论 (4)第一章设计要求与方案论证 (5)1.1 设计要求 (5)1.2 系统基本方案选择 (5)1.2.1 单片机芯片的选择方案 (5)1.2.2 显示模块选择方案 (5)1.2.3 时钟的控制方案 (5)1.3 电路设计最终方案决定 (5)第二章主要元件介绍 (7)2.1 单片机STC89C52介绍 (7)2.1.1 STC89C52主要功能 (7)2.1.2 STC89C52引脚介绍 (7)2.1.3 STC89C52最小系统 (9)2. 2 1602字符液晶介绍 (10)2.2.1 1602液晶概述 (10)2.2.2 1602引脚介绍 (10)2.2.3 1602字符液晶使用方法 (11)第三章系统硬件设计 (13)3.1 单片机控制系统 (13)3.2.各部分功能实现 (13)3.2.1.控制部分(STC89C52) (13)3.2.2键盘控制系统设计 (14)3.2.3.显示电路 (14)3.2.4.整点提醒电路 (15)3.3. 总电路原理图 (16)第四章软件设计及仿真 (17)4.1 软件主要要完成的功能 (17)4.2软件设计的主要流程 (17)4.3 仿真显示效果 (18)总结 (19)参考文献 (20)附录 (21)绪论20世纪末,电子技术获得了飞速发展,在其推动下,现代电子产品几乎深入到社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也是现代产品性能进一步提高,产品更新换代的节奏也越来越快。
基于单片机的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电子时钟。
基于单片机的1602电子时钟设计
基于单片机的1602电子时钟设计一.实验目的:(1)用单片机设计基于单片机的1602电子时钟显示;(2)熟练掌握Keil软件;(3)熟练掌握Proteus软件仿真;(4)掌握单片机的I/O接口的工作原理;(5)掌握LCD显示器的原理和编程方法;(6)掌握独立式键盘的工作原理和编程方法;(7)掌握单片机下载方法;二.实验要求(1)可实现时钟显示(2)可调整时间三.实验内容(1)画仿真图如图1图1(2)编写程序(3)下载运行(4)运行结果,分析其中的错误四.程序(一)#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit LCD_RS=P2^0;sbit LCD_RW=P2^1 ;sbit LCD_EN=P2^2;void Delay_ms(uint xms) ;bit lcd_busy();void lcd_wcmd(uchar cmd);void lcd_wdat(uchar dat) ;void lcd_clr() ;void lcd_init() ;/********以下是延时函数********/void Delay_ms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}/********以下是LCD忙碌检查函数********/bit lcd_busy(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;_nop_(); _nop_(); _nop_(); _nop_();result = (bit)(P0&0x80);LCD_EN = 0;return result;}/********以下是写指令寄存器IR函数********/void lcd_wcmd(uchar cmd){while(lcd_busy());LCD_RS = 0; LCD_RW = 0; LCD_EN = 0;_nop_(); _nop_();P0 = cmd;_nop_(); _nop_(); _nop_(); _nop_();LCD_EN = 1;_nop_(); _nop_(); _nop_(); _nop_();LCD_EN = 0;}/********以下是写寄存器DR函数********/void lcd_wdat(uchar dat){while(lcd_busy());LCD_RS = 1; LCD_RW = 0; LCD_EN = 0;P0 = dat;_nop_(); _nop_(); _nop_(); _nop_();LCD_EN = 1;_nop_(); _nop_(); _nop_(); _nop_();LCD_EN = 0;}/********以下是LCD清屏函数********/void lcd_clr(){lcd_wcmd(0x01); //清除LCD的显示内容Delay_ms(5);}/********以下是LCD初始化函数********/void lcd_init(){Delay_ms(15); //等待LCD电源稳定lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据Delay_ms(5);lcd_wcmd(0x38);Delay_ms(5);lcd_wcmd(0x38);Delay_ms(5);lcd_wcmd(0x0c); //显示开,关光标Delay_ms(5);lcd_wcmd(0x06); //移动光标Delay_ms(5);lcd_wcmd(0x01); //清除LCD的显示内容Delay_ms(5);}(二)#include <reg51.h>#include "LCD_drive.h"#define uchar unsigned char#define uint unsigned intuchar year=12,mon=10,day=10,hour=12,min=00,sec=00;uchar count_10ms;sbit k7=P3^0; sbit k1=P3^2; sbit k2=P3^3; sbit k3=P3^4;sbit k4=P3^5; sbit k5=P3^6; sbit k6=P3^7; bit k1_flag=0;uchar code line1_data[] = {"----"};uchar code line2_data[] = {"****"};uchardisp_buf[12]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; void LCD_conv(char in1,in2,in3,in4,in5,in6){disp_buf[0]=in1/10+0x30; disp_buf[1]=in1%10+0x30; disp_buf[2]=in2/10+0x30; disp_buf[3]=in2%10+0x30; disp_buf[4]=in3/10+0x30; disp_buf[5]=in3%10+0x30; disp_buf[6]=in4/10+0x30; disp_buf[7]=in4%10+0x30; disp_buf[8]=in5/10+0x30; disp_buf[9]=in5%10+0x30; disp_buf[10]=in6/10+0x30; disp_buf[11]=in6%10+0x30; }void LCD_disp(){lcd_wcmd(0x04|0x80);lcd_wdat(disp_buf[0]); lcd_wdat(disp_buf[1]);lcd_wdat(0xb0);lcd_wdat(disp_buf[2]); lcd_wdat(disp_buf[3]);lcd_wdat(0xb0);lcd_wdat(disp_buf[4]); lcd_wdat(disp_buf[5]);lcd_wcmd(0x44|0x80);lcd_wdat(disp_buf[6]); lcd_wdat(disp_buf[7]);lcd_wdat(0x3a);lcd_wdat(disp_buf[8]); lcd_wdat(disp_buf[9]);lcd_wdat(0x3a);lcd_wdat(disp_buf[10]); lcd_wdat(disp_buf[11]);}void timer1() interrupt 3{TH1=0xdc; TL0=0x00;count_10ms++;if(count_10ms>=100){count_10ms=0; sec++;if(sec>=60){sec=0; min++;if(min>=60){min=0; hour++;if(hour>=24){hour=0; day++;if(day>=30){day=1; mon++;if(mon>=12){mon=1; year++;} }}} } }}void keyprocess(){TR1=0;if(k2==0){Delay_ms(10);if(k2==0){while(!k2); year++; }}if(k3==0){Delay_ms(10);if(k3==0){while(!k3); mon++;if(mon>12){mon=0;} } }if(k4==0){Delay_ms(10);if(k4==0){while(!k4); day++;if(day>30){day=0;} } }if(k5==0){Delay_ms(10);if(k5==0){while(!k5); hour++;if(hour==24){hour=0;} }}if(k6==0){Delay_ms(10);if(k6==0){while(!k6); min++; if(min==60) {min=0;} }}if(k7==0){Delay_ms(10);if(k7==0){while(!k7);TR1=1; k1_flag=0;} }}void timer1_init(){TMOD=0x10;TH1=0xdc; TL1=0x00;EA=1; ET1 =1; TR1 =1;}void main(){uchar i;P0=0xff; P2=0xff;timer1_init ();lcd_init(); lcd_clr();lcd_wcmd(0x00|0x80);i=0;while(line1_data[i]!='\0'){lcd_wdat(line1_data[i]); i++;}lcd_wcmd(0x0c|0x80); i=0;while(line1_data[i]!='\0'){lcd_wdat(line1_data[i]); i++;}lcd_wcmd(0x40|0x80); i=0;while(line2_data[i]!='\0'){lcd_wdat(line2_data[i]); i++;}lcd_wcmd(0x4c|0x80); i=0;while(line2_data[i]!='\0'){lcd_wdat(line2_data[i]); i++;}while(1){if(k1==0){Delay_ms(10);if(k1==0){while(!k1);k1_flag=1;}}if(k1_flag==1)keyprocess();LCD_conv(year,mon,day,hour,min,sec); LCD_disp();}}。
数字电子钟的设计电路图pcb图
数字电子钟的设计与制作一、设计概述1.设计任务➢时钟脉冲电路设计➢60进制计数器设计➢24进制计数器设计➢“秒”,“分”,“小时”脉冲逻辑电路设计➢“秒”,“分”,“小时”显示电路设计➢“分”,“小时”校时电路➢整点报时电路2.功能特性➢设计的数字钟能直接显示“时”,“分”,“秒”,并以24小时为一计时周期。
➢当电路发生走时误差时,要求电路具有校时功能。
➢要求电路具有整点报时功能,报时声响为四低一高,最后一响正好为整点。
3.原理框图图 1 原理框图二、设计原理数字钟是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。
它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能和报时功能。
因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路、报时电路和振荡器组成。
干电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路组成。
秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。
将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发现胡一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。
“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。
“时计数器”采用24进制计时器,可实现对一天24小时的累计。
译码显示电路将“时”、“分”、“秒”计数器的输出状态菁七段显示译码器译码,通过六位LED七段显示器显示出来。
整点报时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时。
校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整的。
三、设计步骤1.计数器电路根据计数周期分别组成两个60进制(秒、分)和一个24进制(时)的计数器。
把它们适当连接就可以构成秒、分、时的计数,实现计时功能。
CC4518的符号如图,一个芯片集成了两个完全相同的十进制计数器,其异步清零信号CR是高电平有效。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
XXXXX学院
电
子
线
路
课
程
设
计
【带LCD显示的电子时钟】
班级:XX
姓名:XX
学号:XX
指导老师:XX
XX年XX月XX 日
摘要
在当代繁忙的学习与生活中,数字钟已成为人们日常生活中必不可少的必需品,被广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
数字电路采用数字电路,实现对时、分、秒时钟显示的计时装置,具有走时准确、性能稳定、携带方便等优点 它还用于计时、自动报时及自动控制等各个领域。
单片机具有体积小、功能强可靠性高、价格低廉等一系列优点 基于单片机的定时器功能完成的数字钟电路的设计,结构简单,便于携带。
也利于我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路、写程序、调试电路的能力。
研究数字钟以及扩大其应用,具有非常现实的意义。
此设计中的数字钟不仅可以显示普通的年、月、日、时、分、秒外,还可加入蜂鸣器、按键复位等功能。
关键字:LCD1602 单片机电子时钟定时复位
一.任务要求
设计一个时钟电路。
以单片机为核心模块,LCD1602为显示模块,通过控制使1602显示时间、字符。
1.1基本要求
1).第一行显示自己的名字
2).第二行显示时间
1.2发挥部分
1).加入按键,实现调时功能
2).加入蜂鸣器,实现闹钟功能
二.系统分析 2.1 系统总体方框图
2.2 系统总体分析
本设计由ST89C51单片机、复位电路、晶振电路、外部中断和显示电路5个模块组成。
其中以单片机模块为核心模块,主导其余四个模块工作,1602显示模块用来显示秒、分、时计数单位中的值。
利用AT89c51单片机内部的定时/计数器进行中断定时,配合软件延时,实现电路的总体功能。
ST89C51
复位电路
晶振电路
显示电路
外部中断
三、硬件设计
3.1、晶振电路
图3.1 晶振电路
一般的晶振振荡电路都是在一个反相放大器的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容。
51单片机最小系统晶振Y1也可以采用6MHz或者11.0592MHz,在正常工作的情况下可以采用更高频率的晶振,51单片机最小系统晶振的振荡频率直接影响单片机的处理速度,频率越大处理速度越快。
3.2、复位电路
图3.2 复位电路
单片机复位电路就好比电脑的重启部分。
该电路采用上电按钮复位电路:首先经过上电复位,按键直接与+5V电源相连,按下按键后,形成高电平复位,同时电解电容被电路放电;按键松开时,电源对电容形成充电,充电电流在电阻上,按键依然为高电平,复位。
充电完成后,电容相当于开路,按键为低电平,单片机芯片正常工作。
3.3、显示模块
图3.3 显示电路
液晶显示器(LCD)是一种利用液晶的扭曲/向列制成的新型显示器件,具有体积小、重量轻、功耗低、显示质量高、抗干扰能力强、与单片机接口方便的诸多优点,在单片机系统中被广泛应用。
16021脚接VSS为地电源,2脚为VDD接5V正电源,3脚是VL为液晶显示器对比度调整端,4脚是RS为寄存器选择,5脚为读写信号线,6脚E端为使能端,7~14脚为D0~D7,是8位双向数据线
采用1602显示模块内部存储容量大,易于控制。
1602显示器主要用来显示时间和定时时间。
通过单片机控制,1602显示字符。
3.4、原理图及原理分析
图3.4 原理图
该电路采用单片机的内部定时器精确定时,采用定时计数器1,工作方式1,P0口接1602液晶显示器,9脚接复位电路,18、19脚接晶振电路,利用定时计数器的定时、计数功能,完成电路的显示。
基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个多功能数字时钟系统。
单片机扩展的LCD1602显示器用来显示秒、分、时计数单元中的值。
1602显示器主要用来显示时间和定时时间。
本项目采用中断方式编程,单次定时时间为50 ms,当定时20次时,1秒到了,秒加1,当秒计数到60时,分加一,秒跳回0,当分计数至60时,小时加一,同时分跳回0,当小时跳动至24时,跳回00重新计数。
计数的内容通过单片机P0口在1602上显示。
3.5、PCB 图
图3.5 PCB图
四、软件设计
4.1 液晶软件驱动
开始
LCD初始化
延时
设第一行显示位置
设第二行显示位置
设第二行显示位置
显示第二行内容
结束
4.2 计时程序分析
否
是
否
是
否
是
否
是
重装初值
循环次数加1
秒加1
60秒到?
60分到?
24小时到? 秒清0,分加1
分清0,时加1
时清0 返回
满20次?
开始
4.3主程序分析
开始
内部中断
外部中断
设置显示位置
显示内容
结束
五.总结
经过两个星期的学习,从中学习了很多。
从一开始的模糊不知道从哪入手,到慢慢地熟悉整个流程,自己写出程序,感觉自己收获不少。
虽然学习的时间是短暂的,但留给我的印象是深刻的。
单片机在我们的学习中出现的频率很高,在这两个星期的学习中让我更加熟悉了51单片机,明白它功能的强大。
也熟悉了LCD1602显示器的功能。
我想,人就是慢慢学习不断进步的过程,要学以致用,多积累,才能使自己更加充实。