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的分享

相关推荐
小猪写代码5 小时前
STM32 进阶SPI案例1:软件模拟SPI读写FLASH
stm32·单片机·嵌入式硬件
zcy8496443716 小时前
39 基于单片机的角度、水位、温度、辅助热源、电机仿真
单片机·嵌入式硬件
zcy8496443716 小时前
40 基于单片机的温湿度检测判断系统
单片机·嵌入式硬件
夜间看花7 小时前
49 基于单片机的湿度和光照监测
单片机·嵌入式硬件
石板小湫8 小时前
53 基于单片机的8路抢答器加记分
java·数据库·单片机
夜间去看海8 小时前
67 基于单片机的温湿度、烟雾、阈值切换、状态灯、串口收发
单片机·嵌入式硬件·串口·温湿度·状态灯
美式小田8 小时前
硬件工程师面试题 1-10
嵌入式硬件·面试·硬件工程师
小猪写代码8 小时前
STM32进阶 FSMC应用案例:扩展外部 SRAM
stm32·单片机·嵌入式硬件
lucy153027510799 小时前
D7000 低电压立体声手机功放电路芯片,电源纹波抑制比高静态电流低,内置节电模式开关和静噪开关 外接元件少所需外围元件少
单片机·嵌入式硬件·智能手机·音视频·便携式视盘播放器·cd-rom·便携式迷你播放器