基于51单片机的实时操作系统的研究
- 格式:doc
- 大小:631.59 KB
- 文档页数:84
南京信息职业技术学院毕业设计论文作者薛亮学号*****T32 系部电子信息学院专业无线电技术题目基于单片机的家用电器远程遥控装置的设计与制作指导教师李光明评阅教师完成时间:2010年2月11日目录第1章绪论 (5)1.1 概述 (5)1.2 设计要求及主要功能介绍 (5)1.3 MCS-51系列单片机简介 (7)第2章系统总体设计 (9)2.1 系统功能模块的划分 (9)2.2 系统原理框图 (9)2.3 系统软件主要特色 (10)第3章各模块详细设计 (12)3.1 振铃检测模块的设计 (12)3.2 双音多频模块的设计 (13)3.3 自动摘机及超时挂机模块的设计 (16)3.4 语音提示模块的设计 (17)3.5 密码设置模块的设计 (21)3.6 EEPROM及看门狗模块的设计 (23)3.7 继电器驱动模块的设计 (27)3.8 系统总程序的设计 (28)第4章系统的组装、调试和测试 (30)4.1 系统的组装、调试 (30)4.2 振铃检测及自动摘机功能的测试 (30)4.3 语音及双音多频功能的测试 (30)4.4 密码设置功能的测试 (30)4.5 EEPROM密码存储功能的测试 (31)4.6 继电器驱动、电器状态显示及语音提示功能的测试 (31)4.7 超时自动挂机功能的测试 (31)第5章系统方案总评 (32)结论 (33)致谢 (33)参考文献 (33)附录A 家用电器远程遥控装置的功能及使用 (35)1 家用电器远程遥控装置的功能 (35)2 家用电器远程遥控装置的使用方法 (36)图1 家用电器远程遥控装置原理图 (38)图2 家用电器远程遥控装置印制板图 (39)图3 家用电器远程遥控装置CPLD内部电气图 (40)表1 家用电器远程遥控装置元器件清单 (41)第1章绪论1.1 概述单片机以其强大的控制能力已经被广泛应用于诸多领域,从最初的8位控制器到现在的16位、32位控制器都还有很大的发展和应用空间。
RTX51 Tiny 实时内核理解声明:以下来自网络整理而来并非本人作品,觉得挺容易懂所以放入博客以便后来学习者参考RTX51 Tiny中容易混淆的问题RTX51 Tiny是 Keil uVision中自带的一个小型嵌入式RTOS,具有小巧、速度快、系统开销小、使用方便等优点。
使用RTX51 Tiny能够提高系统的稳定性,优化程序的性能;而且它是为51单片机专门定制的,所以在51单片机上的运行效率比其它一些通用的RTOS性能也要好一些。
但是,由于RTX51 Tiny的相关资料和书籍比较少,大部分只是对程序自带帮助文件的简单翻译,很少进行深入探讨。
下面就RTX51 Tiny使用中经常遇到的一些问题进行探讨。
1 关于时间片的问题RTX51 Tiny使用的是无优先级时间片轮询法,每个任务使用相同大小的时间片,但是时间片是怎样确定的呢?RTX51 Tiny的配置参数(Conf_tny.a51文件中)中有INT_CLOCK和TIMESHARING两个参数。
这两个参数决定了每个任务使用时间片的大小:INT_CLOCK是时钟中断使用的周期数,也就是基本时间片;TIMESHARING是每个任务一次使用的时间片数目。
两者决定了一个任务一次使用的最大时间片。
如假设一个系统中INT_CLOCK设置为10000,即10ms,那么TIMESHARING=1时,一个任务使用的最大时间片是 10ms;TIMESHARING=2时,任务使用最大的时间片是20ms;TIMESHARING=5时,任务使用最大的时间片是50ms;当 TIMESHARING设置为0时,系统就不会进行自动任务切换了,这时需要用os_switch_task函数进行任务切换。
这部分功能是RTX51 Tiny 2.0中新增加的。
2 关于os_wait延时的问题os_wait 是RTX51 Tiny中的基本函数之一。
它的功能是将当前任务挂起来,等待一个启动信号(K_SIG)或超时信号(K_TMO)或周期信号(K_IVL)或者是它们之间的组合。
作者:大海橡树前段时间给单片机写个跑马灯的程序,它是将单片机4组IO口全用了,一个引脚一个LED 一共32个,当初是拿出去当作品展用的,写了个程序,要求好几个花样,但是写程序的时候发现,单独控制一组端口还可以,要是同时控制4组IO口,并且显示的花样都不一样?该怎么办呢?这就要用的RTX51了,MCS-51单片机的RTOS(实时操作系统)。
RTX51简介:图(1)RTX51是德国KEIL公司开发的专门针对于8051内核兼容MCU所作的实时操作系统(RTOS),RTX51有两个版本:RTX51-FULL与RTX51-Tiny。
FULL版本支持四级任务优先级,最大256任务,它工作在类似于中断功能的状态下,同时支持抢占式与时间片循环调度、支持信号(signal)、消息队列、二进制信号量(semaphore)和邮箱(mailbox),其功能强大,仅仅占用6~8KB的程序存储器空间。
RTX51_Tiny是RTX51FULL的子集,是一个很小的内核,只占用大约800byte的存储空间(主要程序RTX51TNY.A51仅有不足一千行)它适用于对实时性要求不非常严格的、仅要求多任务管理且任务间通信功能不要求非常强大的应用。
它仅使用51内部寄存器来实现所有功能,应用程序只需要以系统调用(system call)的方式引用RTX51中的函数即可,RTX51-Tiny可以支持16个任务,多个任务遵循时间片轮转的规则,任务间以信号signal的方式进行通信,任务可以等待另一任务给他发出signal然后再从挂起状态恢复运行,它并不支持抢占式任务切换的方式。
上面只是RTX51的简单介绍,具体的用法自己到百度文库下载RTX51实时操作系统的使用方法:/view/0902ce1755270722192ef70d.html。
上面有详细的介绍,由于篇幅有限,这里就不做过多的介绍。
大家好好阅读文档上的内容,才知道怎么使用RTOS,刚开始接触的时候有点不好理解,多写几个程序练练手,就有点理解了,确实,要建立起操作系统的概念不是一两天的事情,其中要设计很多的抽象的概念,只有把他们完全理解了,才好应用。
RTX51 Tiny介绍μVision是德国K eil公司开发的单片机IDE软件,最初主要用于8051系列单片机,RTX51是其自带的运行于8051系列单片机上的小型多任务实时操作系统,可用来设计具有实时性要求的多任务软件。
RTx51有2个版本:RTX51 Tiny和RTX51 Full。
RTX51 Tiny是RTX51 Full的子集。
RTX51 Tiny 自身仅占用900字节左右的程序存储空间,可以很容易地运行在没有外部扩展存储器的8051单片机系统上。
它完全集成在Keil C5l编译器中,具有运行速度快、对硬件要求不高、使用方便灵活等优点,因此越来越广泛地应用到单片机的软件开发中。
它可以在单个CPU上管理几个作业(任务),同时可以在没有扩展外部存储器的单片机系统上运行。
目前在8051系列单片机上使用多任务实时操作系统,RTX51 Tiny也就成为了首选。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ RTX51 TINY允许同时“准并行”地执行多个任务:各个任务并非持续运行,而是在预先设定的时间片(time slice)内执行。
CPU执行时间被划分为若干时间片,RTX51 TINY为每个任务分配一个时间片,在一个时间片内允许执行某个任务,然后RTX51 TINY切换到另一个就绪的任务并允许它在其规定的时间片内执行。
由于各个时间片非常短,通常只有几ms,因此各个任务看起来似乎就是被同时执行了。
基于STC8A单片机的RTOS调度器设计作者:何春林来源:《西部论丛》2019年第08期随着时代的发展,市面流行的51单片机在各方面性能已显著增强,例如STC8A系列单片机就具有速度快、内存大、外设多等诸多优势。
然而当前51平台的实时操作系统(Real Time Operating System,RTOS)大都基于传统51芯片设计,功能受限大,已无法充分发挥硬件的性能[1]。
本文从充分发挥STC8A系列單片机的硬件特性出发,阐述在KeilC51平台下开发RTOS 内核过程中调度器的设计与实现的关键问题。
1、调度器设计调度器用于在RTOS中为各任务合理分配CPU的使用权[2]。
调度时机分为两类:当前任务因等待资源而让出CPU使用权,一般触发于后台环境;其他任务抢占当前任务的CPU使用权,一般触发于前台环境。
1.1 调度期间中断屏蔽问题.当RTOS在执行后台环境的任务调度期间,若发生中断又导致前台环境的任务调度得以执行,必然破坏后台任务调度的相关数据,导致系统崩溃。
因此一般RTOS都将任务调度规定为临界操作,通过中断屏蔽的方式确保调度过程不被打断[3]。
然而中断屏蔽会导致系统对外部事件的响应滞后,影响系统的实时性。
1.2 STC8A单片机硬件新特性.STC8A系列单片机的定时器T0具有不可屏蔽中断模式(模式3),根据官方手册,该模式专为RTOS的滴答定时器而设计[4]。
在该模式下,T0不受中断屏蔽的影响,不会停止运行,且具有最高中断优先级。
用它作为滴答定时器,RTOS便具有一颗稳定而高效的心脏,系统心跳更加精确,不会意外停止。
但是在使用T0的模式3作为滴答定时器时,由于其中断不可屏蔽,前后台任务调度冲突的问题不可避免。
1.3 调度器设计思路.通过分析可知,想要充分发挥STC8A单片机定时器T0的新特性,需要在设计调度器时寻求一些新的思路。
本文所述RTOS内核在设计调度器时借鉴了STM32系列单片机使用软中断进行任务调度的思想。
单片机在嵌入式系统中的实时操作系统应用嵌入式系统是指在一定范围内执行特定功能,具有实时性、可靠性、可控性、成本低、功耗低的设备。
嵌入式系统使用的核心部件是单片机,在其中,实时操作系统(RTOS)又是至关重要的部分。
本文将讨论单片机在嵌入式系统中运用实时操作系统的应用。
第一部分:什么是实时操作系统?实时操作系统(RTOS)是一种多任务嵌入式操作系统,它旨在为实时应用程序提供一种高效稳定、预测性强的任务处理方式。
RTOS通常需对处理器进行裁剪化,以实现高效的,有限的任务数处理能力[1]。
RTOS对于诸如机器人控制、无人机或自动驾驶汽车等实时应用程序而言特别重要。
第二部分:实时操作系统的分类有两种常见的RTOS分类:硬实时系统和软实时系统。
硬实时系统必须在特定的时间限制内执行任务,如果任务在其规定的时间内无法得到完成,则系统将会无法正常工作。
软实时系统不是特定的时间限制内执行任务,但也需要保证任务在其规定的时间内完成,否则系统可能会在一定程度上失真。
第三部分:单片机在嵌入式系统中的应用在嵌入式系统中,单片机广泛运用RTOS。
这种应用通常被用于需要高度可靠且时间预测能力的系统,如工业、航空航天及医疗设备。
由于单片机本身体积较小,成本低,功耗低等特点,员处理器设计使用RTOS可以有效的节省开发成本。
单片机所运行的实时操作系统可提高系统稳定性和性能,满足模糊控制,遥控控制等受时间和精度要求高的任务。
第四部分:如何选择RTOSRTOS在系统中的选择是由工程师依据应用程序的特点而决定的。
在选择RTOS时应充分考虑设备成本和性能需求。
对于非常受时间限制任务的系统,通常需要硬实时系统,而对于不需要特定时间限制但需要高度稳定性的系统,软实时系统则更加适合[2]。
结论本文介绍了单片机在嵌入式系统中运用实时操作系统的应用。
实时操作系统使单片机能够更好地实现机器人控制、无人机、自动驾驶汽车等实时应用程序。
在选择合适的RTOS时需要充分考虑应用程序的特点,以确保实时计算和正确性。
基于C51单片机的温度控制系统应用系统设计(附程序)基于C51单片机的温度控制系统应用系统设计--------- 单片机原理及应用实践周设计报告姓名:班级:学号:同组成员:指导老师:成绩:时间:2011 年7 月3 日单片机温度控制系统摘要温度是日常生活中无时不在的物理量,温度的控制在各个领域都有积极的意义。
很多行业中都有大量的用电加热设备,如用于热处理的加热炉,用于融化金属的坩锅电阻炉及各种不同用途的温度箱等,采用单片机对它们进行控制不仅具有控制方便、简单、灵活性大等特点,而且还可以大幅度提高被控温度的技术指标,从而能够大大提高产品的质量。
因此,智能化温度控制技术正被广泛地采用。
本温度设计采用现在流行的AT89S51单片机,配以DS18B2数字温度传感器,上、下限进行比较,由此作出判断是否触发相应设备。
本设计还加入了常用的液晶显示及状态灯显示灯常用电路,使得整个设计更加完整,更加灵活。
关键词:温度箱;AT89C52 LCD1602单片机;控制目录1引言11.1温度控制系统设计的背景、发展历史及意义11.2温度控制系统的目的11.3温度控制系统完成的功能12总体设计方案22.1方案一 22.2方案二 23DS18B20温度传感器简介73.1温度传感器的历史及简介73.2DS18B20的工作原理7DS18B20工作时序7ROM操作命令93.3DS18B20的测温原理98B20的测温原理:9DS18B20的测温流程104单片机接口设计124.1设计原则124.2引脚连接12晶振电路12串口引脚12其它引脚135系统整体设计145.1系统硬件电路设计14主板电路设计14各部分电路145.2系统软件设计16 系统软件设计整体思路系统程序流图176结束语2116附录22参考文献391引言1.1温度控制系统设计的背景、发展历史及意义随着社会的发展,科技的进步,以及测温仪器在各个领域的应用,智能化已是现代温度控制系统发展的主流方向。
嵌入式实时操作系统μC/OS在C51平台上的移植及应用的开题报告一、选题背景及研究目的嵌入式实时操作系统(RTOS)是嵌入式系统中广泛使用的操作系统,它为具有实时性要求的应用程序提供了资源管理、任务调度、通信机制等功能,大大提高了嵌入式系统的可靠性、可维护性和可扩展性。
其中,μC/OS是一个功能强大、可靠性高、开放式的RTOS,广泛应用于微处理器、嵌入式网络和控制系统等领域。
C51是一种广泛使用的8位单片机,具有成本低、易于使用等优点,广泛应用于消费电子、家电、汽车电子等领域。
本文旨在通过在C51平台上移植μC/OS,分析实现的过程、开发工具、硬件平台及移植后的应用效果,为嵌入式系统的开发提供技术支持和参考。
二、研究内容和方法本文的主要研究内容包括以下几个方面:1.μC/OS的介绍及功能特点2.C51平台的介绍及特点,以及μC/OS在C51平台上的需求分析3.μC/OS在C51平台上的移植过程,包括内存管理、任务调度、消息队列等4.移植后的测试和应用,包括任务执行时间、系统资源占用率、通信效率、可靠性等指标的测试,以及在实际应用中的效果5.总结与展望,对移植过程中遇到的问题进行总结,对嵌入式操作系统未来的发展趋势进行展望在研究方法上,本文采用了理论分析和实验验证相结合的方法。
首先,对μC/OS 的功能特点、内核原理等进行理论分析;其次,结合C51平台的特点进行需求分析和移植实现;最后,利用实验验证对移植后的系统进行实测和分析。
三、预期成果及意义本文的预期成果包括以下几个方面:1.基于C51平台成功移植μC/OS,并在实验中进行了测试和分析2.验证了在C51平台上利用μC/OS构建实时嵌入式系统的可行性和可靠性3.提出了在移植μC/OS时需要注意的问题和经验,为相关研究提供了参考本文的意义在于:1. 为嵌入式系统开发人员提供技术支持和经验总结,提高嵌入式系统开发的效率和可靠性;2. 推广μC/OS在C51平台上的应用,扩展其应用范围,促进嵌入式系统的发展;3. 贡献一份力量,推动嵌入式操作系统的发展,为自动化、智能化等领域的发展提供支撑和保障。
单片机中的实时操作系统RTOS概述在单片机应用中,实时性是至关重要的要素之一。
实时操作系统(Real-Time Operating System,RTOS)是一种专门设计用于满足实时性需求的操作系统。
本文将对RTOS进行概述,并介绍其在单片机应用中的重要性和优势。
一、RTOS的定义和特点实时操作系统(RTOS)是一种操作系统,其设计和实现旨在保证任务以可预测和保证的时间内得到正确执行。
实时任务是对时间敏感的任务,其输出结果必须在特定的时间限制内得到响应。
真正的实时操作系统能够保证任务满足其时间约束,并且具有可预测性、可信性、可靠性、高效性等特点。
二、RTOS的应用RTOS在单片机应用中具有广泛的应用。
无论是工业控制、汽车电子、医疗设备还是消费电子产品,都可以利用RTOS来实现任务的调度和管理。
RTOS的应用可以提高系统的实时性、可预测性和稳定性,满足多任务处理的需求。
三、RTOS的重要性1. 实时性要求:在很多单片机应用中,任务需要在特定的时间内完成,例如工业自动化控制中的传感器数据采集和实时控制。
RTOS具备优秀的实时性能,能够满足任务的时限要求,保证系统的可靠性和稳定性。
2. 多任务处理:单片机应用往往需要同时运行多个任务。
通过RTOS可以方便地进行任务调度和管理,提高系统运行效率和资源利用率。
RTOS的多任务处理机制能够按照优先级或其他调度算法合理分配任务的执行顺序,实现任务之间的协调和同步。
3. 硬件抽象:RTOS可以提供丰富的硬件抽象层,与底层硬件进行适配,简化单片机应用的开发过程。
通过RTOS的硬件抽象接口,开发者可以屏蔽底层硬件的差异,快速实现面向任务的高层应用程序。
四、RTOS的优势1. 可靠性:RTOS具备良好的容错和错误处理机制,能够保证任务的可靠性和系统的稳定性。
当出现异常情况时,RTOS能够及时检测和响应,进行错误恢复和处理。
2. 简化开发:RTOS提供全面和易用的任务管理、通信和同步机制,使开发者能够更高效地开发单片机应用。
单片机的实时操作系统单片机作为嵌入式系统的核心部件之一,广泛应用于各种电子设备中。
为了更好地满足实时性要求,单片机常常需要搭载实时操作系统(RTOS)。
本文将就单片机实时操作系统的原理、应用以及实现方式进行探讨。
一、实时操作系统的原理实时操作系统是一种能够满足任务严格的时序要求的操作系统。
它能够保证任务的及时响应,并在规定的时间内完成任务。
单片机实时操作系统的核心原理主要包括以下几个方面:1. 任务管理:实时操作系统能够对任务进行管理,按照优先级进行调度。
高优先级的任务将优先执行,保证了对实时任务的及时响应。
2. 中断服务机制:实时操作系统通过中断来实现对任务的及时响应。
当有高优先级任务到达时,操作系统会中断当前任务的执行,处理高优先级任务,然后再返回原任务的执行。
这样可以保证实时任务的执行不受阻塞。
3. 时钟管理:实时操作系统需要准确地控制任务的执行时间,因此需要精确的时钟管理。
单片机实时操作系统通常会使用定时器来提供时钟源,通过定时器中断控制任务的执行时间。
二、实时操作系统的应用单片机实时操作系统广泛应用于需要满足实时性要求的系统中,如航空航天、医疗器械、工业自动化等领域。
以下是实时操作系统在不同领域的应用实例:1. 航空航天领域:实时操作系统被广泛应用于飞行控制系统中,保证飞行器的稳定性和安全性。
它能够及时响应飞行器的各种传感器数据、控制指令,实时调整飞行参数。
2. 医疗器械领域:实时操作系统在医疗器械中的应用主要涉及到对患者生命体征的监测与控制。
例如,心电监护仪、呼吸机等设备需要通过实时操作系统及时获取患者的生理信号,并做出相应的处理和控制。
3. 工业自动化领域:实时操作系统在工业自动化中起到了至关重要的作用。
它能够实时响应各种传感器信号,控制工业设备的运行和生产流程,提高生产效率和质量。
三、实现单片机的实时操作系统目前,市场上有很多针对单片机的实时操作系统可以选择,例如RT-Thread、FreeRTOS等。
基于μC/OS-II的智能窗系统设计作者:张飞何雅琴来源:《现代电子技术》2008年第07期摘要:智能窗在国内智能建筑上获得了广泛的应用。
目前,国内大多数公司生产的智能窗都是基于前后台模式进行设计的。
以实时操作系统μC/OS-II为基础,简要介绍了基于实时操作系统μC/OS-II的智能窗系统的硬件设计方案,详细介绍了其软件的实现过程,并给出了部分源代码,最后介绍了本智能窗系统的优势所在。
关键词:智能窗;智能建筑;前后台系统;实时操作系统中图分类号:TP316文献标识码:B文章编号:1004-373X(2008)07-118-Design of Smart-Window Based on μC/OS-II(Changzhou Institute of Mechatronic Technology,Changzhou,213164,China)Abstract:The smart-window is used widely in the intelligent buildings of our country.In current,many companys design smart-window based on foreground/background system .This article briefly introduces the design of hardware about the smart-window based on the real-time operating system μC/OS-II.Moreover,the flow of software is described.Finally,the advantage of this smart-Keywords:smart-window;intelligent building;foreground/background system;real-time operating system随着电子技术的发展和人民生活水平的不断提高,智能窗已经越来越多地被用到了现代智能化建筑中,他提供住户一个安全、方便的环境。
嵌入式实时操作系统,可以充分的利用单片机的资源,提高CPU使用效率。
操作系统最主要就是实现任务的调度、管理。
同时对于实时操作系统来说响应时间很重要。
操作系统编写最主要就是用到了堆栈SP于RET指令。
这两个东西怎么用呢?其实在我们每次调用函数的时候都会自动将函数的断点地址(执行函数调用时的PC)压入到SP中,而从函数中返回时其实是利用RET指令将断点弹回到PC(程序指针)中。
所以利用堆栈和RET指令就可以实现简单的任务的切换。
这么说肯定挺模糊的,接下来一步一步解释。
首先,要知道任务是一个死循环。
如下面所示,可以看出两个任务都是死循环,按照以往的情况,程序是跳不出来的,只能在while(1)中无限执行。
那怎么才可以实现从task0到task1的切换呢?其实如果我们能够改变PC的值是不是就可以改变程序执行顺序了。
任务的调度切换就是利用改变PC的值来改变程序执行顺序的。
其次,就是要解决如何实现PC值的正确变换问题,如何让PC指向我们需要执行的地方。
这就是通过堆栈来实现的。
我们可以为每个任务建立一个堆栈用于保存任务PC的值,以及任务寄存器的值。
这样每次进行任务切换时只要从相应的堆栈中取出PC和寄存器的值就可以实现任务的调度了。
在程序中于寄存器相关的程序使用在C语言中嵌入汇编来实现的。
因为直接使用C语言不能直接控制寄存器。
在本程序中,入栈和出栈是通过汇编实现的。
一个简单的操作系统如下所示,只能实现简单的任务调度,延时。
必须注意,空闲任务(Idle)必须建立,否则会出错。
#include<reg52.h>#define OSEnterCritical() EA=0#define OSExitCritical() EA=1#define EnterInt() EA=0;#define uint unsigned short int#define uchar unsigned char#define MAX_Tasks 3#define False 0#define Ture 1#define MaxPrio 2#define IdlePrio MaxPrio#define OS_Task_Create_Error 1#define OS_Delet_Task_Error 2#define OS_Delet_Task_Not_Exit 3#define OS_Resume_Idle_Error 4#define OS_Resume_Task_Error 5typedef struct{uchar OSStackTop; //SPuchar OSSuspend;uchar OSTCBDly; //delay time}OSTCB;uchar code OSMapTbl[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};OSTCB OSTCBTbl[MAX_Tasks];volatile uchar OSRdyTbl;volatile uchar OSIntNesting; //用于中断锁死volatile uchar OSSchNesting; //任务切换上锁volatile uchar OSRuning=False;volatile uchar OSStartStack[MAX_Tasks][20];volatile uchar OSPoint[MAX_Tasks][2];volatile uchar OSPrioCur;//volatile uchar OSTaskPend;OSInit(){// uchar i;EA=0;ET0=1;TMOD=0x01;TH0=0xB1;TL0=0xE0;OSRdyTbl=0;OSIntNesting=0;OSSchNesting=0;}//PCL,PCH,ACC ,B,DPL,DPH,PSW,R0-R7uchar *OSStackInit(uint task,uchar *ptr,uchar OSPrio){uchar* stk;stk=ptr;OSPoint[OSPrio][0]=task;OSPoint[OSPrio][1]=task>>8;*(stk++)= OSPoint[OSPrio][0];*(stk++)= OSPoint[OSPrio][1];*(stk++)= 0x00; //ACC*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk++)= 0x00;*(stk) = 0x00;return stk;}uchar OSTaskCreate(uint task,uchar *ptr,uchar OSPrio){uchar* psp;OSEnterCritical();if(OSPrio<=MaxPrio) //创建的任务优先级有效{psp=OSStackInit(task,ptr,OSPrio); //初始化堆栈OSRdyTbl|=OSMapTbl[OSPrio];OSTCBTbl[OSPrio].OSStackTop=psp;OSTCBTbl[OSPrio].OSSuspend=0;OSTCBTbl[OSPrio].OSTCBDly=0;}else{OSExitCritical();return OS_Task_Create_Error;}OSExitCritical();}/*===================================================== 任务调度函数入口参数:无函数说明:进入函数后,先进行堆栈保护,然后查找最高优先级任务运行======================================================*/void OSSchedule(){uchar i;OSEnterCritical();#pragma asmPUSH ACCPUSH BPUSH DPHPUSH DPLPUSH PSWPUSH 0PUSH 7PUSH 1PUSH 2PUSH 3PUSH 4PUSH 5PUSH 6#pragma endasmOSTCBTbl[OSPrioCur].OSStackTop=SP;if(OSRdyTbl) //如果就续表中有任务{for(i=0; i<MAX_Tasks;i++){if((OSRdyTbl & OSMapTbl[i])&&(!OSTCBTbl[i].OSSuspend)) //任务优先级最高且未被挂起{OSPrioCur=i;break;}}}SP=OSTCBTbl[OSPrioCur].OSStackTop;#pragma asmPOP 6;POP 5;POP 4;POP 3;POP 2;POP 1;POP 7;POP 0;POP PSW;POP DPL;POP DPH;POP B;POP ACC;#pragma endasmOSExitCritical();}void OSStart(){TR0=1;EA=1;while(1);}/*=========================================================延时若干个系统时钟入口参数:延时系统时间个数===========================================================*/ void OSDelay(uchar time){if(time==0)//延时为0,返回return;OSEnterCritical();OSTCBTbl[OSPrioCur].OSTCBDly=time;OSTCBTbl[OSPrioCur].OSSuspend=1;OSExitCritical();OSSchedule();}/*=========================================================任务删除函数入口参数:为被删除任务优先级函数说明:将任务从就绪表中删除===========================================================*/ uchar OSTaskDelet(uchar priority){OSEnterCritical();if(priority>=IdlePrio){OSExitCritical();return OS_Delet_Task_Error;}if(!(OSRdyTbl & OSMapTbl[priority])){OSExitCritical();return OS_Delet_Task_Not_Exit;}OSRdyTbl &= ~(OSMapTbl[priority]);OSExitCritical();if(priority<OSPrioCur){OSSchedule();}}/*=========================================================任务恢复函数入口参数:恢的任务优先级函数说明:恢复被OSTaskDelet()删除的任务===========================================================*/ uchar OSTaskResume(uchar priority){OSEnterCritical();if(priority==IdlePrio)//恢复的任务不能为空闲任务,为空闲任务返回错误标志{OSExitCritical();return OS_Resume_Idle_Error;}if((!(OSRdyTbl & OSMapTbl[priority])) && (priority>=0)){OSRdyTbl |= (OSMapTbl[priority]);}else //返回的任务不存在,返回错误标志{OSExitCritical();return OS_Resume_Task_Error;}OSExitCritical();if(priority<OSPrioCur){OSSchedule();}}/*=============================================================== 定时器0用于产生系统时钟,这里每过20ms中断一次。
基于51单片机实验报告(计算器)一.计算器模块1.功能介绍利用8051 单片机硬件资源和常用外围电路如LCD1602,七段数码管,时钟(DS1302)温度传感器(18B20)等实现一个能做简单四则运算,并具有时钟显示,温度显示附加功能的计算器。
2.设计方案利用STC89C52为内核的单片机,PC机。
四则运算利用4*4矩阵键盘实现从0—9和运算符号的输入,并将操作过程和结果显示在LCD1602上。
时钟显示和温度显示,可以利用DS1302产生年份,月份,日期,星期,时,分,秒的数据,并将数据送往LCD1602显示,同样可以利用单片机开发板上面集成的DS18B20温度传感器来测试周围环境的温度,将获取的温度通过在LCD1602来显示。
系统设计框图3.具体实现代码计算器四则运算部分主要分为键盘扫描的键值读取,判断运算符号实现乘除优先级计算,LCD1602显示。
键盘扫描常用的有行扫描法,线反转法,此处我们用行扫描法,可以更明了读取键值。
unsigned char temp;key = null;//第一行按键P3 = 0xfe;temp = P3;temp = temp & 0xf0;if (temp != 0xf0){delay(10); //延时软件去抖动temp = P3;temp = temp & 0xf0;if (temp != 0xf0) //确认有键按下{temp = P3;switch (temp){case 0xee:key = 'D'; //读键值break;case 0xde:key = 0;break;case 0xbe:key = '=';break;case 0x7e:key = '/';break;}flag++;}}读完按键值之后我们需要读取运算的数字与运算符号,通过判断键值为数字则通过nun=nun*10+key,计算出数字,判断键值为运算符号则读出数字和键值。