历史上的今天
今天是:2025年02月08日(星期六)
2020年02月08日 | 基于51单片机的pwm直流电机调速
2020-02-08 来源:51hei
仿真原理图如下

单片机源程序如下:
#include /********************************************* * 定时器初值 *********************************************/ #define T0HIGH 0xec #define T0LOWW 0x8a /********************************************* * *********************************************/ typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; typedef bit BOOL; /********************************************* * 单片机管脚定义 *********************************************/ sbit KEY_ON_PIN = P2^0; sbit KEY_INC_PIN = P2^1; sbit KEY_DEC_PIN = P2^2; sbit MOTO_LEFT = P3^6; sbit MOTO_RIGHT = P3^7; /********************************************* * 按键定义 *********************************************/ #define KEY_NULL 0xff #define KEY_LONG_PERIOD 25 #define KEY_CONTINUE_PERIOD 20 #define KEY_DOWN 0x80 #define KEY_CONTINUE 0x40 #define KEY_UP 0x20 #define KEY_STATE_INIT 0 #define KEY_STATE_WOBBLE 1 #define KEY_STATE_PRESS 2 #define KEY_STATE_LONG 3 #define KEY_STATE_CONTINUE 4 #define KEY_STATE_RELEASE 5 #define KEY_ON_VALUE 1 #define KEY_INC_VALUE 2 #define KEY_DEC_VALUE 3 #define KEY_ON (KEY_ON_VALUE | KEY_DOWN) #define KEY_INC (KEY_INC_VALUE | KEY_DOWN) #define KEY_INC_CON (KEY_INC_VALUE | KEY_CONTINUE) #define KEY_DEC (KEY_DEC_VALUE | KEY_DOWN) #define KEY_DEC_CON (KEY_DEC_VALUE | KEY_CONTINUE) /********************************************* * 常量定义 *********************************************/ #define true 1 #define false 0 #define MOTO_ON MOTO_LEFT = false; MOTO_RIGHT = true #define MOTO_OFF MOTO_LEFT = true; MOTO_RIGHT = true /********************************************* * 全局变量定义 *********************************************/ code u8 DisCode[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xff}; u8 PWMpercent = 0; u8 DisNum[4] = {0x0a, 0x0a, 0x0a, 0x00}; u8 DisPosition = 0; u8 SecCount = 0; u8 u10msNum = 0; BOOL b10msEvent = false; BOOL b100msEvent = false; BOOL b1secEvent = false; BOOL MotoStart = false; BOOL MotoRun = false; void Key_Prosess(void); void Dynamic_Display(void); void Speed_Display(void); /********************************************* * 主函数 *********************************************/ main() { TMOD = 0x01; TH0 = T0HIGH; TL0 = T0LOWW; TR0 = 1; ET0 = 1; EA = 1; P1 = 0x00; while(1) { if(true == b10msEvent) //10毫秒定时标志 { b10msEvent = false; Key_Prosess(); //按键扫描 Dynamic_Display(); //动态显示 if(true == MotoStart) //如果电机启动 { if(true == MotoRun) { if(--u10msNum == 0) //如果电机转动时间到,停止电机 { MotoRun = false; MOTO_OFF; } } if(true == b1secEvent) //PWM周期为1秒,1秒钟时间到,开始下一个周期 { b1secEvent = false; MotoRun = true; MOTO_ON; u10msNum = PWMpercent; } } } } } /********************************************* * 清显示 *********************************************/ void Num_Clear(void) { u8 i; for(i=0; i<3; i++) { DisNum[i] = 0x0a; } DisNum[3] = 0x00; } /********************************************* * 读键值 *********************************************/ u8 Key_Scan(void) { if(KEY_ON_PIN == false) return KEY_ON_VALUE; if(KEY_INC_PIN == false) return KEY_INC_VALUE; if(KEY_DEC_PIN == false) return KEY_DEC_VALUE; return KEY_NULL; } /********************************************* * 按键状态扫描 *********************************************/ u8 GetKey(void) { static u8 KeyState = KEY_STATE_INIT; static u8 KeyTimeCount = 0; static u8 LastKey = KEY_NULL; //保存按键释放时候的键值 u8 KeyTemp = KEY_NULL ; KeyTemp = Key_Scan(); switch(KeyState) { case KEY_STATE_INIT: //初始状态 if(KEY_NULL != KeyTemp) //有键按下 { KeyState = KEY_STATE_WOBBLE; //进入消抖 } break; case KEY_STATE_WOBBLE: //消抖 KeyState = KEY_STATE_PRESS; break; case KEY_STATE_PRESS: if(KEY_NULL != KeyTemp) { LastKey = KeyTemp; //保存键值,以便在释放按键状态返回键值
上一篇:手把手教你单片机串口通信-基础篇
史海拾趣
|
[img=http://hi.eeworld.net/attachment/200911/22/5108_1258896379hB6h.jpg][/img][img=http://hi.eeworld.net/attachment/200911/22/5108_1258896378SHxq.jpg[/img]… 查看全部问答> |
|
要实现二个SD卡接口(SDIO设备) 是不是要实现以下二套机制 SD Cilent SD bus SDHC SD卡硬件 SD Cilent SD bus SDHC SD卡硬件 … 查看全部问答> |
|
NAND启动代码 ldr r0, =BWSCON ldr r0, [r0] ands r0, r0, #6 ;OM[1:0] != 0, NOR FLash boot bne copy_proc_beg ;don\'t read nand flash\' adr r0, ResetEntry ;OM[1:0] == 0, NAND FLash boot cmp r0, #0 ;if use Multi-ice, 如果使 ...… 查看全部问答> |
|
在给的开发流程中是这样: AT%IPOPEN=\"TCP\",\"61.144.177.202\",3000 CONNECT AT%IPSEND=\"683100310068c90896060000027400000100e416\" %IPSEND:15 OK %IPDATA:20\"683100310068C90896060000027400000100E416\" ------------------------ ...… 查看全部问答> |
|
经过一天的奋斗,,终于把那个贪吃蛇弄好了,但是在效果上还是不足,当蛇身增长后(4个以后)出现了明显的闪烁问题,还有就是扫描矩阵键盘不是很灵敏。矩阵键盘方面我在尝试改成中断,但是点阵闪烁问题怎么解决啊?延时增加亮度的话又担心执行一次循 ...… 查看全部问答> |
|
【视频分享】电源设计小贴士37:折中选择输入电容纹波电流的线压范围 简介:您在为一个低功耗、离线电源选择输入滤波电容时,会出现一种有趣的权衡过程。您要折中地选取电容的纹波电流额定值,以适合电源工作所需的电压范围。通过增加输入电容,您可以获得更多纹波电流的同时还可以通过降低输入电容的压降来缩小电源的 ...… 查看全部问答> |
|
RAW_SEM.C 教学问题 1 raw_semaphore_create教学问题 1 RAW_SEMAPHORE和这个结构体里的RAW_COMMON_BLOCK_OBJECT是什么样的关系,体现了面向对象里面的什么思想? 2初始化后任务默认是以什么样的方式阻塞在semphore 上的? 3 如何改变任务阻塞方式? ...… 查看全部问答> |




