- /***************************************************************************************************
- 工程名稱: NTC_SMG
- 功能描述: 實現NTC熱敏電阻測溫,數碼管低三位顯示結果,其中顯示的最高位為符號位(測溫范圍-10-50)。
- 硬件連接: 用8位杜邦線將J8與J12連接,2位杜邦線分別將J11_0與J15_DS1、J11_1與J15_DS2連接,
- 1位杜邦線將J19_AIN0與J15_RT連接,2位杜邦線分別將J11_7與J17_SDA、J11_6與J17_SCL連接。
- 維護記錄: 8-22
- ***************************************************************************************************/
- #include "reg51.h" //包含頭文件
- #define uchar unsigned char
- #define uint unsigned int
- sbit LE1=P2^0; //位選573鎖存器使能
- sbit LE2=P2^1; //段選573鎖存器使能
- extern uchar Read_AD(uchar chn);
- extern show();
- uchar flag; //正負符號位
- uchar code dis[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
- // 0 1 2 3 4 5 6 7
- 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//0~F的段碼
- // 8 9 A B C D E F
- code unsigned int vt_table[]= //電壓與實際溫度對照表
- {
- 4132,4098,4063,4026,3988,3949,3908,3866,3823,3779, //-9-0
- 3733,3686,3639,3590,3540,3489,3437,3385,3331,3277, //1-10
- 3222,3166,3110,3054,2997,2940,2882,2824,2767,2709, //11-20
- 2651,2593,2536,2478,2421,2365,2309,2253,2198,2143, //21-30
- 2089,2036,1984,1932,1881,1831,1782,1734,1686,1640, //31-40
- 1594,1550,1506,1464,1422,1381,1341,1303,1265,1228, //41-50
- };
- //**************************************************************************************************
- //延時函數
- //**************************************************************************************************
- delay(uint time) //int型數據為16位,所以最大值為65535
- {
- uint i,j; //定義變量i,j,用于循環語句
- for(i=0;i<time;i++) //for循環,循環50*time次
- for(j=0;j<100;j++); //for循環,循環50次
- }
- //**************************************************************************************************
- //數碼管顯示函數
- //**************************************************************************************************
- smg_show(uchar n)
- {
- //顯示符號位
- P1=0xdf; //0xbf=1101 1111,即選通個位
- LE1=1; //鎖存位
- LE1=0; //斷開鎖存,位選573的Q7~Q0仍保持
- if(flag){P1=0x40;flag=0;}//為負,顯示"-"號
- else P1=0x00; //為正,不顯示
- LE2=1; //鎖存段碼
- LE2=0; //斷開鎖存,段選573的Q7~Q0仍保持
- delay(10); //延時保持一下,延時過大會閃動,延時過小會有重影
- P1=0x00;LE2=1;LE2=0; //清除P1口數據,以免造重影
- //顯示十位
- P1=0xbf; //0xbf=1011 1111,即選通個位
- LE1=1; //鎖存位
- LE1=0; //斷開鎖存,位選573的Q7~Q0仍保持
- P1=dis[n/10]; //dis[n/10]為0~9的編碼
- LE2=1; //鎖存段碼
- LE2=0; //斷開鎖存,段選573的Q7~Q0仍保持
- delay(10); //延時保持一下,延時過大會閃動,延時過小會有重影
- P1=0x00;LE2=1;LE2=0; //清除P1口數據,以免造重影
- //顯示個位
- P1=0x7f; //0xbf=0111 1111,即選通十分位
- LE1=1; //鎖存位
- LE1=0; //斷開鎖存,位選573的Q7~Q0仍保持
- P1=dis[n%10]; //0~9的編碼
- LE2=1; //鎖存段碼
- LE2=0; //斷開鎖存,段選573的Q7~Q0仍保持
- delay(10); //延時保持一下,延時過大會閃動,延時過小會有重影
- P1=0x00;LE2=1;LE2=0; //清除P1口數據,以免造重影
-
- }
- //**************************************************************************************************
- //主函數
- //**************************************************************************************************
- void main()
- {
- uchar i,value;
- uint temp;
- while(1) //死循環
- {
- temp=Read_AD(0); //采集0通道模擬電壓值
- temp=19*temp; //乘以電阻特性參數
- for(i=0;(vt_table[i]>temp)&&(i<60);i++);//查表得到溫度對應參數
- if(i<10) {value=10-i;flag=1;}//如果是負溫度,符號標志置1,表示為負
- else value=i-10; //如果為正,去掉10個負數
- smg_show(value); //顯示溫度值
- }
- }
復制代碼 |