这是个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; //λѡ ǧλ 0000 0001
wei=1;
wei=0;
delay(10);
} |