单片机LED调光程序,状态机按键处理,效果比较好

2020-11-21来源: 51hei关键字:单片机  LED调光  状态机  按键处理

用状态机处理按键,终于把这个功能实现了;实验板上测试通过。
/* ********************************************************************************************* */
// 处理器   : STC89C52RC
// 编译环境 : Keil4 C51
// 系统时钟 : 11.0592MHZ
// 简单描述 : 1个独立按键,短按开关LED灯,长按调光,如果按住按键不放,LED亮度从 亮-->暗,暗-->亮,循环。
/* ********************************************************************************************* */
#include
typedef unsigned char uChar8;
typedef unsigned int  uInt16;
                                         /*初始状态  确认状态   单击状态    连发状态 */
typedef enum KeyState{StateInit,StateAffirm,StateSingle,StateRepeat};//键值状态值
uChar8 pwm_led_val = 0;         //LED占空比值 0-20 0最亮
uChar8 pwm_t;                                 //周期
sbit KEY1 = P3^0;                        //定义按键端口
sbit LED = P1^0;                        //定义LED灯端口

void Timer0Init(void)
{
        TMOD |= 0x02;                        //设置定时器0工作模式2,8位自动重装
        TH0 = 240;                                //定时器装初值
        TL0 = 240;                                //11.0592M晶振下占空比最大比值是20,输出2880HZ
        EA = 1;                                        //开总中断
        ET0 = 1;                                //开定时器0中断
        TR0 = 1;                                //启动定时器0
}
void Timer1Init(void)
{
        TMOD |= 0x10;                        // 设置定时器1工作模式1,16位计数器
        TH1 = 0xDC;                                // 赋初始值
        TL1 = 0x00;                                // 11.0592M晶振下,定时10ms
        TR1 = 1;                                // 启动定时器1
}

/* ***************************************************** */
// 函数名称:        Init()
// 函数功能:   初始化
// 入口参数:        无
// 出口参数:         无
/* ***************************************************** */
void Init()                                        //初始化
{
        Timer0Init();
        Timer1Init();
               
}

//定时器0中断
void timer0() interrupt 1
{
        pwm_t++;
        if(pwm_t == 20)
        {
                pwm_t = 0; LED = 1;
        }
        if(pwm_led_val == pwm_t)
                LED = 0;                                         
}


