找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2014|回复: 0
打印 上一主题 下一主题
收起左侧

51温控程序

[复制链接]
跳转到指定楼层
楼主
ID:117626 发表于 2016-4-30 09:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"reg52.h"
#include"intrins.h"
#include"math.h"
#define uchar unsigned char
#define uint unsigned int
#define Lcd_Data P0
uchar code dispbuf[33]={"Temperature:`CSX: `C XX: `C"};
uchar numcode[10]={'0','1','2','3','4','5','6','7','8','9'};
uint num[30]={0};
uchar count=0;//10秒记次数
sbit RS=P2^0;//lcdrs
sbit RW=P2^1;//lcdrw
sbit E=P2^2;//lcde
sbit Busy=P0^7;//lcd忙
sbit LED=P3^4;
sbit BUZZER=P3^5;
sbit jidianqi=P3^6;
sbit K0=P1^0;
sbit K1=P1^1;
sbit ON=P1^2;
sbit OFF=P1^3;
uchar bdata flag;
sbit DQ  =P2^7;
uint temp,shangxian,xiaxian,xianwen;

void delay(void);
void Init_LCD(void);
void Write_Comm(uchar);
void Write_Data(uchar);
void Read_Busy(void);

void Init_18B20(void);
uchar ReadOneChar(void);
void WriteOneChar(uchar dat);
void tessttemp(void);
uint wd(void);
void Delay(uint time);

sbit sta_flag=flag^0;
sbit fuhao=flag^1;
void timer1(void);
void delay1ms(void);
void sys_init(void);
void display(void);
void hextobcd(bit flag,uchar num);
void bm(void);
void delay15(uchar us);
void keyscan(void);
void delay3(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}

void main(void)
{LED=0;
BUZZER=0;
shangxian=99,xiaxian=5;
delay1ms();
sys_init();
delay1ms();
TR0=1;
ET0=1;
testtemp();
while(!ON)
{
if(OFF==0) break;
while(1)
{if(OFF==0)break;
xianwen=temp*0.0625;
keyscan();
if(15==count)
{
temp=wd();
count=0;
testtemp();
display();
}
hextobcd();
if(xianwen<xiaxian)
{
LED=1;
jidianqi=0;
}
if(xianwen>=shangxian)
{LED=0;
jidianqi=1;
BUZZER=1;
delay3(5);
BUZZER=0;
}
}
}
Write_Comm(0x01);
}
void keyscan()
{uchar num;
if(K0=0)
{delay3(150);
if(K0=0)
{
num++;
if(num==5)num=0;
}
}
if(K1==0)
{delay3(150);
if(num==0)
{xiaxian++;
if(xiaxian==50)
   xiaxian=5;
}
}
}
void timer0(void)interrupt 1 using 0
{
TH0=0x15;
TL0=0xA0;
TH1=0;
TL1=0;
count++;
_nop_();
_nop_();
_nop_();
_nop_();
}
void sys_init(void)
{
uchar i;
for(i=0;i<29;i++)
{
num[i]=0;}
TMOD=0x11;
TH0=0x15;
TL0=0xA0;
P0=0;
EA=1;
}
void hextobcd(void)
{
float tp;
unsigned long int tmp;
fuhao=0;
if(temp<0x8000)
tp=temp*0.0625;
else
{
bm();
tp=temp*0.0625;
fuhao=1;
}
tp*=10;
tmp=tp;
num[12]=tmp/100;
if(fuhao)
num[12]=num[12]|0x80;
num[13]=tmp/10-(tmp/100)*10;
num[19]=shangxian/10;
num[20]=shangxian%10;
num[28]=xiaxian/10;
num[29]=xiaxian%10;
}

void tessttemp(void)
{
Init_18B20();
if(flag)
{
WriteOneChar(0xCC);
WriteOneChar(0x44);
}
}

uint wd(void)
{
unsigned int a=0,b=0,t=0;
Init_18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);

a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
return(t);
}
void Init_18B20(void)
{
DQ=1;
Delay(10);
DQ=0;
Delay(80);
DQ=1;
Delay(10);
if(DQ)
flag=0;
else
flag=1;
Delay(20);
}
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay(15);
}
return(dat);
}

void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}

void bm(void)
{
temp=~temp;
temp+=1;
}

void display(void)
{
{
uchar a,b,d;
Init_LCD();
Write_Comm(0x01);
Write_Comm(0x80);
for(a=0;a<16;a++)
{
d=dispbuf[a];
if((a>11)&&(a<14))
{
d=numcode[num[a]];
}
if(14==a)
{
d=0xdf;
}
Write_Data(d);
}
Write_Comm(0xc0);
for(b=16;b<33;b++)
{
d=dispbuf[b];
if((b>18)&&(b<21))
{
d=numcode[num[b]];
}
if((b>27)&&(b<30))
{
d=numcode[num[b]];
}
if(b==21)
{
d=0xdf;
}
if(30==b)
{
d=0xdf;
}
Write_Data(d);
}
}
}
void Read_Busy(void)
{
do{
Lcd_Data=0xff;
RS=0;
RW=1;
E=0;
delay();
E=1;
}while(Busy);
}
void Write_Comm(uchar lcdcomm)
{
Lcd_Data=lcdcomm;
RS=0;
RW=0;
E=0;
Read_Busy();
E=1;
}

void Write_Data(uchar lcddata)
{
Lcd_Data=lcddata;
RS=1;
RW=0;
E=0;
Read_Busy();
E=1;
}
void Init_LCD(void)
{
delay();
Write_Comm(0x01);
Write_Comm(0x38);
Write_Comm(0x06);
Write_Comm(0x0c);
}
void delay15(uchar us)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
us--;
}
while(us);
}
void Delay(uint time)
{
while(time--);
}
void delay1ms(void)
{
uchar i,j;
for(i=0;i<2;i++)
   for(j=0;j<255;j++);
}
void delay()
{
uchar y;
for(y=0;y<0xff;y++);
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表