当前位置:文档之家› 简单温度控制完整程序

简单温度控制完整程序

简单温度控制完整程序
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs = P3^4 ;
sbit rw = P3^5 ;
sbit ep = P3^7 ;
unsigned int set1=30,set2=10;
unsigned char flag=0;
sbit DQ =P1^7; //定义通信端口
sbit fengmingqi=P1^1;
sbit jidianqi=P1^5;
code uchar mayuan[]={'0','1','2','3','4','5','6','7','8','9'}; code uchar aa[]={"wendu is:"};
code uchar bb[]={"sheding :"};
typedef bit BOOL ;
unsigned char k,dat_wr[8],dat_rd[8];
void putchar(uchar weizhi,uchar da); void delay(uchar);
void lcd_wcmd(uchar);
BOOL lcd_bz();
void lcd_pos(uchar) ;
void lcd_wdat(uchar) ;
void display(uchar,uchar *) ;
void lcd_init();
void longdelay(uchar s);
void keyscan(void);
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result ;
rs = 0 ;
rw = 1 ;
ep = 1 ;
result = (BOOL)(P2 & 0x80) ;
ep = 0 ;
return result ;
}
void lcd_wcmd(uchar cmd)
{ // 写入指令数据到LCD while(lcd_bz()) ;
rs = 0 ;
rw = 0 ;
ep = 0 ;
P2 = cmd ;
ep = 1 ;
ep = 0 ;
}
void lcd_pos(uchar pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80) ;
}
void lcd_wdat(uchar dat)
{ //写入字符显示数据到LCD
while(lcd_bz()) ;
r s = 1 ;
r w = 0 ;
e p = 0 ;
P2 = dat ;
e p = 1 ;
e p = 0 ;
}
void lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38) ; //function set
delay(1) ;
lcd_wcmd(0x38) ; //function set
delay(1) ;
lcd_wcmd(0x08) ; //display on/off
delay(1) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容delay(1) ;
lcd_wcmd(0x06) ; //entry mode set
delay(1) ;
lcd_wcmd(0x0c) ; //entry mode set
delay(1) ;
}
/*---------------
函数名称:display()
功能:在LCD上显示数组的数据
说明:先写显示地址,后写显示数据
调用:lcd_wcmd(), lcd_pos()
入口参数:pos 写入的位置,q指向要写入的数据所在的数组
返回值:无
----------------*/
void display(uchar pos, uchar *q)
{
uchar i ;
//lcd_wcmd(0x01) ; //clear
//delay(10) ;
lcd_pos(pos) ;
for(i=0 ;i<9;i++)
{
lcd_wdat(*q) ;
q++ ;
//longdelay(2) ;
}
}
void putchar(uchar weizhi,uchar da)
{
delay(2);
lcd_pos(weizhi);
lcd_wdat(da);
}
//延时函数
void delay(uchar ms) // 延时子程序
{ uchar i ;
while(ms--)
{
f or(i = 0 ; i<250;i++) ;
}
}
void delay1(uchar a)
{
while(a--);
}
void delay2(unsigned int i)//延时函数
{
while(i--);
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay2(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay2(80); //精确延时大于480us
DQ = 1; //拉高总线
delay2(10);
x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败
delay2(5);
DQ=1;
}
/**************************************** ***************************************** *********/
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 1;
delay2(5);
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay2(5);
DQ = 1;
}
}
/**************************************** ***************************************** ***************/
//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 1;
delay2(5);
DQ = 0;
DQ = dat&0x01;
delay2(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
/********************************/
//读取温度
unsigned int ReadTemperature(void)
{
unsigned int a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay2(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar(); //读低八位数据
b=ReadOneChar(); //读最高四位,一共十二位
b<<=8;
//b<<=4;
//b+=(a&0xf0)>>4;//b与a组成最高的八位c ,算时舍去了最低四位,只保留5到12位(c*2*2*2*2*0.0625=c*1=c),所以c的值就是实测温度
t=b+a;
return(t);
}
main()
{
uint bai,shi,ge;
float v;
int j;
unsigned int i;
fengmingqi=1;
jidianqi=1;
delay(10) ;
lcd_init() ; // 初始化LCD
display(0x00,aa);
display(0x40,bb);
while(1)
{
i=ReadTemperature();//读温度i=i>>4;
bai=i/100;
shi=i%100/10;
ge=i%10;
putchar(0x0b,mayuan[bai]);
putchar(0x0c,mayuan[shi]);
putchar(0x0d,mayuan[ge]);
}
}。

相关主题