设计的ads1146热电偶温度变送器,程序烧写进去屏幕出现一排黑格,经检查屏幕与单片机均无损坏。求助 程序及电路图如下,感谢各位。
电路原理图如下:
程序部分:
- /*
- 引脚定义: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开关端口定义
- 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); //关数码管,点阵函数
- void DelayUs2x(unsigned char t);
- void DelayMs(unsigned char t);
- void dms(unsigned int t);
- void Init_Timer0(void); //定时器函数
- bit LCD_Check_Busy(void); //LCD判忙函数
- void LCD_Write_Com(unsigned char com);//LCD写入命令函数
- void LCD_Write_Data(unsigned char Data);//LCD写入数据函数
- void LCD_Clear(void);//LCD清屏函数
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s); //LCD写入字符串函数
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data); //LCD写入字符函数
- void LCD_Init(void); //LCD初始化函数
- void AD_init(void);//AD初始化,寄存器设置
- void D_OUT(void);//AD读数据
- void MaOut(unsigned int out_data);//AD420输出
- float K_table(void);//K型热热电势转换成温度
- float S_table(void);//K型热热电势转换成温度
- /*------------------------------------------------
- 主函数
- ------------------------------------------------*/
- void main(void)
- {
- cmg88();//关数码管,点阵函数
- 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()//关数码管,点阵函数
- {
- DU=1;
- P0=0X00;
- DU=0;
- }
- /*------------------------------------------------
- uS延时函数,含有输入参数 unsigned char t,无返回值
- unsigned char 是定义无符号字符变量,其值的范围是
- 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
- 长度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延时函数,含有输入参数 unsigned char t,无返回值
- unsigned char 是定义无符号字符变量,其值的范围是
- 0~255 这里使用晶振12M,精确延时请使用汇编
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- //大致延时1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- void dms(unsigned int t)
- {
- unsigned int i;
- while(t--)
- {
- for(i=0;i<125;i++);
- }
- }
- /*------------------------------------------------
- 判忙函数
- ------------------------------------------------*/
- bit LCD_Check_Busy(void)
- {
- DataPort= 0xFF;
- RS_CLR;
- RW_SET;
- EN_CLR;
- _nop_();
- EN_SET;
- return (bit)(DataPort & 0x80);
- }
- /*------------------------------------------------
- 写入命令函数
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- while(LCD_Check_Busy()); //忙则等待
- RS_CLR;
- RW_CLR;
- EN_SET;
- DataPort= com;
- _nop_();
- EN_CLR;
- }
- /*------------------------------------------------
- 写入数据函数
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- while(LCD_Check_Busy()); //忙则等待
- RS_SET;
- RW_CLR;
- EN_SET;
- DataPort= Data;
- _nop_();
- EN_CLR;
- }
- /*------------------------------------------------
- 清屏函数
- ------------------------------------------------*/
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- DelayMs(5);
- }
- /*------------------------------------------------
- 写入字符串函数
- ------------------------------------------------*/
- 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 ++;
- }
- }
- /*------------------------------------------------
- 写入字符函数
- ------------------------------------------------*/
- 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);
- }
- /*------------------------------------------------
- 初始化函数
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38); /*显示模式设置*/
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*显示关闭*/
- LCD_Write_Com(0x01); /*显示清屏*/
- LCD_Write_Com(0x06); /*显示光标移动设置*/
- DelayMs(5);
- LCD_Write_Com(0x0C); /*显示开及光标设置*/
- }
- /*------------------------------------------------
- AD采集数据函数
- ------------------------------------------------*/
- //AD寄存器设置
- 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数据读取
- 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型将电势换算成温度函数
- {
- 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位定时器,使用"|"符号可以在使用多个定时器时不受影响
- TH0=(65536-20000)/256; //重新赋值 20ms
- TL0=(65536-20000)%256;
- EA=1; //总中断打开
- ET0=1; //定时器中断打开
- TR0=1; //定时器开关打开
- }
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256; //重新赋值 20ms
- TL0=(65536-20000)%256;
- time_20ms++;
- if(time_20ms%10==0) //定时读取数据
- {
- Read_AD=1;
- }
- }
复制代码
|