[51单片机] 以PWM控制直流电机为例建一个简单的51工程框架
目录
1)功能概述
名称:独立按键控制直流电机调速
内容:对应的电机接口需用杜邦线连接到uln2003电机控制端;
使用5V-12V 小功率电机皆可 2个按键分别加速和减速;
采用8个8段数码管的后两位显示0~10级速度;

2)引脚连接
P3连接按键;P0连接8x八段数码管,P22段码锁存,P23位码锁存;P1.1连接ULN2003的一个输入;直流电机端连接ULN2003对应的输出,另一端连接VCC。
3)框架介绍
本文主要目的不是介绍如何实现功能,而是如何做一种方便复用和理解的框架。如下图左USER文件中的文件属于最高层(离用户最近);FUNC文件夹中的文件属于功能层(用户层文件可以调用功能层实现的各种功能,同时功能层内部也有少量的相互调用);INTE文件夹主要是中断层(本来想把中断单独拿出来,但是中断子程序和用户层交叉太多,所以仅在这里实现中断初始化函数,中断子程序依然放在main.c文件中)

注:注意main.c中的引用!(因为在keil里的文件夹和外部并没有直接对应关系,外部是我手动建的)
4)模块说明
--> 4.1 delay说明:对外提供两个延时函数(在I2C、按键消抖等地方要用到)
#include<reg52.h> void DelayUs2x(unsigned char t);//us级延时函数声明
void DelayMs(unsigned char t); //ms级延时
--> 4.2 key8说明:对外提供按键扫描函数,如果有按键按下则返回对应的键值(这是8按键的,不是4x4的)
#include<reg52.h> #define KeyPort P3 unsigned char KeyScan(void);//按键扫描函数,返回扫描键值
应用示例:如下KeyScan()被调用来检测按键实现按键控制功能~

--> 4.3 led8说明:对外提供在8x八段数码管显示功能(这里要做特殊处理)
#include<reg52.h> #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^;//定义锁存使能端口 段锁存
sbit LATCH2=P2^;// 位锁存 void Display(unsigned char FirstBit,unsigned char Num);
应用示例:如下把要显示的2位的整数PWN_ON显示在8X八段数码管上。在1的地方要分别取PWN_ON的十位和个位然后通过DuanMa转换为相应的数码管灯的显示数值;然后在中断或具有频繁周期刷新的函数体内调用display函数进行显示(display的第一个参数是选择8x八段数码管的第几位开始显示,0表示从第1位开始;第二个参数是说明要显示几位)

特别注意:这里的display(6,2)意思是把一个两位整数显示在8个数码管的后两个上,而给TempData赋值并不是TempData[6]和TempData[7]!
5)复用规则
今后便可采用相同的方法不断扩充FUNC层,当遇到具体问题可以在main和中断中做调整。
6)工程链接
https://github.com/beautifulzzzz/stc89c51-or-stc89c52

