单片机原理及应用A实验报告-LCD1602与DS18B20程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1LCD1602与DS18B20程序设计一、实验目的1、学习实验系统的基本操作,了解在实验系统中进行程序设计、仿真和调试的操作方法和步骤;2、熟悉Proteus的虚拟仪器的使用;3、熟悉并灵活运用单片机的I2C通信功能;4、熟悉LCD1602液晶显示字符,能运用DS18B20读取当前温度,了解One-Wire协议;5、使用LCD1602,在液晶第一行上显示字符串“Hello”,在液晶第二行上显示字符串“Welcome!”;6、使用DS18B20与单片机通信,读取当前温度并在LCD1602液晶上显示出来。二、实验原理1、LCD1602液晶由若干个5*7或者5*11的点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。2、1602采用标准的16脚接口或是14接口,其中:第1脚:GND为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚是背光正极,16脚是背光负极(14接口中没有这两个引脚)。3、根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。2三、实验步骤1、硬件仿真。先分析实验所需的硬件条件,然后在Proteus上连接好硬件电路,注意连接好必要的电阻等。2、软件编写。在Keil或其它的单片机编程软件上用C语言编写出构思好的软件。3、将程序编译为HEX文件,然后烧录到仿真单片机中,进行仿真。4、分析实验结果,找出问题并解决。四、实验结果及分析1、实验开始时,发现该显示的字符串未显示完毕。后经过比较检检查,发现是程序发送字节时有误,在判断字符串结束时多了一个空格。2、改正过后显示正常。并后面实验结果也符合要求。图1LCD1602仿真实验结果图2DS18B20仿真实验结果3五、体会LCD1602与DS18B20对时序的要求都是非常严格的,可见我们学习单片机的编程时是必须要熟悉与掌握时序概念的,能看懂时序图应是我们的必备技能。同时,在学习这两实验后,也提示我们以后再做实际产品时,有很多的程序模块是我们不必去耗大量时间编写的,只要我们能看懂并会用一些成品模块就可以了。六、附件LCD1602显示程序:/*******************************************************************************实验名:LCD1602显示实验*功能:显示字符串“Hello”与“WelcometoSWUST!”******************************************************************************/#includereg51.h#defineLCD1602_DBP2sbitLCD1602_RS=P3^2;sbitLCD1602_RW=P3^1;sbitLCD1602_E=P3^0;/*等待液晶准备好*/voidLcdWaitReady(){unsignedcharsta;LCD1602_DB=0xFF;LCD1602_RS=0;LCD1602_RW=1;do{LCD1602_E=1;sta=LCD1602_DB;//读取状态字LCD1602_E=0;}while(sta&0x80);//bit7等于1表示液晶正忙,重复检测直到其等于0为止}/*向LCD1602液晶写入一字节命令,cmd-待写入命令值*/voidLcdWriteCmd(unsignedcharcmd){LcdWaitReady();LCD1602_RS=0;LCD1602_RW=0;LCD1602_DB=cmd;LCD1602_E=1;LCD1602_E=0;}/*向LCD1602液晶写入一字节数据,dat-待写入数据值*/voidLcdWriteDat(unsignedchardat){LcdWaitReady();LCD1602_RS=1;LCD1602_RW=0;LCD1602_DB=dat;LCD1602_E=1;LCD1602_E=0;}/*设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标*/voidLcdSetCursor(unsignedcharx,unsignedchary){unsignedcharaddr;if(y==0)//由输入的屏幕坐标计算显示RAM的地址4addr=0x00+x;//第一行字符地址从0x00起始elseaddr=0x40+x;//第二行字符地址从0x40起始LcdWriteCmd(addr|0x80);//设置RAM地址}/*在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针*/voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str){LcdSetCursor(x,y);//设置起始地址while(*str!='\0')//连续写入字符串数据,直到检测到结束符{LcdWriteDat(*str++);}}/*初始化1602液晶*/voidInitLcd1602(){LcdWriteCmd(0x38);//16*2显示,5*7点阵,8位数据接口LcdWriteCmd(0x0C);//显示器开,光标关闭LcdWriteCmd(0x06);//文字不动,地址自动+1LcdWriteCmd(0x01);//清屏}voidmain(){InitLcd1602();LcdShowStr(5,0,Hello!);LcdShowStr(0,1,WelcometoSWUST!);while(1);}DS18B20程序:LCD显示模块:#includereg52.h#defineLCD1602_DBP2sbitLCD1602_RS=P3^2;sbitLCD1602_RW=P3^1;sbitLCD1602_E=P3^0;/*等待液晶准备好*/voidLcdWaitReady(){unsignedcharsta;LCD1602_DB=0xFF;LCD1602_RS=0;LCD1602_RW=1;do{LCD1602_E=1;sta=LCD1602_DB;//读取状态字LCD1602_E=0;}while(sta&0x80);//bit7等于1表示液晶正忙,重复检测直到其等于0为止}/*向LCD1602液晶写入一字节命令,cmd-待写入命令值*/voidLcdWriteCmd(unsignedcharcmd){LcdWaitReady();LCD1602_RS=0;LCD1602_RW=0;LCD1602_DB=cmd;LCD1602_E=1;LCD1602_E=0;}/*向LCD1602液晶写入一字节数据,dat-待写入数据值*/voidLcdWriteDat(unsignedchardat)5{LcdWaitReady();LCD1602_RS=1;LCD1602_RW=0;LCD1602_DB=dat;LCD1602_E=1;LCD1602_E=0;}/*设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标*/voidLcdSetCursor(unsignedcharx,unsignedchary){unsignedcharaddr;if(y==0)//由输入的屏幕坐标计算显示RAM的地址addr=0x00+x;//第一行字符地址从0x00起始elseaddr=0x40+x;//第二行字符地址从0x40起始LcdWriteCmd(addr|0x80);//设置RAM地址}/*在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针*/voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str){LcdSetCursor(x,y);//设置起始地址while(*str!='\0')//连续写入字符串数据,直到检测到结束符{LcdWriteDat(*str++);}}/*初始化1602液晶*/voidInitLcd1602(){LcdWriteCmd(0x38);//16*2显示,5*7点阵,8位数据接口LcdWriteCmd(0x0C);//显示器开,光标关闭LcdWriteCmd(0x06);//文字不动,地址自动+1LcdWriteCmd(0x01);//清屏}DS18B20:#includereg52.h#includeintrins.hsbitIO_18B20=P3^6;//DS18B20通信引脚/*软件延时函数,延时时间(t*10)us*/voidDelayX10us(unsignedchart){do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}while(--t);}bitGet18B20Ack(){bitack;EA=0;IO_18B20=0;DelayX10us(50);6IO_18B20=1;DelayX10us(6);ack=IO_18B20;while(!IO_18B20);EA=1;returnack;}voidWrite18B20(unsignedchardat){unsignedcharmask;EA=0;for(mask=0x01;mask!=0;mask=1){IO_18B20=0;_nop_();_nop_();if((mask&dat)==0)IO_18B20=0;elseIO_18B20=1;DelayX10us(6);IO_18B20=1;}EA=1;}unsignedcharRead18B20(){unsignedchardat;unsignedcharmask;EA=0;for(mask=0x01;mask!=0;mask=1){IO_18B20=0;_nop_();_nop_();IO_18B20=1;_nop_();_nop_();if(!IO_18B20)dat&=~mask;elsedat|=mask;DelayX10us(6);}EA=1;returndat;}bitStart18B20(){bitack;ack=Get18B20Ack();if(ack==0){Write18B20(0xCC);Write18B20(0x44);}return~ack;}7bitGet18B20Temp(int*temp){bitack;unsignedcharLSB,MSB;ack=Get18B20Ack();if(ack==0){Write18B20(0xCC);Write18B20(0xBE);LSB=Read18B20();MSB=Read18B20();*temp=((int)MSB8)+LSB;}return~ack;}main.c:#includereg52.hbitflag1s=0;//1s定时标志unsignedcharT0RH=0;//T0重载值的高字节unsignedcharT0R

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功