基于单片机设计的简易热水器控制系统(6)

2019-05-17 16:43

附录2 部分源程序

#include #include \#define uchar unsigned char #define uint unsigned int

/***********************************

//数码管段选定义 0 1 2 3 4 5 6 7 8 9 uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,

0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //断码

//数码管位选定义

uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};

uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8}; uchar smg_i = 3; //显示数码管的个位数 sbit dq = P2^4; //18b20 IO口的定义 sbit relay = P2^5; //继电器IO口定义 sbit beep = P2^3; //蜂鸣器IO口定义

uchar a_a;

uint temperature ; // bit flag_300ms ; uchar key_can;

//按键值的变量

uchar menu_1; //菜单设计的变量 uint t_high = 300,t_low = 100; bit flag_lj_en;

//按键连加使能

bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了 uchar key_time,flag_value; //用做连加的中间变量 bit key_500ms ; uchar flag_clock;

22

本设计系统是18b20温度报警系统数码管显示,

可设置温度上限高温报警和下限低温报警,报警温 度可精确到0.1度,并具有掉电保存功能,数据保存 在单片机内部EEPOM中,进入设置界面后如果没有键 按下系统会在30秒后自动退出设置界面,人性化的按 键设置,按键还具有连加、减功能。

**********************************/

uchar zd_break_en,zd_break_value; //自动退出设置界面

/***********************1ms延时函数*****************************/ void delay_1ms(uint q) { }

/***********************小延时函数*****************************/ void delay_uint(uint q) { }

/***********************数码显示函数*****************************/ void display() { }

/******************把数据保存到单片机内部eepom中******************/ void write_eepom() {

SectorErase(0x2000);

byte_write(0x2000, t_high % 256);

23

uint i,j; for(i=0;i

for(j=0;j<120;j++);

while(q--);

uchar i;

for(i=0;i

//位选

//段选 //位选 //消隐

P3 = smg_we[i]; P1 = dis_smg[i]; delay_1ms(1); P3 = 0xff; P1 = 0xff;

}

byte_write(0x2001, t_high / 256); byte_write(0x2002, t_low % 256); byte_write(0x2003, t_low / 256); byte_write(0x2055, a_a);

/******************把数据从单片机内部eepom中读出来*****************/ void read_eepom() { }

/***********************18b20初始化函数*****************************/ void init_18b20() { }

/*************写18b20内的数据***************/ void write_18b20(uchar dat) {

uchar i; for(i=0;i<8;i++) {

//写数据是低位开始 //把总线拿低写时间隙开始

24

t_high = byte_read(0x2001); t_high <<= 8;

t_high |= byte_read(0x2000); t_low = byte_read(0x2003); t_low <<= 8;

t_low |= byte_read(0x2002); a_a = byte_read(0x2055);

bit q; dq = 1; dq = 0; dq = 1; q = dq; dq = 1;

//把总线拿高 //给复位脉冲 //750us

//把总线拿高 等待 //110us

//读取18b20初始化信号 //200us

//把总线拿高 释放总线

delay_uint(1); //15us delay_uint(80); delay_uint(10); delay_uint(20);

dq = 0;

}

}

dq = dat & 0x01; //向18b20总线写数据了 delay_uint(5); // 60us dq = 1; dat >>= 1;

//释放总线

/*************读取18b20内的数据***************/ uchar read_18b20() { }

/*************读取温度的值 读出来的是小数***************/ uint read_temp() {

init_18b20();

write_18b20(0xcc); write_18b20(0xbe); EA = 0;

25

uchar i,value; for(i=0;i<8;i++) { }

return value;

//返回数据

dq = 0; dq = 1; if(dq == 1)

//把总线拿低读时间隙开始 //释放总线 //开始读写数据

value >>= 1; //读数据是低位开始

value |= 0x80;

delay_uint(5); //60us 读一个时间隙最少要保持60us的时间

uint value; uchar low;

//在读取温度的时候如果中断的太频繁了,就应该把中断给关

了,否则会影响到18b20的时序

init_18b20();

//初始化18b20

//跳过64位ROM //启动一次温度转换命令 //500us

write_18b20(0xcc); write_18b20(0x44); delay_uint(50);

//初始化18b20

//跳过64位ROM //发出读取暂存器命令

}

low = read_18b20(); EA = 1; value <<= 8; value |= low; value *= 0.625; return value;

//读温度低字节

value = read_18b20(); //读温度高字节

//把温度的高位左移8位

//把读出的温度低位放到value的低八位中 //转换到温度值 小数 //返回读出的温度 带小数

/*************定时器0初始化程序***************/ void time_init() { }

/****************独立按键处理函数************************/ void key() {

static uchar key_new = 0,key_old = 0,key_value = 0; if(key_new == 0) { } else {

26

//开总中断 //开定时器0中断 //允许定时器0定时

EA = 1; ET0 = 1; TR0 = 1;

TMOD = 0X01; //定时器0、定时器1工作方式1

//按键松开的时候做松手检测

{ }

if((P2 & 0x0f) == 0x0f)

key_value ++; key_value = 0; else

if(key_value >= 10)

write_eepom(); key_value = 0; key_new = 1; flag_lj_en = 0; flag_value = 0;

//关闭连加使能 //清零

flag_lj_3_en = 0; //关闭3秒后使能


基于单片机设计的简易热水器控制系统(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2016.5人教版一年级下册数学全册教案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: