LCD1602+AD623+MAX1240+pt100+51單片機
程序及仿真文件
Pt100.zip
(784.97 KB, 售價: 5 E幣)
2020-1-29 23:34 上傳
點擊文件名下載附件
售價: 5 E幣 [記錄]
[ 購買]
233040xtcauouvc60kdjqv.png (31.09 KB)
下載附件
2020-1-29 23:29 上傳
1_225196359.png (11.3 KB)
下載附件
2020-1-29 23:32 上傳
- #include <reg52.h>
- #include <string.h>
- #include <math.h>
- #include "intrins.h"
- #define ROW1 0x80
- #define ROW2 0xC0
- #define Ts_CONST 1 //AD采樣時間系數(shù),采樣時間為0.1xTs_CONST(s)
- #define NOACT 0
- #define FC 1
- #define Start_AD 2
- #define Cal_Temperature 3
- #define Kpt 0.02732644 //AD芯片max1240的采樣值到溫度值的轉(zhuǎn)化系數(shù)
- void LCD_Init(void);
- void ClearDisp(unsigned char Row);
- void Display(unsigned char Addr, unsigned char *pstr);
- void DecToASC(unsigned int Dec,unsigned char *p, unsigned char n);
- void Disp_Initize(void);
- void Write_CMD(unsigned char CMD);
- unsigned int AD_MAX1240(void);
- sbit RS=P2^2;
- sbit RW=P2^1;
- sbit E=P2^0;
- sbit SDA=P1^5;
- sbit SCL=P1^6;
- sbit CS=P1^7;
- sbit Key=P3^5;
- sbit up=P3^6;
- sbit down=P3^7;
- unsigned char DispBuf[16];
- unsigned char RunState=NOACT;
- unsigned int AD_Reslut,tsflag,ts=1;
- float fz,tmp,tmp1,Pt;
- void delay(unsigned int j)//延時jms
- {
- unsigned int m,n;
- for(n=0;n<j;n++)
- {
- for(m=0;m<120;m++);
- }
- }
- void main(void)
- { LCD_Init();
- ClearDisp(ROW1);
- Disp_Initize();
- CS=1;
- SDA=1;
- SCL=0;
- TMOD=0x11;
- TF0=0; //開始程序前先延時65ms,等待max1240上電,以保證AD采樣準確
-
- TH0=0;
- TL0=0;
- TR0=1;
- while(!TF0);
- TF0=0;
- TR0=0;
- TH0=0x3C; //12M晶振時延時50ms
- TL0=0xB0;
- ET0=1;
- TR0=1;
- EX1=1;
- IT1=1;
- EA=1;
- while(1)
- switch(RunState)
- { case NOACT:
- break;
- case FC: //F0計算及顯示
- fz=pow(10,(tmp-121.0000)/10);
- DecToASC(fz,DispBuf,1);
- DispBuf[1]='.';
- DecToASC((fz-(unsigned int)fz)*1000,DispBuf+2,3);
- DispBuf[5]='\0';
- Display(0x80+11,DispBuf);
-
-
- RunState=NOACT;
- break;
- case Start_AD: //開始AD采樣
- AD_Reslut=AD_MAX1240();
- RunState=Cal_Temperature;
- break;
- case Cal_Temperature: //將AD值轉(zhuǎn)化為溫度并進行線性化
- {
-
- Pt=AD_Reslut*Kpt;
- Pt+=100; //溫度值
-
- tmp=Pt/100;
- tmp=1-tmp;
- tmp=2.31e-6L*tmp;
- tmp+=1.527480889e-5L;
- tmp=sqrt(tmp);
- tmp+=-3.9083e-3L;
- tmp/=-1.155e-6L;//AD采樣值線性化修正
- tmp1=tmp;
- tmp=(tmp+tmp1)/2;//取平均溫度
- tmp=((float)((unsigned int)(tmp*10)))/10 ;
- DecToASC(tmp,DispBuf,3);
- DispBuf[3]='.';
- DecToASC((tmp-(unsigned int)tmp)*10,DispBuf+4,1);
- DispBuf[5]='\0';
- Display(0xC0+2,DispBuf); //顯示函數(shù)
- }
-
- RunState=NOACT;
- break;
- }
- }
- /*******************************************************************************/
- unsigned int AD_MAX1240(void) //讀取AD,AD芯片為串口數(shù)據(jù)形式
- { unsigned int adtmp=0;
- unsigned char i;
- CS=0;
- while(!SDA);
- SCL=1;
- adtmp<<=1;
- SCL=0;
- for(i=0;i<12;i++)
- { SCL=1;
- adtmp<<=1;
- if(SDA==1)adtmp++;
- SCL=0;
- }
- CS=1;
- return adtmp;
- }
- /*******************************************************************************/
- void Disp_Initize(void) //LCD初始化,將Ts,F(xiàn)0,t等提示字符顯示在屏幕上
- { //unsigned char *p;
-
-
- DispBuf[0]='T';
- DispBuf[1]='s';
- DispBuf[2]='=';
- DecToASC(ts,DispBuf+3,2);
- DispBuf[5]='s';
-
- DispBuf[8]='f' ;
- DispBuf[9]='0' ;
- DispBuf[10]='=' ;
- DispBuf[16]='\0';
- Display(0x80,DispBuf);
- DispBuf[0]='t';
- DispBuf[1]='=';
- DispBuf[2]='\0';
- Display(0xc0,DispBuf);
- }
- /*******************************************************************************/
- void INT1_ISR(void) interrupt 2 //切換采樣時間的中斷函數(shù),用于開關(guān)量識別和改變Ts(采樣時間)
- {
- EA=0;
- TR0=0;
- ET0=0;
- strcpy(DispBuf," ");
- Display(0x80+11,DispBuf);
- while(1)
- {
-
- if(up==0)
- {
- delay(100);
- if(up==0)
- ts++;
- }
-
- if(down==0)
-
- { delay(100);
- if(down==0)
- ts--;
- }
-
- if(ts>60)
- ts=1;
- if(ts<=0)
- ts=60;
- DecToASC(ts,DispBuf,2);
- DispBuf[2]='s';
- DispBuf[3]='\0';
- Display(0x80+3,DispBuf);
- if(Key==0)
- break;
- }
- EA=1;
- TR0=1;
- ET0=1;
-
- }
- /*******************************************************************************/
- void T0_ISR(void) interrupt 1 //定時中斷程序
- { static unsigned char T0_CNT=Ts_CONST;
- //static bit Flag=0;
- TH0=0x3C;
- TL0=0xB0;
- //Flag=!Flag;
- //if(Flag)return;
- T0_CNT--;
- tsflag++;
- if(!T0_CNT)
- { T0_CNT=Ts_CONST;
- RunState=Start_AD; //AD采樣
- }
- if(tsflag>=ts*20)
- {
- tsflag=0;
- RunState =FC; //Ts到時進行F0值運算
- }
- }
- /*******************************************************************************/
- void DecToASC(unsigned int Dec,unsigned char *p, unsigned char n) //將Dec變量編程可以在1602上直接顯示的ASICII值
- { unsigned char i;
- p+=n;
- p--;
- for(i=0;i<n;i++)
- { *p=Dec%10+0x30;
- p--;
- Dec/=10;
- }
- }
- /*LCD顯示*******************************************************************************/
- void Check_Busy(void)
- {// return;
- do
- { P0=0xFF;
- E=0;
- RS=0;
- RW=1;
- E=1;
- _nop_();
- }while(P0&0x80);
- E=0;
- }
- /*******************************************************************************/
- void Write_CMD(unsigned char CMD)
- {
- Check_Busy();
- E=0;
- RS=0;
- RW=0;
- P0=CMD;
- E=1;
- _nop_();
- E=0;
- }
- /*******************************************************************************/
- void Write_Data(unsigned char Data)
- {
- Check_Busy();
- E=0;
- RS=1;
- RW=0;
- P0=Data;
- E=1;
- _nop_();
- E=0;
- }
- /*******************************************************************************/
- void LCD_Init(void)
- {
- Write_CMD(0x38);
- Write_CMD(0x0C);
- Write_CMD(0x06);
- Write_CMD(0x01); //清屏
- }
- /*******************************************************************************/
- void Display(unsigned char Addr, unsigned char *pstr)
- {
- Write_CMD(Addr);
- while(*pstr)
- Write_Data(*pstr++);
- }
- /*******************************************************************************/
- void ClearDisp(unsigned char Row)
- {
- strcpy(DispBuf," ");
- Display(Row,DispBuf);
- }
復(fù)制代碼
【必讀】版權(quán)免責聲明
1、本主題所有言論和內(nèi)容純屬會員個人意見,與本論壇立場無關(guān)。2、本站對所發(fā)內(nèi)容真實性、客觀性、可用性不做任何保證也不負任何責任,網(wǎng)友之間僅出于學習目的進行交流。3、對提供的數(shù)字內(nèi)容不擁有任何權(quán)利,其版權(quán)歸原著者擁有。請勿將該數(shù)字內(nèi)容進行商業(yè)交易、轉(zhuǎn)載等行為,該內(nèi)容只為學習所提供,使用后發(fā)生的一切問題與本站無關(guān)。 4、本網(wǎng)站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網(wǎng)站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網(wǎng)站所有軟件和資料均為網(wǎng)友推薦收集整理而來,僅供學習用途使用,請務(wù)必下載后兩小時內(nèi)刪除,禁止商用。6、如有侵犯你版權(quán)的,請及時聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|
|