在单片机系统中,有许多情况下需要等待某个事件的发生,来继续下一步操作,如果有一个任务还好说,单片机可以无限等待事件的发生,但是如果单片机要处理多个事件时,这种系统一般不能实现,除非用中断,对!用中断,但是中断源的数量是有限的,并且有很多中断源是针对特殊用处,这样能给我自由分配的中断源就只有定时器中断和外部中断,如果仅使用这几个中断源来实现异步,这样可实现的异步事件时非常有限的,每个中断源完成一个异步事件,效率是相当低,大大降低了系统的性能,降低了定时器的利用率.
因此在这里我考虑使用定时器中断来实现多个事件的异步,一个定时器如何实现多个任务的并发?
在这里使用一个任务一个计数器,根据任务实时性的强弱,来设计任务计数器的计数溢出值,每个任务的变量通过一个全局结构体来定义,当然这个结构体必须包括这个计数溢出值。每到一个定时器中断,各个任务计数器都加一,然后检查计数器是否溢出,如果计数溢出就执行相应的任务,同时将此任务的计数器值清零,,如果溢出执行相应的任务,如果没有,则此任务就不执行!但一定要注意在中断程序,千万不能有死循环,如果有等待一定要进行超时检测,来避免死机!
这里举个例子,刚刚成思路,因此写的不是很好!这个程序使用一个4连体数码管显示从DS18B20中采集的温度值,4位连体数码管当然只能使用动态扫描方法来显示数据,并且这个动态扫描不能在主程序中执行,因为在主程序动态扫描效果很容易收到中断程序的影响,而使显示效果下降,因此必须使用定时器来控制延时实现动态扫描,但是ds18b20的读写时序对延时的精度要求也是相当高的,如果在主程序中,中断程序造成的延时必然会对ds18b20采集数据的延时精确度造成干扰,而不能采集正确的数据!因此DS18b20采集数据的程序也不能够放在主程序中,当然我们可以使用两个定时器来实现!这里我们使用一个定时器来实现,由于DS18B20温度转换时间比较长12位精度的温度转换需要接近1秒的时间,这对动态扫描是无法容忍的,可行的办法是将启动转换,读取温度值放在同一个中断的不同状态,也就是在任务中实现状态机,从而避免了在中断中出现长时间的等待,而影响系统的性能!以下中断函数的具体实现:
void interrupt main_int()
{
// t0_int(&data) ;
uchar tl ,th ;
uint temp ;
if(T0IF)
{
T0IF=0 ;
(ds.count)++ ;
if(ds.count==80)
{
ds.count=0 ;
switch(ds.state)
{
case 0 :
ds.state=1 ;
init_ds18b20() ;
write_ds18b20(ROM_SKIP) ;
write_ds18b20(MEM_CONVERT) ;
break ;
case 1 :
init_ds18b20() ;
write_ds18b20(ROM_SKIP) ;
write_ds18b20(MEM_READ) ;
tl=read_ds18b20() ;
th=read_ds18b20() ;
if(!(th&0xf0))
{
th=th&0x07 ;
temp=th*256+tl ;
ds.data=temp/16 ;
}
else
{ th=th&0x07 ;
temp=th*256 +tl ;
ds.data=temp/16 ;
}
ds.state=0 ;
break ;
default :
ds.state=0 ;
break ;
}
}
int_display1(ds.data) ;
TMR0=210 ;
}
}
关键字:单片机 定时器 多任务
引用地址:
单片机通过定时器来实现多任务
推荐阅读最新更新时间:2024-03-16 14:59
基于单片机的太阳能发电量的检测与设计
可再生能源太阳能发电可分为太阳能光发电(又称光伏)和太阳能热发电两大类,后者由于技术比较复杂,只能用于比较大的容量,应用受到一定限制,所以目前实际应用较少。太阳能光发电具有取之不尽,用之不竭,无污染等诸多优点,已成为人类寻求新能源的热点。但同时又存在应用间歇性,发电量与气候条件有关的缺点。因此,为提高太阳能电池的利用率,实时监控发电量是很有必要的,可以及早发现太阳能电池工作中出现的异常情况。这里提出了一种太阳能电池发电量实时监控系统的设计方案。系统利用AT89S52单片机控制,采用霍尔电流传感器对太阳能电池的输出电流测量,其突出优点是可以在几乎不消耗能量情况下,将电流转换为电压进行测量。 1 系统硬件设计 系统硬件
[单片机]
NO.15 MSP432定时器使用实例——流水灯
上一篇文章我们讲了定时器Timer的基本概念和如何调用定时器。这次我们来尝试在MSP432中使用定时器完成流水灯这个小实验。 流水灯是我们从真正意义上进行对单片机进行时间控制。 这个实验主要是控制我们开发板上的LED进行1s亮,1s灭,循环进行。 首先,我们打开CCS中ResourceExplorer的TiDrivers下的案例——timerled。 我们将其导入到我们的工作区中,我们再打开timerled.syscfg这个文件,查看本工程的相关配置。 我们要增加其他Timer也非常简单,只要点击ADD这个按钮就可以配置相关内容。 我们其次打开timerled.c这个主文件,
[单片机]
单片机多机冗余设计及控制模块的VHDL语言描述
摘要: 以三个单片机组成的系统为例介绍一种单片机多机冗余容错设计。阐述设计中关键的时钟同步技术和总线仲裁方法,给出控制模块的VHDL语言描述。
关键词: 单片机 冗余容错 时钟 总线 VHDL
本文提出一种表决式单片机多机冗余设计方案。该方案不同于中央系统的多机冗余设计。大规模系统冗余大多采用完善而复杂的机间通讯协议实现系统重构,不太注重系统的实时性。本方案结构简单,易于实现,具有极强的实时性,没有电子开关切换总线的咔嗒声输出。单片机价格低廉、功能灵活,也使得该设计在类似仪器仪表的小系统中的运用成为可能。
1 设计原理
设计结构如图1所示。完成整个冗余设计的电路被置于一个核心控制模块中
[半导体设计/制造]
基于AT89S52单片机的简易数字示波器设计
随着电子技术的发展和电路结构的变化,对电路测量的要求也变得更高。对广大理工科学生和从事电子等相关行业的普通工作者在电子制作、产品维修等中,很多电路参数需要测量分析,经常需要使用数字示波器。但目前我国使用的高性能 数字示波器 普遍价格昂贵,所以研究简易数字示波器具有重要意义。 1 系统结构和工作原理 1.1 系统结构 该设计以 AT89S52 单片机为控制核心,由预处理电路(包括阻抗变换、程控放大、信号调理电路)、A/D数据采集电路、E2PROM存储电路、功能键盘、LCD显示电路以及电源等部分组成。系统结构框图如图1所示。 1.2 工作原理 数字示波器有二个输入通道。预处理电
[单片机]
Diodes的紧凑高带宽 2:1 多任务/解多任务切换器
Diodes Incorporated 的紧凑高带宽 2:1 多任务/解多任务切换器,实现了具有卓越讯号完整性的绕送 【2021 年06月10日美国德州普拉诺讯】Diodes 公司旗下的无源多任务/解多任务切换器系列又加入了新的生力军。PI2DBS16212A支持高达 20Gbps 的数据传输速率,是一款提供双向操作的 4 对 2 差分通道切换器IC,适用于高效能 IT 设备,包括台式电脑、笔记本电脑、工作站和服务器。 Diodes Incorporated 采用独特的设计方法,优化调整了 PI2DBS16212A 在插入损耗、回波损耗、偏斜和串扰方面的动态电气特性。这款装置除了具有小尺寸和低矮型的特色,在其 14G
[网络通信]
基于ARM的LPC1768微控制器启动过程
基本概念(CMSIS): Cortex Micro-controller Software Interface Standard,微控制器软件接口标准。 2. CMSIS标准的文件结构: a) core_cm.c (stdint.h) b) system_.c (core_cm, system_) c) startup_.s 其中core_cm.c以及core_cm中为内核设访问层,其中定义了定义了内核中得外设几丁质以及一些内核的访问及控制函数。 startup_.s文件是系统的启动文件,其包括堆和栈的初始化配置、中断向量表的配置以及将程序引导到main()函数等功能。 system_和system_.c文件则是
[单片机]
关于51单片机外部中断的触发方式
51单片机有两个外部中断申请输入端:INT0 和 INT1。 51单片机的外部中断,分为低电平触发和下降沿触发。在单片机内部,分别由控制位 IT0 和 IT1 来控制。 复位时,IT0/1 都为 0,即默认为低电平触发。 一般来说,外设第一次向单片机申请外部中断时,单片机使用那种触发方式,并无什么差别。 但是,返回主程序后,如果外部申请信号仍然是低电平,就有区别了。 在采用低电平触发时,单片机执行了一条主程序的指令后,就会又重新进入中断程序。 而采用下降沿触发时,即使 INT0/1 引脚仍然是低电平,单片机也不会重新进入中断程序。 如果外设想要申请第二次中断,必须是先恢复高电平,重新再送来一次下降沿才行。 那么,为了避免仅仅来了一
[单片机]
单片机设计技巧:如何实现8051模块化编程
目前在8051 单片机应用开发中主要有两种编程语言:汇编语言和C51 语言。C51 语言是一种结构化的编程语言,采用C51 编写的应用程序结构清晰、模块化程度高、可读性强、并容易移植。但C51 语言也有缺点,就是编译后生成的目标代码空间要比汇编的大。 而且目前单片机的教材还是侧重于汇编语言。因此学习用单片机汇编语言程序进行结构化设计还是很有必要的。我们知道C51 语言是函数式语言,其程序由函数构成,每一个源程序有且只有一个主函数main() 和若干个函数组成。其中每一个函数都用于完成某一特定任务。也就是说,一个项目若具有几个功能,实现这些功能就会需要由若干个任务来完成,那么它的源程序中就会有若干个或以上的函数。而在汇编语言中,
[单片机]