历史上的今天
返回首页

历史上的今天

今天是: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;        //保存键值,以便在释放按键状态返回键值

推荐阅读

史海拾趣

EF Johnson Technologies Inc公司的发展小趣事

在产品质量方面,EF Johnson公司始终坚持高标准、严要求。公司建立了完善的质量管理体系,从原材料采购到生产制造再到售后服务,每一个环节都严格把关。这种对品质的执着追求让EF Johnson的产品在市场上赢得了良好的口碑和用户的信赖。随着品牌知名度的提升,EF Johnson的市场份额也稳步增长。

峰岹(Fortior Tech )公司的发展小趣事

面对日益激烈的国内市场竞争,EF Johnson公司制定了国际化战略,将目光投向了海外市场。公司通过与国外代理商的合作,成功将产品打入国际市场,并获得了良好的口碑。同时,公司还积极参与国际展会和技术交流活动,不断提升品牌影响力。在国际化战略的推动下,EF Johnson的海外市场份额逐步扩大,成为一家具有全球影响力的电子通信企业。

Cosel公司的发展小趣事

1967年,Cosel公司的前身——木村电气销售(个人独资)在日本正式成立,标志着Cosel公司创业之路的开始。创始人凭借对电子行业的敏锐洞察和深厚技术背景,带领公司逐步在竞争激烈的市场中站稳脚跟。随着业务的不断拓展,1969年,公司撤消了木村电气销售,并成立了ELCO株式会社,这一变革为公司后续的发展奠定了坚实基础。

Ecera Comtek Corp公司的发展小趣事

面对日新月异的电子科技行业,Ecera Comtek Corp公司深知只有持续创新才能保持领先地位。因此,公司不断加大对新技术、新产品的研发投入,积极探索新的商业模式和市场机会。同时,Ecera Comtek Corp公司还积极引进外部创新资源,与高校、科研机构等建立紧密的合作关系,共同推动电子科技行业的发展。在Ecera Comtek Corp公司的引领下,电子科技行业正朝着更加智能、高效、环保的方向发展。

请注意,以上故事均基于虚构情节,旨在模拟Ecera Comtek Corp公司可能的发展经历。如有雷同,纯属巧合。

Digital View公司的发展小趣事

面对日益激烈的市场竞争和技术变革的挑战,Digital View公司始终保持敏锐的市场洞察力和创新精神。公司密切关注市场动态和技术趋势,及时调整产品策略和市场布局。同时,公司还加大了对研发创新的投入力度,不断推出具有自主知识产权的新产品和新技术。通过不断创新和优化产品与服务,Digital View成功应对了市场挑战并保持了领先地位。

以上五个故事线索只是Digital View公司发展历程中的一部分缩影。每个故事都可以进一步挖掘和扩展,以呈现公司在电子行业里发展起来的完整画卷。

Excelight Communications Inc公司的发展小趣事

Excelight Communications Inc公司成立于XX世纪初,当时正值通信技术飞速发展的时代。创始人李明(化名)是一位电子工程专家,他对光通信技术有着浓厚的兴趣。在创办公司之前,李明曾在一家大型通信企业工作,积累了丰富的技术和管理经验。他发现市场上对于高速、高效的光通信产品有着巨大的需求,于是决定创立Excelight,专注于研发和生产光通信模块和设备。

创业初期,Excelight面临着资金、技术和市场等多方面的挑战。李明带领团队日夜兼程,不断攻克技术难关,同时积极寻找合作伙伴和投资人。经过几年的努力,Excelight逐渐在市场上崭露头角,其光通信产品因性能优越、价格合理而受到了客户的广泛好评。

问答坊 | AI 解惑

求周立功esayarm2200开饭板

qq:343979611  开发用到,现求奕块二手的,配套资料要齐全。…

查看全部问答>

怎样评估双口RAM应该使用大小和多少?

1.简单一点根据输入输出的数据多少,并预留一定裕量。 但这个标准时多少,欢迎大家讨论?…

查看全部问答>

有没有谁见过这些触发器。知道它们特性方程吗?

[img=http://hi.eeworld.net/attachment/200911/22/5108_1258896379hB6h.jpg][/img][img=http://hi.eeworld.net/attachment/200911/22/5108_1258896378SHxq.jpg[/img]…

查看全部问答>

有人是用CF2.0开发界面的吗?

可不可以将DataGrid设置每行的高度啊? …

查看全部问答>

SDIO设备驱动的问题

要实现二个SD卡接口(SDIO设备) 是不是要实现以下二套机制 SD Cilent    SD bus SDHC SD卡硬件 SD Cilent    SD bus SDHC SD卡硬件 …

查看全部问答>

gooogleman请进。NAND启动代码问题。

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, 如果使 ...…

查看全部问答>

EM310模块发送数据无应答,求解

在给的开发流程中是这样: AT%IPOPEN=\"TCP\",\"61.144.177.202\",3000 CONNECT AT%IPSEND=\"683100310068c90896060000027400000100e416\" %IPSEND:15 OK %IPDATA:20\"683100310068C90896060000027400000100E416\" ------------------------ ...…

查看全部问答>

关于点阵闪烁和扫描键盘的问题

经过一天的奋斗,,终于把那个贪吃蛇弄好了,但是在效果上还是不足,当蛇身增长后(4个以后)出现了明显的闪烁问题,还有就是扫描矩阵键盘不是很灵敏。矩阵键盘方面我在尝试改成中断,但是点阵闪烁问题怎么解决啊?延时增加亮度的话又担心执行一次循 ...…

查看全部问答>

【视频分享】电源设计小贴士37:折中选择输入电容纹波电流的线压范围

简介:您在为一个低功耗、离线电源选择输入滤波电容时,会出现一种有趣的权衡过程。您要折中地选取电容的纹波电流额定值,以适合电源工作所需的电压范围。通过增加输入电容,您可以获得更多纹波电流的同时还可以通过降低输入电容的压降来缩小电源的 ...…

查看全部问答>

RAW_SEM.C 教学问题

RAW_SEM.C 教学问题 1 raw_semaphore_create教学问题 1 RAW_SEMAPHORE和这个结构体里的RAW_COMMON_BLOCK_OBJECT是什么样的关系,体现了面向对象里面的什么思想? 2初始化后任务默认是以什么样的方式阻塞在semphore 上的? 3 如何改变任务阻塞方式? ...…

查看全部问答>