历史上的今天
返回首页

历史上的今天

今天是:2025年03月03日(星期一)

正在发生

2021年03月03日 | 单片机的状态机框架编写

2021-03-03 来源:eefocus

在单片机裸机的编程方法中,状态机的方法是比较好的,经典的比如按键的检测判断等。

其实有很多地方可以使用这种思想。比如传感器的数据采集,因为单片机不可能一直等待着运行,那样的效率是很低的,通常都是结合fsm + timer的方式来提高CPU的使用率


一、传感器中使用fsm的方法。

大家都知道,ds18b20的采集是比较慢的,发送转换指令后,最慢需要等待720ms,这个时间有点太长了。简直不能忍受。


如下所示:我采用了11bit分辨率,0.125的分辨率足够了,作为温度参考而已。

The resolution of the temperature sensor is user - configurable to 9, 10, 11, or 12 bits, corresponding to increments of 0.5°C, 0.25°C, 0.125°C, and 0.0625°C, respectively.

Temperature Conversion Time t CONV

9 - bit resolution    93.75   ms  0.5

10 - bit resolution   187.5       0.25

11 - bit resolution   375         0.125

12 - bit resolution   750         0.0625

那么我肯定不是死等的,死等,多浪费cpu,效率太低了,实际工作中根本无法接受。

因此,做了一个状态机:

int main(int argc, char const *argv[])

{

    while(1)

    {

        ds18b20_discope();

    }

    return 0;

}

void ds18b20_discope(void)

{

    switch (ds18b20的状态机的全局变量)

    {

    case 发送命令:

        发送转换命令

        赋值到等待装态

        break;

    case 等待装态:

        判断是否有超时,

        如果有超时,则:读取,计数器清零,并回到发送命令状态

        否则,do nothing

            break;

    default:

        break;

    }

}


定时器的基准中断可以自己细化,我是50ms一个中断

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

    如果ds18b20已经处于等待状态,

    则计数++

}


这样就是一个简单的传感器定时采样的状态机思路,不会死等,效率较高,而且稳定。


注意ds18b20的时序性比较严格,网上说不能被打断的,但是后来移植到freertos中,也是可以的,温度采样还算稳定,但是考虑到后续程序比较大,该框架有点费时间,因此还是裸机了,状态机的思路基本能解决。

推荐阅读

史海拾趣

Dytran Instruments Inc公司的发展小趣事

尽管已经被收购并进行了业务整合,但Dytran并没有停止其创新的步伐。公司继续加大研发投入,推动传感器技术的不断创新和升级。同时,Dytran还积极探索新的应用领域和市场空间,以满足不断变化的客户需求。

在未来,Dytran将继续致力于为客户提供高质量、高性能的传感器产品和解决方案。同时,公司还将积极参与国际竞争和合作,推动传感器技术的国际化和标准化进程。通过不断创新和发展,Dytran有望在电子行业中继续保持其领先地位并实现更加辉煌的未来。

以上五个故事框架概述了Dytran Instruments Inc.公司在电子行业中的发展历程、技术创新、市场拓展、被收购与业务整合以及未来展望等方面的重要事件和里程碑。这些故事展示了Dytran如何凭借其技术实力和市场洞察力在竞争激烈的电子行业中脱颖而出并实现持续发展。

Alan Industries Inc公司的发展小趣事

随着国内市场的饱和,Alan Industries Inc.开始将目光投向海外市场。公司制定了国际化发展战略,通过设立海外分公司、参加国际展会等方式,积极开拓国际市场。同时,公司还加强了对国际市场的调研和分析,根据不同地区的市场需求和文化特点,推出了针对性的产品和服务。这些努力使得公司在国际市场上也取得了不俗的成绩。

ERGOBAHCO公司的发展小趣事

随着公司规模的扩大,ERGOBAHCO公司逐渐意识到品质与创新对于品牌的重要性。公司投入大量资金引进先进的生产设备和技术,并建立了严格的质量管理体系。同时,ERGOBAHCO公司还鼓励员工进行创新研发,不断推出具有市场竞争力的新产品。这些举措使得ERGOBAHCO公司的产品逐渐在行业内树立了良好的口碑,品牌知名度也随之提升。

EZchip Technologies Ltd公司的发展小趣事

作为一家领先的电子企业,EZchip深知自己在推动社会进步和可持续发展方面所肩负的责任。因此,公司一直致力于环境保护、社会公益和可持续发展等方面的工作。EZchip通过采用环保材料和节能技术降低生产过程中的能耗和排放;积极参与社会公益活动回馈社会;同时注重企业的可持续发展规划和管理模式的创新。这些举措不仅体现了公司的社会责任感和担当精神也为企业赢得了良好的社会声誉和品牌形象。

EMI Filter Company公司的发展小趣事

Kemet公司在EMI滤波器领域也有着一席之地。他们致力于研发符合环保标准的EMI滤波器。随着全球对环保问题的日益重视,Kemet看到了绿色环保EMI滤波器的巨大潜力。他们采用环保材料和无铅工艺,生产出了符合RoHS标准的EMI滤波器。这些产品不仅性能稳定,而且对环境友好,赢得了众多环保意识强烈的客户的青睐。

CANDD公司的发展小趣事

在快速发展的过程中,CANDD公司始终注重企业文化的建设。公司倡导创新、协作、诚信和担当的核心价值观,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的培训和成长,为员工提供了广阔的职业发展空间。这些举措不仅激发了员工的工作热情,还为公司培养了一批忠诚、有能力的员工队伍。在企业文化的引领下,CANDD公司不断向前发展,成为了电子行业的佼佼者。

这些故事虽然基于虚构的CANDD公司,但它们所反映的电子行业发展趋势和企业管理理念是真实存在的。通过这些故事,我们可以更好地理解电子行业的发展历程和未来趋势。

问答坊 | AI 解惑

做研发的一点心得体会!

出来作研发也一年了,很有些体会。在这里想与大家分享下! 1. 不要把自己搞成“实验机器”,要多在课题开展前进行详细的课题论证,信息搜集和筛选。 企业一般做课题都很着急,课题进度要求很快,作为研发人员,要做大量的实验,筛选路线,打通 ...…

查看全部问答>

电子工程师启迪之——创造性与习惯相结合

人们可能会对电子产品的开发与设计方法坚持某种不变的观念,甚至对解决不同问题所采用的器件这样的小事都有某种思维定势,这是可以理解的。 我认识到,对于电子设计人员来说,“熟悉招致轻视”这样的说法并不适用于他们。甚至那些我所认识的最有创 ...…

查看全部问答>

请教ADC0809控制问题

程序如下;怎么ADC0809一直处于忙状态  (P[0..7]接D[0..7]P0接数码管) #include #define uchar unsigned char #define uint unsigned int uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示码0-9 ...…

查看全部问答>

DM9000用于嵌入式工控产品的问题

我的嵌入式产品用的DM9000a, 用一台电脑能ping 通(偶尔丢包),不断电情况下,切换成另一台电脑,有时能ping通,有时ping 不通,并且10M/100M以及LINK灯灭,怎么回事啊?谢谢 …

查看全部问答>

如何把 51 单片机中的 .c 文件和 .h 文件 和 VC写的工程文件做成库

问题一: 在 51单片机 中用 C 写的 .c 和.h 文件,如何做成库呢?51的编译器是 IAR 问题二: 如何把VC写的一个 C 工程文件做成库呢? 问题三: 老大只说让我把上面这两种 C 语言写的函数和文件做成库,应该是做成 lib 库呢,还是做成 dll 库呢 ...…

查看全部问答>

高科技大型上市公司招聘: 嵌入式系统设计工程师 /通信产品设计工程师 / 系统软件设计工程师 工作地点 深圳

本公司是深圳一家高科技大型上市公司,主要经营电力系统产品生产研发,微电子产品生产研发,光磁设备,公司内有员工高层公寓,食堂,文体活动中心,员工家属楼多处,座落于美丽的深圳市福田区笔架山与莲花山之间,公司目前有员工6000多人,工程师及 ...…

查看全部问答>

WinCE下如何判断一个程序是否已经运行?

参考了一些桌面上的方案,发现在CE4.2下面都用不了,要么是mutex函数不支持多个参数,要么就是用不了Process类,大家能不能帮忙想想办法啊,看怎么实现判断程序是否运行的效果,如果已经运行了就不要再运行。…

查看全部问答>

wince 5中能否动态修改显示分辨率?

正在开发wince下的驱动,能否通过应用程序来动态调整TFT的分辨率?比如说从640x480调整到320x240,调整过程中WINCE不能重新启动? 我发现可以通过应用程序来进行屏幕旋转,有没有调整分辨率的函数? 谢谢…

查看全部问答>

求教关于TIMERA的捕获问题

使用的芯片是413 采用TA1的捕获模式从P1.2口测量频率周期,在测试板上使用按键模拟待测脉冲信号,结果发现按一次键会发生很多次捕获中断,为查明中断源有查TAIV,结果令人差异。代码如下: #include "msp430x41x.h" unsigned int m=1,l=1,o=1 ...…

查看全部问答>