求助求助!!!!!
我的問題又更新了。為什么proteus仿真的時候,只有-25~+25的數值顯示是正確的啊?怎么改呢?
- #include <REG51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit EN=P2^2;
- sbit DQ=P3^4;
- uchar code table1[]="Temperature is:";
- uint table2[6],temperature,temperatureflag;
- uint wei_bai,wei_shi,wei_ge,xiaoshu,fuhao,wendu;
- void delay(int a)
- {
- int i,j;
- for(i=a;i>0;i--)
- for(j=0;j<110;j++);
- }
- void delayus(int a)
- {
- while(a--);
- }
- void write_com(uchar com)
- {
- P0=com;
- RS=0;RW=0;EN=1;
- delay(10);
- EN=0;
- }
- void write_dat(uchar dat)
- {
- P0=dat;
- RS=1;RW=0;EN=1;
- delay(10);
- EN=0;
- }
- void init_LM1602()
- {
- write_com(0x01);
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- }
- uchar read_onebyte()
- {
- uchar i,temp=0;
- for(i=0;i<8;i++)
- {
- DQ=0;
- temp>>=1;
- DQ=1;
- if(DQ) temp|=0x80;
- delayus(4);
- }
- return temp;
- }
- void write_onebyte(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DQ=0;
- DQ=dat&0x01;
- delayus(10);
- DQ=1;
- dat>>=1;
- }
- }
- void init_DS18B20()
- {
- uchar x=0;
- DQ=1;
- delayus(8);
- DQ=0;
- delayus(80);
- DQ=1;
- delay(4);
- x=DQ;
- delayus(20);
- }
- uchar read_Temparature()
- {
- uchar tempL=0,tempH=0;
- init_DS18B20();
- write_onebyte(0xcc);
- write_onebyte(0x44);
- delayus(100);
- init_DS18B20();
- write_onebyte(0xcc);
- write_onebyte(0xbe);
- tempL=read_onebyte();
- tempH=read_onebyte();
- /* if(tempH&0xF0) //顯示負數
- {
- tempL=~tempL;
- tempH=~tempH;
- temperature=(tempH*256+tempL)/16*(-1)-1;
- temperatureflag=1;
- }
- else //顯示正數
- {
- temperature=(tempH*256+tempL)*0.0625;
- temperatureflag=0;
- }*/
- temperature=tempH;
- temperature=temperature<<8;
- temperature=temperature|tempL;
- if(temperature>0x0fff)
- {
- temperature=~temperature+2;
- temperatureflag=1;
- }
- else temperatureflag=0;
- temperature=temperature*0.0625*10;
- return temperature;
- }
- void display()
- {
- wendu=read_Temparature();
- if(temperatureflag==1) fuhao=0x2d;
- else fuhao=0x2b;
- wei_bai=wendu/1000+0x30;
- wei_shi=wendu%1000/100+0x30;
- wei_ge=wendu%100/10+0x30;
- xiaoshu=wendu%10+0x30;
- write_com(0xc3);
- write_dat(fuhao);
- write_dat(wei_bai);
- write_dat(wei_shi);
- write_dat(wei_ge);
- write_dat(0x2e);
- write_dat(xiaoshu);
- write_dat(0xdf);
- write_dat(0x43);
- }
- void main()
- {
- uchar i;
- init_LM1602();
- while(1)
- {
- write_com(0x80);
- for(i=0;i<15;i++)
- {
- write_dat(table1[i]);
- delay(5);
- }
- display();
- }
- }
復制代碼
|