精华内容
下载资源
问答
  • 本文将介绍一种利用热释电红外传感器作为探测源, 经过信号调理后送给CPU 处理, 在异常情况下发出声光报警信号,同时自动封锁出口的安防设备。系统有“自动”、“商场”、“场馆”和“家庭”四种工作模式供用户选择...
  • 基于51单片机的综合项目设计。内含单片机红外接收解码、电子日历策、稳压电源设计等项目的程序设计及Proteus仿真,很不错,好东西哦。
  • 51单片机综合小项目

    2020-08-03 15:22:10
    用开发板做了一个万年历综合小项目,可以测温,报警,显示时间等。内部的驱动源码可以直接移植,有一定基础想尝试做项目的可以拿这个项目练练手。
  • 51单片机 项目源代码

    2016-10-19 21:28:43
    51单片机 项目源代码
  • 基于51单片机的智能小车避障 该项目包括原理图电路图 程序源码 演示视频讲解文档全套资料 三分拿去 超值了
  • 电子设计---基于51单片机

    千次阅读 2020-07-01 11:41:36
    毕业了,作为在实验室摸鱼四年的老学长分享一些资料 这些项目均已做过,适合小白更好的在项目中学习51单片机 标题

    毕业了,分享一些项目资料

    这些项目均已做过,适合小白更好的在项目中学习单片机

    全程指导制作 全套教程资料均可以提供  源代码(均注释) 仿真 原理图 PCB文件 无保留教授。

    课程设计 毕业设计 电赛 省赛 均可以指导,提供技术支持

    stc51   stm32 

    做过很多,项目就不一一举例  先放一些51的选题供大家选择  希望加我注明来意 

     

     

     

    展开全文
  • 基于51单片机的汽车尾灯控制系统 该项目包括原理图电路图 程序源码 演示视频讲解文档全套资料 三分拿去 超值了
  • 单片机的P0口接LCD1602或LCD12864的数据端口D0~D7 (使用跳线帽连接) ;单片机的P1口的P1. 1、P1.2、P1.3、P1.4、P1.5分别接LCD1602或LCD12864的RS、R/W、E、PSB和RST (也使用跳线帽连接) ;单片机的P1日的P1.6和P1.7接...
  • 采用AT89C52单片机智能控制,结合外围电子电路,设计的频率计性能稳定。在软件设计上采用了单片机的C语言设计,通过单片机内部定时/计数器同时动作,在测量频率时将测频率和测周期相结合,提高了频率计的测量准确性。...
  • 基于51单片机毕设的一般操作流程 0 引言 工科类的一些专业,像自动化、物联网等专业的毕业生,他们涉及到有关51系列的单片机来完成毕设项目时,往往由于平时实践的机会少,面对这一类毕设无从下手,希望下面的一些...
  • 51单片机实例20例

    2018-03-14 14:05:07
    适合初学者,基于单片机开发板的51单片机实例代码20例
  • 2. 以超声波传感器为接口部件,设计基于单片机的无线超声波测距系统,对超声波发生电路、超声波接收放大电路、计数和显示电路等模块进行软硬件设计。 3. 使用数字温度传感器DS1820(DS18B20)实时监测环境温度并显示...
  • 51板子为TX-1C(STC89C52RC),如果不是这种款式也没事,联系我帮你改改引脚就可以用了,通过51单片机可监测到该引脚的电平跳变情况(输出波形),结合12864显示出来,非常可观和方便
  • 基于51单片机的GSM短信防盗报警系统 该项目包括原理图电路图 程序源码 演示视频讲解文档全套资料 三分拿去 超值了
  • 基于51单片机的温控风扇的整体项目,里面含有源程序,原理图,元件,封装,PCB图,功能及操作说明,芯片资料等
  • 采用AT89C52单片机,0.96寸OLED屏,AT24C02存储芯片,4*4矩阵键盘组成,支持断电密码记忆,密码修改,带密码退格功能。纯C语言适合初学者练习,毕业设计,课程项目等。接口方面涉及模拟I2C协议编写。
  • 笔者曾在多个通信测试仪器项目中,成功地应用ARM处理器、C51单片机等为主控芯片的嵌入式系统,实现了对仪器相关模块的实时控制功能。因此提出一种在某通信测试仪器中使用C51单片机来实现实时控制的设计方案。  1 ...
  • 100个51单片机实例

    2018-12-13 19:32:44
    100个51单片机实例,给初学单片机的朋友们,希望对大家有所帮助
  • 51单片机的实例集合,淘宝购买。有万年历、12864屏显示、步进电机控制、交通灯、等等真实有效,。百度网盘链接,永久有效
  • 基于51单片机的AD,DA转换技术,包括液晶显示和按键控制和声光报警等功能
  • 项目基于51单片机的抢答器设计,包括.asm汇编代码和.DSN电路文件。本作品来自微机原理课程项目,供读者参考学习。
  • 基于51单片机的wifi智能led灯的毕业设计

    万次阅读 多人点赞 2020-02-13 11:28:09
    基于51单片机的wifi智能led灯的毕业设计 摘要 系统基于STC89C52RC单片机设计,拥有自动与手动两种模式,自动模式下可以过热释红外传感器检测是否有人,采用光敏电阻构成的电路检测环境光的强度,从而自动实现灯的...

    基于51单片机的wifi智能led灯的毕业设计

    摘要

          系统基于STC89C52RC单片机设计,拥有自动与手动两种模式,自动模式下可以过热释红外传感器检测是否有人,采用光敏电阻构成的电路检测环境光的强度,从而自动实现灯的自动开启和关闭;手动模式下可以使用wifi连接手机,通过手机app手动控制不同灯的开启和关闭并可控制各LED灯的光亮度,并采用可移动充电式电源供电,满足不同场景的需求。系统简单易行、控制方便,可用于传统照明的节能改造。

    设计思路

          本系统基于STC89C52单片机设计,可实现灯具的自动控制;同时,结合esp8266wifi模块通过安卓手机端app与wifi模块进行数据通信,实现对被控对象的无线连接手动控制。主要功能如下:

    (1)自动模式: 通过光敏电阻和热释红外传感器分别自动检测光的强弱和是否有人,室内无人或者光照充足时自动灭灯,灭灯时间延时一分钟;有人到且光照不足时自动开灯;该模式即节约了人力资源又节约了大量电能。
    (2)手动模式:开启手机wifi,通过手机APP手动控制灯的开启和关闭,使用手机轻松控制灯的开关,方便快捷。

    图1 系统框图
    在这里插入图片描述
    在这里插入图片描述

    硬件设计

    wifi模块

          wifi模块采用esp8266,对wifi模块进行配置就需要使用到AT指令集。其最基础的一些AT指令集在下面贴出,部分会在代码中使用到。

    WIFIAT+CIPMUX=1AT+CIPSERVER=1,80	//修改端口号
    AT+CWMODE=3				//设置模式
    AT+RST					//重启
    AT+CWJAP="WiFixdd","xiaojieying"	//搜索并连接路由器
    AT+CIPMODE=1				//透传
    AT+CIPMUX=0				//单路模式
    AT+CIPSTART="TCP","172.29.242.2",8080	//连接手机端
    AT+CIPSEND				//进入透传

    若想深入研究自行找资料学习AT指令集。

    热释电传感器

          HC-SR501 人体红外传感器模块是基于红外技术的自动控制模块,它可以检测人或某些动物发出的红外辐射并输出电信号我们使用的 。
    在这里插入图片描述
    在这里插入图片描述

    电源模块

          电源模块采用18650可充电电池,由于其供电电压为3.6V,不能很好的为电路工作,所以我们通过升压模块对其进行电压放大,以达到标准供电电压5V。并能通过变压充电模块为18650电池充电。
    在这里插入图片描述

    驱动电路

          由于52单片机的IO口驱动能力较弱,无法满足大型LED灯的需要,所以我们在这里通过三极管进行电流放大,该驱动电路通过电阻对单片机IO口进行降压,使得三极管得以导通,并对单片机IO口电流进行放大,以达到驱动该大型灯泡的能力,并给每一个LED灯串联一个限流电阻,已达到保护LED灯延长使用寿命的作用。该电路共使用六个大型LED灯照明,三黄三白,不同颜色交替摆放,已保证单种颜色灯光的照明范围。
    在这里插入图片描述
    要注意的是实物硬件电路板对led灯的一个布局,以及合理跳线的一个问题。

    代码实施

          程序主要模块是通过单片机串口与蓝牙进行通信。由于STC89c52没有独立的波特率发生器,所以我们这里将定时计数器T1改装成波特率发生器,产生9600的标准波特率,并通过串口中断函数对读取数据进行接收,并将串口中断优先级调到最高。
    在这里插入图片描述
          下面是手机APP与单片机的简单通信协议,创建单独协议的目的是为了对以后项目扩展,技术升级留下足够的预留空间,并可以保证产品的加密安全性。
    在这里插入图片描述
          通过对程序的算法设计,该智能灯泡可达到黑夜可自动控制,有人经过则自动开起,并保持最大可调时间10分钟后自动熄灭。通过手机APP控制LED的开关以及亮度调节,若夜晚通过手机APP开起灯光,人经过后无需手机关闭即可自动关闭,以防止由于忘关造成的电力浪费。以下是主程序流程图。
    在这里插入图片描述
    main.c

    #include "reg52.h"
    #include"uart.h"
    #include"led.h"
    #include<stdio.h> 
    
    sbit MAN=P1^4;  
    
    int main()
    { 	 	
      unsigned char dat=0;	
      NewLineReceived = 0;	
      MAN=1;	
      ColorLED_Init();		//LED灯初始化  
      Serial_Init();		//串口初始化  
      ms_delay(1000);	
      WIFI_Init();			//WIFI模块初始化	    	
      timer0_init();		//定时计数器零初始化	
      color_led_pwm(0, 0);  
      while(1)	
      { 			
        if(MAN==0)		
        {			
          color_led_pwm(255, 255);			
          while(MAN==0) ;				
          color_led_pwm(0, 0);		
        }  	 			
        if(NewLineReceived == 1)		
        {	 			
          uart_send_string("Init OK!"); 			
          serial_led();//调用串口解析函数			
          NewLineReceived = 0;		 		
        }	
      }  
    }
    

    led.c

    #include "reg52.h"
     sbit LED_W = P1^0;
     sbit LED_W1=P1^1;
     sbit LED_W2=P1^2; 
     sbit LED_Y = P1^5;
     sbit LED_Y1 = P1^6;
     sbit LED_Y2 = P1^7;
      unsigned char whitenum=0;
      unsigned char yellownum=0; 
      unsigned char ledWnum=0;
      unsigned char ledYnum=0;
       void ColorLED_Init()
       {	      	LED_W = 1;	LED_W1 = 1;	LED_W2 = 1;   	LED_Y = 1;	LED_Y1 = 1;	LED_Y2 = 1;}
     void color_led_pwm(unsigned char v_iwhite, unsigned char v_iyellow)//点亮相应颜色的灯
     {	whitenum = v_iwhite;	yellownum = v_iyellow; }
      /*** Function       ledRPwmWrite* @author        Danny* @date          2017.08.16* @brief         LED_R产生pwm* @param         void* @retval        void* @par History   无*/ 
     void ledWPwmWrite()
     {	if((whitenum != 0) && (whitenum!=255))	{		if(ledWnum <=  whitenum)		{				LED_W=1;			LED_W1=1;			LED_W2=1;		}		else		{				LED_W=0;			LED_W1=0;			LED_W2=0;		}	}	else if(whitenum==0)		{				LED_W=0;			LED_W1=0;			LED_W2=0;		}	else if(whitenum==255)	   	{				LED_W=1;			LED_W1=1;			LED_W2=1;		}} 
     /*** Function       ledGPwmWrite* @author        Danny* @date          2017.08.16* @brief         LED_G产生pwm* @param         void* @retval        void* @par History   无*/ 
     void ledYPwmWrite()
     {	if((yellownum != 0)&&(yellownum!=255))	{		if(ledYnum<=yellownum)		{			LED_Y=1;			LED_Y1=1;			LED_Y2=1;		}		else		{			LED_Y=0;			LED_Y1=0;			LED_Y2=0;		}	}	else if(yellownum==0)	   {			LED_Y=0;			LED_Y1=0;			LED_Y2=0;		}	else if(yellownum==255)	   {			LED_Y=1;			LED_Y1=1;			LED_Y2=1;		}}   
     void Update_ColorPWM()
     {	ledWPwmWrite();	ledYPwmWrite();} 
     void timer0_init()
     {	TMOD|=0X01;  //定时器T0工作方式1,定时器T1工作方式2    
     TH0=0XFF;    //100us定时,装入初值    
     TL0=0XA4;	TR0=1;		//启动T0工作    
     ET0=1;		//允许T0中断  	
     EA =1;	    //开总中断	
     PT0=0; }	
      void timer0() interrupt 1  
      {     TH0=0XFF;    //50us定时,装入初值   
       TL0=0XD2;  	//控制pwmled	
       ledWnum++;	ledYnum++;	Update_ColorPWM(); 
      }
       

    uart.c

    #include "reg52.h"
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     #include"led.h"
     bit NewLineReceived = 0;       //串口接收完成标志位bit StartBit  = 0;             //协议开始标志int g_num=0;				   //定义变量int g_packnum=0;char InputString[50] = {0};    //用来储存接收到的内容 /*** Function       StringFind* @author        Danny* @date          2017.08.16    * @brief         字符串查找* @param[in]     pSrc:源字符串; pDst:查找的字符串; v_iStartPos:源字符串起始位置* @param[out]    void* @retval        void* @par History   无*/int StringFind(const char *pSrc, const char *pDst, int v_iStartPos)  {  	int i, j;      for (i = v_iStartPos; pSrc[i]!='\0'; i++)  	  //判断是否到了源字符串的结束符    {          if(pSrc[i]!=pDst[0])  					  //与所要查找的字符串的第一个字节作比较        	continue;                 j = 0;          while(pDst[j] !='\0' && pSrc[i+j]!='\0')  //判断是否到了所要查找字符串以及源字符串的结束符        {              j++;              if(pDst[j]!=pSrc[i+j])              break;          }          if(pDst[j]=='\0')  						  //判断是否到了所要查找字符串的结束符            return i;      }      return -1;  }  /*** Function       uart_send_byte* @author        Danny* @date          2017.08.16* @brief         串口发送一个字符* @param[in]     data:字符* @param[out]    void* @retval        void* @par History   无*/void uart_send_byte(unsigned char dat){   SBUF = dat;	          //把数据放到SBUF中   while(TI == 0);	      //未发送完毕就等待   TI=0;                  //发送完毕后,要把TI重置0} /*** Function       uart_send_string* @author        Danny* @date          2017.08.16* @brief         串口发送一个字符串* @param[in]     void* @param[out]    void* @retval        void* @par History   无*/void uart_send_string(unsigned char *str){	while(*str != '\0')		     //判断指针str是否指向字符串的末尾	{	   uart_send_byte(*str);     //往串口上发送字符串	   str++;					 //指针自增,按照一个字节一个字节发送字符串	}}				   /*** Function       Serial_Init* @author        Danny* @date          2017.08.16* @brief         串口初始化函数* @param         void* @retval        void* @par History   无*/void Serial_Init(){  	SCON=0x50;      //[bit6:5]SM1 SM2 = 1 0;[bit4]REN=1  /*	AUXR=0x11;      //[bit4]BRTR=1,允许独立波特率发生器运行;[bit0]SIBRS=1,                    //独立波特率作为串口1的波特率发生器,此时定时器1释放	BRT=0XFD;       //独特波特率发生器定时器(产生波特率9600) */	TMOD|=0X20;		PCON=0;	TH1=TL1=0XFD;	TR1=1;  	ES=1;			//开串口中断  	EA=1;			//开总中断	PS=1;} /*** Function       serial_IRQHandler* @author        Danny* @date          2017.08.16* @brief         串口中断处理接收串口数据函数* @param         void* @retval        void* @par History   无*/void serial_IRQHandler(void) interrupt 4 using 1  //串行口中断,第一组寄存器{	 	unsigned char date = 0;   	if(RI)  	{    	RI=0;					       //清除接收中断标志位		date=SBUF;				       //串行口接收到的数据		if(date == '$')		{	  		StartBit = 1;		       //协议开始	  		g_num = 0;		}		if(StartBit == 1)		{			InputString[g_num]=date;   //将接收到的数据存储到定义的数组中		}		if(StartBit == 1 && date == '#')		{	  		NewLineReceived = 1;	   //串口接收完成标志	  		StartBit = 0;			   //协议关闭	  		g_packnum = g_num;		   		}		g_num++;					    //g_num自增		if(g_num >= 80)		{			g_num=0;				    //将g_num清零			StartBit=0;			NewLineReceived=0;		    //串口接收完成标志		}  	}}/******************************************************************函 数: void ms_delay(int t)功 能: 毫秒级延时参 数: 无返回值: 无*******************************************************************/void ms_delay(int t)  { 	int i,j; 	for(i=t;i>0;i--) 		for(j=110;j>0;j--); }/******************************************************************函 数: void WIFI_Init(void)功 能: wifi初始化(名字:esp8266;密码:1234567890)参 数: 无返回值: 无*******************************************************************/ void WIFI_Init(void) {	ES = 0;	TI = 1; 	printf("AT+RST\r\n");	ms_delay(1000) ;	printf("AT+CWMODE=3\r\n");	ms_delay(1000) ;	printf("AT+CIPMUX=1\r\n");	ms_delay(1000) ;	printf("AT+CIPSERVER=1,8080\r\n"); 	ms_delay(1000) ;printf("AT+CIOBAUD=9600\r\n"); // 设置与单片机一致的波特率 	ms_delay(1000) ;	while(!TI);	TI = 0;	ES = 1;} /*void WIFI_Init(void) {	ES = 0;	TI = 1; 	uart_send_string("AT+RST\r\n");	ms_delay(1000) ;	uart_send_string("AT+CWMODE=3\r\n");	ms_delay(1000) ;	uart_send_string("AT+CIPMUX=1\r\n");	ms_delay(1000) ;	uart_send_string("AT+CIPSERVER=1,8080\r\n"); 	ms_delay(1000) ;uart_send_string("AT+CIOBAUD=9600\r\n"); // 设置与单片机一致的波特率 	ms_delay(1000) ;	while(!TI);	TI = 0;	ES = 1;}  */void serial_led(){	 //解析蓝牙APP发来的灯控信息    //如:$JC,CLW255,CLY000# 亮白灯	if (StringFind((const char *)InputString, (const char *)"CLW", 0) > 0) //判断是否查找到了字符串"CLW" 	{		int m_kp, i, ii, white, yellow;								   //定义变量		char m_skp[5] = {0}; 		//寻找以CLW开头,,结束中间的字符											   //定义数组存放数据		i = StringFind((const char *)InputString, (const char *)"CLW", 0); //查找到字符串"CLW"的位置赋值给i		ii = StringFind((const char *)InputString, (const char *)",", i);  //查找到字符串","的位置赋值给ii		if (ii > i)														   //判断ii与i的关系大小		{						memcpy(m_skp, InputString + i + 3, ii - i -3);				//从InputString + i + 3所指的内存地址的起始位置开始拷贝(ii-i-3)个字节到m_skp所指的内存地址的起始位置中			m_kp = atoi(m_skp);											   //将找到的字符串m_skp转换成整形数赋值给m_kp			white = m_kp;		} 		 		//寻找以CLY开头,#结束中间的字符		i = StringFind((const char *)InputString, (const char *)"CLY", 0); //查找到字符串"CLY"的位置赋值给i		ii = StringFind((const char *)InputString, (const char *)"#", i);  //查找到字符串","的位置赋值给ii		if (ii > i)														   //判断ii与i的关系大小		{			memset(m_skp, 0x00, sizeof(m_skp));							   //清空m_skp中的数据			memcpy(m_skp, InputString + i + 3, ii - i -3);			//从InputString + i + 3所指的内存地址的起始位置开始拷贝(ii-i-3)个字节到m_skp所指的内存地址的起始位置中			m_kp = atoi(m_skp);											   //将找到的字符串m_skp转换成整形数赋值给m_kp			yellow = m_kp;			//sprintf(ReturnTemp, "%d", green);			//uart_send_string(ReturnTemp);			color_led_pwm(white, yellow);                              //点亮相应颜色的灯			NewLineReceived = 0;  			memset(InputString, 0x00, sizeof(InputString));               //清空串口数据						return;		}	}	if (StringFind((const char *)InputString, (const char *)"JC", 0) == -1 )  //判断是否查找到了字符串"4WD"	{		//点灯判断    	if (InputString[1] == 'W')       //白灯    	{			if(InputString[2]=='1')      		color_led_pwm(255, 0);			if(InputString[2]=='0')      		color_led_pwm(0, 0);    	}    	else if (InputString[1] == 'Y')  //黄灯    	{      		if(InputString[2]=='1')      		color_led_pwm(0, 255);			if(InputString[2]=='0')      		color_led_pwm(0, 0);    	}    	else if (InputString[1] == 'O')  //全部灯    	{      		if(InputString[2]=='1')      		color_led_pwm(255,255);			if(InputString[2]=='0')      		color_led_pwm(0, 0);    	}    		}
     }
     

    由于格式问题,代码格式是乱的,可自行整理,并添加.h文件,或通过下方链接下载。

    手机APP程序

          可自行制作或下载第三方软件WiFi调试助手。
    凭借其开放性的巨大优势,安卓平台在设备开发应用中广受欢迎。安卓平台允许开发者根据自己的喜好和应用需求,设计出具有不同特色的实用软件。同时,安卓平台还能够适配多种硬件开发平台,对于硬件开发门槛要求低,极大地方便了用户对其进行相关的开发研究。此外,凭借其巨大的优势,安卓平台在当前开发平台领域中呈现逐年上升的趋势。因此在本设计中采用安卓平台进行本项目的设计开发。

    注:需要源文件请到我个人主页下载,代码仅供参考。

    下载链接://download.csdn.net/download/weixin_44313435/12152854

    展开全文
  • 计算机 电子信息工程 通信工程 实验 课程设计 工程项目 资源 必过 已过 好用 答辩简单 按着来就行 大学生关注我 以后所有我的课设都会更新 所需积分很低 签一次到就能得不用去桃宝买 多支持 个人主页有更多课设实验...
  • 单片机驱动SG90,视频教程: 《单片机实践项目》之基于51单片机控制SG90舵机手册及程序讲解: https://www.bilibili.com/video/BV1z54y1176S/
  • 基于51单片机的测速及测距系统。项目包括利用霍尔传感器测车轮转速(rad/s)及行驶速度(m/s),超声波测距,LCD1602显示速度及距离
  • 基于51单片机的温度湿度监控系统

    万次阅读 多人点赞 2018-05-28 21:55:09
    今天笔者给大家介绍一种利用51单片机的温度模块制作一个小空间的温度湿度检测系统,温度检测使用的是DHT11,如果想将此项目移植到开发板上,需要自行修改管脚。 原理截图 源代码如下: #include&lt;reg52.h...

    今天笔者给大家介绍一种利用51单片机的温度模块制作一个小空间的温度湿度检测系统,温度检测使用的是DHT11,如果想将此项目移植到开发板上,需要自行修改管脚。
    原理截图这里写图片描述
    源代码如下:

    #include<reg52.h>
    #include "intrins.h"
    typedef unsigned char uint8;
    typedef unsigned int uint16;
    sbit rs=P2^6;    // 数据命令选择
    sbit rw=P2^5;    //读写选择
    sbit e=P2^7;      //使能
    
    sbit k1=P3^3; //模式
    sbit k2=P2^1; //加
    sbit k3=P2^2; //减
    
    sbit DHT11_DQ_OUT=P3^2;
    sbit led1=P3^6;
    sbit led2=P3^7;
    
    sbit dq=P2^0;
    
    uint8 mode=0,xian;
    char temph=50,templ=20;
    char humih=80,humil=20;
    uint8 temp,humi;
    uint8 flag;   //设定报警标志
    uint8 a,c,tempvalue;
    uint8 code num[10]="0123456789";
    
    uint8 code str1[]="Temp:";  //温度
    uint8 code str2[]="Humi:";  //湿度
    uint8 code str3[]="Error";  
    uint8 code str4[]="Success    "; 
    uint8 code str5[]="%RH";
    uint8 code str6[]="TempH:";   //设定温度上限显示
    uint8 code str7[]="TempL:";   //设定温度下限显示
    uint8 code str8[]="HumiH:";    //设定湿度上限显示
    uint8 code str9[]="HumiL:";    //设定湿度下限显示
    
    
    void delay(uint16 i)
    {
        while(i--);
    }
    
    void delay_ms(uint16 i)
    {
        while(i--)
            delay(90);
    }
    
    void wrc(uint8 c)    //写命令
    {
        delay(1000);
        rs=0;
        rw=0;
        e=0;
        P0=c;
        e=1;
        delay(10);
        e=0;
    }
    void wrd(uint8 dat)   //写数据
    {
        delay(1000);
        rs=1;
        rw=0;
        e=0;
        P0=dat;
        e=1;
        delay(10);
        e=0;
        rs=0;
    }
    void lcd_init()    // LCD1602初始化
    {
        delay(1000);
        wrc(0x38);
        wrc(0x38);   //功能设置命令,选择8位总线,双行显示  5*7点阵字符
        wrc(0x38);
        wrc(0x06);  //光标和显示模式设置  光标右移  整屏不移动
        wrc(0x0c);  //显示开关控制  开显示  无光标 光标不闪烁
        wrc(0x01);  //清零指令  固定的
    }
    //复位DHT11
    void DHT11_Rst()       
    {                 
        DHT11_DQ_OUT=0;     //拉低DQ
        delay_ms(20);       //拉低至少18ms
        DHT11_DQ_OUT=1;     //DQ=1 
        delay(3);       //主机拉高20~40us
    }
    
    //等待DHT11的回应
    //返回1:未检测到DHT11的存在
    //返回0:存在
    uint8 DHT11_Check()        
    {   
        uint8 retry=0;   
        while (DHT11_DQ_OUT&&retry<100)//DHT11会拉低40~50us
        {
            retry++;
            _nop_();
        };   
        if(retry>=100)return 1;
        else retry=0;
        while (!DHT11_DQ_OUT&&retry<100)//DHT11拉低后会再次拉高40~50us
        {
            retry++;
            _nop_();
        };
        if(retry>=100)return 1;     
        return 0;
    }
    
    
    //DHT11初始化 
    //返回0:初始化成功,1:失败
    uint8 DHT11_Init()
    {
        DHT11_Rst();      
        return DHT11_Check();   
    }
    
    
    //从DHT11读取一个位
    //返回值:1/0
    uint8 DHT11_Read_Bit(void)           
    {
        uint8 retry=0;
        while(DHT11_DQ_OUT&&retry<100)//等待变为低电平 12-14us 开始
        {
            retry++;
            _nop_();
        }
        retry=0;
        while((!DHT11_DQ_OUT)&&retry<100)//等待变高电平    26-28us表示0,116-118us表示1
        {
            retry++;
            _nop_();
        }
        delay(1);//等待40us
        if(DHT11_DQ_OUT)return 1;
        else return 0;         
    }
    
    //从DHT11读取一个字节
    //返回值:读到的数据
    uint8 DHT11_Read_Byte(void)    
    {        
        uint8 i,dat=0;
        for (i=0;i<8;i++) 
        {
            dat<<=1; 
            dat|=DHT11_Read_Bit();
        }                           
        return dat;
    }
    
    //从DHT11读取一次数据
    //temp:温度值(范围:0~50°)
    //humi:湿度值(范围:20%~90%)
    //返回值:0,正常;1,读取失败
    uint8 DHT11_Read_Data(uint8 *temp,uint8 *humi)    
    {        
        uint8 buf[5];
        uint8 i;
        DHT11_Rst();
        if(DHT11_Check()==0)
        {
            for(i=0;i<5;i++)//读取40位数据
            {
                buf[i]=DHT11_Read_Byte();
            }
            if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
            {
                *humi=buf[0];
                *temp=buf[2];
            }
    
        }else return 1;
        return 0;       
    }
    
    
    
    
    void ds18b20init()      //18b20的初始化
    {
        dq=1;
        delay(1);
        dq=0;
        delay(80);
        dq=1;
        delay(5);
        dq=0;
        delay(20);
        dq=1;
        delay(35);
    }
    void ds18b20wr(uint8 dat)     //18b20写数据
    {
        uint8 i;
        for(i=0;i<8;i++)
        {
            dq=0;
            dq=dat&0x01;
            dat>>=1;
            delay(8);//在时序上只有这一块对时序要求最准确,他的时间必须大于15us
            dq=1;
            delay(1);
        }   
    }
    uint8 ds18b20rd()         //18b20读数据
    {
        uint8 value,i;
        for(i=0;i<8;i++)    
        {
            dq=0;
            value>>=1;
            dq=1;
            if(dq==1)value|=0x80;
            delay(8);//在这一块也对时间要求特别准确,整段程序必须大于60us      
        }
        return value;
    }
    uint8 readtemp()              //读取温度内需要复位的
    {
        uint8 b;
        ds18b20init();      //初始化
        ds18b20wr(0xcc);   //发送忽略ROM指令
        ds18b20wr(0x44);   //发送温度转换指令
        delay(100);
        ds18b20init();     //初始化
        ds18b20wr(0xcc);   //发送忽略ROM指令
        ds18b20wr(0xbe);   //发读暂存器指令
        a=ds18b20rd();   //温度的低八位
        b=ds18b20rd();   //温度的高八位
        b<<=4;           //ssss s***;s为标志位s=0表示温度值为正数,s=1温度值为负数
        c=b&0x80;       //温度正负标志位确认
        b+=(a&0xf0)>>4;
        a=a&0x0f;     //温度的小数部分
        return b;
    }
    
    
    void key_pros()  //按键处理函数
    {
        if(k1==0)
        {
            delay(1000);
            if(k1==0)
            {
                mode++;
                if(mode==5)mode=0;
                wrc(0x01);
            }
            while(!k1);
        }
        if(mode==1)       //对温度上限设定
        {
            if(k2==0)         //加
            {
                delay(1000);
                if(k2==0)
                {
                    temph++;
                    if(temph>=80)temph=80;
                }
                while(!k2);
            }
            if(k3==0)      //减
            {
                delay(1000);
                if(k3==0)
                {
                    temph--;
                    if(temph<=0)temph=0;
                }
                while(!k3);
            }
        }
        if(mode==2)       //对温度下限设定
        {
            if(k2==0)         //加
            {
                delay(1000);
                if(k2==0)
                {
                    templ++;
                    if(templ>=80)templ=80;
                }
                while(!k2);
            }
            if(k3==0)      //减
            {
                delay(1000);
                if(k3==0)
                {
                    templ--;
                    if(templ<=0)templ=0;
                }
                while(!k3);
            }
        }
        if(mode==3)       //对湿度上限设定
        {
            if(k2==0)         //加
            {
                delay(1000);
                if(k2==0)
                {
                    humih++;
                    if(humih>=80)humih=80;
                }
                while(!k2);
            }
            if(k3==0)      //减
            {
                delay(1000);
                if(k3==0)
                {
                    humih--;
                    if(humih<=0)humih=0;
                }
                while(!k3);
            }
        }
        if(mode==4)       //对湿度下限设定
        {
            if(k2==0)         //加
            {
                delay(1000);
                if(k2==0)
                {
                    humil++;
                    if(humil>=80)humil=80;
                }
                while(!k2);
            }
            if(k3==0)      //减
            {
                delay(1000);
                if(k3==0)
                {
                    humil--;
                    if(humil<=0)humil=0;
                }
                while(!k3);
            }
        }
    }
    
    void lcd_init_display()    //LCD初始化显示
    {
        uint8 i;
        for(i=0;i<5;i++)
        {
            wrc(0x80+i);
            wrd(str1[i]);   
        }
    
        for(i=0;i<5;i++)
        {
            wrc(0xc0+i);
            wrd(str2[i]);   
        }
    }
    
    void data_pros()    //数据处理函数
    {
        uint8 i;        
        uint8 temp_buf[2],humi_buf[2];
        uint8 temphbuf[2],templbuf[2],humihbuf[2],humilbuf[2];
        float dio;
        uint16 k;
    
        tempvalue=readtemp();
        DHT11_Read_Data(&temp,&humi);
        temp_buf[0]=temp/10+0x30;   
        temp_buf[1]=temp%10+0x30;
    
        humi_buf[0]=humi/10+0x30;   
        humi_buf[1]=humi%10+0x30;
    
        dio=a*0.0625;
        k=dio*10000;//取小数点后两位有效数字
    
        temphbuf[0]=temph/10+0x30;
        temphbuf[1]=temph%10+0x30;
        templbuf[0]=templ/10+0x30;
        templbuf[1]=templ%10+0x30;
    
        humihbuf[0]=humih/10+0x30;
        humihbuf[1]=humih%10+0x30;
        humilbuf[0]=humil/10+0x30;
        humilbuf[1]=humil%10+0x30;
    
        if(mode==0)
        {
            lcd_init_display();
            wrc(0x85);
            wrd(num[tempvalue%100/10]);
            wrd(num[tempvalue%100%10]);
            wrd('.');
            wrd(num[k/1000]);
            wrd(0xdf);
            wrd('C');
    
            for(i=0;i<2;i++)
            {
                wrc(0Xc5+i);
                wrd(humi_buf[i]);         
            }   
            for(i=0;i<3;i++)
            {
                wrc(0Xc7+i);
                wrd(str5[i]);         
            }   
        }
        if(mode==1)           //温度上限显示
        {
            wrc(0x80);
            for(i=0;i<6;i++)
            {
                wrd(str6[i]);         
            }
            wrd(temphbuf[0]);
            wrd(temphbuf[1]);           
        }
        if(mode==2)           //温度下限显示
        {
            wrc(0x80);
            for(i=0;i<6;i++)
            {
                wrd(str7[i]);         
            }
            wrd(templbuf[0]);
            wrd(templbuf[1]);           
        }
        if(mode==3)           //湿度上限显示
        {
            wrc(0x80);
            for(i=0;i<6;i++)
            {
                wrd(str8[i]);         
            }
            wrd(humihbuf[0]);
            wrd(humihbuf[1]);           
        }
        if(mode==4)           //湿度下限显示
        {
            wrc(0x80);
            for(i=0;i<6;i++)
            {
                wrd(str9[i]);         
            }
            wrd(humilbuf[0]);
            wrd(humilbuf[1]);           
        }
    }
    
    void baojinpros()   //报警处理
    {
        if(tempvalue>=temph||humi>=humih)    //检测温度或者湿度高于设定上限值 降温湿
        {
            led1=1;     //降温湿指示灯
            led2=0;
        }
        if(tempvalue<=templ||humi<=humil)   //检测温度或者湿度低于设定下限值  升温湿
        {
            led1=0;
            led2=1;    //升高温湿指示灯
        }
        if((tempvalue>templ&&tempvalue<temph)&&(humi>humil&&humi<humih))
        {
            led1=0;
            led2=0; 
        }
    }
    
    void main()
    {
        uint8 i=0;
        led1=0;
        led2=0;
        lcd_init();
        while(DHT11_Init()) //检测DHT11是否纯在
        {
            for(i=0;i<5;i++)
            {
                wrc(0x80+i);
                wrd(str3[i]);   
            }           
        }
        wrc(0x01);
        lcd_init_display();    //LCD初始化显示
        i=0;
        while(1)
        {   
            i++;
            key_pros();
            baojinpros();   //报警处理
            if(i==15)
            {
                i=0;
                data_pros();     //读取一次DHT11数据最少要大于100ms
            }
            delay(1000); 
    
        }   
    }
    展开全文
  • 基于51单片机无线温度控制系统硬件介绍: 该设计采用51单片机STC89C52控制DS18B20实现的无线温度控制系统。通过简单的无线通信协议,实现可靠性与功耗平衡。该系统能实现对温度的测量,同时还可以进行温度的设定,是...
  • 基于51单片机的智能台灯设计

    千次阅读 2021-09-05 08:56:06
    一.硬件方案 本文介绍了一种基于PWM调光的智能台灯设计。把单片机技术和PWM调光技术结合起来实现台灯...主要由51单片机+光线检测雾传感+ADC0832模数芯片+人体检测模块+按键+LED灯等;如图: 二.设计功能 (1)上电之后

    一.硬件方案

    本文介绍了一种基于PWM调光的智能台灯设计。把单片机技术和PWM调光技术结合起来实现台灯光强的调节。即在不改变PWM方波周期的前提下,利用单片机控制PWM的占空比,从而来改变电压的大小实现灯光亮度的调节。
    当人体在台灯的范围内且环境光线较弱时,自动感应开灯,且灯的亮度随着环境光线的改变而自动调节,一旦人离开台灯范围,即红外热释传感器检测不到有人时,1分钟后自动熄灯。
    主要由51单片机+光线检测雾传感+ADC0832模数芯片+人体检测模块+按键+LED灯等;如图:
    在这里插入图片描述

    二.设计功能

    (1)上电之后,绿色的 LED 灯点亮,代表当前是自动控制模式。
    (2)通过按键 1,可以在手动模式(绿灯灭)和自动模式(绿灯亮)之间来回切换 .
    (3)在手动模式下,可以通过按键 2 降低亮度,按键 3 增加亮度。
    (4)在自动模式下,首先要检测到有人,才进行亮度的自动控制,否则台灯熄灭。 可以挡住光敏电阻的光线,或用手电筒来照射光敏电阻,模拟光照的变化,从而就可以 看到台灯的亮度会随着环境中的光照强度的改变而改变,效果是光照越弱,台灯越亮。 如果人体传感器 1 分钟检测不到有人,台灯就会自动熄灭。
    (5)无论是自动模式还是手动模式,都是把亮度分为 10 个等级的。
    (6)人体感应检测功能只在自动模式下有效。

    三.设计原理图

    (1)原理图主要采用AD软件进行设计,如图:
    在这里插入图片描述

    (2)Protues仿真图如下:
    在这里插入图片描述
    (3)PCB图如下:
    在这里插入图片描述

    四.软件设计

    (1)程序流程图
    在这里插入图片描述

    (2)主程序源码

    /*********************************************************/
    // 主函数
    /*********************************************************/
    void main()
    {
    	uchar ret;
    	
    	TimerInit(); 					// 定时器初始化
    	
    	LED=0;								// 指示灯点亮(自动模式指示灯)
    	ret=Get_ADC0832();		// 获取AD采集结果(环境光照强度)
    	AutoControl(ret);			// 上电先进行一次自动亮度控制	
    	AutoControl(ret+7);
    	
    	while(1)
    	{
    		/* 模式切换控制 */
    		if(Key1==0)					// 如果按键1被按下去
    		{
    			LED=~LED;					// 切换LED灯状态
    			DelayMs(10);			// 延时消除按键按下的抖动
    			while(!Key1);			// 等待按键释放
    			DelayMs(10);			// 延时消除按键松开的抖动
    		}
    			
    		/* 亮度控制 */
    		if(LED==1)							// 如果LED是灭的
    		{
    			ManualControl();			// 则进行手动控制
    		}
    		else										// 如果LED是亮的
    		{
    			if(gTime<60000)
    			{
    				ret=Get_ADC0832();		// 获取AD采集结果(环境光照强度)
    				AutoControl(ret);			// 进行自动控制	
    				DelayMs(200);
    			}
    		}
    		
    		/*检测是否有人*/
    		if(Module==1)
    		{
    			gTime=0;										// 检测到有人,则把60秒计时清零
    		}
    		if(gTime>60000)								// 如果gTime的值超过了60000
    		{
    			gTime=60000;								// 则把gTime的值重新赋值为60000,避免过大溢出
    			gIndex=0;										// 如果1分钟检测不到有人,则把台灯熄灭
    		}
    	}
    }
    

    如需资料请关注公众号“单片机实例设计”,首页回复“台灯”获取资料;
    在这里插入图片描述

    展开全文
  • 单片机项目基于51单片机的超声波测距仪的设计说明.doc
  • 基于AT89S51单片机数字钟的设计.zip。本资源是 基于AT89S51单片机数字钟的设计,下载附件包含项目相关资源和汇编代码。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,049
精华内容 1,619
关键字:

基于51单片机的项目