當前位置:編程學習大全網 - 源碼下載 - 高分求51單片機AD7731實現AD轉換C程序代碼?

高分求51單片機AD7731實現AD轉換C程序代碼?

#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit DS=P3^3; //定義DS18B20接口int temp; uchar flag1; void display(unsigned char *lp,unsigned char lc);//數字的顯示函數;lp為指向數組的地址,lc為顯示的個數void delay();//延時子函數,5個空指令code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x39,0x00};//***陰數碼管顯示數的組成是 "0-9""0-9有小數點的" "-" "C" "空 表"unsigned char l_tmpdate[8]={0,0,10,0,0,0,0,0};//定義數組變量,並賦值1,2,3,4,5,6,7,8,就是本程序顯示的八個數int tmp(void);void tmpchange(void);void tmpwritebyte(uchar dat);uchar tmpread(void);bit tmpreadbit(void);void dsreset(void);void delayb(uint count);void main() //主函數{uchar i;int l_tmp; while(1) { tmpchange(); //溫度轉換 l_tmp=tmp(); //讀取溫度值 if(l_tmp<0) l_tmpdate[0]=20; //判斷溫度為負溫度,前面加"-" else { l_tmpdate[0]=l_tmp/1000; //顯示百位,這裏用1000,是因為我們之前乖以10了 if(l_tmpdate[0]==0) l_tmpdate[0]=22;//判斷溫度為正溫度且沒有上百,前面不顯示,查表第12是空 }l_tmp=l_tmp%1000;l_tmpdate[1]=l_tmp/100;//獲取十位l_tmp=l_tmp%100;l_tmpdate[2]=l_tmp/10;//獲取個位再l_tmpdate[2]+=10;//加入小數點,查表可得出有小數點的排在後10位,所以加10l_tmpdate[3]=l_tmp%10;//獲取小數第壹位l_tmpdate[4]=21;for(i=0;i<10;i++){ //循環輸出10次,提高亮度display(l_tmpdate,5); } }}void display(unsigned char *lp,unsigned char lc)//顯示{ unsigned char i; //定義變量 P2=0; //端口2為輸出 P1=P1&0xF8; //將P1口的前3位輸出0,對應138譯門輸入腳,全0為第壹位數碼管 for(i=0;i<lc;i++){ //循環顯示 P2=table[lp[i]]; //查表法得到要顯示數字的數碼段 delay(); //延時5個空指令 if(i==7) //檢測顯示完8位否,完成直接退出,不讓P1口再加1,否則進位影響到第四位數據 break; P2=0; //清0端口,準備顯示下位 P1++; //下壹位數碼管 }}void delay(void) //空5個指令{_nop_();_nop_();_nop_();_nop_();_nop_();}void delayb(uint count) //delay{ uint i; while(count) { i=200; while(i>0) i--; count--; }答案補充

}void dsreset(void)//DS18B20初始化{ uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--;}bit tmpreadbit(void) // 讀壹位{ uint i; bit dat; DS=0;i++; //小延時壹下 DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return (dat);}uchar tmpread(void) //讀壹個字節{ uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1); } return(dat); } 答案補充

void tmpwritebyte(uchar dat) { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; i=8;while(i>0)i--; DS=1; i++;i++; } }}void tmpchange(void){ dsreset(); delayb(1); tmpwritebyte(0xcc); tmpwritebyte(0x44); }答案補充

int tmp() //獲得溫度{ float tt; uchar a,b; dsreset(); delayb(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); //發送讀取數據命令 a=tmpread(); //連續讀兩個字節數據 b=tmpread(); temp=b; temp<<=8; temp=temp|a; //兩字節合成壹個整型變量。 tt=temp*0.0625; //得到真實十進制溫度值,因為DS18B20//可以精確到0.0625度,所以讀回數據的最低位代表的是//0.0625度。 temp=tt*10+0.5; //放大十倍,這樣做的目的將小數點後第壹位//也轉換為可顯示數字,同時進行壹個四舍五入操作。 return temp; //返回溫度值}答案補充

void readrom() //read the serial 讀取溫度傳感器的序列號{ //本程序中沒有用到此函數 uchar sn1,sn2; dsreset(); delayb(1); tmpwritebyte(0x33); sn1=tmpread(); sn2=tmpread();}void delay10ms() { uchar a,b; for(a=10;a>0;a--) for(b=60;b>0;b--);}哇!好累啊。。。這個可以用。。。用那個口自己看看就懂了,如果要匯編語言的去看:/%B6%E0%B9%A6%C4%DC%B3%B4%BB%F5%BB%FA/blog/item/1f4f0ede8776141462279862.html

  • 上一篇:Ubuntu下怎樣安裝軟件
  • 下一篇:初中詩詞文言文app
  • copyright 2024編程學習大全網