STC89C52单片机可调速电机及呼吸灯(PWM)代码演示
目录
直流电机介绍
电机的驱动电路
PWM介绍
PWM重要参数
PWM的产生方法
代码演示
1,调速电机
2,呼吸灯
直流电机介绍
直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转
直流电机主要由永磁体(定子)、线圈(转子)和换向器组成
除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等
步进电机:构造上角度上有磁铁,可以精确到角度
舵机:控制方向的电机
无刷电机与空心杯电机:都是高速电机,但是空心杯电机更加的小巧,灵活
电机的驱动电路
这里的代码演示的是将电机一头接在VCC电源端口,另一端接在P1^0口
PWM介绍
PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域
PWM重要参数:
频率 = 1 / TS 占空比 = TON / TS 精度 = 占空比变化步距
PWM的产生方法
类似的应用还有我们手机上的呼吸灯,也是采用了PWM的技术,我们控制不同的占空比来实现灯的亮度不同,而要实现从亮到暗,那么就要在规定的时间内改变比较值的大小,从而使占空比也随时间的变化而变化。
代码演示
1,调速电机
主函数
#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Timer0.h"sbit Motor=P1^0;unsigned char Counter,Compare; //计数值和比较值,用于输出PWM
unsigned char KeyNum,Speed;void main()
{Timer0_Init();while(1){KeyNum=Key();if(KeyNum==1){Speed++;Speed%=5;if(Speed==0){Compare=0;} //设置比较值,改变PWM占空比if(Speed==1){Compare=40;}if(Speed==2){Compare=60;}if(Speed==3){Compare=80;}if(Speed==4){Compare=100;}}Nixie(1,Speed);}
}void Timer0_Routine() interrupt 1 //中断周期为100x100us=10ms
{TL0 = 0x9C; //设置定时初值TH0 = 0xFF; //设置定时初值Counter++;Counter%=100;//**计数值变化范围限制在0~99等价于if(Counter==100){Counter=0;}if(Counter<Compare) //计数值小于比较值{Motor=1; //输出1}else //计数值大于比较值{Motor=0; //输出0}
}
按键函数
unsigned char Key()
{unsigned char KeyNumber=0;if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}return KeyNumber;
}
定时器函数
void Timer0_Init(void)
{TMOD &= 0xF0; //设置定时器模式TMOD |= 0x01; //设置定时器模式TL0 = 0x9C; //设置定时初值TH0 = 0xFF; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0=1;EA=1;PT0=0;
}
数码管函数
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};void Nixie(unsigned char Location,Number)
{switch(Location) //位码输出{case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number]; //段码输出Delay(1); //显示一段时间P0=0x00; //段码清0,消影
}
Delay延时函数
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
2,呼吸灯
主函数
#include <REGX52.H>sbit LED=P2^0;void Delay(unsigned int t)
{while(t--);
}void main()
{unsigned char Time,i;while(1){for(Time=0;Time<100;Time++) //改变亮灭时间(比较值),由暗到亮{for(i=0;i<20;i++)//计次延时:让每一个亮度停留一段时间,不至于变化的太快{LED=0; //LED亮Delay(Time); //延时TimeLED=1; //LED灭Delay(100-Time); //延时100-Time,**保证周期恒定**,都是100}}for(Time=100;Time>0;Time--) //改变亮灭时间(比较值),由亮到暗{for(i=0;i<20;i++) //计次延时{LED=0; //LED亮Delay(Time); //延时TimeLED=1; //LED灭Delay(100-Time); //延时100-Time}}}
}
STC89C52单片机可调速电机及呼吸灯(PWM)代码演示相关推荐
- STC89C52单片机I2C通信以及AT24C02介绍使用代码演示
目录 AT24C02引脚介绍与使用 AT24C02介绍 I2C通信介绍 I2C通信时序 起始条件与终止条件 发送一个字节(主机发送到从机) 接受一个字节(从机发送到主机) 发送应答与接受应答 I2C ...
- 单片机蓝桥杯--LED呼吸灯
在CT107D单片机综合训练平台实现LED的基本控制和其他单片机开发平台不一样,不单单是控制几个LED实现跑马灯这么简单.因为在这个平台上要掌握74CH138译码器和74HC573锁存器的使用才能实现 ...
- 树莓派呼吸灯python代码
点灯 from machine import Pin import time LED = Pin(25,Pin.OUT) if __name__ == '__main__':while True:LE ...
- 【跟着江科大学Stm32】STM32F103C6T6_实现呼吸灯_代码
PWM.h #ifndef __PWM_H #define __PWM_Hvoid PWM_Init(); void PWM_SetCompare1(uint16_t Compare);#endif ...
- 安卓 呼吸灯效果--代码实现
android 三步代码创建呼吸灯效果 如图:这里介绍的是怎么完全用代码创建一个这样的效果; –bug及解决方式:类似于在不同选项卡的界面之间来回切换时,缩放动画的相对位置发生错乱(本来).解决办法是 ...
- 呼吸灯51单片机c语言编程,51单片机基于定时器实现呼吸灯(C8051F020单片机)
一.实现思路 原理:利用PWM信号控制LED灯的亮暗程度,实现LED灯由暗到亮又由亮到暗的渐变过程. 方法:通过定时器设置LED所接引脚的高低电平持续时间,模拟出PWM波. 二.关键问题--PWM的频 ...
- STC89C52单片机 使用定时器使LED灯闪烁
#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned ...
- 51单片机的仿真实验——交通灯(十字路口演示)
学习目标: 1.了解交通灯的基本工作原理: 2.用multisim模拟实现交通灯控制: 3.用Keil C51编程实现上述功能: 4.用Keil与multisim联调 学习内容: 通过AT89C51实 ...
- 【C51单片机学习笔记----DS18B20温度传感器LCD1602液晶屏直流电机调速与呼吸灯AD模数转换红外外部中断】
文章目录 一.DS18B20温度传感器 1.DS18B20温度传感器连接原理图 2.DS18B20温度传感器单总线通信时序 3.DS18B20温度传感器代码模块 二.LCD1602液晶屏 1.LCD1 ...
最新文章
- windows上使用image库
- 从Ecipse中导出程序至apk
- matlab之norm函数
- 【专升本计算机】甘肃省普通高等学校专升本考试计算机全真模拟试卷(一)
- 在XCode的一个项目中创建多个C/C++/Cpp文件并分别运行——创建多个target实现
- Linux FastDFS 分布式文件系统安装
- 如何使用camtasia制作网页视频调查问卷
- Ps 初学者教程,如何在图片中创建双重曝光效果?
- Django 403 CSRF token missing or incorrect.
- Shell 工具(cut)
- 宋宝华:Linux的任督二脉——进程调度和内存管理
- 个推科普漫画,解读《女心理师》中的智能语音识别系统
- diy高性能存储服务器,存储服务器 diy
- 《互联网的那些事之时代》第二回:春江潮水连海平,海上明月共潮生
- JAVA中的flush()方法
- (后续更新)【微信小程序】毕业设计 租房小程序开发实战,零基础开发房屋租赁系统小程序
- 并发策略-CAS算法
- 使众人行:如何带领一群人把事做成?
- 鲲鹏cpu支持linux,首款国产CAD适配统一操作系统UOS:兼容鲲鹏、兆芯、龙芯等国产CPU...
- SAP ABAP ME23N标准采购订单打印输出配置开发