基于單片機的鉑電阻溫度控制器,內含仿真電路及源程序
0.png (16.13 KB, 下載次數: 73)
下載附件
2018-1-3 00:54 上傳
0.png (9.98 KB, 下載次數: 67)
下載附件
2018-1-3 00:54 上傳
單片機源程序如下:
- #include<REG52.H> //插入52特殊功能寄存器頭文件
- //-----------------------------------------------------------
- unsigned char code dispbitcode[]=//定義顯示位控制驅動碼
- {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
- //"0位","1位","2位","3位","4位","5位","6位","7位"
- //---------------------------------------------------------------------
- unsigned char code ledcode[]=//定義“0--9”十個數據的共陰極LED七段顯示碼
- {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
- //"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", 黑屏
- //-------------------------------------------------------------------------
- unsigned char dispbuf[8]={10,10,10,10,10,10,0,0};//定義顯示緩沖區初值
- //-------------------------------------------------------------------------
- unsigned char dispcount;//顯示控制位變量
- unsigned int uiresult;//采集數據變量
- bit sflag;//符號標志位,為1時表示負值
- sbit START=P3^0;//定義ADC0809啟動控制位
- sbit OE=P3^1;//定義ADC0809輸出控制位
- sbit EOC=P3^2;//定義ADC0809轉換結束標志位
- sbit P17=P1^7;//小數點控制位
- //=========================================
- int delay1ms()//延時1ms函數
- {unsigned int j;
- for(j=0;j<333;j++)
- {;}
- return 1;
-
- }
- //===================================================
- void display()//顯示處理函數
- {for(dispcount=0;dispcount<5;dispcount++)//顯示0-4位
- {P2=0xff;//消影,關閉顯示
- if(dispbuf[1]==0)//顯緩區1位是否為"0"
- { dispbuf[1]=dispbuf[0];//是,顯緩區0位值賦給1位
- dispbuf[0]=10;}//取黑屏碼
- P1=ledcode[dispbuf[dispcount]];//取對應位顯示碼
- if(dispcount==3)//判斷是否是小數點位
- {P17=1;}//是,輸出小數點
- P2=dispbitcode[dispcount];//取對應位顯示控制碼
- delay1ms();//延時1ms
- P2=0xff;//消影,關閉顯示
- }
- }
- //====================================================
- void adc0809()//ADC0809數據采集處理函數
- {unsigned char i;
- unsigned long y;
- START=0;//啟動ADC0809,產生高電平脈沖啟動信號
- START=1;
- START=0;
- P0=0xff;//P0口設為輸入狀態
- EOC=1;//設EOC位為輸入狀態
- while(EOC==0);//沒有轉換完等待
- OE=1;//轉換完,選通ADC0809轉換數據輸出
- uiresult=P0;//讀ADC0809轉換結果
- OE=0;//關閉選通位
- y=uiresult;
- if(uiresult<118||uiresult>124)//數據是否小于118或大于124
- if(uiresult<129)//數據是否小于129
- {uiresult=y*19.25;//數據標度變換
- if(uiresult<2557.14)//數據是否小于2557.14
- {uiresult=2557.14-uiresult;sflag=1;}//是的,計算絕對溫度值,設置負號標志
- else
- {uiresult=uiresult-2557.14;sflag=0;}//否,計算絕對溫度值,設置正號標志
- }
- else
- {uiresult=y*20;//數據標度變換
- if(uiresult<2680)//數據是否小于2680
- {uiresult=2680-uiresult;sflag=1;}//是的,計算絕對溫度值,設置負號標志
- else
- {uiresult=uiresult-2680;sflag=0;}//否,計算絕對溫度值,設置正號標志
- }
- else
- {uiresult=y*16.667;//數據標度變換
- if(uiresult<2267.708)//數據是否小于2267.708
- {uiresult=2267.708-uiresult;sflag=1;}//是的,計算絕對溫度值,設置負號標志
- else
- {uiresult=uiresult-2267.708;sflag=0;}//否,計算絕對溫度值,設置正號標志
- }
- i=4;
- dispbuf[1]=0;//取0
- dispbuf[2]=0;//取0
- dispbuf[3]=0;//取0
- dispbuf[4]=0;//取0
- if(sflag==1)//是負溫度標志嗎?
- {dispbuf[0]=11;}//是,取"-"顯示碼
- else
- {dispbuf[0]=10;}//否,取"黑屏"碼
- dispbuf[5]=10;//取"黑屏"碼
- dispbuf[6]=10;//取"黑屏"碼
- dispbuf[7]=10;//取"黑屏"碼
- while(uiresult/10)//(uiresult/10)大于0嗎
- {dispbuf[i]=uiresult%10;//取低位數據送入對應的緩沖器
- uiresult=uiresult/10;//數據除10,準備取次低位數
- i--;//緩沖數據指針減1
- }
- dispbuf[i]=uiresult;//數據的最高有效位送入對應的緩沖器
- }
- //========================================================
- void main(void)
- {START=0;//關閉ADC0809啟動
- OE=0;//關閉ADC0809數據輸出
- uiresult=100;//設溫度參數初值
- while(1)
- {display();//顯示處理函數
- adc0809();//ADC0809數據采集處理函數
- }
- }
復制代碼
所有資料51hei提供下載:
單片機課設.zip
(25.3 KB, 下載次數: 64)
2018-1-2 22:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|