基于51单片机的恒温加热系统--main.c文件

作品完成于今年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
  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值