/*******************************************
** 温度传感器设计温控系统 **
** STC89C52RC+DS18B20+LCD12864 **
** 作者:九江学院 周远明 **
** 完成日期:2015年04月01日 **
********************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda_24c02=P2^0;//串行数据输入/输出端
sbit scl_24c02=P2^1;//串行时钟输入端
sbit DQ=P2^2; //温度传感器 I/O 口
sbit U1s=P2^7;//段位锁存
sbit U2s=P2^6;//位选锁存
sbit data_595si=P1^0;//595数据输入口
sbit clk_595srck=P1^4;//595数据写进移位寄存器时钟输入口
sbit e_595rck=P2^3;//595移位寄存器,数据送输出的时钟
sbit PSB_12864=P1^3;//串/并方式控制
sbit RST_12864=P1^5;//复位
sbit led_d=P0^2;//led灯引脚定义
sbit led_z=P0^1;//led灯引脚定义
sbit led_g=P0^0;//led灯引脚定义
sbit CS_12864=P2^5;
sbit SID_12864=P2^6;
sbit SCLK_12864=P2^4;
sbit S1=P3^7;//定义按键
sbit S2=P3^6;//定义按键
sbit S3=P3^5;//定义按键
sbit S4=P3^4;//定义按键
#define keyL_A S1//按键-左加
#define keyL_S S2//按键-左减
#define keyR_A S3//按键-右加
#define keyR_S S4//按键-右减
long int temperature=0;
int temp_L,temp_H; //初始温度值*10后的值
uchar code dis1[16]={" 温控系统 "};
uchar code dis2[16]={"The Contr Range:"};
int temp;//定义整型温度数据变量
float f_temp;//定义浮点型温度数据变量
/*----------------延时函数部分-----------------------*/
void delayms(uint xms)//延时单位ms
{
uint i;
for(;xms>0;xms--)
{
for(i=0;i<=110;i++)
{
;
}
}
}
void delayus(uint xus)//单位微妙us
{
while(xus)
{
xus--;
}
}
void delay_ds18b20(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<1;j++);
}
/*----------------初始化板子部分-----------------------*/
void write_data_74hc595(uchar da)//写字节给74hc595芯片
{
uint i;
e_595rck=0;//先置低电平为得到上升沿做准备
for(i=1;i<=8;i++)
{
clk_595srck=0;//先置于低电平为得到上升沿做准备
data_595si=da&0x80;//送一位最高位
da<<=1;//左移动一位去掉已送的原先数据的最高的那一位,右边自动添零
clk_595srck=1;//置高电平,使得到一上升沿把数据中的最高的一位送入缓存寄存器中
}
e_595rck=1;//置为高电平得到上升沿把缓存寄存器中的数据送到数据口(即把8位数据送出)
data_595si=0;//把数据输入口置为零,和单片机硬件接口有关
}
void initboard(void)
{
U1s=1;
U2s=1;
P0=0x00;//关闭所有数码管,避免驱动电压不够
U1s=0;
U2s=0;
write_data_74hc595(0x40);//开通发光二极管的使能端
P1=0xff;//关闭所有发光二极管,避免驱动电压不够
write_data_74hc595(0x00);//关闭发光二极管的使能端
}
/*----------------DS18B20温度传感器处理部分-----------------------*/
uchar reset_ds18b20()
{
uchar presence;
DQ=0;
delay_ds18b20(29); //延时480 - 960 us
DQ=1;
delay_ds18b20(3); //延时 15 - 60 us
presence=DQ;
delay_ds18b20(25); //延时 60 - 240 us
return(presence);
}
uchar read_bit_ds18b20()
{
uchar i;
DQ=1;
delay_ds18b20(1);
DQ=0;
DQ=1;
for(i=0;i<3;i++);
return(DQ);
}
void write_bit_ds18b20(uchar dat)
{
DQ=0; //置0 无需延时
if(dat==1)
DQ=1;
delay_ds18b20(1); //延时 60 - 120 us
DQ=1;
delay_ds18b20(1); //延时 1 - ∞ us
}
void write_byte_ds18b20(uchar dat)
{
uchar i,j;
for(i=0;i<8;i++)
{
j=((dat>>i)&0x01);
write_bit_ds18b20(j);
}
}
uchar read_byte_ds18b20()
{
uchar dat=0;
uchar i;
for(i=0;i<8;i++)
{
if(read_bit_ds18b20())
dat|=0x01<<i;
}
return(dat);
}
int read_temp_ds18b20()
{
uchar templ=0,temph=0;
int temp=0;
reset_ds18b20();//复位
write_byte_ds18b20(0xcc); //跳过ROM
write_byte_ds18b20(0x44); //跳过温度采集
delay_ds18b20(10); //750ms
reset_ds18b20();
write_byte_ds18b20(0xcc); //跳过ROM
write_byte_ds18b20(0xbe); //准备好数据(开始温度转换采集)
templ=read_byte_ds18b20();//读低字节温度值
temph=read_byte_ds18b20();//读低字节温度值
temp=(templ+(temph*256));
return(temp);
}
/*----------------12864液晶显示器处理部分-----------------------*/
void write_date(uchar da)//写数据
{
uchar i;
uchar i_da=0xfa;//写数据操作:1111 1010
delayms(1);
CS_12864=1;//置高电平
SCLK_12864=0;
for(i=0;i<8;i++)//送写数据控制字给控制器
{
SID_12864=(i_da&0x80);
SCLK_12864=0;
SCLK_12864=1;//上升沿
i_da=i_da<<1;
}
i_da=da&0xf0;
for(i=0;i<8;i++)//数据的高四位,低四位补零,给控制器
{
SID_12864=(i_da&0x80);
SCLK_12864=0;
SCLK_12864=1;//上升沿
i_da=i_da<<1;
}
i_da=da<<4;
for(i=0;i<8;i++)//数据的低四位,低四位补零,给控制器
{
SID_12864=(i_da&0x80);
SCLK_12864=0;
SCLK_12864=1;//上升沿
i_da=i_da<<1;
}
CS_12864=0;
}
void write_command(uchar cmd)//写指令(三字节)
{
uchar i;
uchar i_cmd=0xf8;// 写指令操作:1111 1000
delayms(1);CS_12864=1;//置高电平
SCLK_12864=0;
for(i=0;i<8;i++)//送写指令控制字给控制器
{
SID_12864=(i_cmd&0x80);
SCLK_12864=0;
SCLK_12864=1;//上升沿
i_cmd=i_cmd<<1;
}
i_cmd=cmd&0xf0;
for(i=0;i<8;i++)//指令的高四位,低四位补零,给控制器
{
SID_12864=(i_cmd&0x80);
SCLK_12864=0;
SCLK_12864=1;//上升沿
i_cmd=i_cmd<<1;
}
i_cmd=cmd<<4;
for(i=0;i<8;i++)//指令的低四位,低四位补零,给控制器
{
SID_12864=(i_cmd&0x80);
SCLK_12864=0;
SCLK_12864=1;//上升沿
i_cmd=i_cmd<<1;
}
CS_12864=0;
}
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if(X==1)
{
X=0x80;//第一行起始地址
}
else
if(X==2)
{
X=0x90;//第二行起始地址
}
else
if(X==3)
{
X=0x88;//第三起始地址
}
else
if(X==4)
{
X=0x98;//第四行起始地址
}
pos=X+Y;
write_command(pos);//显示地址
}
void init_12864(void)
{
RST_12864=1;
delayms(1);//延时处理
PSB_12864=0;//串行口方式
delayms(1);
write_command(0x30);//基本指令操作
delayms(1);
write_command(0x30);//8位数据
write_command(0x0c);//显示开,关光标
write_command(0x06);//指针自动移动
write_command(0x01);//清除LCD的显示内容
}
void display(uchar X,uchar Y,char *str)
{
uchar i;
lcd_pos(X,Y);
for(i=0;i<16;i++)
{
write_date(str[i]);
}
}
/*----------------屏幕显示部分-----------------------*/
void display_temp(int date)
{
uchar tt[16];
uchar bai,shi,ge;
if((date&0xf800)>0)//判断温度数据 是否是负温度
{
tt[9]='-';//在液晶显示器相应位置上显示一个 ” - “ 负温度标志
}
else
{
tt[9]='+';//在液晶显示器相应位置上显示一个 ” +“ 正温度标志
}
date=(date&0x07ff)*0.625;
bai=(date%1000)/100;
shi=(date%100)/10;
ge=date%10;
tt[0]='R';
tt[1]='o';
tt[2]='o';
tt[3]='m';
tt[4]='T';
tt[5]='e';
tt[6]='m';
tt[7]='p';
tt[8]=':';
tt[10]='0'+bai;//实际温度的十位
tt[11]='0'+shi;//实际温度的个位
tt[12]='.';
tt[13]='0'+ge;//实际温度小数点后第一位
tt[14]='^';
tt[15]='C';
display(2,0,tt);
}
void display_range(int min,int max)
{
uint x1,y1,x2,y2;
uchar t1[16];
if(min<0)
{
min=-min;
t1[4]='-';
}
else
{
t1[4]='+';
}
if(max<0)
{
max=-max;
t1[12]='-';
}
else
{
t1[12]='+';
}
x1=min/100;
y1=(min%100)/10;
x2=max/100;
y2=(max%100)/10;
t1[0]='m';
t1[1]='i';
t1[2]='n';
t1[3]=':';
t1[5]='0'+x1;
t1[6]='0'+y1;
t1[7]=' ';
t1[8]='m';
t1[9]='a';
t1[10]='x';
t1[11]=':';
t1[13]='0'+x2;
t1[14]='0'+y2;
t1[15]=' ';
display(4,0,t1);
}
/*----------------AT24C02芯片部分-----------------------*/
void init_24c02(void)//初始化(将总线都拉高释放总线)
{
sda_24c02=1;
delayus(1);
scl_24c02=1;
delayus(1);
}
void start(void)//启动信号(SCL在高电平期间,SDA一个下降沿启动信号)
{
sda_24c02=1;
delayus(1);
scl_24c02=1;
delayus(1);
sda_24c02=0;
delayus(1);
}
void respons(void)//应答信号(SCL在高电平期间,SDA被从设备拉为低电平表示答应)
{
uchar i;
scl_24c02=1;
delayus(5);
while((sda_24c02==1)&&(i<255))i++;//防止一旦器件没有发送应答信号,程序将永远停止在这里,而真正的程序中是不允许这样的
scl_24c02=0;
delayus(1);
}
void stop(void)//停止信号(在SCL高电平期间,SDA一个上升
没有合适的资源?快使用搜索试试~ 我知道了~
DS18B20温控系统(液晶+正负温度+数据保存).zip
共15个文件
obj:2个
lst:2个
bak:2个
需积分: 10 8 下载量 178 浏览量
2015-11-19
19:15:24
上传
评论
收藏 60KB ZIP 举报
温馨提示
我们于本周进行了硬件类课程设计,我们的选题是DS18B20温度传感器设计。通过基于MCS-51系列单片机AT89C51和DS18B20温度传感器检测温度,熟悉芯片的使用,温度传感器的功能。数码显示管的使用,C语言的设计,并把我们这一年所学的数字和模拟电子技术、检测技术、单片机应用等知识,通过理论联系实际,从题目分析、电路设计调试、程序编制调试到传感器的选定等这一完整的实验过程,培养了学生正确的设计思想,使学生充分发挥主观能动性,去独立解决实际问题,以达到提升学生的综合能力、动手能力、文献资料查阅能力的作用,为毕业设计和以后工作打下一个良好的基础。
资源推荐
资源详情
资源评论
收起资源包目录
DS18B20温控系统(液晶+正负温度+数据保存).zip (15个子文件)
DS18B20温控系统(液晶+正负温度+数据保存)
DS18B20温控系统(液晶串行)_uvproj.bak 0B
DS18B20温控系统(液晶串行).lnp 102B
STARTUP.LST 14KB
DS18B20温控系统(液晶串行).M51 39KB
DS18B20温控系统(液晶串行).uvopt 54KB
DS18B20温控系统(液晶串行).uvproj 13KB
DS18B20温控系统(液晶串行) 27KB
DS18B20温控系统(液晶串行).LST 25KB
DS18B20温控系统(液晶串行)_uvopt.bak 54KB
DS18B20温控系统(液晶串行).plg 6KB
STARTUP.A51 6KB
DS18B20温控系统(液晶串行).hex 8KB
STARTUP.OBJ 749B
DS18B20温控系统(液晶串行).c 11KB
DS18B20温控系统(液晶串行).OBJ 31KB
共 15 条
- 1
资源评论
LoadingMain
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功