2016-09-23 13:09:09 qq_33869658 阅读数 56189

        这是我大二做某实验室管理员,为了方便自己管理整理,都是一些51单片机的小作品,适合给刚学完51单片机的新手练手!

一目录

1基于51单片机的火灾温度烟雾报警器

2基于51单片机的声光电子琴

3基于51单片机的音乐喷泉

4基于51单片机的智能温控风扇

5基于51单片机的超声波测距

6基于51单片机的无线温湿度控制系统设计

7基于51单片机脉搏心率计

8.基于51单片机led音乐频谱

9.基于51单片机的智能充电器

10.基于51单片机的贪吃蛇游戏

11.基于51单片机的电子秤

12.基于51单片机的视力保护器

13.基于51单片机防人水位检测报警系统

14.基于51单片机的声光控制器设计

15.基于51单片机的红外计数器

16.基于51单片机的自行车码表设计

17.基于51单片机的计算器的设计

18.基于51单片机的酒精浓度测试仪设计

19.基于51单片机的智能台灯设计

20.基于51单片机的卫星定位

21.基于51单片机防尘PM2.5灰尘设计

22.基于51单片机的无线音乐门铃

23基于51单片机的短信收发控制器

24.基于51单片机的智能插座定时开关设计

25.基于51单片机的4*4*4单片机的光立方设计


二.作品参考图

1基于51单片机的火灾温度烟雾报警器



2基于51单片机的声光电子琴



3基于51单片机的音乐喷泉



4基于51单片机的智能温控风扇



5基于51单片机的超声波测距



6基于51单片机的无线温湿度控制系统设计


7基于51单片机脉搏心率计


8.基于51单片机led音乐频谱


9.基于51单片机的智能充电器


10.基于51单片机的贪吃蛇游戏


11.基于51单片机的电子秤


12.基于51单片机的视力保护器


13.基于51单片机防人水位检测报警系统


14.基于51单片机的声光控制器设计


15.基于51单片机的红外计数器


16.基于51单片机的自行车码表设计


17.基于51单片机的计算器的设计


18.基于51单片机的酒精浓度测试仪设计


19.基于51单片机的智能台灯设计


20.基于51单片机的卫星定位


21.基于51单片机防尘PM2.5灰尘设计


22.基于51单片机的无线音乐门铃


23基于51单片机的短信收发控制器



24.基于51单片机的智能插座定时开关设计



25.基于51单片机的4*4*4单片机的光立方设计












2019-06-04 13:01:57 weixin_44283571 阅读数 386

之前心血来潮花了近一个月制作了一台WiFi小车,功能不复杂主要是实现小车的前进后退与左右转弯。
小车主要组成有四大部分:
1. 51单片机
2.电机驱动模块
3.wifi模块
4.车身主体
51单片机只要用51单片机最小系统即可,可以自己制作也可以上淘宝买现成的零部件。
电机驱动模块主要是用于给电机供给稳定的电压,同时电机也是通过驱动模块与51单片机相连,进而能通过51单片机控制电机的正转与反转。我用的电机模块为L298N,下图为L298N模块的详解在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其中“单片机IO控制输入”便是用于电机驱动模块与单片机相连的的接口,接口IN1与IN2用于控制马达A,IN3与IN4用于控制马达B。

wifi模块我用的是ESP8266-CH-340,这块板对于第一次使用wifi模块的新手来说极其友好,首先买回来即可使用不用刷固件,其次这块板即可3.3v供电正常工作也可以5v供电正常工作,而可以5v正常工作也就意味着在于单片机(单片机也是5v正常工作)进行通信的时候就不用进行电平转换也可以进行通信。

顺带说一下关于电平转换,数字电路,电平就是电位的高低,用0和1表示。在计算机或者其他微处理器内部只能识别0和1这两个数字信号,不同的系统电平表示的0和1实际的电位并不相同。例如,高电平常用3.3V,5V,12V,低电平常用0,当不同的系统进行连接通信控制时,就要进行电平转换。打个比方,单片机的高电位为5v,而电脑的串口电平为12V,要实现电脑到单片机通信就必须将电脑的12V转到单片机的5V,反之,5V转到12V。