[51单片机] 以PWM控制直流电机为例建一个简单的51工程框架的更多相关文章
- 51单片机—使用PWM对直流电机调速
文章目录 - 什么是PWM - PWM是怎么对直流电机进行调速的 - 通过定时器中断实现PWM调速 - 上代码 - 什么是PWM PWM(脉宽调制),是靠改变脉冲宽度来控制输出电压,通过改变周期来控制 ...
- 51单片机 | 模拟PWM调制控制实验
———————————————————————————————————————————— PWM(脉冲宽度调制) 对模拟信号电平进行数字编码的方法 - - - - - - - - - - - - - ...
- 51单片机-独立按键控制led矩阵的左移和右移
51单片机学习 独立按键 控制led灯光矩阵的左移和右移 开发板采用的是普中的A2学习开发板,具体的代码如下: typedef unsigned int u16; void delay(u16 tim ...
- python:什么是单例?一个简单的单例
单例:即一个类只能生成唯一的一个实例,python中的类如果没有被实例化,则cls._instance为None 如下: class Singleton(object): def __new__(cl ...
- [51单片机] 以从0开始做4位8段共阴数码管3461AS驱动谈细节决定高质量DIY
目录 1)问题产生 2)失败尝试 3)最终方案 4)使用方法 5)知识共享 1)问题产生 在上一篇“以PWM控制直流电机为例建一个简单的51工程框架”中已向大家介绍了一个封装好的8位8段数码管的驱动( ...
- STM32F103定时器输出PWM波控制直流电机
这个暑假没有回家,在学校准备九月份的电子设计竞赛.今天想给大家分享一下STM32高级定时器输出PWM波驱动直流电机的问题.. 要想用定时器输出的PWM控制直流电机,,首先要理解“通道”的概念..一个定 ...
- 51单片机学习笔记(清翔版)(13)——LED点阵、74HC595
如图3,点阵屏分单色和彩色,点阵屏是由许多点组成的,在一个点上,只有一颗一种颜色的灯珠,这就是单色点阵屏,彩色的在一个点上有三颗灯珠,分别是RGB三原色. 图4你可能没看出来,那么大块黄色的就是点阵屏 ...
- Altium Designer16绘制51单片机的一些经验总结
制作这块51单片机的还是蛮艰辛的,应该是我水平太差,现在这块51板已经稳定了,也把这块板子制作过程中的一些问题及经验总结记录下来.这块板子制作出了很大问题很大原因是因为我对Altium Designe ...
- 51单片机 小车 L298N pwm调速 串口控制 按键控制
难点:1.串口定时器T1,和T0定时器优先级 2.pwm频率与占空比的设置 按键控制 按键1——前进 按键2——后退 按键3——加速 按键4——减速 (板子上只有四个按键) 串口控制 ‘1’——前进 ...
随机推荐
- [09]APUE:进程关系
[a] getpgid / setpgid #include <unistd.h> pid_t getpgid(pid_t pid) //成功返回进程组 ID,出错返回 -1 int se ...
- freeCodeCamp:Chunky Monkey
猴子吃香蕉可是掰成好几段来吃哦! 把一个数组arr按照指定的数组大小size分割成若干个数组块. 例如:chunk([1,2,3,4],2)=[[1,2],[3,4]]; chunk([1,2,3,4 ...
- GDI+ 发生一般性错误解决办法
错误的代码g对象继续占用 未释放资源 如果路径不一样 没问题 相同路径 获取图片进行 缩略会造成GDI错误 /// <summary> /// 生成缩略图 /// </summary ...
- Jquery给input[type=radio] 控件赋值
setobject: function (data, scope, win) { //data jsoon数据, scope,一般为form的id,win 窗口对象,如果在当前window win=n ...
- Nodejs在centos下的安装
新学了nodejs,发现在centos下面安装的时候,与windows有一些不同的地方,以前习惯在安装不上的时候,去百度出来,解决了以后,当时都记住如何解决的了,但是过了一段时间以后,就全都忘记光了, ...
- jquery中的cookie
关于cookie,一直是个很敏感的问题,以前对于cookie的处理,都是用原生的方式处理,创建函数对cookie进行处理,创建,设置以及删除.. function setCookie(key,valu ...
- POJ 2096 Collecting Bugs (概率DP)
题意:给定 n 类bug,和 s 个子系统,每天可以找出一个bug,求找出 n 类型的bug,并且 s 个都至少有一个的期望是多少. 析:应该是一个很简单的概率DP,dp[i][j] 表示已经从 j ...
- CentOS添加用户及赋予sudo权限
在CentOS下添加一个用户假设用户名:username 密码:userpwd 新建用户: adduser username 修改密码: passwd username 根据提示重复输入两遍userp ...
- Eclipse JAVA项目的 目录结构 和 导入
说明:本文所有测试以java工程为例: 1. Eclipse下的java工程目录 eclipse的基本工程目录叫做workspace,每个运行时的eclipse实例只能对应一个workspace,也就 ...
- 部署额外域控制器,Active Directory
部署额外域控制器 转自:http://yuelei.blog.51cto.com/202879/117599 如果域中只有一台域控制器,一旦出现物理故障,我们即使可以从备份还原AD,也要付出停机等 ...