作品完成于今年6月份,现在整理整理发上来,防止忘记。
基于51单片机的恒温加热系统-演示视频.mp4
引用的头文件
>自编的DS18B20温度传感器驱动程序源码 ds18b20.h
>自编的LCD1602液晶显示屏驱动程序源码 lcd1602.h
↓main.c文件
/*********************恒温加热系统main.c主程序****************/
/*
* 驱动的接口函数:
* DS18B20温度传感器驱动 :float DS18B20_ReadTmp(); 返回温度值
* LCD1602显示屏的驱动 : void LCD1602_WriteInstrucion(unsigned char addr);addr显示的首地址
* void LCD1602_WriteData(unsigned char dat[]);dat[]显示的数据
*/
#include <reg52.h>
#include <LCD1602.h>
#include <DS18B20.h>
#define EMPTY 0x20 //LCD1602显示空值的宏
sbit pwm = P1^6; //pwm输出IO口
bit DIR = 1; //电平标志位,为1表示接下来pwm要输出高电平,为0表示要输出低电平
bit STARTSTOP = 0; //可控硅开启还是关断状态标志位,1为开启,0为关断
sbit k1 = P3^1; //按键接口
sbit k2 = P3^0;
sbit k3 = P3^2;
sbit k4 = P3^3;
unsigned char a = 1;
unsigned char HLevel_TH ; //定时器初始值,高电平的高8位
unsigned char HLevel_TL ; //定时器初始值,高电平的低8位
unsigned char LLevel_TH ; //定时器初始值,低电平的高8位
unsigned char LLevel_TL ; //定时器初始值,低电平的低8位
unsigned int xdata PWM_CYCLE = 2000; //pwm周期,初始值设为2000 us
unsigned int Htime = 1000; //高电平时间
unsigned int Ltime = 1000; //高电平时间
unsigned int main_count; //主函数里的计数变量,用来判断是否进行测量
float PV ; //保存当前温度数值的变量,present value
float SHV = 37.5; //初始的温度范围
float SLV = 37.0;
unsigned char num[] = "0123456789" ; //用于温度数据转换成字符型数据的运算
unsigned char lcdbuf[16]; //用于保存lcd1602的显示数据
unsigned char xdata save[] = " save! " ;
unsigned char xdata start[] = " start! " ;
unsigned char xdata stop[] = " STOP! " ;
/******函数原型声明******/
void time0_init(); //初始化定时器0
void init_calculate(unsigned int Htime,unsigned int Ltime); //计算定时器装载的初值
void pwm_out() ; //定时器中断函数
void delay(unsigned int i);
unsigned char *PVdisplay(); //处理显示当前值数组的函数指针,present value
unsigned char *SVrange(); //处理显示设置范围数组的函数指针,set value range
unsigned char *PSHV(); //请设置上限值,please set high value
unsigned char *PSLV(); //请设置下限值,please set low value
unsigned char *DUTY_RATIO(); //计算占空比,DUTY_RATIO,以xx%显示
void lcd_display(unsigned char addr,const unsigned char dat[]); //lcd显示函数
void lcd_clean(unsigned char addr,unsigned char n); //lcd清屏函数,addr为开始清屏的首地址,n为清除字符个数
bit key_do(unsigned char k); //判断按键是否按下,内嵌了消抖和等待按键松开
void SV_key(float *value, unsigned char *(*po)()); //设置数据增减的按键处理函数
void key_pros(); //处理按键的总函数
void output_regulation(unsigned int times); //负反馈调节函数
/******函数原型声明结束****/
/*主函数*/
void main(void)
{
pwm = 0; //先关闭pwm信号
time0_init(); //定时器初始化
LCD1602_Init(); //lcd1602显示屏初始化
PV = DS18B20_ReadTmp();
lcd_display(0xc0,stop);
while(1)
{
main_count++;
output_regulation(20000); //经过仿真,主函数循环一次25us,则20000×25us = 0.5s
key_pros();
}
}
/*中断处理函数*/
void pwm_out() interrupt 1
{
TR0 = 0; //先关闭定时器
if(DIR==0) //标志位为0,则接下来pwm输出低电平
{
TH0 = LLevel_TH;
TL0 = LLevel_TL;
pwm = 0;
DIR = 1;
}
else //标志位为1,则接下来pwm输出低电平
{
TH0 = HLevel_TH;
TL0 = HLevel_TL;
pwm = 1;
DIR = 0;
}
TR0 = 1; //装填完毕打开定时器
}
/*
*函数名: time0_init()
*函数功能: 对定时器0进行初始化,使其一开始计时1000个数(1000 us)
*输入: 无
*输出: 无
*/
void time0_init()
{
TMOD |= 0x01; //定时器工作模式为工作方式1
TH0 = 0xfc;
TL0 = 0x18; //定时器初始值设为定时1000 us,即pwm周期的一半
ET0 = 1;
EA = 1;
TR0 = 0; //先不要开计时器
}
/*
*函数名: init_calculate(unsigned int Htime,unsigned int Ltime)
*函数功能: 将电平时间参数转换成可以直接装载到定时器初值的格式
*输入: 高电平时间 Htime,低电平时间 Ltime。单位 us
*输出: 无
*/
void init_calculate(unsigned int Htime,unsigned int Ltime)
{
HLevel_TH = (65536-Htime)/256; //将十进制的时间参数值转换成定时器的初始值格式,即高低8位
HLevel_TL = (65536-Htime