温度时钟测距lcd1602显示程序

合集下载

DS18B20与LCD1602的测温显示程序

DS18B20与LCD1602的测温显示程序
delay_15us(40); // 延时 480--960us
ds18B20_data = 1; // 拉高总线,延时 15us-60us 后等待ds18B20 响应
delay_15us(2); // 15us-60us
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
uchar Minus_Flag=0;
uchar code Temp_Disp_Title[]={"Current Temp : "};
uchar Current_Temp_Display_Buffer[]={"TEMP: "};
LCD_RS = 0;
LCD_RW = Байду номын сангаас;
LCD_EN = 0;
_nop_();
_nop_();
LCD_Data = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void Write_LCD_Data(uchar dat)
#define ds18B20_ALARM_SEARCH 0xEC // 报警搜索指令
#define ds18B20_WRITE_SCRATCHPAD 0x4E // 写暂存寄存器指令
#define ds18B20_READ_SCRATCHPAD 0xBE // 读暂存寄存器指令
{
while(LCD_Busy_Check());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;

DS18B20温度采集与1602显示程序

DS18B20温度采集与1602显示程序

DS18B20温度采集与1602显示程序#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P1^4; //DS18B20口sbit LCD_RS=P2^7;sbit LCD_RW=P2^6;sbit LCD_EN=P2^5; //液晶有关控制位//unsigned char code str1[]={"welcome "};unsigned char code str2[]={"temp and 1602:"};unsigned char code str3[]={"temp: "};unsigned char data temp_data[2] = {0x00,0x00} ;unsigned char code mytab[8]= {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;uchar data disdata[5] = {0x00,0x00,0x00,0x00,0x00} ;uint tvalue;//温度值/*************延时程序***************/void delay1(int ms){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<250;j++);}void delay2( unsigned int k){unsigned int n;n=0;while(n < k){n++;}return;}/***********************************//***********lcd1602程序*************//***********************************//*************写指令****************/void lcd_wcmd(unsigned char cmd){delay1(1);LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=cmd;delay1(1);LCD_EN=1;delay1(1);LCD_EN=0;}/*************写数据****************/void lcd_wdat(unsigned char dat){delay1(1);LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delay1(1);LCD_EN=1;delay1(1);LCD_EN=0;}/*************初始化****************/void lcd_init(){delay1(15) ;lcd_wcmd(0x01) ; //清除LCD的显示内容lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据delay1(5) ;lcd_wcmd(0x38) ;delay1(5) ;lcd_wcmd(0x38) ;delay1(5) ;lcd_wcmd(0x0c) ; //显示开,关光标delay1(5) ;lcd_wcmd(0x06) ; //移动光标delay1(5) ;lcd_wcmd(0x01) ; //清除LCD的显示内容delay1(5) ;}/**********设定显示位置*************/void lcd_pos(uchar pos){lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量}/***********************************//************DS18B20程序************//***********************************//***********ds1820初始化************/Init_DS18B20(void){DQ = 1 ; //DQ复位delay2(8) ; //稍做延时DQ = 0 ; //单片机将DQ拉低delay2(85) ; //精确延时大于480usDQ = 1 ; //拉高总线delay2(18) ;}/**********读一个字节数据*************/ ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ=1;delay2(1);DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay2(4);}return(dat);}/**********写一个字节数据*************/ WriteOneChar(unsigned char dat){unsigned char i = 0 ;for (i=8;i>0;i--){DQ = 0 ;DQ = dat&0x01 ;delay2(5) ;DQ = 1 ;dat>>=1 ;}delay2(4);}/*************读取温度值**************/Read_Temperature(void){Init_DS18B20() ;WriteOneChar(0xCC) ; // 跳过读序号列号的操作WriteOneChar(0x44) ; // 启动温度转换delay2(125);Init_DS18B20() ;WriteOneChar(0xCC) ; //跳过读序号列号的操作WriteOneChar(0xBE) ; //读取温度寄存器temp_data[0] = ReadOneChar() ; //温度低8位temp_data[1] = ReadOneChar() ; //温度高8位tvalue=((temp_data[1]*256)+temp_data[0])*0.625;//return(tvalue);}/*************温度转换**************/Disp_Temperature()//温度值显示{disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(disdata[0]==0x30){disdata[0]=0x20; //如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20; //如果百位为0,十位为0也不显示}}lcd_pos(0x48);lcd_wdat(disdata[0]);//显示百位lcd_pos(0x49);lcd_wdat(disdata[1]);//显示十位lcd_pos(0x4a);lcd_wdat(disdata[2]);//显示个位lcd_pos(0x4b);lcd_wdat(0x2e); //显示小数点lcd_pos(0x4c);lcd_wdat(disdata[3]);//显示小数位}/**************显示函数***************/void dis_play(){uchar m ;lcd_init() ; //初始化LCDlcd_pos(0) ; //设置显示位置为第一行的第1个字符m = 0 ;while(str1[m] != '\0'){ //显示字符lcd_wdat(str1[m]) ;m++ ;}lcd_pos(0x40); //设置显示位置为第二行第1个字符m = 0 ;while(str2[m] != '\0'){lcd_wdat(str2[m]); //显示字符m++ ;}delay1(3000);lcd_init() ; //初始化LCDlcd_pos(0) ; //设置显示位置为第一行的第1个字符m = 0 ;while(str3[m] != '\0'){ //显示字符lcd_wdat(str3[m]) ;m++ ;}/***************主函数****************/ void main(){dis_play();//初始化显示while(1){Read_Temperature() ;//读取温度Disp_Temperature() ;//显示温度}。

LCD1602时钟显示以及修改程序

LCD1602时钟显示以及修改程序
writeCmd(addr1);
j=dis_buff[i]+'0';
writeDat(j);
i++;
}
dspStr(0,2,":");
i=2;
for (addr1=0x83;addr1<0x85;addr1++)
{
writeCmd(addr1);
dis_buff[3]++;
if( dis_buff[3]>=10)
{
dis_buff[3]=0;
if (dis_buff[2]<5)
dis_buff[2]++;
else dis_buff[2]=0;
}
#include"reg52.h"
#include <intrins.h>
sbit E =P2^5;
sbit RW=P2^6;
sbit RS=P2^7;
sbit alarm=P3^7;
unsigned char data dis_buff[10];
unsigned char hour,min,sec;
j=dis_buff[i]+'0';
writeDat(j);
i++;
}
}
void key_incsec( )//秒初始值设置
{
if (key_0==2)//秒加一
{
ji=0;
addr4=0x87;
dis_buff[5]++;
if( dis_buff[5]>=10)

LCD1602_显示时间_温度

LCD1602_显示时间_温度

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define LCDIO P2sbit DQ=P1^3;//ds18b20与单片机连接口sbit rs=P1^0;sbit rd=P1^1;sbit lcden=P1^2;sbit acc0=ACC^0; //移位时的第0位sbit acc7=ACC^7; //移位时用的第7位uchar second,minute,hour,day,month,year,week,count=0; uchar ReadValue,num,time;uint tvalue;//温度值uchar tflag;uchar code table[]={" 2010-11-29 MON"};uchar code table1[]={" 15:45:00 000.0C"};uchar code table2[]= "THUFRISATSUNMONTUEWES";uchar data disdata[5];sbit DATA=P0^1; //时钟数据接口sbit RST=P0^2;sbit SCLK=P0^0;sbit menu=P3^5; //菜单sbit add=P3^6; //加一sbit dec=P3^7; //减一void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); }void delay1(uint z){for(;z>0;z--);}void write_com(uchar com) {rs=0;rd=0;lcden=0;P2=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date) {rs=1;lcden=0;P2=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){uchar num;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);delay(5);write_com(0x80);for(num=0;num<15;num++){write_date(table[num]);delay(5);write_com(0x80+0x40);for(num=0;num<15;num++){write_date(table1[num]);delay(5);}}void Write1302(uchar dat){uchar i;SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备delay1(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续写8个二进制位数据{DATA=dat&0x01; //取出dat的第0位数据写入1302delay(2); //稍微等待,使硬件做好准备SCLK=1; //上升沿写入数据delay1(2); //稍微等待,使硬件做好准备SCLK=0; //重新拉低SCLK,形成脉冲dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位 }}void WriteSet1302(uchar Cmd,uchar dat){RST=0; //禁止数据传递SCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输delay1(2); //稍微等待,使硬件做好准备Write1302(Cmd); //写入命令字Write1302(dat); //写数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递}uchar Read1302(void){uchar i,dat;delay(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续读8个二进制位数据{dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位 if(DATA==1) //如果读出的数据是1dat|=0x80; //将1取出,写在dat的最高位SCLK=1; //将SCLK置于高电平,为下降沿读出delay1(2); //稍微等待SCLK=0; //拉低SCLK,形成脉冲下降沿delay1(2); //稍微等待}return dat; //将读出的数据返回}uchar ReadSet1302(uchar Cmd){uchar dat;RST=0; //拉低RSTSCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输Write1302(Cmd); //写入命令字dat=Read1302(); //读出数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递return dat; //将读出的数据返回}void Init_DS1302(void){WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((45/10)<<4|(45%10))); //根据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,((15/10)<<4|(15%10))); //根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,((29/10)<<4|(29%10))); //根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((11/10)<<4|(11%10))); //根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8c,((10/10)<<4|(10%10))); //nianWriteSet1302(0x8a,((4/10)<<4|(4%10)));}void DisplaySecond(uchar x){uchar i,j;i=x/10;j=x%10;write_com(0xc7);write_date(0x30+i);write_date(0x30+j);}void DisplayMinute(uchar x){uchar i,j;i=x/10;j=x%10;write_com(0xc4);write_date(0x30+i);write_date(0x30+j);}void DisplayHour(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0xc1);write_date(0x30+i);write_date(0x30+j); }void DisplayDay(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x89);write_date(0x30+i);write_date(0x30+j); }void DisplayMonth(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x86);write_date(0x30+i);write_date(0x30+j); }void DisplayYear(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x83);write_date(0x30+i);write_date(0x30+j); }void DisplayWeek(uchar x) { uchar i;x=x*3;write_com(0x8c);for(i=0;i<3;i++){write_date(table2[x]);x++;}}void read_date(void){ReadValue = ReadSet1302(0x81);second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x83);minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x85);hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x87);day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x89);month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x8d);year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue=ReadSet1302(0x8b); //读星期 week=ReadValue&0x07;DisplaySecond(second);DisplayMinute(minute);DisplayHour(hour);DisplayDay(day);DisplayMonth(month);DisplayYear(year);DisplayWeek(week);}void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num){newval=ReadSet1302(newaddr); //读取当前时间newval=((newval&0x70)>>4)*10+(newval&0x0f); //将bcd码转换成十进制if(flag) //判断是加一还是减一{newval++;switch(s1num){ case 1: if(newval>99) newval=0;DisplayYear(newval);break;case 2: if(newval>12) newval=1;DisplayMonth(newval);break;case 3: if(newval>31) newval=1;DisplayDay(newval);break;case 4: if(newval>6) newval=0;DisplayWeek(newval);break;case 5: if(newval>23) newval=0;DisplayHour(newval);case 6: if(newval>59) newval=0;DisplayMinute(newval);break;case 7: if(newval>59) newval=0;DisplaySecond(newval);break;default:break;}}else{newval--;switch(s1num){ case 1: if(newval==0) newval=99;DisplayYear(newval);break;case 2: if(newval==0) newval=12;DisplayMonth(newval);break;case 3: if(newval==0) newval=31;DisplayDay(newval);break;case 4: if(newval<0) newval=6;DisplayWeek(newval);case 5: if(newval<0) newval=23;DisplayHour(newval);break;case 6: if(newval<0) newval=59;DisplayMinute(newval);break;case 7: if(newval<0) newval=59;DisplaySecond(newval);break;default:break;}}WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10)); //将新数据写入寄存器}//键盘扫描程序//*******************************************void key_scan(void){ uchar miao,s1num=0;if(menu==0){delay(5);if(menu==0){while(!menu);s1num++;while(1){if(menu==0){delay(5);if(menu==0){while(!menu);s1num++;}}rd=0;miao=ReadSet1302(0x81);second=miao;WriteSet1302(0x80,miao|0x80);write_com(0x0f);//光标闪射if(s1num==1){ year=ReadSet1302(0x8d);write_com(0x80+4); //年光标if(add==0){delay(3);if(add==0){ while(!add);turn_val(year,1,0x8d,1);}}if(dec==0){delay(3);if(dec==0){ while(!dec);turn_val(year,0,0x8d,1);}}}if(s1num==2){month=ReadSet1302(0x89);write_com(0x80+7); //月光标if(add==0){delay(3);if(add==0){ while(!add);turn_val(month,1,0x89,2); }}if(dec==0){delay(3);if(dec==0){ while(!dec);turn_val(month,0,0x89,2); }}}if(s1num==3){ day=ReadSet1302(0x87);write_com(0x80+10);//日光标if(add==0){delay(3);if(add==0){ while(!add);turn_val(day,1,0x87,3);}}if(dec==0){delay(3);if(dec==0){ while(!dec);turn_val(day,0,0x87,3); //写入日寄存器 }}}if(s1num==4){ week=ReadSet1302(0x8b);write_com(0x80+14); //星期光标if(add==0){delay(3);if(add==0){ while(!add);turn_val(week,1,0x8b,4);}}if(dec==0){delay(3);if(dec==0){ while(!dec);turn_val(week,0,0x8b,4);}}}if(s1num==5){ hour=ReadSet1302(0x85);write_com(0x80+0x40+2); //时光标if(add==0){delay(3);if(add==0){ while(!add);turn_val(hour,1,0x85,5);}}if(dec==0){delay(3);if(dec==0){ while(!dec);turn_val(hour,0,0x85,5);}}}if(s1num==6)//调时间分{ minute=ReadSet1302(0x83);write_com(0x80+0x40+5);if(add==0){delay(5);if(add==0){ while(!add);turn_val(minute,1,0x83,6); //写入分寄存器 }}if(dec==0){delay(3);if(dec==0){ while(!dec);turn_val(minute,0,0x83,6); //写入分寄存器 }}}if(s1num==7)//调时间秒{ second=ReadSet1302(0x81);write_com(0x80+0x40+8);//秒光标if(add==0){delay(3);if(add==0){ while(!add);if(second==0x60)second=0x00;turn_val(second,1,0x81,7);}}if(dec==0){delay(3);if(dec==0){ while(!dec);turn_val(second,0,0x81,7);}}}if(s1num==8){ miao=ReadSet1302(0x81);second=miao;WriteSet1302(0x80,second&0x7f);s1num=0;//s1num清零//write_com(0x0c);//光标不闪烁//break;}}}}}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); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/ {unsigned char i=0;for (i=8; i>0; 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(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.425);//温度值扩大10倍,精确到1位小数return(tvalue);}void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}write_com(0xc9);write_date(flagdat);//显示符号位write_com(0xca);write_date(disdata[0]);//显示百位write_com(0xcb);write_date(disdata[1]);//显示十位write_com(0xcc);write_date(disdata[2]);//显示个位write_com(0xcd);write_date(0x2e);//显示小数点write_com(0xce);write_date(disdata[3]);//显示小数位write_com(0xcf);write_date('C');}void main(){init();Init_DS1302(); //将1302初始化read_temp();//读取温度ds1820disp();//显示while(1){read_date();key_scan();read_temp();//读取温度ds1820disp();//显示}}完。

LCD1602显示的程序

LCD1602显示的程序
}
WriteOneChar(0xbe);//发温度转换命令
readtemp[0]=ReadOneChar();//读取相应的温度值低位
readtemp[1]=ReadOneChar();//读取相应的温度值高位
sflag[h]=0;
delayy(20);
}
//18B20读一个字节
ReadOneChar(void)
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
}
}
readtemp[1]=readtemp[1]<<4;//将高低温度和为一个字节,本方法避免了*0。0625,很简单,很准确
readtemp[1]=readtemp[1] & 0x70;
xx="readtemp"[0];
{
displaybuf[k+1]= fentemp%10;
fentemp= fentemp/10;
}
displaybuf[k]= fentemp;
k+=2;
xx="xx">>4;
xx="xx"& 0x0f;
readtemp[1]=readtemp[1] | xx;
temp[h]=readtemp[1];
fentempபைடு நூலகம்"temp"[h];//拆分两路温度值送入显示单元

LCD1602中文资料程序和使用说明

LCD1602中文资料程序和使用说明

LCD1602中文资料程序和使用说明一、硬件连接和初始化步骤:1.将LCD1602的16个引脚连接到MCU(单片机)的相应引脚上。

其中,VCC和GND分别接到电源正负极,VO接到可调电位器的中间引脚(用于调节背光亮度),RS、RW和E分别接到MCU的IO口上,D0-D7分别接到MCU的8个IO口上。

2.初始化LCD1602的操作包括设置显示模式、显示光标、输入模式等,具体步骤如下:a.将8位数据接口设置为并行输入模式,即设置D0-D3为输入模式。

b.设置显示模式为2行显示,5x8点阵字符,显示器不移动。

c.将显示光标设置为闪烁显示。

d.设置数据输入方式为向右移动,同时字符显示不移动。

e.清除显示内容,将光标位置设置为第一行第一列。

f.打开显示器和光标显示功能。

二、常用函数和操作方法:1. void lcd1602_init( 初始化LCD1602,包括上述硬件连接和初始化步骤。

2. void lcd1602_clear( 清除显示内容。

3. void lcd1602_setCursor(int row, int column) 设置光标位置,row表示行数(从0开始),column表示列数(从0开始)。

4. void lcd1602_print(String str) 在当前光标位置打印字符串str。

5. void lcd1602_shiftDisplayLeft( 将显示内容向左移动一位。

6. void lcd1602_shiftDisplayRight( 将显示内容向右移动一位。

7. void lcd1602_scrollDisplayLeft( 将整个显示内容向左滚动一格。

8. void lcd1602_scrollDisplayRight( 将整个显示内容向右滚动一格。

9. void lcd1602_noCursor( 关闭光标显示。

10. void lcd1602_cursor( 打开光标显示。

51单片机lcd1602显示温度源程序18b20测温

51单片机lcd1602显示温度源程序18b20测温

LCD1 twice/////////////////////////////////////////////////////III ////// ======================================= //b5E2RGbCAP //// ===作者:Ni 的年少 W A O 轻狂========== //// plEanqFDPw //// ===创建时间:2008.07.03 ========== //// DXDiTa9E3d/// =======================================////RTCrpUDGiT///// 5PCzVD7HxA//////////////////////////////////////////////////////jLBHrnAlLg//////////////////////////////////// ///// DS18b20 温度传感器////////////////////////////////////////////*注:1、当用到循环左移或右移时 <>> 或 <<),不能超出变的范围例如:un sig ned char i,j 。

j=(i<<8>>>4得到的结果出错。

un sig ned char j 。

unsignedint i 。

j=(i<<8>>>4。

- b i»'is'PODXADClKTAL2RSTFu 1/ADl P&.2XAD2 PD 3怕D3 FO.OAIK P0.«/AM P0.7XAD7 卩工唤PSEN 叱担⑴ P2.-3/A11 ALE P2.4/A1JEAP1J 5JA1SP2J8M14P2.7;A15 P1.D P3.O/RXDP1.1 PM ™ PI.2 P3.2/INTD PI.3 P3 3/INTIPI.4PI.5 F3.57T1Pl.6 p 财硕 PI.7F3.7/1RDNOU TEF1P : -49 163°iishenton9弍 ... I:.代「旳匚引203Q_3i 85SBSaBb?4 毎--R1J weDOOND ••3S1SB2F「:斗It 26,2L28 16得到的结果正确••…2、LCD 的清屏时间 ——1.64ms 。

LCD1602液晶显示器进行设置时钟程序

LCD1602液晶显示器进行设置时钟程序
write(0x80+0x40+add);//设置add位地置
read(0x30+shi);//设置十位地置
read(0x30+ge);//设置个位地址
}
void key()//独立开关控制
{
if(K1==0)
{
delay(5);
if(K1==0)
{
K1num++;
while(!K1);//判断按键是否按下
}
}
}
}
}
void main()//主函数
{
init();//调用子函数
init1();//调用定时子函数
while(1)
{
key();
}
}
void init1()//定时子函数
{
TMOD=0x01;
EA=1;//开总中断
ET0=1;//开定时器中断
TR0=1;
TH0=(65536-50000)/256; //设置时间50ms
{
s++;
if(s==23)
s=0;
write_sfm(3,s);
write(0x80+0x40+3);//时地址
}
}
}
if(K3==0)
{
delay(5);
if(K3==0)
{
while(!K3);
if(K1num==1) //K3控制时分秒减
{
m--m);
EP=1;
delay(5);
EP=0;
}
void read(uchar date)//写入指令函数
{
RS=1;//根据时序图来设置

DS18B20温度计 c程序 lcd1602显示(word文档良心出品)

DS18B20温度计 c程序 lcd1602显示(word文档良心出品)

2007-12-14 19:05温度值精确到0.1度,lcd1602显示仿真电路图如下c程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;unsigned char code str1[]={"temperature: "};unsigned char code str2[]={" "};uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令//{ delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);}/******************************ds1820程序***************************************/ 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); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/{unsigned char i=0;for (i=8; i>0; 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(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue);}/*******************************************************************/ void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}wr_com(0xc0);wr_dat(flagdat);//显示符号位wr_com(0xc1);wr_dat(disdata[0]);//显示百位wr_com(0xc2);wr_dat(disdata[1]);//显示十位wr_com(0xc3);wr_dat(disdata[2]);//显示个位wr_com(0xc4);wr_dat(0x2e);//显示小数点wr_com(0xc5);wr_dat(disdata[3]);//显示小数位}/********************主程序***********************************/void main(){ init_play();//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}。

1602液晶显示时间与温度程序

1602液晶显示时间与温度程序

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit lcden=P2^7;sbit lcdrs=P2^5;sbit rw=P2^6;sbit DQ=P3^5;sbit key1=P3^0;sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^7;uchar count,key1num,key2num,key3num,shi,fen,miao; uchar num;uchar code table[]= {" 00:00:00 "};uchar code table1[]={" 000.0 C "};uchar code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; uchar SegBuffer[4]={0};void Delay_15us(uint del){for(del;del>0;del--){_nop_();_nop_();_nop_();_nop_();}_nop_();_nop_();}bit RST_DS18B20(){bit ret=1;DQ=0;Delay_15us(39);DQ=1;Delay_15us(4);ret=DQ;Delay_15us(27);DQ=1;return ret;}void WBIT_DS18B20(bit data_bit){DQ=0;Delay_15us(0);DQ=data_bit;Delay_15us(2);DQ=1;}void WBYTE_DS18B20(uchar data_byte){uchar i;for(i=0;i<8;i++){WBIT_DS18B20((bit)(data_byte & 0x01));data_byte>>=1;}}bit RBIT_DS18B20(){bit data_bit;DQ=0;_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();data_bit=DQ;Delay_15us(3);DQ=1;return data_bit;}uchar RBYTE_DS18B20(){uchar data_byte=0;uchar i,j;for(i=0;i<8;i++){j=RBIT_DS18B20();j=j<<i;data_byte=data_byte|j;}return data_byte;}void START_DS18B20(){DQ=1;_nop_();_nop_();RST_DS18B20();WBYTE_DS18B20(0xcc);WBYTE_DS18B20(0x44);}uint READ_TEM(){uint tem=0;DQ=1;_nop_();_nop_();RST_DS18B20();WBYTE_DS18B20(0xcc);WBYTE_DS18B20(0xbe);tem=RBYTE_DS18B20();tem=(RBYTE_DS18B20()<<8)|tem;return tem;}void Temperature_4(uint data_tem) {uint dat=0;float temp;if(data_tem&0x800){data_tem=~data_tem+1;temp=data_tem*0.0625;temp=temp*10+0.5;dat=temp;SegBuffer[0]=dat%10;SegBuffer[1]=dat/10%10;SegBuffer[2]=dat/100%10;;}else{temp=data_tem*0.0625;temp=temp*10+0.5;dat=temp ;SegBuffer[0]=dat%10;SegBuffer[1]=dat/10%10;SegBuffer[2]=dat/100%10;SegBuffer[3]=dat/1000%10;}}void delay_1ms(uint del){uint i,j;for(i=0;i<del;i++)for(j=0;j<148;j++);}void write_com(uchar com){lcdrs=0;P0=com;delay_1ms(5);lcden=1;delay_1ms(5);lcden=0;}void write_date(uchar date){lcdrs=1;P0=date;delay_1ms(5);lcden=1;delay_1ms(5);lcden=0;}void display(){write_date(0x30+SegBuffer[0]); write_com(0x80+0x40+7);write_date(0x30+SegBuffer[1]); write_com(0x80+0x40+6);write_date(0x30+SegBuffer[2]); write_com(0x80+0x40+5);write_date(0x30+SegBuffer[3]);}void init(){rw=0;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<16;num++){write_date(table[num]);delay_1ms(5);}write_com(0x80+0x40);for(num=0;num<16;num++){write_date(table1[num]);delay_1ms(5);}TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;IE=0x82;TR0=1;}void write_sfm(uchar add,uchar date) {uchar shi1,ge;shi1=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi1);}void keyscan(){key4=0;if(key1==0){delay_1ms(1);if(key1==0){key1num++;while(!key1);if(key1num==1){TR0=0;write_com(0x80+11);write_com(0x0f);}if(key1num==2){write_com(0x80+8);}if(key1num==3){write_com(0x80+5);}if(key1num==4){key1num=0;write_com(0x0c);TR0=1;}}}if(key1num!=0){if(key2==0){delay_1ms(1);if(key2==0){while(!key2);if(key1num==1){miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+10);}if(key1num==2){fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+7);}if(key1num==3){shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+4);}}}if(key3==0){delay_1ms(1);if(key3==0){while(!key3);if(key1num==1){miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+10);}if(key1num==2){fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+7);}if(key1num==3){shi--;if(shi==-1)shi=23;write_sfm(4,shi);write_com(0x80+4);}}}}}void main(){uint temp=0;init();while(1){START_DS18B20();temp=READ_TEM();Temperature_4(temp);display();keyscan();}}void T0_time() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;count++;if(count==20){count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}write_sfm(4,shi);}write_sfm(7,fen);}write_sfm(10,miao);}}。

