|
設(shè)計(jì)的ads1146熱電偶溫度變送器,程序燒寫進(jìn)去屏幕出現(xiàn)一排黑格,經(jīng)檢查屏幕與單片機(jī)均無損壞。求助 程序及電路圖如下,感謝各位。
電路原理圖如下:
新建文本文檔 (6).jpg (3.6 MB, 下載次數(shù): 25)
下載附件
2018-6-18 17:20 上傳
程序部分:
- /*
- 引腳定義:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
- ------------------------------------------------*/
- #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #include<intrins.h>
- #define RS_CLR RS=0
- #define RS_SET RS=1
- #define RW_CLR RW=0
- #define RW_SET RW=1
- #define EN_CLR EN=0
- #define EN_SET EN=1
- #define DataPort P0
- #define uchar unsigned char
- #define nop _nop_()
- uchar ADC_H;
- uchar ADC_L;
- uchar ad_result;
- uchar bdata ADC;
- uchar Read_AD;
- uchar sw_sign = 0;
- uchar outdata= 0x0000;
- xdata unsigned long time_20ms=0;
- sbit RS = P1^0; //定義LCD端口
- sbit RW = P1^1;
- sbit EN = P1^2;
- sbit DU = P2^0;
- sbit WE = P2^1; //顯示端口完畢
- sbit ADC_SCLK=P2^0; // 定義ADS1146端口
- sbit ADC_DIN=P2^1;
- sbit DAC_DOUT=P2^2;
- sbit ADC_DRDY=P2^3;
- sbit ADC_CS=P2^4;
- sbit ADC_START=P3^7;
- sbit ADC_REST=P3^6;
- sbit ADC_X=ADC^0; // ADS1146端口完畢
- sbit AD420_LATCH=P3^3; //定義AD420端口
- sbit AD420_CLK=P3^4;
- sbit AD420_DATA=P3^5;
- sbit AD420_CLEAR=P3^2; //AD420端口完畢
- sbit sw1 = P2^5;//K開關(guān)端口定義
- sbit sw2 = P2^6;
- sbit sw3 = P2^7;
- //K型熱電偶分度表
- static const unsigned int fendubiao_K[29]={0,1697,3435,5136,6812,8504,10230,11981,13741,15509,17302,19086,20863,22647,24407,26158,27892,29593,31277,32944,34578,36204,37787,39354,40896,42404,43878,45940,47000};//Vref=2.5V
- //static const unsigned int fendubiao_K[29]={0,1697,3435,5136,6812,8504,10230,11981,13741,15509,17302,19086,20863,22647,24407,26158,27892,29593,31277,32944,34578,36204,37787,39354,40896,42404,43878,45940,47000};//Vref=2.5V
- //S型熱電偶分度表
- static const unsigned int fendubiao_S[177]={0,186,379,580,788,1003,1224,1452,1685,1924,2167,2416,2669,2927,3188,3454,3724,3996,4272,4552,4835,5120,5408,5698,5991,6287,6584,6884,7186,7489,7795,8102,8411,8722,9034,9348,9663,9979,10297,10616,10937,11258,11581,11905,12230,12557,12884,13213,13542,13873,14205,14537,14871,15206,15542,15879,16217,16555,16895,17236,17578,17921,18265,18610,18957,19304,19652,20001,20352,20703,21056,21410,21765,22121,22478,22836,23196,23557,23919,24282,24646,25011,25378,25745,26114,26484,26855,27227,27601,27975,28351,28728,29106,29485,29865,30246,30629,31012,31397,31782,32169,32557,32945,33335,33726,34118,34511,34905,35300,35696,36093,36490,36889,37288,37688,38088,38489,38891,39293,39696,40099,40503,40908,41312,41717,42123,42529,42935,43341,43748,44155,44562,44969,45376,45783,46190,46598,47005,47412,47819,48226,48633,49040,49446,49853,50259,50665,51070,51475,51879,52284,52687,53090,53493,53895,54296,54697,55097,55497,55896,56294,56691,57087,57483,57878,58272,58665,59056,59447,59835,60221,60604,60982,61356,61724,62087,62442};//Vref=2.5V
- void cmg88(void); //關(guān)數(shù)碼管,點(diǎn)陣函數(shù)
- void DelayUs2x(unsigned char t);
- void DelayMs(unsigned char t);
- void dms(unsigned int t);
- void Init_Timer0(void); //定時(shí)器函數(shù)
- bit LCD_Check_Busy(void); //LCD判忙函數(shù)
- void LCD_Write_Com(unsigned char com);//LCD寫入命令函數(shù)
- void LCD_Write_Data(unsigned char Data);//LCD寫入數(shù)據(jù)函數(shù)
- void LCD_Clear(void);//LCD清屏函數(shù)
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s); //LCD寫入字符串函數(shù)
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data); //LCD寫入字符函數(shù)
- void LCD_Init(void); //LCD初始化函數(shù)
- void AD_init(void);//AD初始化,寄存器設(shè)置
- void D_OUT(void);//AD讀數(shù)據(jù)
- void MaOut(unsigned int out_data);//AD420輸出
- float K_table(void);//K型熱熱電勢轉(zhuǎn)換成溫度
- float S_table(void);//K型熱熱電勢轉(zhuǎn)換成溫度
- /*------------------------------------------------
- 主函數(shù)
- ------------------------------------------------*/
- void main(void)
- {
- cmg88();//關(guān)數(shù)碼管,點(diǎn)陣函數(shù)
- LCD_Init();
- LCD_Clear();//清屏
- /*while (1)
- {
- LCD_Write_Char(7,0,'o');
- LCD_Write_Char(8,0,'k');
- LCD_Write_String(1,1,"Hard Work");
- while(1);
- } */
- //init();
- AD_init();
- while(1)
- {
- if(sw1 == 0xff){sw_sign = 0;}
- if(sw2 == 0xff){sw_sign = 1;}
- if(sw3 == 0xff){sw_sign = 2;}
- ADC_START=1;
- if(Read_AD==1)
- {
- Read_AD=0;
- D_OUT();
- LCD_Write_String(0,0,"temp");
- if(sw_sign == 0){
- K_table();
- LCD_Write_Data(ad_result);
- outdata = 0x0000;
- outdata = outdata + (ad_result-20);
- MaOut(outdata);
- LCD_Write_String(0,1,"elec");
- LCD_Write_Data(outdata);
- ADC_H=0xff;
- ADC_L=0xff;}
- else
- {
- S_table();
- LCD_Write_Data(ad_result);
- outdata = 0x0000;
- outdata = outdata + (ad_result-20);
- LCD_Write_String(0,1,"elec");
- LCD_Write_Data(outdata);
- ADC_H=0xff;
- ADC_L=0xff;
- }
-
- }
- //Display();
- }
- }
- void cmg88()//關(guān)數(shù)碼管,點(diǎn)陣函數(shù)
- {
- DU=1;
- P0=0X00;
- DU=0;
- }
- /*------------------------------------------------
- uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時(shí)請使用匯編,大致延時(shí)
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時(shí)請使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- //大致延時(shí)1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- void dms(unsigned int t)
- {
- unsigned int i;
- while(t--)
- {
- for(i=0;i<125;i++);
- }
- }
- /*------------------------------------------------
- 判忙函數(shù)
- ------------------------------------------------*/
- bit LCD_Check_Busy(void)
- {
- DataPort= 0xFF;
- RS_CLR;
- RW_SET;
- EN_CLR;
- _nop_();
- EN_SET;
- return (bit)(DataPort & 0x80);
- }
- /*------------------------------------------------
- 寫入命令函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS_CLR;
- RW_CLR;
- EN_SET;
- DataPort= com;
- _nop_();
- EN_CLR;
- }
- /*------------------------------------------------
- 寫入數(shù)據(jù)函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS_SET;
- RW_CLR;
- EN_SET;
- DataPort= Data;
- _nop_();
- EN_CLR;
- }
- /*------------------------------------------------
- 清屏函數(shù)
- ------------------------------------------------*/
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- DelayMs(5);
- }
- /*------------------------------------------------
- 寫入字符串函數(shù)
- ------------------------------------------------*/
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x); //表示第一行
- }
- else
- {
- LCD_Write_Com(0xC0 + x); //表示第二行
- }
- while (*s)
- {
- LCD_Write_Data( *s);
- s ++;
- }
- }
- /*------------------------------------------------
- 寫入字符函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x);
- }
- else
- {
- LCD_Write_Com(0xC0 + x);
- }
- LCD_Write_Data( Data);
- }
- /*------------------------------------------------
- 初始化函數(shù)
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38); /*顯示模式設(shè)置*/
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關(guān)閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標(biāo)移動設(shè)置*/
- DelayMs(5);
- LCD_Write_Com(0x0C); /*顯示開及光標(biāo)設(shè)置*/
- }
- /*------------------------------------------------
- AD采集數(shù)據(jù)函數(shù)
- ------------------------------------------------*/
- //AD寄存器設(shè)置
- void AD_init(void)
- {
- uchar i;
- ADC_REST=1;
- ADC_CS=0;
- ADC_SCLK=1;
- ADC_DIN=0x42;
- for(i=0;i<8;i++)
- {
- ADC_SCLK=0;
- nop;
- ADC_SCLK=1;
- nop;
- }
- ADC_DIN=0x01;
- for(i=0;i<8;i++)
- {
- ADC_SCLK=0;
- nop;
- ADC_SCLK=1;
- nop;
- }
- ADC_DIN=0x00;
- for(i=0;i<8;i++)
- {
- ADC_SCLK=0;
- nop;
- ADC_SCLK=1;
- nop;
- }
- ADC_DIN=0x02;
- for(i=0;i<8;i++)
- {
- ADC_SCLK=0;
- nop;
- ADC_SCLK=1;
- nop;
- }
- }
- //AD數(shù)據(jù)讀取
- void D_OUT(void)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- ADC<<=1;
- ADC_SCLK=1;
- ADC_X=ADC_DIN;
- nop;
- ADC_SCLK=0;
- nop;
- }
- ADC_L=ADC_X;
- for(i=0;i<8;i++)
- {
- ADC<<=1;
- ADC_SCLK=1;
- ADC_X=ADC_DIN;
- nop;
- ADC_SCLK=0;
- nop;
- }
- ADC_H=ADC_X;
- ad_result=ADC_H;
- ad_result=ad_result<<8;
- ad_result+=ADC_L;
- }
- /*------------------------------------------------
- AD420輸出4-20MA
- ------------------------------------------------*/
- void MaOut(unsigned int out_data)
- {
- unsigned char i;
- AD420_CLK=0;
- AD420_DATA=0;
- AD420_LATCH=0;
- for(i=0;i<16;i++)
- {
- if((out_data<<i) & 0x8000)
- {
- AD420_DATA=1;
- }
- else
- {
- AD420_DATA=0;
- }
- dms(10);
- AD420_CLK=1;
- dms(10);
- AD420_CLK=0;
- }
- dms(10);
- AD420_LATCH=1;
- dms(10);
- AD420_LATCH=0;
- AD420_CLK=0;
- AD420_DATA=0;
- }
- //將電勢換算成溫度
- float K_table(void)
- {
- unsigned char i=0;
- float tempt2,coff;
- unsigned int temp1,temp3=0,temp4=0;
- unsigned int hw_value = 25;
- temp4=(hw_value)*(1692)/50;
- /* if(volt_sign==0xff)
- {
- volt=0;
- //return hw_value;
- }*/
- temp3=ad_result*4.194304*2+temp4; //419.4304*2=32768*64/2500
- for(i=0;i<28;i++) //查表
- {
- if((temp3>=fendubiao_K[i])&&(temp3<fendubiao_K[i+1]))
- {
- coff=(float)(fendubiao_K[i+1]-fendubiao_K[i]);
- coff=50/coff;
- temp1=i*50;
- tempt2=(temp3-fendubiao_K[i])*coff+temp1;
- // return tempt2-temp_RK;
- }
- }
- return 0xffff;
- }
- float S_table(void) //S型將電勢換算成溫度函數(shù)
- {
- unsigned char i=0;
- float tempt2,coff;
- unsigned int temp1,temp3=0,temp4=0;
- unsigned int hw_value = 25;
- temp4=(hw_value)*(178)/10;
- /*if(volt_sign==0xff)
- {
- volt=0;
- return hw_value;
- }*/
- temp3=ad_result*16.777216+temp4; //1677.7216=32768*64/2500
- for(i=0;i<178;i++) //查表
- {
- if((temp3>=fendubiao_S[i])&&(temp3<fendubiao_S[i+1]))
- {
- coff=(float)(fendubiao_S[i+1]-fendubiao_S[i]);
- coff=10/coff;
- temp1=i*10;
- tempt2=(temp3-fendubiao_S[i])*coff+temp1;
- // return tempt2-temp_RS;
- }
- }
- return 0xffff;
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號可以在使用多個(gè)定時(shí)器時(shí)不受影響
- TH0=(65536-20000)/256; //重新賦值 20ms
- TL0=(65536-20000)%256;
- EA=1; //總中斷打開
- ET0=1; //定時(shí)器中斷打開
- TR0=1; //定時(shí)器開關(guān)打開
- }
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256; //重新賦值 20ms
- TL0=(65536-20000)%256;
- time_20ms++;
- if(time_20ms%10==0) //定時(shí)讀取數(shù)據(jù)
- {
- Read_AD=1;
- }
- }
復(fù)制代碼
|
|