66 基于单片机的太阳能充电、温度检测、档位PWM调速系统

所有仿真详情导航:

PROTEUS专栏说明-CSDN博客

目录

一、主要功能

二、硬件资源

三、主程序编程

四、资源下载


一、主要功能

基于52单片机,采用DS18B20温度传感器检测温度,采用滑动变阻器连接ADC0832数模转换器模拟电量,采用L298N驱动电机转动。
五个按键,第一按键为系统总开关,按下后系统运行。
然后有模式切换按键,自动模式是依靠温度调速,手动模式是按键调速。
三个按键分别为一档、二档、三档。
根据温度范围来划分风俗档位,比如分3档。温度10-20为一档,20-25为二档,25-35为三档,档位越高转速越快。
显示屏显示实时温度,当前档位,和当前电量。
如果电量小于20,则蜂鸣器报警。

具体动态效果看B站演示视频(高清需要跳转到B站看)

基于单片机的太阳能充电、温度检测、档位PWM调速系统_哔哩哔哩_bilibili

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、主程序编程

cpp 复制代码
#include <REGX52.H>
#include<intrins.h>
#include<stdio.h>
#include "Delay.h"
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned  int

sbit DS=P2^4;                 //DS18B20温度传感器

sbit CS=P1^0;                 //adc0832引脚
sbit CLK=P1^1;
sbit DIO=P1^2;

sbit key1=P1^3;
sbit key2=P1^4;
sbit key3=P1^5;
sbit key4=P1^6;
sbit key5=P1^7;

sbit out1 = P3^6;
sbit out2 = P3^7;
sbit beep = P3^0;
sbit cd= P2^5;

unsigned char count;
typedef unsigned char u8;
typedef unsigned int  u16;
static uint temp;
static float ftemp = 0.0f;//温度转变
uint temp;


static unsigned char num;
static int dlyz=20;  
static int flag=1;
uchar  count=0;
static double u,u1;
static flag2=0;
static a=0,b=0,c=0,numsum=0;
static mode=0;
int kg=1;

void tmpchange();
uint tmp();
void beep_warning();
void ajpd();


void Car_Move(uchar speed)	 //电机转动
{
	uchar Car_Speed = speed;
	count++;	
	if(count <= Car_Speed)
	{
		out1 = 1;
	}
	else
	{
	 	out1 = 0;
	}
	if(count >= 100)
	{
	 	count = 0;
	}	
}

void Time0_Init()          //定时器初始化
{
TMOD = 0x01;           //定时器0工作在方式1    
IE   = 0x82;
TH0  = 0xfe;
TL0  = 0x33;     //11.0592MZ晶振,0.5ms
TR0=1;                 //定时器开始
EA=1;
}



void Time0_Int() interrupt 1 //中断程序
{
   TH0  = 0xfe;             //重新赋值
   TL0  = 0x33;
    num++;
	if(num==200)
	{
	    tmpchange();        //让18b20开始转换温度
	    temp = tmp();       //读取温度
	    ftemp = temp/10.0f; //转换温度
		num=0;
	}
	switch(numsum)
	{
		case 0:out1 = 0;out2=0;break;
		case 1:Car_Move(30);break;	 	 //电机低速前进
		case 2:Car_Move(60);break;	 	 //电机高速前进
		case 3:Car_Move(100);break;	 	 //电机高速前进
		default:break;
	}
}


