|
發布時間: 2018-12-2 15:54
正文摘要:初學單片機,老師比較傾向讓學生自學,所以很多東西要在網上自己學習,針對這個設計感覺無從下手,求大神們幫忙,基于我們這種板子幫我出個程序我學習一下,謝謝! |
| 網上自己隨便找都有的,ds18b20主要去學它的單串口通信線 |
| 這個程序要自己把管腳改了 |
| 這種百度一下就很多的,我是百度里學會的C51 |
|
#include"reg51.h" #include"intrins.h" #define uchar unsigned char #define uint unsigned int sbit DSPORT=P3^7; sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //uchar DisplayData[8]; void delay(uint z) { while(z--); } void delayus(uint x,uchar y) { uchar i,j; for(i=x;i>0;i--) for(j=y;j>0;j--); } void Ds18b20Init() { uchar st=1; DSPORT = 1; _nop_();_nop_(); while(st) { DSPORT = 0; //時序很重要,一定要準確; delayus(149,1); //延時750us DSPORT = 1; delayus(4,4); //延時15~60 us; if(DSPORT == 0) //當 DSPORT=0時,初始化才是正確的; st = 1; else st = 0; delayus(99,1); //延時500us } } void Ds18b20WriteByte(uchar dat) //寫是判斷數據再寫入, { uchar i,temp; DSPORT = 1; _nop_();_nop_(); for(i=0;i<8;i++) { DSPORT = 0; delayus(0,0); //延時20us temp=dat&0x01; // delayus(9,1); if(temp == 1) //判斷,然后把數據置給總線(把數據送走,好判斷) DSPORT = 1; delayus(2,2); //延時45us dat>>=1; DSPORT = 1; } } uchar Ds18b20ReadByte() //讀是有了數據再給數據 { uchar i,dat; // static bit j; for(i=0;i<8;i++) { dat>>=1; DSPORT=1; _nop_();_nop_(); DSPORT=0; _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); DSPORT=1; //當至高時,傳送數據; _nop_();_nop_();_nop_();_nop_(); // j=DSPORT; if(DSPORT) //判斷總線,高位傳送數據; dat=dat|0x80; delayus(1,1); } return dat; } void Ds18b20ChangTemp() { Ds18b20Init(); delayus(1,100); Ds18b20WriteByte(0xcc); //跳過ROM Ds18b20WriteByte(0x44); } void Ds18b20ReadTempCom() { Ds18b20Init(); delayus(1,100); Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0xbe); } int Ds18b20ReadTemp() { int temp=0; uchar tmh,tml; Ds18b20ChangTemp(); Ds18b20ReadTempCom(); tml=Ds18b20ReadByte(); tmh=Ds18b20ReadByte(); temp=(tmh*256+tml)*0.0625*100+0.5; //乘100使其小數點前兩位,加0.5使其四舍五入; return temp; } void display(int temp) { uchar i; /***在此不能這樣轉換,因為上面的temp已經轉換為一個數值,取反出來有錯, 這樣只是數碼管上的數值取反了,而不是DS18B20公式取反! ****/ /* int tp; // float 不能取位; if(temp<0) { DisplayData[0]=0x40; //if小于0,則前面加一個 '-' ; temp=temp-1; temp=~temp; tp=temp; } else //大于0,則前面的不顯示 ; { DisplayData[0]=0x00; tp=temp; } */ for(i=0;i<4;i++) { switch(i) { // case 0: LSA=0;LSB=0;LSC=1; P0=DisplayData[0]; break; case 0: LSA=1;LSB=1;LSC=0; P0=smgduan[temp/1000]; break; case 1: LSA=0;LSB=1;LSC=0; P0=smgduan[temp%1000/100]|0x80; break; case 2: LSA=1;LSB=0;LSC=0; P0=smgduan[temp%100/10]; break; case 3: LSA=0;LSB=0;LSC=0; P0=smgduan[temp%10]; break; } delay(100); //延時必須寫在清屏前面, P0=0x00; } } void main() { while(1) { display(Ds18b20ReadTemp()); } } 拿去吧,這個是c51的板子程序,管腳改了,數碼管程序按照你的板子寫就可以顯示了,只能幫你到這里了,別的靠你自己加油。 |