/******************************************基于8155的8LED显示温度控制器设计***************************/
#include<reg52.h>
#include<absacc.h>
/*******************************************宏定义***************************************************/
#define uint unsigned int
#define uchar unsigned char
/*******************************************定义8155地址***********************************************/
#define COM8155 XBYTE[0X7FF8] //8155的命令口
#define PA8155 XBYTE[0X7FF9] //8155的PA
#define PB8155 XBYTE[0X7FFA] //8155的PB
#define PC8155 XBYTE[0X7FFB] //8155的PC
/*********************************************定义DS18B20引脚**********************************************/
sbit DS18B20=P3^0; //DDS18B20引脚
/*******************************************定义数码管显示的码值**************************************/
uchar code du_code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //8段共阴极数码管显示码值
uchar dis_buf[]={0x3f,0x3f,0x40,0x3f,0x3f,0x40,0x3f,0x3f}; //数码管显示缓存,格式为MM-NN-SS
uchar code bit_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管显示的位值
/*********************************************定义系统变量***************************************************/
uchar hour,minute,second; //定义时间变量
char hour1=0,minute1=0,second1=5; //定义采样间隔变量
uchar count,count1,num,count2; //定义计数器变量
uint count3=0;
uchar str[8]; //定义数显示温度
uchar temp=0; //定义显示温度平均值变量
uchar temp1[2]; // 定义数组存储温度值
bit flag=0; // 定义时间标志位
bit flag1,flag2,flag3,flag4; //定义按键标志位
uint i=0x3f00; //定义8155RAM起始地址
/*********************************************延时程序***************************************************/
//us延时程序
void delayus(uint x)
{
while(x--);
}
//ms延时程序
void delayms(uint x)
{
uchar y;
for(;x>0;x--)
for(y=110;y>0;y--)
;
}
/*********************************************DS18B20程序***************************************************/
//18b20初始化程序
void Init_DS18B20(void)
{
uchar x=0;
DS18B20 = 1; //DS18B20复位
delayus(8); //稍做延时
DS18B20 = 0; //单片机将DS18B20拉低
delayus(80); //精确延时 大于 480us
DS18B20 = 1; //拉高总线
delayus(10);
x=DS18B20; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delayus(5);
}
//读一个字节
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DS18B20 = 0; // 给脉冲信号
dat>>=1;
DS18B20 = 1; // 给脉冲信号
if(DS18B20)
dat|=0x80;
delayus(5); //延时
}
return(dat);
}
//写一个字节
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DS18B20 = 0;
DS18B20 = dat&0x01;
delayus(5);
DS18B20 = 1;
dat>>=1;
}
delayus(5);
}
//读温度值
uchar ReadTemperature(void) //读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delayus(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
b<<=4;
b+=(a&0xf0)>>4;
t=b;
return(t); //返回温度值
}
/*********************************************扫描键盘程序***************************************************/
void keyscan()
{
uchar m;
m=PC8155;
m=m&0x0f;
if(m!=0x0f)
{
delayms(10); //延时消抖
PB8155=0x0f;
m=PC8155;
m&=0x0f;
if(m!=0x0f)
{
m=PC8155;
m&=0x0f;
switch(m)
{
case(0x0e):flag1=1;break; //按键1被按下
case(0x0d):flag2=1;break; //按键2被按下
case(0x0b):flag3=1;break; //按键3被按下
case(0x07):flag4=1;break; //按键4被按下
}
}
while(PC8155!=0x0f); //等待按键松开
}
if(flag1==1)
{
count++;
count2=0;
if(count>=3) //按键1被按下,功能计数器加1,跳转到下一个功能
count=0;
flag1=0;
}
if(count==1) //判断当前是否在功能1状态下
{
if(flag2==1)
{
count2++; //按键2被按下,采样时间小时加1
if(count2>=3) //判断时间界限
count2=0;
flag2=0;
}
if(flag3==1)
{
if(count2==0) second1++; if(second1==60) second1=0;
if(count2==1) minute1++; if(minute1==60) minute1=0;
if(count2==2) hour1++; if(hour1==24) hour1=0;
flag3=0;
}
if(flag4==1)
{
if(count2==0) second1--; if(second1<0) second1=59;
if(count2==1) minute1--; if(minute1<0) minute1=59;
if(count2==2) hour1--; if(hour1<0) hour1=23;
flag4=0;
}
}
if(count==2)
{ //判断当前是否在功能2状态下
if(flag2==1)
{
if(i<0x3fff)
i++; //判断RAM地址范围
flag2=0; //RAM地址加1
}
if(flag3==1)
{
if(i>0x3f00) //判断RAM地址范围
i--; //RAM地址减1
flag3=0;
}
}
}
/*********************************************初始化程序***************************************************/
void initial()
{
COM8155=0x03; //初始化8155
TMOD=0x11; //定时器工作方式初始化
TH0=(65536-1000)/256;
TL0=(65536-1000)%256; //定时器0装初值
TH1=(65536-50000)/256;
TL1=(65536-50000)%256; //定时器1装初值
ET0=1; //开定时器0中断
ET1=1; //开定时器1中断
EA=1; //开总中断
TR0=1; //开定时器0
TR1=1; //开定时器1
}
/*********************************************主程序***************************************************/
void main()
{
uint x=0x3F00;
uchar ss;
uchar j=0x00;
initial(); //系统初始化
for(;x<=0x3fff;x++)
XBYTE[x]=0x00; //RAM初始化
x=0x3F00;
while(1)
{
keyscan(); //键盘扫描
if(flag==1)
{
temp=ReadTemperature(); //读温度值
flag=0;
if(count==0)
{
str[0]=0;
str[1]=0;
str[2]=du_code[temp/10];
str[3]=du_code[temp%10];
str[4]=0x63;
str[5]=0x39;
str[6]=0;
str[7]=0; //装温度值
}
}
if(count==1)
{
dis_buf[0]=du_code[hour1/10];
dis_buf[1]=du_code[hour1%10];
dis_buf[3]=du_code[minute1/10];
dis_buf[4]=du_code[minute1%10];
dis_buf[6]=du_code[second1/10];
dis_buf[7]=du_code[second1%10]; //装采样时间值
}
if(count==2)
{
ss=XBYTE[i];
str[0]=0x40;
str[1]=0x40;
str[2]=du_code[ss/16];
str[3]=du_code[ss%16];
str[4]=0x63;
str[5]=0x39;
str[6]=0x40;
str[7]=0x40; //装储存的温度值
}
if(hour1!=0||minute1!=0||second1!=0)
{
if(hour1==hour&&minute1==minute&&second1==second) //判断采样时间间隔是否到达
{
XBYTE[x++]=temp/10*16+temp%10; //将温度值存储起来
second=0;
minute=0;
hour=0; //时间值清零
}
}
}
}
/*********************************************定时器0中断程序***************************************************/
void timer0() interrupt 1
{
//装初值
if(count==0||count==2)
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
PB8155=bit_code[count1]; //送数码管的位值
PA8155=str[count1]; //显示温度值
}
if(count==1)
{
TH0=(65536-500)/256;
TL0=(65536-500)%256;
count3++;
if(count3<=600)
{
PB8155=bit_code[count1];
PA8155=dis_buf[count1]; //显示采样时间间隔
}
else
{
if(count2==0)
{
if(count1==6||count1==7)
PB8155=0xff;
else
PB8155=bit_code[count1]; //秒闪烁
PA8155=d
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
8、 温度控制类 基本要求: 1 用18B20或AD590温度传感器作温度探头,采集温度数据并转换成BCD码在数码管或LCD上显示。 2 记录间隔可任意设定(1S到1h,步长1s),能按设定时间存储数据。 3 通过键回放温度和记录时间参数。 发挥部分: 1 通过DA回放数据(直方图),用模拟示波器显示。 2 设定温度告警门限。 3 通过声、光告警显示。 动态显示格式: 自定
资源推荐
资源详情
资源评论
收起资源包目录
基于8155的8LED显示温度控制器设计.zip (18个子文件)
基于8155的8LED显示温度控制器设计
8155.PWI 1KB
8155_DS18B20.Opt 979B
8155_DS18B20.hex 4KB
8155_DS18B20_Uv2.Bak 2KB
8155_DS18B20 14KB
8155_DS18B20.M51 19KB
Last Loaded 8155.DBK 115KB
8155_DS18B20.plg 216B
8155_DS18B20_Opt.Bak 983B
8155_DS18B20.LST 22KB
Last Loaded 8155_DS18B20.DBK 116KB
8155_DS18B20.OBJ 17KB
8155_DS18B20.Uv2 2KB
8155_DS18B20.lnp 41B
8155_DS18B20.PWI 1KB
8155_DS18B20.c 9KB
8155_DS18B20.pdsprj.LAPTOP-VU8L8507.86180.workspace 3KB
8155_DS18B20.DSN 116KB
共 18 条
- 1
从入门到捕蛇者说
- 粉丝: 757
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页