打印

状态机在单片机中的应用

[复制链接]
335|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lium|  楼主 | 2020-7-24 21:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

请大家说说,或者给点资料,谢谢了!

使用特权

评论回复
沙发
wangzsa| | 2020-7-24 21:32 | 只看该作者
我记得我有点,稍等啊

使用特权

评论回复
板凳
lium|  楼主 | 2020-7-24 21:35 | 只看该作者
能举个例子吗

使用特权

评论回复
地板
wangpe| | 2020-7-24 21:38 | 只看该作者
比如某些芯片的AD采样 你就可以用状态机写

使用特权

评论回复
5
zhuww| | 2020-7-24 21:40 | 只看该作者
嗯, 这样结构就很清晰

使用特权

评论回复
6
lium|  楼主 | 2020-7-24 21:43 | 只看该作者
也是,我等2楼兄弟了,给我发站内信就行

使用特权

评论回复
7
hanwe| | 2020-7-24 21:52 | 只看该作者
好的

使用特权

评论回复
8
yufe| | 2020-7-24 21:55 | 只看该作者
功能:按键去抖;

描述:按钮按下时RES1返回1,如果持续按下的时间超过delay_key_on,则置按键状态status_res1为1,不超过则保持status_res1原值;

同样,按钮释放时RES1返回0,如果持续释放的时间超过delay_key_off,则置按键状态status_res1为0,不超过则保持status_res1原值;



step_res1:当前处理状态,按下/释放;

add_res1:用于累计状态持续时间

======================

switch(step_res1) //处理输入信号

{

       case 0:

           if(RES1) //如果按钮被按下

{

                add_res1++;

                if(add_res1>delay_key_on){//如果持续按下的时间足够

                    status_res1=1;//置当前状态为闭合

                    add_res1=0;//清计数器

                    step_res1=1;//进入第二步

                }

           }

           else{

                add_res1=0;//如果按钮被释放,则重新累计

           }

           break;

       case 1:

           if(!RES1) //如果按钮被释放

                     {

                add_res1++;

                if(add_res1>delay_key_off){//如果持续释放的时间足够

                    status_res1=0;//置当前状态为释放

                    add_res1=0;//清计数器

                    step_res1=0;//回到第一步

                }

           }

           else{

                add_res1=0;//如果按钮仍然闭合,则重新累计

           }

            break;

       default:

           add_res1=0;//若为其他状态,则初始化

           step_res1=0;

           break;

}
更多操作

使用特权

评论回复
9
wangzsa| | 2020-7-24 21:59 | 只看该作者

测试程序:
/*************************************************************************
本文件所有模块的公用测试函数。您可以把本函数放在main()函数的开头里,然后在
本函数内添加您编写的各个模块函数的测试函数,这样你就可以单独测试自己的函数,
而不会影响别的组员的工作(因为main函数一开始就执行了您的测试函数,没有执行
别人的函数!)
**************************************************************************/
/*
void Key_Board_Test(void)//
{
     //如果您想测试函数My_Fun(),那么您就编写相应的My_Fun_Test(),然后把它
     //放到这里来执行。测试完成以后,根据实际情况决定是否保留该测试函数。
     //在本函数前应已初始化串口、定时器0中断!
     u8 key;
     Key_Board_Init();//初始化键盘缓冲区
     while(1)
     {
         key=Read_Key();//从缓冲区读取键值
         if(key == -1)
         {
             continue;
         }
         SoundLight_ms(_TypeBeep,30);//蜂鸣器发声30ms
         switch(key)
         {
             case Key_Up://上箭头
             {
                 printf("您按下了“上箭头”按键。\n\n");
                 break;
             }
             case Key_Down://下箭头
             {
                 printf("您按下了“下箭头”按键。\n\n");
                 break;
             }
             case Key_Add: //加
             {
                 printf("您按下了“加”按键。\n\n");
                 break;
             }
             case Key_Sub://减
             {
                 printf("您按下了“减”按键。\n\n");
                 break;
             }
             case Key_Enter://回车
             {
                 printf("您按下了“回车”按键。\n\n");
                 break;
             }
             case Key_Return://返回
             {
                 printf("您按下了“返回”按键。\n\n");
                 break;
             }
             case Key_LR://左右组合键
             {
                 printf("您同时按下了“左、右”按键。\n\n");
                 break;
             }
             default://未定义按键
             {
                 printf("不知道您按下了什么按键...\n\n");
                 break;
             }
         }
     }
}*/

使用特权

评论回复
10
lium|  楼主 | 2020-7-24 22:02 | 只看该作者
多谢楼上了,太详细了,我慢慢看看

使用特权

评论回复
11
wangzsa| | 2020-7-24 22:05 | 只看该作者
这个得是CAN总线的开发的

使用特权

评论回复
12
huwr| | 2020-7-24 22:12 | 只看该作者
这个具体是什么上面要用到状态机的?

使用特权

评论回复
13
zwll| | 2020-7-24 22:15 | 只看该作者
还有这个状态机的是否就是一个类似任务缓存处理的机制的?

使用特权

评论回复
14
xxrs| | 2020-7-24 22:18 | 只看该作者
不是特别明白的,欢迎拍砖的

使用特权

评论回复
15
lium|  楼主 | 2020-7-24 22:21 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

915

主题

9578

帖子

3

粉丝