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. 连接导线通过导线将各个元器件进行连接。
导线的设计应考虑信号的传输距离、屏蔽和抗干扰等因素,以保证电子时钟的稳定性和可靠性。
- 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显示器的功能。
我想,人就是慢慢学习不断进步的过程,要学以致用,多积累,才能使自己更加充实。