基于51单片机的红外摇头小风扇

您所在的位置:网站首页 用51单片机实现红外遥控灯亮 基于51单片机的红外摇头小风扇

基于51单片机的红外摇头小风扇

2024-07-15 15:21| 来源: 网络整理| 查看: 265

文章目录 实验准备硬件原理及实现舵机控制原理程序设计 直流电机转速控制原理程序设计 NEC红外解码原理程序设计 蜂鸣器短暂发声原理程序设计 红外摇头小风扇程序实物效果图实验心得

实验准备

本实验基于51单片机控制小风扇,在软件keil5上编写程序。需要使用到的元件有51单片机、直流电机、舵机、红外遥控器、杜邦线、蜂鸣器、数码管。需要完成NEC红外遥控器解码、舵机转动控制、电机转速控制、蜂鸣器发声四部分程序的编写,最后将这四部分合并再将相应元件组装,完成一个基于51单片机的红外摇头小风扇的设计。同时能够在数码管显示直流电机转速的档位,一个有0~10这一个档位,0就是停止,10最大。

硬件原理及实现 舵机控制 原理

舵机是由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。通过发送信号,指定输出轴旋转角度。舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:0.5ms--------------0度; 1.0ms------------45度;1.5ms------------90度;2.0ms-----------135度; 2.5ms-----------180度。舵机上有三根线,红黄褐三种颜色,褐色线为舵机信号线,通过给信息线提供不同的电信号来控制舵机转过不同的角度。 舵机的PWM信号频率改变一定要有延时,要给舵机足够的时间转到指定的角度后才能改变PWM频率。

程序设计

使用51单片机的定时器2控制中断

#include int flag=0; sbit pwm1=P1^1; sbit key1=P3^2;//开关1引脚 unsigned int value[]={6,11,16,21,16,11};//误差原因,6-0°,11-45°,16-90°,21-135°,26-180° unsigned int percent = 0;//0.1ms次数标识 int k=0,count=0; void Timer0Initial() { T2L = 0xAE; T2H = 0xFB; } //定时0.1ms,11.0592MHz,0.01%的误差 void initial_Timer() { AUXR |= 0x04; //设置1T模式 Timer0Initial(); AUXR |= 0x10;//定时器2开始计时 IE2 |=0x04; //允许定时器2中断 EA = 1; //打开总中断 } void delay(unsigned int x) { unsigned int i,j; for(i = 0;i0 ; --j) ; }//延时函数,1ms void keyscan()//按键扫描函数 { if(key1 == 0) { delay(3);//按键消抖,延时消抖 if(key1 == 0) { while(!key1);//按键放开 flag=!flag; } } } void initial() { key1 = 1; initial_Timer(); }//初始化 void Timer0() interrupt 12 //定时器2 { if(flag==1){//若打开开关 percent += 1;//设置周期 if(percent == 200) { count++; percent = 0; pwm1 = 1; }//产生低电平,当达到20ms时,进入下个周期,重新产生蹈叩缙? if(percent == value[k]) { pwm1 = 0; }//产生高电平,当时间达到时,变为低电平 if(count==20){ count=0; k++; if(k==6)k=0; }//,13ms/60°,延时,给舵机时间转动到指定的角度 } Timer0Initial(); } void main() { initial(); while(1) { keyscan(); delay(10); } } 直流电机转速控制 原理

在PWM驱动控制的调整系统中,按一个固定的频率来接通和断开电源,并且根据需要改变一个周期内“接通”和“断开”时间的长短。通过改变直流电机电枢上电压的“占空比”来达到改变平均电压大小的目的,从而来控制电动机的转速。 如图1所示: 图1 PWM信号的占空比 图1 PWM信号的占空比

设电机始终接通电源时,电机转速最大为Vmax,设占空比为D= t1 / T,则电机的平均速度为Va = Vmax * D,其中Va指的是电机的平均速度;Vmax 是指电机在全通电时的最大速度;D = t1 / T是指占空比。由上面的公式可见,当我们改变占空比D=t1/T时,就可以得到不同的电机平均速度Vd,从而达到调速的目的。严格来说,平均速度Vd与占空比D并非严格的线性关系,但是在一般的应用中,我们可以将其近似的看成是线性关系。所以,我们通过改变高电平持续的时间来进行直流电机调速。

程序设计

使用51单片机的定时器0来控制中断

#include sbit Key1=P3 ^ 2; //风扇减速 sbit Key2=P3 ^ 3; //风扇加速 sbit Key3=P1 ^ 7; //风扇停止或者开始 sbit pwm1=P4^1; sbit pwm2=P4^2; bit fflag=0;//风扇转动标志位 int speed = 50,count = 0; /****************延时处理**********************/ void Delay( unsigned int xms ) { unsigned char i; for( ; xms > 0; xms-- ) for( i = 114; i > 0; i-- ) { ; } } /****************初始化**********************/ void init(){ P4M0=0x06; P4M1=0x00;//设置P4.1,P4.2为推挽输出 pwm1=0; pwm2=0; AUXR |= 0x80; //定时器时钟1T模式 TMOD = 0x01; //设置定时器模式,16位自动重装载 TL0 = (65536-1000)%256; TH0 = (65536-1000)/256; TF0=0; TR0=1;//定时器0开始计时 ET0=1;//打开定时器0中断 EA=1;//打开总中断 } /************按键处理函数***************/ void keys(){ if(Key3==0){ Delay(10); if(Key3==0){ fflag=~fflag; } while(!Key3); } if(Key1==0){ Delay(10); if(Key1==0){ speed-=5; if(speed=100)speed=100; } while(!Key2); } } /***********中断处理函数**********/ void timer0()interrupt 1 { TR0 = 0; TL0 = (65536-1000)%256; TH0 = (65536-1000)/256; TR0 = 1; if(fflag==1){ count++; if(count>100){ count=0; } if(count0;i--) for(j=110;j>0;j--); } /********** 系统初始化 ********/ void sysinit() { // 初始化定时器 TMOD |= 0x20; // 设置定时器1位工作方式2 (0~255) TH1 = 0x00; // 赋初值 TL1 = 0x00; 256*(1/12m)*12=0.256ms TR1 = 1; // 启动定时器1 ET1 = 1; // 使能定时器1 // 初始化外部中断2 INT_CLKO |= 0x10;//开INT2; EA = 1; // 开总中断 } /********* LED灯初始化 **********/ void IOinit(){ P0M0=0xff; P0M1=0x00; P2M1=0x00; P2M0=0x08; led_sel=1; P0=0x00; } /************ 转换编码 *************/ void changecode() { uchar k = 1; uchar i,j; uchar value; if(ir_rc_ok ==1) // 如果ir接受完成就进行转码 { for(i=0;i1; // if(irdata[k]>6&&irdata[k]32&&irtime 0; xms-- ) for( i = 114; i > 0; i-- ) { ; } } /*---------蜂鸣器发声函数--------*/ void beeps(){ for(xb=0;xb


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3