首页 > 其他分享 >66 基于单片机的太阳能充电、温度检测、档位PWM调速系统

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

时间:2024-12-16 10:27:35浏览次数:5  
标签:uchar ++ void 单片机 while 66 sbit PWM DS

所有仿真详情导航:

PROTEUS专栏说明-CSDN博客

目录

一、主要功能

二、硬件资源

三、主程序编程

四、资源下载


一、主要功能

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

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

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

二、硬件资源

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

三、主程序编程

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

标签:uchar,++,void,单片机,while,66,sbit,PWM,DS
From: https://blog.csdn.net/zs849644371/article/details/144499381

相关文章

  • 【077】基于51单片机智能消毒柜【Proteus仿真+Keil程序+报告+原理图】
    ☆、设计硬件组成:51单片机最小系统+DHT11温湿度传感器+LCD1602液晶显示+AT24C02存储芯片+紫外线灯+继电器+按键设置+限位开关+蜂鸣器+LED灯。1、设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片;2、采用DHT11温湿度传感器实时检测温湿度数值,并通过LCD1602实时更......
  • STM32学习笔记(四)TIM定时中断、PWM的简单应用(舵机、直流电机)
    一、TIM简介定时器(Timer,简称TIM)是STM32中非常重要的外设之一,广泛应用于定时、计数、PWM输出、事件触发等多种场景。STM32提供了多个定时器,每个定时器的功能和性能有所不同,但基本原理类似。定时器的工作原理是通过不断计数来产生定时事件,计数器会在每个周期到达预设值时......
  • 16.基于51单片机的太阳能路灯控制系统(实物)
    16.基于51单片机的太阳能路灯控制系统(实物)通过百度网盘分享的文件:资料详解链接:https://pan.baidu.com/s/1zPXLcLmqZAljkgMeU2RT7w?pwd=597l 提取码:597l 太阳能路灯控制系统:带太阳能充电功能,oled显示,白天根据光强判断开关灯晚上开灯,二级菜单可以设置时间日期。太阳能......
  • 15.基于51单片机的温控风扇(实物)
    15.基于51单片机的温控风扇(实物)通过百度网盘分享的文件:资料详解链接:https://pan.baidu.com/s/1zPXLcLmqZAljkgMeU2RT7w?pwd=597l 提取码:597l 1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机2.采用DS18B20温度传感器测温(0-99.9°C),三极管驱动数码管显......
  • 14.基于51单片机的智能花盆设计(实物)
    14.基于51单片机的智能花盆设计(实物)通过百度网盘分享的文件:资料详解链接:https://pan.baidu.com/s/1zPXLcLmqZAljkgMeU2RT7w?pwd=597l 提取码:597l 设计简介:基于单片机的智能花盆设计单片机:STC89C52功能:1、通过显示屏显示花盆中土壤的温度、湿度,花盆外光照强度;2、通......
  • 【每日一题】3266. K 次乘运算后的最终数组 I&II
    给你一个整数数组 nums ,一个整数 k  和一个整数 multiplier 。你需要对 nums 执行 k 次操作,每次操作中:找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最 前面 的一个。将 x 替换为 x*multiplier 。k 次操作以后,你需要将 nums 中每一个......
  • coder666 P2903 - 整数幂
    题目oj: 登陆-徐工院·"周编一"计划题目:2903-整数幂考点:位运算  题目描述: 判断一个数是不是的整数幂,比如,所以输出“yes”,而无法表示成的整数幂形式,所以输出“no”输入: 输入一个正整数,在int范围以内输出: 如果是的整数幂,输出yes,否则,输出no样......
  • 力扣 3266. K 次乘运算后的最终数组 II
    发现\(k\le10^9\),肯定不能直接模拟了。但是注意到,如果最小值\(\min\timesm>\max\)存在,我们可以直接给每个数乘上\(m^{\lfloor\frac{k}{n}\rfloor}\),最后再处理剩下的\(k\bmodn\)个\(m\)即可,这个复杂度是\(O(n)\)的。具体地说,最小值乘上一个\(m\)超过最大值之后,其......
  • WordPress教程66集(全)
    WordPress教程66集(全)6小时https://www.bilibili.com/video/BV1AG4y1Q7sV/?spm_id_from=333.337.search-card.all.click&vd_source=d10c649e248b08f4441d8cd6b76f46fcwordpressAstrahttp://www.wp.com/wp-adminyoastseoElementorWebsiteBuilderEssentialAddonsfor......
  • leetcode 866. 回文质数
    866.回文质数想着开大数组,用质数筛选的方法。但是开大数组超内存了......