#include#define uchar unsigned char//只有256
#define uint unsigned int//有16位但占内存。
#define ulongunsigned long
#include
sbit rs=P2^6;//
sbit rw=P2^5;//
sbit en=P2^7;//
sbit k1=P1^0;//按键+
sbit k2=P1^1;//按键-
uchar set=195;//初始化温度
sbit OUT=P1^2;//定义输出
void delay (int a)//毫秒级延时
{
int x,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
//定义温度数据变量
float wdd = 0;//单精度浮点型变量眼3.4*10^38----(-3.4*10^38)占4个字节小数点后7-8位
//double wdd = 0;//双精度浮点型变量 小数点后15-16位
ulong x = 0;//长整数型温度
uintwd;//定义一个温度用于显示
sbitSO=P3^2;//P1.0口与SO相连
sbitCS=P3^3;//P1.1口与CS相连
sbitSCK=P3^4; //P1.2口与SCK相连
/*******************************延时函数**********************************************/
void Delay1Ms(uint t)
{
uchar i;
for (;t>0;t--)
{
for (i=0;i<138;i++)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
}
void Delay1s(uchar t)
{
for (;t>0;t--)
{
Delay1Ms(250);
Delay1Ms(250);
Delay1Ms(250);
Delay1Ms(250);
}
}
void delayus()//us微秒延时
{
_nop_();
_nop_();
_nop_();
_nop_();
}
unsigned long Re_Convert() //热电偶数据--读取温度
{ uchar i;
unsigned long Temp_2;
Temp_2=0;
CS=1;
SCK=0;
Delay1Ms(120); //不低于(52机)100MS不然数据无法刷新
_nop_();_nop_();
CS=0;
for(i=0;i<16;i++)//16位数据读取
{
Temp_2<<=1;//向右移一位
_nop_();
SCK=1;//上升
if(SO==1)
{Temp_2=Temp_2|0x01;}
else
Temp_2=Temp_2|0x00;
_nop_();
SCK=0;
_nop_();
}
Temp_2=Temp_2<<1; //向左移一位,取0-14位
Temp_2=Temp_2>>3; //向右移4位,取3-14位
//Temp_2=1024.123456;//测试正常运行不要
return(Temp_2); //返回温度
}
void write_com(uchar com)//写命令
{
rs=0;//
rw=0;
en=0;
P0=com;
delay(2);
en=1;
delay(5);
en=0;
delay(2);
}
void write_dat(uchar dat)//写数据
{
rs=1;//
rw=0;
en=0;
P0=dat;
delay(2);
en=1;
delay(5);
en=0;
delay(2);
}
void write_zfc(uchar *p)//定义一个带指针的函数?(字符串)
{
while(*p!=0)//不能用";"
write_dat(*p++);
}
void init_1602()//1602初始化
{
write_com(0x38);//设置16X2显示
delay(1);
write_com(0x0C);//0e光标不闪//0c不显//0f闪烁显示
delay(1);
write_com(0x06);//光标移位加1
delay(1);
write_com(0x01);//清屏
delay(1);
write_com(0x80);
write_zfc("Set=");
}
void write_TH(uchar set)//高温显示
{
uchar qian,bai,shi,ge;
qian=set/1000;
bai=set%1000/100;
shi=set%100/10;
ge=set%10;
write_com(0x80+4);
// write_dat(0x30+qian);
write_dat(0x30+bai);
write_dat(0x30+shi);
write_dat(0x30+ge);
write_dat(0xdf);//显上0
write_dat('C');
}
void display(uint tvalue)//4位显示子函数
{
uchar qian,bai,shi,ge;
qian=tvalue/1000;
bai=tvalue%1000/100;
shi=tvalue%100/10;
ge=tvalue%10;
write_com(0xc0+3);
write_zfc("WD =");
//write_dat(0x30+qian);
write_dat(0x30+bai);
write_dat(0x30+shi);
write_dat(0x30+ge);
write_dat(0xdf);//显上0
write_dat('C');
}
void keyscan()
{
if(k1==0)
{
// delay(5);
//while(!k1);
set++;
if(set>250)set=250;
write_TH(set);
}
if(k2==0)
{
//delay(5);
//while(!k2);
set--;
if(set<30)set=30;
write_TH(set);
}
}
void main()
{
init_1602();
while(1)
{
keyscan();
write_TH(set);//设置温度
x=Re_Convert(); //读取温度//X=读到的值
wdd=25*x;//温度量化 X 0.25//取后两位就X25
wd =(uint)wdd;//浮点型变量转换成uint型变量16位
//wd=wd-48;//计算
wd=wd/200;//计算
display(wd);
if(wd>set)
{
OUT=1;
write_com(0x80+11);
write_zfc("");
}
else
{
if(wd+1<=set) //让这回到5C之下才又开始加温,防闪烁
{
OUT=0;//加热开始
write_com(0x80+11);
write_zfc("");
}
}
}
}