在这里插入图片描述
车身主体就由底盘与直流减速电机组成。

设计构想图:
设计构想图
详细图:
在这里插入图片描述
单片机与电机驱动模块相连原理图:在这里插入图片描述
单片机与wifi模块相连图解:
在这里插入图片描述
(如果单片机与WiFi模块工作电压都为5V则不需要串口电平转换模块,可直接相连TXD与RXD)
需要注意的问题:
三个模块需要共地,如果不共地那么单片机与WiFi模块将不能进行通信。
WiFi模块的使用需要用到AT指令进行配置,使用起来也不难可自行上网查询,详细教程可上B站找“叁仪电子”这位阿普主的视频。
最后附上照片两张:
在这里插入图片描述
在这里插入图片描述
代码

#include <reg52.h>
#define RunLed P1                  
#define ShowPort P2               
#define uchar unsigned char 
sbit M1A=P0^0;   //位定义电机1正
sbit M1B=P0^1;   //位定义电机1负
sbit M2A=P0^2;   //位定义电机2正
sbit M2B=P0^3;   //位定义电机2负
void tingzhi()   //停止
{
   M1A=0;                                   
   M1B=0;                                  
   M2A=0;                                 
   M2B=0;
}
void qianjin()    //前进
{
   M1A=1;                                   
   M1B=0;                                   
   M2A=1;                                   
   M2B=0;
}
void houtui()    //后退
{
   M1A=0;                                   
   M1B=1;                                   
   M2A=0;                                   
   M2B=1;
}
void youzhuan()  //右转
{
   M1A=0;                                   
   M1B=1;                                   
   M2A=1;                                   
   M2B=0;
}
void zuozhuan()   //左转
{
   M1A=1;                                   
   M1B=0;                                   
   M2A=0;                                   
   M2B=1;
}
void delay(int i)    //延时函数
{
 int j,k;
 for(j=0;j<i;j++)
 for(k=0;k<j;k++);
}
void ms_delay(int t)   //延时ms函数
{  
 int k,j;  
 for(k=t;k>0;k--)   
 for(j=110;j>0;j--); 
} 
void init_serial()    //串口初始化,设置波特率115200
{
 TMOD=0x20;  
    TH1=0xFF;           
    TL1=0xFD; 
 SCON=0x50;   
    RCAP2H=0xFF;   
    RCAP2L=0xFD; 
 TCLK=1;   
 RCLK=1;   
    C_T2=0;   
    EXEN2=0;  
    TR2=1 ;
 TI=0; 
}
void Send_Uart(uchar value)  //单片机数据发送
{
 ES=0;       //串口中断关闭
 TI=0;       
 SBUF=value;     //将数据放入串口寄存器中
 while(TI==0);   
 TI=0;  
 ES=1;   
} 
void ESP8266_Set(uchar *puf)     // WIFI模块接收到单片机的AT指令          
{    
 while(*puf!='\0')    
 {   
  Send_Uart(*puf);     
  ms_delay(50);  
  puf++; 
  delay(50);   
 }   
 delay(500);  
}
void ControlCar(unsigned char ConType)    //选择小车运行的模式
{
 tingzhi();
 switch(ConType)                       
 {
  case 1:                          
  { 
   tingzhi();      
   //delay(240);
   qianjin();
   delay(240);
   break;
  }
  case 2: //后退                              
  { 
   tingzhi();       
   //delay(240);
   houtui(); 
   delay(240);
   break;
  }
  case 3: //左转                              
  { 
   tingzhi();        
   // delay(240);
   zuozhuan();                              
   delay(240);
   break;
  }
  case 4:                              
  { 
   tingzhi();        
   //delay(240);
   youzhuan();                               
   delay(240);
   break;
  }
  case 0: //停止                          
  {
   tingzhi();
   break;                               
  }
 }
}
void ComBreak() interrupt 4     //中断函数,单片机判断串口接收到的数据   
{
 unsigned char RecvData;          
 if(RI==1)                        
 { 
  RecvData=SBUF;          //从串口寄存器中读取数据        
  if(RecvData=='T')                
  {
   ControlCar(0);
  }
  if(RecvData=='S')              
  {
   ControlCar(1);
  }
  if(RecvData=='X')              
  {
   ControlCar(2);
  }
  if(RecvData=='Z')              
  {
   ControlCar(3);
  }
  if(RecvData=='Y')              
  {
   ControlCar(4);
  }
 
  //SBUF=RecvData;                 
  RI=0;        //把RI至0                    
 }
 if(TI==1)     //把TI至0              
 {
  TI=0;                      
 }
}
void main()     
{
 init_serial();            //串口初始化           
 ES=1;                     //串口中断打开       
 REN=1;                    //单片机接收允许位        
 EA=1;         //总中断打开
 delay(240);
   
 ESP8266_Set("AT+CWMODE_CUR=2\r\n"); //AP模式
    ESP8266_Set("AT+CIPMUX=1\r\n");
    ESP8266_Set("AT+CIPSERVER=1,8080\r\n");  
                      
 while(1)                          
 {                 
 }
}

