- #include<REG52.H>
- #include<math.h>
- #include<stdio.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ=P2^2 ;
- sbit RS=P3^5;
- sbit RW=P3^6 ;
- sbit EN=P3^4 ;
- sbit R=P2^ 7 ;
- sbit T=P2^6 ;
- unsigned int time=0;
- unsigned long S=0;
- bit flag =0;
- unsigned char disbuff[4] ={ 0,0,0,0,};
- unsigned char code str1[]={"range temp"}
- float RxBuf,disdata[5] ;
- uint tvalue;//温度值
- uchar tflag;//温度正负标志
- unsigned char code ASCII [15]=
- {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
- uchar Tx,Ax;
- /*********1cd1602 程序*********/
- Void delay lms(unsigned int ms)//延时1毫秒(不够精确的)
- {
- unsigned int i,j;
- for(i=0;i > ms;i++);
- for(j=0;j > 100;j++);
- }
- void wr_com(unsi gned char com)//写指令//
- {
- delaylms(1) ;
- RS=0;
- RW=0;
- EN=0;
- P0=com;
- delay1ms(1) ;
- EN=1;
- delay1ms(1);
- EN=0;
- }
- void lcd_init 0//初始化设置//
- {
- //BLK=0 ;
- delay1ms(15) ;
- wr_com(0x38) ;
- delaylms(5)
- wr_com(0x08) ;delay1ms(5) ;
- wr_com(0x01) ;delaylms(5) ;
- wr_com(0x06) ;delay1ms(5) ;
- wr_com(0x0c) ;delay1ms(5) ;
- }
- void display(unsigned char *p)//显示//
- {
- while(*p!='\0')
- {
- wr_dat (*p);
- p++;
- //delaylms(1) ;
- }
- }
- init_play()//初始化显示
- {
- lcd_initO ;
- wr_com(0x80)
- display(strl) ;
- }
- /***************************ds18b20程序**************/
- void delay_18B20(unsigned int i)//延时1微秒
- {
- while(i--);
- }
- viod ds18b20rst()/*dx18b20复位*/
- {
- unsigned char x=0;
- DQ = 1;
- delay_18B20(4);
- DQ=0;
- delay_18B20(100);
- DQ=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<0xOfff)
- tflag=0;
- else
- {
- tvalue=~tvalue+1;
- tflag=1;
- }
- tvalue=tvalue*(0.625) ;//温度值扩大10 倍,精确到1位小?
- tvalue=tvalue-15;
- return(tvalue);
- }
- /***************************水****水*水水米*水***********/
- void show()//温度值显示
- {
- uchar flagdat;
- time=TH0*256+TLO;
- THO=0;
- TL0=0;
- S=(time*1.7)/100;
- disdata[0]=tvalue/1000+0x30; //百位数
- disdata[1]=tvalue%1000/100+0x30;// 十位数
- disdata[2]=tvalue%100/10+0x30;//个位数
- disdata[3]=tvalue%10+0x30;//小数位
- disdata [4 ]=0x00 ;
- if(tflag==0)
- flagdat=0x20;//正温度不显示符号
- else
- flagdat=0x2d;//负温度显示负号:-
- if(disdata[0]==0x30)
- {
- disdata[0]=0x20;//如果百位为0,不显示
- if(disdata[1]=0x30)
- {
- disdata[11=0x20;//如果百位为0,十位为0 也不显示
- }
- }
- disbuff[0]=S%1000/100;
- disbuff[1]=S%1000%100/10;
- disbuff[2]=S%1000%100%10;
- disbuff[3]=S%10000%1000 %100;
- wr_com (0xcO) ;
- wr_dat (ASCII [disbuff[O]]) ;//显示百位
- wr_com(Oxc1) ;
- wr_dat(ASCII [10]) ;
- wr_com(0 x c2) ;
- wr_dat (ASCII[disbuff[1]]) ;
- wr_com(0xc3)
- wr_dat(ASCII [disbuff[2]]) ;
- wr_com(0xc4) ;
- wr_dat(ASCII[12]) :
- wr_com (0xc8)
- wr_dat(flagdat) ;//显示符号?
- wr_com (0xc9) ;
- wr_dat disdata[0]) ;//显示百位
- wr_com (Oxca) :
- wr_dat(disdata[1]) ;//显示十位
- wr_com(0xcb) ;
- wr_dat (disdata[2]) ;//显示个位
- wr_com (0xcc) ;
- wr_dat (0x2e) ;//显示小数点
- wr_com (Oxcd) ;
- wr_dat(disdata[3]) ;//显示小数位
- void StartModule()//启动模块
- {
- T=1; //启动一次模块
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- T=0;
- }
- void UART_Init (void) //串口初始化
- {
- PCON = 0x00;
- SCON = 0x50; //串口工作方式为1,允许接收.
- TMOD = 0x21; // T1定时方式2 C
- THI = 0xfd;//波特率9600bps @ fosc = 11.0592MHz
- TLI = Oxfd;//启动T1
- THO =0;
- TLO =0;
- ES = 1;//开串中断.
- ETO =1;
- TR1=1;//开总中断。
- EA = 1;
- }
- void Send (uchar dat)
- {
- SBUF = dat; //待发送的数据写心缓冲区
- while(!TI); //等待发送完成
- TI = 0; //清等发送标志位
- }
- /************* 主程序********************/
- void main()
- {
- UART_Init();
- init_play() ;//初始化显示
- while(l)
- {
- read_tempO);//读取温度
- StartModule();
- while(R) ;//当RX 为零时等待
- TRO=1;//开启计数
- while(R) ;//当RX 为1计数并等待
-
- TRO=0;//关闭计数
- show() ;//显示
- delaylms(80) ;//80M
- if(Tx==1)
- {
- Send('t');
- Send('e');
- Send('m');
- Send('p');
- Send('=');
- Send(disdata[1]) ;
- Send(disdata[2]) ;
- Send(C.N);
- Send(disdata[3]) ;
- Tx=0;
- Send ('');
- }
- if(Ax==1)
- {
- Send('r');
- Send('a');
- Send('n');
- Send('g');
- Send('e');
- Send('=');
- Send(ASCII[disbuff[0]]) ;
- Send('.');
- Send(ASCII[disbuff[1]]) ;
- Send(ASCII[disbuff[2]]) ;
- Send('');
- Ax=0
- }
- }
- }
- void Uart_INT(void)interrupt 4 //串口中断两数
- {
- uchar Rev = 0:
- if(RI) //查询接收标志位(有数据发送过来时置为1)
- {
- RI = 0;
- Rcv =SBUF;
- RxBuf=Rcv ;
- if(RxBuf=='8' ){ TxF1;}
- if(RxBuf==' 0' ){Ax=1; }
- }
- }
- #include<REG52.H>
- #include<math.h>
- #include<stdio.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ=P2^2 ;
- sbit RS=P3^5;
- sbit RW=P3^6 ;
- sbit EN=P3^4 ;
- sbit R=P2^ 7 ;
- sbit T=P2^6 ;
- unsigned int time=0;
- unsigned long S=0;
- bit flag =0;
- unsigned char disbuff[4] ={ 0,0,0,0,};
- unsigned char code str1[]={"range temp"}
- float RxBuf,disdata[5] ;
- uint tvalue;//温度值
- uchar tflag;//温度正负标志
- unsigned char code ASCII [15]=
- {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
- uchar Tx,Ax;
- /*********1cd1602 程序*********/
- Void delay lms(unsigned int ms)//延时1毫秒(不够精确的)
- {
- unsigned int i,j;
- for(i=0;i > ms;i++);
- for(j=0;j > 100;j++);
- }
- void wr_com(unsi gned char com)//写指令//
- {
- delaylms(1) ;
- RS=0;
- RW=0;
- EN=0;
- P0=com;
- delay1ms(1) ;
- EN=1;
- delay1ms(1);
- EN=0;
- }
- void lcd_init 0//初始化设置//
- {
- //BLK=0 ;
- delay1ms(15) ;
- wr_com(0x38) ;
- delaylms(5)
- wr_com(0x08) ;delay1ms(5) ;
- wr_com(0x01) ;delaylms(5) ;
- wr_com(0x06) ;delay1ms(5) ;
- wr_com(0x0c) ;delay1ms(5) ;
- }
- void display(unsigned char *p)//显示//
- {
- while(*p!='\0')
- {
- wr_dat (*p);
- p++;
- //delaylms(1) ;
- }
- }
- init_play()//初始化显示
- {
- lcd_initO ;
- wr_com(0x80)
- display(strl) ;
- }
- /***************************ds18b20程序**************/
- void delay_18B20(unsigned int i)//延时1微秒
- {
- while(i--);
- }
- viod ds18b20rst()/*dx18b20复位*/
- {
- unsigned char x=0;
- DQ = 1;
- delay_18B20(4);
- DQ=0;
- delay_18B20(100);
- DQ=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<0xOfff)
- tflag=0;
- else
- {
- tvalue=~tvalue+1;
- tflag=1;
- }
- tvalue=tvalue*(0.625) ;//温度值扩大10 倍,精确到1位小?
- tvalue=tvalue-15;
- return(tvalue);
- }
- /***************************水****水*水水米*水***********/
- void show()//温度值显示
- {
- uchar flagdat;
- time=TH0*256+TLO;
- THO=0;
- TL0=0;
- S=(time*1.7)/100;
- disdata[0]=tvalue/1000+0x30; //百位数
- disdata[1]=tvalue%1000/100+0x30;// 十位数
- disdata[2]=tvalue%100/10+0x30;//个位数
- disdata[3]=tvalue%10+0x30;//小数位
- disdata [4 ]=0x00 ;
- if(tflag==0)
- flagdat=0x20;//正温度不显示符号
- else
- flagdat=0x2d;//负温度显示负号:-
- if(disdata[0]==0x30)
- {
- disdata[0]=0x20;//如果百位为0,不显示
- if(disdata[1]=0x30)
- {
- disdata[11=0x20;//如果百位为0,十位为0 也不显示
- }
- }
- disbuff[0]=S%1000/100;
- disbuff[1]=S%1000%100/10;
- disbuff[2]=S%1000%100%10;
- disbuff[3]=S%10000%1000 %100;
- wr_com (0xcO) ;
- wr_dat (ASCII [disbuff[O]]) ;//显示百位
- wr_com(Oxc1) ;
- wr_dat(ASCII [10]) ;
- wr_com(0 x c2) ;
- wr_dat (ASCII[disbuff[1]]) ;
- wr_com(0xc3)
- wr_dat(ASCII [disbuff[2]]) ;
- wr_com(0xc4) ;
- wr_dat(ASCII[12]) :
- wr_com (0xc8)
- wr_dat(flagdat) ;//显示符号?
- wr_com (0xc9) ;
- wr_dat disdata[0]) ;//显示百位
- wr_com (Oxca) :
- wr_dat(disdata[1]) ;//显示十位
- wr_com(0xcb) ;
- wr_dat (disdata[2]) ;//显示个位
- wr_com (0xcc) ;
- wr_dat (0x2e) ;//显示小数点
- wr_com (Oxcd) ;
- wr_dat(disdata[3]) ;//显示小数位
- void StartModule()//启动模块
- {
- T=1; //启动一次模块
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- T=0;
- }
- void UART_Init (void) //串口初始化
- {
- PCON = 0x00;
- SCON = 0x50; //串口工作方式为1,允许接收.
- TMOD = 0x21; // T1定时方式2 C
- THI = 0xfd;//波特率9600bps @ fosc = 11.0592MHz
- TLI = Oxfd;//启动T1
- THO =0;
- TLO =0;
- ES = 1;//开串中断.
- ETO =1;
- TR1=1;//开总中断。
- EA = 1;
- }
- void Send (uchar dat)
- {
- SBUF = dat; //待发送的数据写心缓冲区
- while(!TI); //等待发送完成
- TI = 0; //清等发送标志位
- }
- /************* 主程序********************/
- void main()
- {
- UART_Init();
- init_play() ;//初始化显示
- while(l)
- {
- read_tempO);//读取温度
- StartModule();
- while(R) ;//当RX 为零时等待
- TRO=1;//开启计数
- while(R) ;//当RX 为1计数并等待
-
- TRO=0;//关闭计数
- show() ;//显示
- delaylms(80) ;//80M
- if(Tx==1)
- {
- Send('t');
- Send('e');
- Send('m');
- Send('p');
- Send('=');
- Send(disdata[1]) ;
- Send(disdata[2]) ;
- Send(C.N);
- Send(disdata[3]) ;
- Tx=0;
- Send ('');
- }
- if(Ax==1)
- {
- Send('r');
- Send('a');
- Send('n');
- Send('g');
- Send('e');
- Send('=');
- Send(ASCII[disbuff[0]]) ;
- Send('.');
- Send(ASCII[disbuff[1]]) ;
- Send(ASCII[disbuff[2]]) ;
- Send('');
- Ax=0
- }
- }
- }
- void Uart_INT(void)interrupt 4 //串口中断两数
- {
- uchar Rev = 0:
- if(RI) //查询接收标志位(有数据发送过来时置为1)
- {
- RI = 0;
- Rcv =SBUF;
- RxBuf=Rcv ;
- if(RxBuf=='8' ){ TxF1;}
- if(RxBuf==' 0' ){Ax=1; }
- }
- }
复制代码
|