1、LCD单片机原理及接口技术 课程设计一、前言1一、设计要求及任务 3二、设计的基本步骤及方案 3三、硬件电路设计及描述 3 开关控制部分 3 LCD液晶显示部分 4 温度测量部分 4四、程序框图 5Lcd1602 5时间,闹铃设置 5温度显示5总流程图6部分程序说明7五、硬件的调试过程及调试方法10六、课程设计体会11七、参考资料11附录11前 言本学期期末,我们进行了单片机实训,对于我们机械设计制造及其自动化专业的学生来说,单片机是自动控制装置中不可缺少的一部分,在当今制造业中有着不可替代的作用。所谓单片机,就是把CPU、存储器、输入设备、输出设备、定时,计数器、等计算机的主要部件集成在一小
2、块硅片上的单片微型计算机。因为它体积小可靠性高性价比高等诸多有点,在机电一体化产品领域有着广泛地应用。本次单片课程实训我们选择的题目是设计一个LCD智能电子时钟,也就是在生活中有着广泛应用的电子表的部分功能电路,虽然在单片机的电路中,此电路属于相对简单的一个,但是在我们制作电路过程中,对我们的启发是很大的。首先这是我们把理论适用于实践的一次尝试,我们学习的目的是为了实用,也就是通常说的学以致用。本次实训,我们选择了生活中应用广泛的电子时钟电路的原因也就在于此!通过LCD电子时钟的设计,我们相信,可以积累更多的实际运用单片机的经验!便于我们在以后的工作中更好的适应工作环境,更加顺利的进行工作过程
3、,更加熟练的掌握进单片机的应用技术。其次实训过程也是我们巩固所学知识的过程。在我们实训过程中,会遇到这样或那样意想不到的问题,需要对设计进行一遍又一遍的改动,在改动和检错的过程中,我们需要向其他通许或老师请教许多关于已知错误的知识,而这些知识大部分是我们平时学习所不掌握或掌握不熟练指之处,因此通过查阅资料和请教他人,我们不仅温习了已学的部分知识,更重要的是接触到了大量的课外知识。孔子有句话:“温故而知新,可以为师矣”。说的就是这个道理!再次单片机的实训中,培养了我们吃苦耐劳的精神和一丝不苟的学习工作态度。单片机的实训过程是很辛苦的,要想做好必须要付出极大的努力。在机的开放期间,几乎在整个实践段
4、都有许多同学在刻苦学习,用心设计。为了更好更快的完成任务,大家废寝忘食的查找设计过程中的错误和不足,虽然同学们的水平有限,但是大家都尽了自己最大的努力。单片机的电路设计复杂而繁琐,每一根线都要细心考虑,精心检查,以保证设计电路尽可能的减少错误,因此没有认真严谨的学习态度是很难完成的!虽然实训的过程很辛苦,但是我们的指导老师更加辛苦,他们在实训的每天都按时到达机房,时刻为我们解答疑难问题!是我们能够完成任务的保证!因此要感谢老师的精心指导和无私帮助!一、设计任务及要求1.设计任务:制作一个的智能电子钟。2.设计要求:1.使用文字型LCD显示当前时间;2.显示格式为“时时:分分:秒秒;3.用4个功
5、能键操作来设置当前时间,功能键K1K4功能如下;K1选择设置时/分/秒;K2加一;K3减一;K4确认完成设置。4.程序执行后工作指示灯LED闪动,LCD显示“00:00:00“;5.增加万年历显示“年月日”;6.增加温度传感器显示当前的温度;3.设计原件AT89C51单片机LCD采用LM16L16*2字符型LCD液晶显示器;采用定时器;温度传感器18b20;五个开关; 一个LED指示灯;一个10k排阻;二、设计的基本步骤及方案1方案:本课题采用单元电路设计硬件电路分为4个部分。1)4个开关控制进行时间设置;2)LCD采用LM16L16*2字符型LCD液晶显示器显示时间,温度,日历;3)用18b
6、20进行测温;4)工作指示灯;总体设计框图:2.步骤:A. 首先根据设计要求,分析闹钟工作原理,然后查阅相关元件资料及文献。如lcd液晶显示器,温度传感器18b20;B针对实现的功能,利用protues软件来画硬件图。C结合硬件图,写出相关硬件的的程序框图,然后进行编写程序。D用keil软件进行程序编译,调试,然后再送给protues仿真。实现各部分硬件的仿真运行。E最后将各个部分程序组合,调试,编译,实现整体仿真。三、硬件电路设计及描述开关控制部分:K1,K2,K3,K4分别闭合时分别给P1.0,P1.1,P1.2,P1.3一个低电平信号。K1-控制时间时分秒设置;K2-加一;K3-减一;K
7、4-完成设置;lcd液晶显示部分:由于P0口为漏极,所以加个排阻;D0D7连接P0口;lcd的使能信号端接P2.2,数据/命令端(H/L)接P2.1,读/写选择端(H/L)接P2.0;温度测量部分:DS1820 数字温度计以9 位数字量的形式反映器件的温度值。DS1820 通过一个单线接口发送或接收信息,因此在中央微处理器和DS1820 之间仅需一条连接线(加上地线)。用于读写和温度转换的电源可以从数据线本身获得,无需外部电源。因为每个 DS1820 都有一个独特的片序列号,所以多只DS1820 可以同时连在一根单线总线上,这样就可以把温度传感器放在许多不同的地方。这一特性在HVAC 环境控制
8、、探测建筑物、仪器或机器的温度以及过程监测和控制等方面非常有用。数据DQ端接在P2.3口四、程序框图:Lcd1602:时间,闹铃设置:温度显示:总流程图:部分程序说明:Lcd相关资料:void init()/lcd初始化 uchar num; rw=0;/写功能; lcden=0; write_com(0x38);/显示模式设置 write_com(0x0c);/显示开 write_com(0x06);/关标设置 write_com(0x01);/清除原数据; write_com(0x80);/首地址指针写操作时序图:void write_com(uchar com) /写命令 rs=0; l
9、cden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; void write_date(uchar date)/写数据 rs=1; lcden=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; 关于18b20资料介绍:初始化时序图1.先将数据线置高电平1;2.延时(该时间要求尽可能小一点);3.数据线拉到低电平0;4.延时750us(该时间范围480960us);5.数据线拉到高电平1;6.延时等待,如果初始化成功则在1560us内产生一个由ds18b20返回的低电平0,据该状态可以确定它的存
10、在.但是应注意,不能无限的等待,不然会使程序进入死循环,所以要进行超时判断;7.若cpu读到数据线上的低电平0后;还要进行延时,其延时的时间从发出高电平算起(第5步的时间算起)最少要480us8.将数据线再次拉到高电平1后结束.void delay_18B20(unsigned int i)/延时1微秒 while(i-); void ds1820rst()/ds1820复位 unsigned char x=0; DQ = 1; /DQ复位 delay_18B20(4); /延时 DQ = 0; /DQ拉低 delay_18B20(100); /精确延时大于480us DQ = 1; /拉高
11、delay_18B20(40); DS18B20写数据时序图1.数据线先置低电平0;2.延时确定的时间为15us;3.按从低位到高位的顺序发送数据(一次只发送一位);4.延时时间为45us;5.将数据线拉到高电平1;6.重复15步骤,直到发送完整个字节;7.最后将数据线拉高到1;void ds1820wr(uchar wdata)/写数据 unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata=1; DS18B20读数据时序图1.将数据线拉高到1;2.延时2us;3
12、.将数据线拉低到0;4.延时6us;5.将数据线拉高到1;6.延时4us7.读数据的状态得到一个状态位,并进行数据处理;8.延时30us.9.重复17步骤,直到读完一个字节;uchar ds1820rd()/读数据 unsigned char i=0; unsigned char dat = 0; for (i=8;i0;i-) DQ = 0; /给脉冲信号 dat=1; DQ = 1; /给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); return(dat);五、硬件的调试过程及调试方法硬件用protues仿真实现功能运行。每用keil编译一次生成hex文件
13、,然后添加到51单片机中,之后运行protues。看是否实现所要的功能。调试中也遇到很多问题;1.在进行lcd显示时,编程端口定义错啦;2.进行模块组合时,出现显示冲突,各模块的显示控制混乱。3.用定时器0与18b20送数据到lcd是产生冲突。T为当前显示温度;111225为年月日;第二排为时间时分秒;温度传感器检测的当前温度;LED工作指示灯闪烁表明工作正常;六、课程设计体会虽然只有短短两个周的实训时间,但是通过这次的课程设计,在很大程度上提高了我们自主学习和思考的能力,使我们获益良多,不能用文字来表达其中的快乐。巩固了我门这学期以来所学习的单片机及其原理这门课程,让我们找到了学习的乐趣,明
14、白了带我们的的老师们的良苦用心和殷切希望。论文中所涉及的很大部分的知识并不是从书本上,而是在已有的知识基础上,借助书籍和网上资源,经过反复思考而得出的,将书本知识运用到实际生活中体现了其价值所在。七、参考资料1单片机原理与应用技术。北京:清华大学出版社,20092吴亦锋. 单片机原理与接口技术。北京:电子工业出版社,20103 DS1820 单线数字温度计说明书。4 smc1602A LOM 使用说明书。附录:#include#define uchar unsigned char#define uint unsigned int/sbit BLK=P10;sbit DQ=P23;sbit rs
15、=P20;sbit rw=P21;sbit lcden=P22;sbit s1=P10;sbit s2=P11;sbit s3=P12;sbit s4=P13;sbit led=P14;sbit l=P24;/sbit been=P30;unsigned char code str1=t: 11-12-25;unsigned char code str2= 00:00:00;uchar data disdata5;uint tvalue;/温度值uchar tflag;/温度正负标志uchar count,s1num,s2num;char miao,shi,fen;/*lcd1602程序*/v
16、oid delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); void write_com(uchar com) / 写命令 rs=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; void write_date(uchar date) /写数据 rs=1; lcden=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; void init() uchar num; rw=0; lcden=0; write_com(0x3
17、8); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num16;num+) /第一排 write_date(str1num); delay(5); write_com(0x80+0x40); for(num=0;num0;i-) DQ = 0; /给脉冲信号 dat=1; DQ = 1; /给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); return(dat);void ds1820wr(uchar wdata)/写数据 unsigned char
18、i=0; for (i=8; i0; i-) DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata=1; read_temp()/读取温度值并转换 uchar a,b; ds1820rst(); ds1820wr(0xcc);/跳过读序列号 ds1820wr(0x44);/启动温度转换 ds1820rst(); ds1820wr(0xcc);/跳过读序列号 ds1820wr(0xbe);/读取温度 a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue=8; tvalue=tvalue|a; if(tv
19、alue0x0fff) tflag=0; else tvalue=tvalue+1; tflag=1; tvalue=tvalue*(0.625);/温度值扩大10倍,精确到1位小? return(tvalue); /*/void ds1820disp()/温度值显示 uchar flagdat; disdata0=tvalue/1000+0x30;/百位数 disdata1=tvalue%1000/100+0x30;/十位数 disdata2=tvalue%100/10+0x30;/个位数 disdata3=tvalue%10+0x30;/小数位 if(tflag=0) flagdat=0x
20、20;/正温度不显示符号 else flagdat=0x2d;/负温度显示负号:- if(disdata0=0x30) disdata0=0x20;/如果百位为0,不显示 if(disdata1=0x30) disdata1=0x20;/如果百位为0,十位为0也不显示 write_com(0x80+2); write_date(flagdat);/显示符号? write_com(0xc1); write_date(disdata0);/显示百位 write_com(0x80+3); write_date(disdata1);/显示十位 write_com(0x80+4); write_date
21、(disdata2);/显示个位 write_com(0x80+5); write_date(0x2e);/显示小数点 write_com(0x80+6); write_date(disdata3);/显示小数位 /*时间设置*/void timer0_init() TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; void write_sfm(uchar add,uchar date) uchar shi,ge; shi=date/10; ge=date%10; write_com(0x8
22、0+0x40+add); write_date(0x30+shi); write_date(0x30+ge);void keyscan() rw=0; if(s1=0) delay(5); /消除抖动 if(s1=0) s1num+; while(!s1); if(s1num=1) TR0=0; / EA=0; write_com(0x80+0x40+10); /秒的位置 write_com(0x0f); /光标闪烁 if(s1num=2) write_com(0x80+0x40+7); /分的位置 if(s1num=3) write_com(0x80+0x40+4); /时的位置 /dela
23、y(500); /s1num=0; if(s1num=4) s1num=1; write_com(0x80+0x40+10); / write_com(0x0c); / TR0=1; if(s1num!=0) /k1不按时候,k2,k3,k4,无作用 if(s2=0) delay(5); /防抖 if(s2=0) while(!s2); if(s1num=1) miao+; if(miao=60) miao=0; write_sfm(10,miao); write_com(0x80+0x40+10); if(s1num=2) fen+; if(fen=60) fen=0; write_sfm(7,fen); write_com(0x80+0x40+7); if(s1num=3) shi+; if(shi=24) shi=0; write_sfm(4,shi); write_com(0x80+0x40+4); if(s3=0) delay(5); if(s3=0) while(!s3); /防抖 if(s1num=1) miao-; if(miao=-1) miao=59; write_sfm(10,miao); write_com(0x80+0x40+10); if(s1num=2) fen-; if(fen=-1) fen=59; write_sfm(7,fen);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1