LCD1602液晶显示实验实验报告及程序

LCD1602液晶显示实验实验报告及程序

LCD1602液晶显示实验实验报告及程序一、实验目的本次实验的主要目的是熟悉并掌握 LCD1602 液晶显示屏的工作原理和编程方法,能够成功实现字符在液晶屏幕上的显示和控制。

二、实验原理LCD1602 是一种工业字符型液晶,能够显示 16x2 个字符,即每行16 个字符,共 2 行。

它的工作原理是通过控制液晶分子的偏转来实现字符的显示。

LCD1602 有 16 个引脚,主要引脚功能如下:1、 VSS:接地。

2、 VDD:接电源(通常为+5V)。

3、 V0:对比度调整引脚,通过外接电位器来调节屏幕显示的对比度。

4、 RS:寄存器选择引脚,高电平时选择数据寄存器,低电平时选择指令寄存器。

5、 RW:读写选择引脚,高电平时进行读操作,低电平时进行写操作。

6、 E:使能引脚,下降沿触发。

7、 D0 D7:数据引脚,用于传输数据和指令。

LCD1602 的指令集包括清屏、归位、输入方式设置、显示开关控制、光标或显示移位、功能设置、CGRAM 和 DDRAM 地址设置以及读忙标志和地址等。

三、实验设备与材料1、单片机开发板2、 LCD1602 液晶显示屏3、杜邦线若干4、电脑四、实验步骤1、硬件连接将 LCD1602 的 VSS 引脚接地。

将 VDD 引脚接+5V 电源。

将 V0 引脚通过一个 10K 的电位器接地,用于调节对比度。

将 RS、RW、E 引脚分别连接到单片机的三个 I/O 口。

将 D0 D7 引脚连接到单片机的 8 个 I/O 口。

2、软件编程包含必要的头文件。

定义与 LCD1602 连接的 I/O 口。

编写初始化函数,包括设置显示模式、清屏、输入方式等。

编写写指令函数和写数据函数,用于向LCD1602 发送指令和数据。

编写显示字符串函数,实现字符在屏幕上的显示。

3、编译下载程序使用编译软件对编写的程序进行编译,生成可执行文件。

将可执行文件下载到单片机开发板中。

4、观察实验结果给开发板上电,观察 LCD1602 液晶显示屏上是否正确显示预设的字符。

LCD1602的简单显示程序

LCD1602的简单显示程序

/*========================================================= 1602液晶显示的实验例子-------------------------------------------------| DB4-----P0.4 | RW-------P2.1| DB5-----P0.5 | RS-------P2.2| DB6-----P0.6 | E--------P2.0| DB7-----P0.7 |---------------------------------------------------LCD1602的简简单显示=========================================================*/ #include#include#define LCM_RW P2_1 //定义引脚#define LCM_RS P2_2#define LCM_E P2_0#define LCM_Data P0#define Busy 0x80 //用于检测LCM状态字中的Busy标识/*------------------------------------------子函数声明------------------------------------------*/void Write_Data_LCM(unsigned char WDLCM);void Write_Command_LCM(unsigned char WCLCM,BuysC);void Read_Status_LCM(void);void LCM_Init(void);void Set_xy_LCM(unsigned char x, unsigned char y);void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s);void main(void){LCM_Init(); //LCM初始化delay_nms(5);//延时片刻(可不要)while(1){Display_List_Char(0, 0, "");Display_List_Char(1, 0, "Robot-AT89S52");}}/*=====================================函数名:Read_Status_LCM()功能:忙检测函数======================================*/void Read_Status_LCM(void){unsigned char read=0;LCM_RW = 1;LCM_RS = 0;LCM_E = 1;LCM_Data = 0xff;do{read = LCM_Data;}while(read & Busy);LCM_E = 0;}/*------------------------------------------- 函数名:Write_Data_LCM ( )功能:对LCD 1602写数据--------------------------------------------*/ void Write_Data_LCM(unsigned char WDLCM){Read_Status_LCM(); //检测忙LCM_RS = 1;LCM_RW = 0;LCM_Data &= 0x0f;LCM_Data |= WDLCM&0xf0;LCM_E = 1; //若晶振速度太高可以在这后加小的延时LCM_E = 1; //延时LCM_E = 0;WDLCM = WDLCM<<4;LCM_Data &= 0x0f;LCM_Data |= WDLCM&0xf0;LCM_E = 1;LCM_E = 1; //延时LCM_E = 0;}/*-------------------------------------------函数名:Write_Command_ LCM ( )功能:对LCD 1602写指令--------------------------------------------*/void Write_Command_LCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC)Read_Status_LCM(); //根据需要检测忙LCM_RS = 0;LCM_RW = 0;LCM_Data &= 0x0f;LCM_Data |= WCLCM&0xf0;//传输高四位LCM_E = 1;LCM_E = 1;LCM_E = 0;WCLCM = WCLCM<<4; //传输低四位LCM_Data &= 0x0f;LCM_Data |= WCLCM&0xf0;LCM_E = 1;LCM_E = 1;LCM_E = 0;}/*-------------------------------------------函数名:LCM_Init()功能:对LCD 1602初始化--------------------------------------------*/void LCM_Init(void) //LCM初始化{LCM_Data = 0;Write_Command_LCM(0x28,0); //三次显示模式设置,不检测忙信号delay_nms(15);Write_Command_LCM(0x28,0);delay_nms(15);Write_Command_LCM(0x28,0);delay_nms(15);Write_Command_LCM(0x28,1); //显示模式设置,开始要求每次检测忙信号Write_Command_LCM(0x08,1); //关闭显示Write_Command_LCM(0x01,1); //显示清屏Write_Command_LCM(0x06,1); //显示光标移动设置Write_Command_LCM(0x0C,1); //显示开及光标设置}/*-------------------------------------------函数名:Set_xy_LCM ()功能:设定显示坐标位置--------------------------------------------*/void Set_xy_LCM(unsigned char x, unsigned char y){unsigned char address;if( x == 0 )address = 0x80+y;elseaddress = 0xc0+y;Write_Command_LCM(address,1);}/*-------------------------------------------函数名:Display_List_Char()功能:按指定位置显示一串字符--------------------------------------------*/void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s){Set_xy_LCM(x,y);while(*s){LCM_Data = *s;Write_Data_LCM(*s);s++;}}datasheet搜索: 。

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毫秒

}

超声波测距程序(LCD1602液晶显示)

超声波测距程序(LCD1602液晶显示)

#include<reg52.h>#include<intrins.h>#define uint unsignedint#define uchar unsigned char#define NOP() {_nop_();_nop_();_nop_();_nop_();}//------LCD引脚-----sbit LCD_RS=P2^6;sbit LCD_RW=P2^5;sbit LCD_EN=P2^7;//------超声波引脚-------sbitTx=P3^3; //触发控制信号输入Trigsbit Rx=P3^2; //回响信号输出Echouchar code table[]={"Distance Test:"}; //LCD第一行显示uchartemp_dis[]= {"000.0 cm"}; //LCD第二行longintt,distance;uchar cache[4]={0,0,0,0};//--------延时-------void delay(uintms){uint t;while(ms--)for(t=0;t<120;t++);}//-------读LCD状态-------ucharread_lcd_state(){uchar state;LCD_RS=0;LCD_RW=1;LCD_EN=1;_nop_();state=P0;LCD_EN=0;_nop_();return state;}//-------忙等待------voidlcd_busy_wait(){while((read_lcd_state() & 0x80)==0x80);NOP();}//----------LCD写指令----------voidlcd_write_com(uchar com){lcd_busy_wait();LCD_RS=0; //RS为0时,写指令,RS为1时,写数据LCD_RW=0;P0=com;NOP();LCD_EN=1;NOP();LCD_EN=0;}//----------LCD写数据----------voidlcd_write_data(uchardat){lcd_busy_wait();LCD_RS=1;LCD_RW=0;P0=dat;NOP();LCD_EN=1;NOP();LCD_EN=0;}//-------LCD初始化-------voidlcd_init(){LCD_EN=0;lcd_write_com(0x38); //LCD显示模式设置lcd_write_com(0x0c); //LCD显示开/关及光标设置lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1 lcd_write_com(0x01); //显示清屏}//---------设置液晶显示位置-----------voidset_lcd_pos(uchar p){lcd_write_com(p|0x80);}//---------液晶显示程序----------voidlcd_print(ucharp,uchar *s,uint low){uintnum;set_lcd_pos(p);for(num=0;num<low;num++){lcd_write_data(s[num]);delay(1);}}void HC05_Init(){Tx=1; //触发脉冲NOP();NOP();NOP();NOP();Tx=0;distance=0.17*t; //距离计算}voiddistance_convert(long intdat){cache[0]=dat/1000;cache[1]=dat/100%10;cache[2]=dat/10%10;cache[3]=dat%10;temp_dis[0]=cache[0]+'0';temp_dis[1]=cache[1]+'0';temp_dis[2]=cache[2]+'0';temp_dis[4]=cache[3]+'0';}//------------主程序-----------void main(){lcd_init();delay(5);TMOD=0x19;EA=1; //开总中断TR0=1; //启动定时器EX0=1; //开外部中断IT0=1; //设置为下降沿中断方式while(1){HC05_Init();distance_convert(distance);lcd_print(0x01,table,14);lcd_print(0x44,temp_dis,8);}}//外部中断0void int0() interrupt 0{t=(TH0*256+TL0); //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时TH0=0;TL0=0;}。

基于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;当进行写模块操作,指向指令寄存器。

DS18B20+LCD1602温度显示演示程序

DS18B20+LCD1602温度显示演示程序

K1 ---减键
设定数减少
每当有键按下,蜂鸣器会响一声。
按住K1或K2键不放可以对设定值进行快速加减。
将设定的温度报警值存入 DS18B20 中的 EERAM,开机自动调出。
----------------------------------
K1---读出 DS18B20 的64位ROM码
LCD1602显示:
READ_ROMCORD
28D6318A000000E3 ;我的DS18B20的64位序列号
低 → 高
具有CRC码效验功能。
K2---退出64位ROM码显示画面。
----------------------------------
3、可以预设高低温报警值(可以用作温度控制)。
----------------------------------
开机时对DS18B20进行检测,如果DS18B20检测不正常,LCD1602显示:
DS18B20 ERROR
PLEASE CHECK
蜂鸣器报警。
DS18B20+LCD1602温度显示演示程序
----------------------------------
采用C语言编写
适用于 ME500
----------------------------------
主要功能:
1、显示实时温度值。
2、可以读出 DS18B20 的64位ROM码。
DS18B20检测正常,LCD1602显示:
TEMP: 100.8℃
TH: 88* TL: 20* ;“*”为报警小喇叭显示的位置
如果温度值高位为0,将不显示出来。