/* ***************************************************** */
// 函数名称:KeyScan(void)
// 函数功能:扫描按键
// 入口参数:无
// 出口参数:键值(num)
/* ***************************************************** */
void KeyScan(void)
{
        static uChar8 KeyStateTemp1 = 0;                        //按键状态临时存储值1
        static uChar8 KeyTime = 0;                                        //按键延时时间
        bit KeyPressTemp1;                                                        //按键是否按下存储值1
        bit falg;                                                                        //亮度标志

        KeyPressTemp1 = KEY1;                                                //读取I/O口的键值
        switch(KeyStateTemp1)
        {       
                case StateInit:                                                        //按键初始状态
                        if(!KeyPressTemp1)                                        //当按键按下,状态切换到确认态
                                KeyStateTemp1 = StateAffirm;
                        break;
               
                case StateAffirm:                                                //按键确认态
                        if(!KeyPressTemp1)
                        {
                                KeyTime = 0;
                                KeyStateTemp1 = StateSingle;        //切换到单次触发态       
                        }
                        else KeyStateTemp1 = StateInit;         //按键已抬起,切换到初始态
                        break;
       
                case StateSingle:                                                //按键单发态
                        if(KeyPressTemp1)                                        //按下时间小于1s
                        {
                                KeyStateTemp1 = StateInit;          //按键释放,则回到初始态
                                                TR0 = !TR0;
                                                LED = 1;                                //关闭LED
               
                        }
                        else if(++KeyTime > 100)                        //按下时间大于1s(100*10ms)
                        {
                                KeyStateTemp1 = StateRepeat;        //状态切换到连发态
KeyTime = 0;

[1] [2]
关键字:单片机  LED调光  状态机  按键处理 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic517318.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机OLED屏幕进行数字,字符,图片的显示程序
下一篇:单片机控制8×8LED点阵屏显示数字的设计

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于51单片机控温程序及电路原理图
所需要 ** 的温度值。并且能够稳定在你所设定的温度下。当 ** 实际温度超过你设定的温度,蜂鸣器报警 。 ** ** 包括各个模块及详细的注释 ** 方便 C51 单片机入门级别者阅读 *电路原理图如下:
发表于 2020-11-04
基于51<font color='red'>单片机</font>控温程序及电路原理图
单片机+LCD12864数字电压表设计
单片机源程序如下://---库函数声明及相关定义---//#include <reg51.h>#include <intrins.h>#define unint unsigned int#define unchar unsigned char#define Databus P1 /*液晶数据总线*/sbit RS=P3^3;      /*数据指令 选择*/sbit RW=P3^4;      /*读写 选择*/sbit EN=P3^2;      /*读写使能*/sbit cs1=P3^6;   
发表于 2020-11-04
<font color='red'>单片机</font>+LCD12864数字电压表设计
51单片机控制模拟交通信号灯
采用单片机的I/O口PO口通过上拉电阻和交通灯相连接,P3.0、P3.1口接到数码管控制位上,控制数码管的显示,程序放在STC89C52RC单片机的ROM中,在十字路口的四组红、黄、绿交通灯中,由单片机的 P1.0-P1.2 、P1.5-P1.7、P2.0-P2.2、P2.5-P2.7控制,由于交通灯为发光二极管且阳极通过限流电阻和电源正极相连,因此I/0口输出低电平时,与之相连的指示灯会亮,并通过数码管显示时间倒计时。I/0口输出高电平时,相应指示灯会灭。当交通出现障碍需要恢复到初始状态时,按下复位键即可,此键由单片机的9脚RST键控制。制作出来的实物图如下:Altium Designer画的原理图和PCB图如下:(51hei
发表于 2020-11-04
51<font color='red'>单片机</font>控制模拟交通信号灯
风速风向传感器在单片机上的应用
/*本风速传感器采用小型直流有刷电机与三杯式旋转风杯组装  而成,其工作原理为,当环境有水平流动风时,旋转风杯能够产生旋转,并带动小型电机产生电压,其电压与旋转速度基本成正比。利用此信号电压,可以对环境风速进行测量。这款风速传感器采用海洋军用的高精度测量风速传感器,与传统产品先别,具有更高精度;是建筑机械(起重机、履带吊、门吊、塔吊)、铁路、港口、码头、风力发电、光伏发电、电厂、气象、索道、环境、温室、养殖等领域不可缺少的风速检测装置。用它可以实现设备风速指示数字化及自动化,是相关设备不可缺少的风速检测设备。*///使用该程序和电路再搭配我们的风速风向传感器就可以实时显示风速风向数据#冠拓电子#include <
发表于 2020-11-04
风速风向传感器在<font color='red'>单片机</font>上的应用
51单片机中的ROM和RAM分别是什么?
众所周知,51 内部的存储器分为数据存储器 RAM 和程序存储器 ROM。以 AT89c51 为例,其中有 128 字节随机存储器(又称数据储存器 RAM)和 4K 字节的只读存 储器(又称程序存储器 ROM)。先说说这个 4K 字节的程序存储器或者说只读存储器,我们写的程序经过编译器 编译成机器码都是存在这个区域,所以称为程序存储器;但单片机上电执行的时 候,此区域内的数据只能读取而不能写入,他的只读存储器的名称从这而来。89c51 的 ROM 采用的是 FPEROM(Flash Programmable and Erasable Read OnlyMemory),具体工艺我也不太清楚,号称可以擦写 1000 次,也就是说你每天
发表于 2020-11-04
Proteus超声波测距仿真电路图+单片机源程序
大多数人感觉超声波测距proteus仿真是无法实现的,虽然proteus自带的库有GUR03和SRF04两种模型,但是却与实际传感器使用方法相差甚远,即使求助度娘也很难找到简单易懂的教程。之前很多人想做超声波测距仿真但都没有找到很好的办法去实现,在软件里没有这样的元件,有人用一个按键开关去模拟仿真,这样仿真出来的效果,非常不好。还有人用555时基电路产生一个延时信号(555电路作为超声波仿真的内部元件),来模拟超声波头发送后遇到回波返射回来的这阶段时间,来对单片机超声波测距单片机系统进行模拟,能完成对超声波测距模块大致仿真,但需要繁杂的设计。下面是一个超声波测距模块的proteus模型,能直接用于proteus仿真,且使用方法
发表于 2020-11-04
Proteus超声波测距仿真电路图+<font color='red'>单片机</font>源程序
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved