使用定时器+中断的方式写DS18B20驱动,中断处理函数尽量简洁,执行几个固定操作最好,状态转移在主函数里实现。有哪位朋友能提点一下,我刚接触单片机,实在想不出来。
1条回答 默认 最新
- _leoatliang 2023-01-10 10:14关注
在单片机中使用定时器 + 中断的方式来驱动 DS18B20 温度传感器的步骤如下:
配置定时器的时钟源和分频因子,并开启定时器中断。
配置 DS18B20 的引脚,并使用单总线通信协议(One-Wire)读取温度数据。
在中断处理函数中,读取定时器的计数值,并用它来更新 DS18B20 的温度值。
在主函数中,使用一个状态机来管理 DS18B20 的驱动程序的状态。
下面是一个简单的例子,展示了如何使用定时器 + 中断的方式来驱动 DS18B20 温度传感器:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "DS18B20.h" #define TIMER_PERIOD 1000 // 定时器周期,单位为毫秒 #define DS18B20_PIN PB1 // DS18B20 的引脚 static volatile uint32_t timer_count = 0; // 定时器计数值 static volatile uint8_t ds18b20_state = 0; // DS18B20 驱动程序的状态 static volatile float ds18b20_temp = 0; // DS18B20 的温度值 // 中断处理函数,每当定时器计数值溢出时调用 void timer_handler(void) { timer_count++; // 更新定时器计数值 } // 主函数 int main(void) { // 配置定时器的时钟源和分频因子,并开启定时器中断 timer_init(TIMER_PERIOD); timer_enable_int(); while (1) { switch (ds18b20_state) { case 0: // 初始化 DS18B20 ds18b20_init(DS18B20_PIN); ds18b20_state = 1; break; case 1: // 读取 DS18B20 的温度 if (timer_count >= TIMER_PERIOD) { // 每隔一定时间执行一次 timer_count = 0; // 重置定时器计数值 ds18b20_read_temp(&ds18b20_temp); } break; default: break; } } return 0; }
解决评论 打赏 举报无用 1
悬赏问题
- ¥100 栈回溯相关,模块加载后KiExceptionDispatch无法正常回溯了
- ¥15 麒麟V10桌面版SP1如何配置bonding
- ¥15 Marscode IDE 如何预览新建的 HTML 文件
- ¥15 K8S部署二进制集群过程中calico一直报错
- ¥15 java python或者任何一种编程语言复刻一个网页
- ¥20 如何通过代码传输视频到亚马逊平台
- ¥15 php查询mysql数据库并显示至下拉列表中
- ¥15 freertos下使用外部中断失效
- ¥15 输入的char字符转为int类型,不是对应的ascall码,如何才能使之转换为对应ascall码?或者使输入的char字符可以正常与其他字符比较?
- ¥15 devserver配置完 启动服务 无法访问static上的资源