2019-02-19 20:16:18 qq_41676952 阅读数 2351

基于51单片机的无线遥控器制作

资源链接:https://download.csdn.net/download/qq_41676952/10965512
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。小到电话,玩具,手机,各类刷卡机,电脑键盘,彩电,冰箱,空调,电磁炉,大到汽车,工业自动控制,机器人,导弹导航装置,甚至是美国的火星车,这些设备里面都含有一个或者多个单片机 。单片机的数量不仅远超过PC机,甚至比人类的数量还要多。因此,单片机的学习、开发与应用将造就一大批软硬件工程师。
单片机是一种控制芯片,一个微型的计算机,加上晶振,存储器,地址锁存器,逻辑门,显示器,按钮,扩展芯片,接口等构成单片机系统
本文用最简单最基础的51单片机向读者展示制作无限遥控器的制作。51单片机内部具有一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
本文就是利用51单片机内部UART功能和蓝牙模块实现单片机之间的无限遥控;主要通过编程用于控制其他单片机或微机系统;例如可以用来遥控另外一款单片机控制的模型车的运动(遥控车);控制单片机开发板上LED灯的亮灭等;
准备过程
知识上:会简单的C语言,知道51单片机的基本结构即可。
材料:51单片机(STC89C52),蓝牙模块,洞洞板,焊锡丝,电池,导线,按键开关,铜柱,电容电阻,晶振
工具:电烙铁,镊子
在这里插入图片描述

原理图:分为三个部分,分别为电源模块,蓝牙模块,MCU系统控制模块;
电源模块:为整个系统提供电能
蓝牙模块:实现无线化传输信号
MCU系统控制模块:实现整个系统的控制
在这里插入图片描述

制作过程:
首先是最小系统的制作:
在这里插入图片描述
在这里插入图片描述

然后就是按键的焊接,
在这里插入图片描述
在这里插入图片描述
接着将以上两部分连接
在这里插入图片描述
在这里插入图片描述
接着是电源模块:由两块3.8V电池串联而成,再经过稳压电路将其转化为5V,为整个系统供电;

在这里插入图片描述

插上蓝牙模块, 制作完成在这里插入图片描述
使用说明:按下左边四个接受方会分别接收到字符 ’1’ ’2’ ’3’ ’4’ , 按下右边四个接受方会分别接收到字符 ’5’ ’6’ ’7’ ’8’ ,
测试:用蓝牙串口助手连接遥控器上的蓝牙,通过按下不同的按键,手机会接收到不同的字符
在这里插入图片描述
在这里插入图片描述
资源链接:https://download.csdn.net/download/qq_41676952/10965512

2017-09-06 13:06:54 mcuwangzai 阅读数 19413

这篇博客就来分享一下51单片机最小系统的制作以及怎么下载程序微笑


首先准备的材料有:一块板子,一块89c51/52的芯片,一个51芯片插座,12MHZ的晶振,一个10的电阻,一个10uf的电解电容

两个20-33pf的瓷片电容,线若干,小开关一个


电路图如下:



那个小开关就是复位开关,制作好了大家可以下载一个小程序看看。。。。。。鄙视






