- #include<reg52.h>
- #include<intrins.h>
- typedef unsigned char uint8;
- typedef unsigned int uint16;
- typedef unsigned long uint32;
- sbit rs=P2^6;
- sbit rw=P2^5;
- sbit e=P2^7;
- sbit dq=P3^7;
- sbit moto=P1^0; //直流電機
- uint8 d[16]=" tempertury ";
- uint8 num[10]="0123456789";
- uint8 a,c,temp;
- void delay(uint16 i)
- {
- while(i--);
- }
- void wrc(uint8 c)
- {
- delay(1000);
- rs=0;
- rw=0;
- e=0;
- P0=c;
- e=1;
- delay(10);
- e=0;
- }
- void wrd(uint8 dat)
- {
- delay(1000);
- rs=1;
- rw=0;
- e=0;
- P0=dat;
- e=1;
- delay(10);
- e=0;
- rs=0;
- }
- void lcdinit()
- {
- delay(1000);
- wrc(0x38);
- wrc(0x38);
- wrc(0x38);
- wrc(0x06);
- wrc(0x0c);
- wrc(0x01);
- }
- void ds18b20init() //18b20的初始化
- {
- dq=1;
- delay(1);
- dq=0;
- delay(80);
- dq=1;
- delay(5);
- dq=0;
- delay(20);
- dq=1;
- delay(35);
- }
- void ds18b20wr(uint8 dat) //18b20寫數據
- {
- uint8 i;
- for(i=0;i<8;i++)
- {
- dq=0;
- dq=dat&0x01;
- dat>>=1;
- delay(8);//在時序上只有這一塊對時序要求最準確,他的時間必須大于15us
- dq=1;
- delay(1);
- }
- }
- uint8 ds18b20rd() //18b20讀數據
- {
- uint8 value,i;
- for(i=0;i<8;i++)
- {
- dq=0;
- value>>=1;
- dq=1;
- if(dq==1)value|=0x80;
- delay(8);//在這一塊也對時間要求特別準確,整段程序必須大于60us
- }
- return value;
- }
- uint8 readtemp() //讀取溫度內需要復位的
- {
- uint8 b;
- ds18b20init(); //初始化
- ds18b20wr(0xcc); //發送忽略ROM指令
- ds18b20wr(0x44); //發送溫度轉換指令
- delay(100);
- ds18b20init(); //初始化
- ds18b20wr(0xcc); //發送忽略ROM指令
- ds18b20wr(0xbe); //發讀暫存器指令
- a=ds18b20rd(); //溫度的低八位
- b=ds18b20rd(); //溫度的高八位
- b<<=4; //ssss s***;s為標志位s=0表示溫度值為正數,s=1溫度值為負數
- c=b&0x80; //溫度正負標志位確認
- b+=(a&0xf0)>>4;
- a=a&0x0f; //溫度的小數部分
- return b;
- }
- void display()
- {
- uint16 i,k;
- float dio;
- dio=a*0.0625;
- k=dio*10000;//取小數點后兩位有效數字
- wrc(0x80+0x00);
- for(i=0;i<16;i++)
- {
- wrd(d);
- }
- wrc(0x80+0x43);
- if(c==0x80) //讀取到負溫度即為補碼,要將其轉換成源碼
- {
- wrd('-');
- temp=temp-1;
- temp=(~temp)|0x80;//負數的補碼即為反碼+1;而負數的反碼為其源碼取反,除了符號位;正數的補碼等于正數的反碼等于正數的源碼
- }
- else
- {
- wrd('+');
- temp=(temp);
- }
- wrd(num[temp/100]);
- wrd(num[temp%100/10]);
- wrd(num[temp%100%10]);
- wrd('.');
- wrd(num[k/1000]);
- wrd(num[k%1000/100]);
- wrd(0xdf);
- wrd('C');
- }
- void motospeed(uint16 i)
- {
- while(i--)
- {
- moto=~moto;
- }
- }
- void delayms(int i)
- {
- while(i--);
- }
- void time0init() //定時器0初始化
- {
- TMOD=0X01;
- TH0=0Xfc;
- TL0=0X18; //1ms
- TR0=1;
- EA=1;
- ET0=1;
- }
- void main()
- {
- lcdinit();
- moto=0;
- while(1)
- {
- //moto=1;
- temp=readtemp();
- display();
- //具體的溫度和速度范圍自己可以設置
- if(temp>0&&temp<=26) //速度2
- // motospeed(1);
- {
|