這是個52單片機熱電偶測溫的程序,通過MAX6675轉換溫度數據的。
寫到Proteus仿真里面數碼管就從由往左閃爍,不能穩定顯示,然后讀的數據也不對。求大佬幫忙看看是程序哪里有問題嗎 萬分感謝!
#include "reg52.h"
#include "absacc.h"
#include "math.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^0; //數碼管段選
sbit wei=P2^1; //數碼管位選
sbit S0=P1^0; //MAX6675位定義
sbit SCK=P1^1; //
sbit CS=P1^2; //
sbit beep=P1^3; //蜂鳴器位定義
sbit Work=P1^4; //工作LED燈位定義
uint Re_Convert (void); //熱電偶溫度轉換
void Disp_temp(); //數碼管顯示
void Baojing(); //蜂鳴器報警
void delay(uchar); ///延時
uint P_Temp;
uint wendu,t1;
uint ge,shi,bai,qian;
uchar code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
uchar code tab2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void main(void) //主函數
{
beep=0;
while(1)
{
Disp_temp();
delay(500);
Baojing();
P_Temp=0;
}
}
void delay(uchar t) //延時函數
{
uchar x;
uchar y;
for(x=0;x<t;x++)
for(y=0;y<110;y++);
}
uint Re_Convert() //熱電偶溫度讀取
{
uchar i;
unsigned long P_Temp2;
CS=1; //MAX6675溫度轉換
delay(10); //
CS=0; //MAX6675使能
delay(1);
SCK=1; //
P_Temp2=0;
for(i=0;i<16;i++)
{
SCK =0; //拉低電平 給一個時鐘信號
P_Temp2=P_Temp2<<1;
if(S0==1)
P_Temp2|=0x0001;
else
P_Temp2&=0xffff;
SCK=1;
delay(10);
}
CS =1;
return(P_Temp2);
}
void Baojing(void) //報警函數
{
if(t1<=100&&t1>=400) //溫度小于100大于400報警
{
delay(20);
beep=1;
}
}
void Disp_temp() //顯示函數
{
P_Temp=Re_Convert();
P_Temp=P_Temp<<1;
P_Temp=P_Temp>>4;
t1=P_Temp/4;//P_Temp =(1024*P_Temp)/4096
t1=t1*10;
ge=t1%10;
t1=t1/10;
shi=t1%10;
t1=t1/10;
bai=t1%10;
qian=t1/10;
P0=tab1[ge];
dula=1;
dula=0;
P0=0x08;
wei=1;
wei=0;
delay(10);
P0=tab2[shi];
dula=1;
dula=0;
P0=0x04;
wei=1;
wei=0;
delay(10);
P0=tab1[bai];
dula=1;
dula=0;
P0=0x02; //0000 0010
wei=1;
wei=0;
delay(10);
P0=tab1[qian];
dula=1;
dula=0;
P0=0x01;
wei=1;
wei=0;
delay(10);
}
|