LCD1602显示时间和温度

LCD1602显示时间和温度

/*************************************************************/
/* */
/* 延时子程序 */
delay(5);
lcd_wcom(0x38);
delay(5);
lcd_wcom(0x38);
delay(5);
lcd_wcom(0x0c); //显示开,关光标
delay(5);
lcd_wcom(0x06); //移动光标
delay(5);
lcd_wcom(0x01); //清除LCD的显示内容
delay(5);
}
/*************************************************************/
/* */
/* 1602显示字符串 */
/* */
sbit SDA=P3^4; //数据端
sbit RST = P3^5; // DS1302复位端
sbit LCD_RW = P2^5; //1602的读写端
sbit LCD_RS = P2^6; //1602的数据命令端
sbit LCD_EN = P2^7; //1602的使能
/* */
/* LCD初始化设定 */
/* */
/* */
/*******************************************************************/
void lcd_wcom(uchar com)
/*************************************************************/
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
sbit LcdRs = P2^5;
sbit LcdRw = P2^6;
sbit LcdEn = P2^4;
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
void delay_key(uint a)
{
uint b;
LcdRw=0;
P0=input;
delay_key(10);
LcdEn=1;
delay_key(10);
LcdEn=0;
}
//设置显示模式************************************************************
void LCD_SetDisplay(unsigned char DisplayMode)
/***********1602液晶显示部分子程序****************/
///////////////////////////////////////////////////
//Port Definitions**********************************************************
DS1302_CLK = 1;
DS1302_RST = 0;
}
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
unsigned char ucData;
DS1302_RST = 0;
TR2=1;
delay(20);
EA=0;
EX1=0;
if(a==1)
{
time=timeh*256+timel;
distancstance=0;
Distance[0]=distance/100+'0';
for(b=0;b<a;b++);
}
//向LCD写入命令或数据********************************************************
void LCD_Write(bit style, uchar input)
{
LcdRs=style;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1;
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
float time;
uchar distance;
EA=0;
Trig=1;
delay_20us();
Trig=0;
while(Echo==0);
a=0;
EA=1;
EX1=1;
TH2=0;
TL2=0;
TF2=0;
ReadValue = Read1302(0x84);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(0x86);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
if(y==1)
LCD_Write(0,0x80|(x-0x40));
}
//将字符输出到液晶显示
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(1,*str);
str++;
}
}
///////////////////////////////////////////////////
ReadValue = Read1302(0x88);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(0x8c);
Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
}
void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{ if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
DS1302_RST = 0;
return(ucData);
}
void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组
{
unsigned char ReadValue;
ReadValue = Read1302(0x80);
LCD_SetInput(0x02|0x00); //AC递增, 画面不动
}
//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(0,0x80|x);
/***********DS1302时钟部分子程序******************/
///////////////////////////////////////////////////
typedef struct __SYSTEMTIME__
{
unsigned char Second;
for(y=110;y>0;y--);
}
void delay_20us()
{
uint a;
for(a=100;a>0;a--);
}
void init()
{
EA=1;
Trig=0;
IT1=1;
}
void chaoshengbo()
{
{
LCD_Write(0, 0x08|DisplayMode);
}
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(0, 0x04|InputMode);
}
//初始化LCD************************************************************
uchar TempBuffer[5],max_temp[4],min_temp[4],Distance[3];
///////////////////超声波模块/////////////////////////
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
sbit DS1302_RST = P2^7; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit DQ = P2^0; //温度传送数据IO口
sbit voice=P2^3;
sbit Trig = P3^6;
unsigned char Minute;
unsigned char Hour;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[11];
unsigned char TimeString[9];
#include "reg52.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
sbit DS1302_CLK = P2^1; //实时时钟时钟线引脚
sbit DS1302_IO = P2^2; //实时时钟数据线引脚
Distance[1]=distance%100/10+'0';
Distance[2]=distance%10+'0';
相关文档
最新文档