uchar get_AD_Res()            //ADC0832启动读取函数 有害气体
{
	uchar i, data1=0, data2=0;
	CS=0;
	
	CLK=0;DIO=1;_nop_();
	CLK=1;_nop_();
	
	CLK=0;DIO=1;_nop_(); 
	CLK=1;_nop_();
	
	CLK=0;DIO=0;_nop_();
	CLK=1;_nop_();
	
	CLK=0;DIO=1;_nop_(); 
	
	for(i=0; i<8; i++)
	{
		CLK=1;_nop_();
		CLK=0;_nop_();
		data1=(data1<<1)|(uchar)DIO; 
	}
	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO<<i;
		CLK=1;_nop_();
		CLK=0;_nop_();
	}
	CS=1;
	
	return(data1 == data2)?data1:0;
}
void dsreset(void)            //发出命令
{
  uint i;
  DS=0;		              
  i=103;				   //将总线拉低480us~960us

  while(i>0)i--;
  DS=1;					   //然后拉高总线,若DS18B20做出反应会将在15us~60us后将总线拉低
  i=4;					   //15us~60us等待
  while(i>0)i--;
  //while(DS);
}
bit tmpreadbit(void)          //读取数据
{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}
uchar tmpread(void)           //读取数据
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }
  return(dat);
}
void tmpwritebyte(uchar dat)  //传输数据给DS18B20
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }
  }
}
void tmpchange(void)          //DS18B20开始工作
{
  dsreset();
  Delay(1);
  tmpwritebyte(0xcc);  
  tmpwritebyte(0x44);  
}					  
uint tmp()                    //获得温度
{
  float tt;
  uchar a,b;
  dsreset();
  Delay(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  a=tmpread();//低八位
  b=tmpread();//高八位
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625; //算出来的是测到的温度,数值可到小数点后两位
  temp=tt*10+0.5; //为了显示温度后的小数点后一位并作出四舍五入,因为取值运算不能取小数点后的数
  return temp;
}





void beep_warning() //温度传感器蜂鸣器警报并且电机转动
{
	if(ftemp>=10 && ftemp <= 20)
	{
		numsum=1;
	}
	else if(ftemp>20 && ftemp <=25)
	{
	  numsum=2;
	}
	else if(ftemp>25 && ftemp <=35)
	{
	  numsum=3;
	}
	else if(ftemp<10 || ftemp > 35)
	{
		numsum=0;
	}
	if(u1<20)
	{
		beep = 0;
		cd =0;
	}
	else
	{
		beep = 1;
		cd=1;
	}
	
}


void main()					  //主函数
{	
	LCD_Init();         //显示屏初始化
	Time0_Init();
	beep = 1;
	while(1)
	{
		if(kg==0)
		{
	LCD_ShowString(1,1,"wendu:");
	LCD_ShowString(2,1,"dl:");
		u=get_AD_Res(); //MQ
		u1 = (u/255)*100;
	  LCD_ShowNum(1,7,ftemp,2); //第一行显示温度
		LCD_ShowNum(2,4,u1,3);
		if(mode==0)
		{
	  beep_warning(); //温度、电压、电流超出报警
		}
		LCD_ShowNum(1,15,numsum,2);
	  }
		else
		{
			LCD_Init();         //显示屏初始化
			out1=0;
			out2=0;
			beep=1;
		}
		ajpd();
	
	}
}

void ajpd()
{
	if(!key1)
	{
		mode++;
		if(mode>1)
		{
			mode = 0;
		}
		while(!key1);
	}
	
	if(mode == 1)
	{		
	if(!key2)
	{
		numsum=1;
		while(!key2);
	}
	
		
	if(!key3)
	{
		numsum=2;
		while(!key3);
	}
	
	if(!key4)
	{
		numsum=3;
		while(!key4);
	}
 }
	
 	
	if(!key5)
	{
	  kg++;
		if(kg>1)
		{
			kg=0;
		}
		while(!key5);
	}
}

四、资源下载

全部资料(源程序、仿真文件、安装包、演示视频):

链接: https://pan.baidu.com/s/1oL_3vXE_jlPq8K_kFxW9RA?pwd=mi1w 提取码: mi1w

--来自百度网盘超级会员v4的分享

相关推荐
电工小王(全国可飞)1 小时前
STM32F407 内部参考电压校准实现 HAL库
stm32·单片机·嵌入式硬件
gyeolhada1 小时前
计算机组成原理(计算机系统3)--实验七:新增指令实验
单片机·嵌入式硬件
嵌入式小强工作室2 小时前
STM32更新程序OTA
stm32·单片机·嵌入式硬件
gyeolhada4 小时前
计算机组成原理(计算机系统3)--实验八:处理器结构拓展实验
java·前端·数据库·嵌入式硬件
andylauren11 小时前
(5)STM32 USB设备开发-USB键盘
stm32·嵌入式硬件·计算机外设
Ronin-Lotus12 小时前
嵌入式硬件篇---ADC模拟-数字转换
笔记·stm32·单片机·嵌入式硬件·学习·低代码·模块测试
promising-w13 小时前
单片机基础模块学习——数码管
单片机·嵌入式硬件·学习
华清远见IT开放实验室13 小时前
嵌入式STM32创新教学:华清远见虚拟仿真实验平台与智能车项目师资培训
stm32·单片机·嵌入式硬件
andylauren13 小时前
(1)STM32 USB设备开发-基础知识
stm32·单片机·嵌入式硬件
末时清14 小时前
OLED--软件I2C驱动__标准库和HAL库
stm32·单片机·嵌入式硬件