最小系统制作非常容易,但是我下载程序时都是先把程序放到开发板上烧好在插入底座中,但是一般的底座由于结构问题,和51单片机芯片针脚太软了,多插几次容易就断掉,所以接下来我就来分享一下怎么不把芯片拔出来就可以任意烧程序(当然有usb转串口就忽视这个方法偷笑


首先把开发板的芯片拔下来,把自己焊的最小系统的VCC,GND,P3^0,P3^1对照接到开发板上:




这样就可以直接烧程序了.....................可怜

2018-11-13 20:48:07 NadLydia 阅读数 1817

基本要求:
1.基于51单片机用LCD1602实现分-秒计时。
2.按键控制分-秒的调整。
3.能实现整时报时的功能(蜂鸣器响)。
4.了解下载模块、下载原理。
5.PCB板的绘制及焊接(包括下载模块)。
6.设计思路以及实现原理。
7.收获及以后的学习计划。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
关于此次的任务,首先我们要了解一下LCD1602的一些知识以及51单片机中的定时器功能,以下是我个人在写程序时用到的知识点。

LCD1602

  1. 引脚说明
    1—VSS—GND
    2—VDD—VCC
    3—V0—LCD偏压输入
    4—RS—数据/命令选择端(H/L)
    5—R/W—读写控制信号(H/L)
    6—E—使能信号
    7—D0—Data I/0
    8—D1—Data I/0
    9—D2—Data I/0
    10—D3—Data I/0
    11—D4—Data I/0
    12—D5—Data I/0
    13—D6—Data I/0
    14—D7—Data I/0
    15—BLK—背光源负极
    16—BLA—背光源正极

  2. 基本操作时序:
    1.读状态:输入:RS=L,RW=H,E=H; 输出:D0~7=状态字
    2.写指令:输入:RS=L,RW=L,D0~7=指令码,E=高脉冲;输出:无
    3.读数据:输入:RS=H,RW=H,E=H;输出:D0~7=数据
    4.写数据:输入:RS=H,RW=L,D0~7=数据,E=高脉冲;输出:无

  3. 显示模式:
    1.LCD上有两行显示,第一行从0x80开始显示光标,第二行从0x80+0x40位开始显示光标。
    2.LCD上的数据是以ASCⅡ码的形式显示的,故在写数据时要加上0x30。

51单片机的定时器
51单片机中的定时或计数器是根据机器内部的时钟或是外部的脉冲信号对寄存器中的数据加1。
初始化程序完成以下工作:
1.对TMOD赋值,以确定T0和T1的工作方式;
2.计算初值,并将其写入TH0、TL0或TH1、TL1;(即定时器的起点,终点到65536,65536-50000即为50ms)
3.中断方式时,则对EA赋值,开放定时器中断;
4.使TR0或TR1置位,启动定时器定时。
由于不会自动装载初值,故进入中断后要设置初值。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
代码

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
	
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
sbit beep=P1^5;
sbit key1=P3^2;
sbit key2=P3^3;
uchar k=0,t=0,s=0,shi=0,ge=0,f,w=1;
void delay(uint c)    //延时50um
{ 
	uint a,b;
	for(a=c;a>0;a--)
	for(b=19;b>0;b--);
}

void lcd_mang()   //判忙
{
	RS=0;
	RW=1;
	E=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	while(P0&0x80);//结果是1,死循环;结果是0,不忙
	E=0;
}
void w_lcd(uchar com,uchar i)   // when i=0, write command;when i=1,write number.
{
	E=0;
	RS=i;
	RW=0;
	delay(2);
	P0=com;
	delay(5);
	E=1;       //1:read the info  0:do the command
	delay(10);
	E=0;
}

void init()   //restart 初始化
{
	delay(300);
	w_lcd(0x38,0);
	delay(100);
	w_lcd(0x38,0);
	delay(100);
	w_lcd(0x38,0);
	w_lcd(0x38,0);
	w_lcd(0x08,0);
	w_lcd(0x01,0);  //clear
	w_lcd(0x06,0);  //point to the next
	w_lcd(0x0C,0);  //show open & pointer 
	TMOD=0x01;
	TH0=(65536-50000)/256;  // get the integer part    in order to get the initial value 50ms
	TL0=(65536-50000)%256;  // get the remainder part
	EA=1;                   //turn on the general intrup switch
	ET0=1;                  //turn on timer intrup
	TR0=1;  	          //start timer 0
	EX0=1;     //开外部中断0
	IT0=0;     //低电平触发
	EX1=1;     //开外部中断1
	IT1=0;     //低电平触发
}

void w_sg(uchar add,uchar x)
{
	ge=x%10;
	shi=x/10;
	w_lcd(0x80+add,0);    
	w_lcd(0x30+shi,1);
	w_lcd(0x80+add+1,0);    
	w_lcd(0x30+ge,1);
}

void timer0 () interrupt 1
{
	TH0=(65536-50000)/256;  
	TL0=(65536-50000)%256;   //重装载值50ms
  k++;

}

void int0 () interrupt 0   //按键1控制分加1
{
	if(key1==0)
	{
		delay(500);
		if(key1==0)
		{
			s=s+1;
			if(s>=60)        ////分为50以上时 加1回到个位
			{
				s=s-60;
			}
		}
	}
	while(!key1);
}

void int1 () interrupt 2   //按键2控制秒加10
{
		if(key2==0)
	{
		delay(500);
		if(key2==0)
		{
			t=t+10;
		if(t>=60)          //秒为50以上时 加10回到个位
			{
				t=t-60;
				s++;
			}
		}
	}
	while(!key2);
}

void xianshi()
{
	if(k==20)
	{
			k=0;
			t++;
    if(t>=60)
		{
			f=1;    //f=1时蜂鸣器响
			while(f==1)
		{
			while(1)
			{
				for(w=0;w<100;w++)
				{
					beep=~beep;
					delay(5);
				}
				f=0;
				if(f==0)
				break;
			}
			beep=1;
		}
			t=0;
			s++;
			if(s>=60)
			{
				s=0;
			}
		}
	}
	  lcd_mang();
		w_sg(6,s);          //显示分
    w_lcd(0x80+8,0);    //显示 “:”
	  w_lcd(0x3A,1);
		w_sg(9,t);          //显示秒
}

void main()
{
  init();  //lcd初始化以及开定时器
//	int0_(); //中断 按键
	while(1)
	{
	  xianshi();

	}
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
个人遇到的问题总结
1.在写代码时,一开始采用数组的方式来分别改变分秒的个位和十位数字,但是变量太多比较麻烦。后来采用取整部(a/10)对应十位和取余部(a%10)对应个位的方法来得出秒值(0<=a<60),每秒a加一。分同理。
2.对于蜂鸣器不响的问题,采用多次取反延时,以此给蜂鸣器一个相对稳定的脉冲。具体见蜂鸣器:https://baike.baidu.com/item/蜂鸣器/3326617
3.DXP中,一开始尝试自己建库,画了一个之后感觉太麻烦了而且时间来不及就放弃了,直接使用了老师的库和软件中原有的库,这也就导致了焊好板后发现电位器的接线是错误的,封装和实物的引脚并没有对应,所以下次最好还是要自己建库,并在接入元器件时要了解其工作原理和元器件的好坏。
4.在PCB中,第一次布局布线的时候感觉很麻烦;第二次尝试先在纸上画出布线方式并按照各个模块来分布,比第一次要方便;第三次布局时,先将各板块置于与单片机对应的引脚附近,将VCC和GND部分线路尽量放在外围,这样尽量避免了交叉线的出现,布线时,发现所有的VCC和GND都要连通,所以先将VCC、GND分别接好,各板块的布线遇到线路的阻挡时,可以点中该引脚查看是否有其他高亮的引脚将其接入电路中。
5.PCB板中,要注意线不能太细,焊盘不能太小,否则洗出来的板子会不能用。在印板子时,由于我们这次画的是单面板,所以复印时不能用镜像,在复印之前一定要仔细想想,不能操之过急。
6.布局时要想想是否合理,会不会出现电源口处插不了电源线的问题,LCD会不会插不上去,电位器怎么放合理…
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
不足之处
本次任务实际上并没有达到要求,并且还是太过于依赖已存在的,缺少思考过程,有一种只是为了完成任务的感觉,而且时间分配不合理。

没有更多推荐了,返回首页