51单片机的实时操作系统的研究--武汉科技大学(完整版,内含源代码)

合集下载

51单片机实验代码

51单片机实验代码

一、 实验目的 掌握汇编语言设计和调试方法,熟悉键盘操作。

二、 实验内容把2000H~20FFH 的内容清零。

三、 实验程序框图四、 实验步骤 用连续或单步的方式运行程序,检查 2000~20FF 中执行程序前后的内容变化。

五、 思考假使把2000H~20FFH 中的内容改成 FF ,如何修改程序。

六、程序清单文件名:ORG 0000H LJMP SE01 ORG 0640HSE01: MOV R0,#00HMOV DPTR,#2000HLOO1: CLR AMOVX @DPTR,A INC DPTR INC ROCJNE R0,#00 H,L OO1LOOP: SJMP LOOPEND;(0000H )送 DPTR;0 送(DPTR;DPTR+1 ;字节数加1 ;不到FF 个字节再清一、实验目的掌握汇编语言设计和调试方法二、实验内容把2000H的内容拆开,高位送2001H低位,低位送2002H低位,2001H、2002H高位清零,一般本程序用于把数据送显示缓冲区时用。

三、实验程序框图四、实验步骤用连续或单步方式运行程序,检查2000H~2002 H中内容变化情况。

五、思考如何用断点方式调试本程序六、程序清单文件名:ORG 0000HLJMP SE02ORG 0660HSE02: MOV DPTR,#2000HMOVX A,@DPTRMOV B,A SWAP A ANL A,#0FH INC DPTR ;(2000) T A^ B ;交换;屏蔽高位MOVX @DPTR,AINC DPTR MOV A,B ANL A,#0FH MOVX@DPTR,A LOOP: JMP LOOPEND;送2001H;(2000)内容屏蔽高位;送2002H四、实验步骤在R2、R3中输入源首址(例如OOOOH), R4 R5中输入的目的地址(例如2000H),R6R7中输入字节数(例如仆FFH,运行程序,检查0000H~1FFFH中内容是否和2000H~3FFFH中内容完全一致。

51单片机操作系统的实现+源代码

51单片机操作系统的实现+源代码

51单片机操作系统开发中的问题与技巧附代码引言51系列单片机是美国Intel公司在1980年推出的高性能8位单片机,在我国的应用非常广泛。

目前,在软件设计中需要软件工程师从底层做起,在系统软件设计方面需要做大量的重复性劳动。

如果开发一套基于51系列单片机的操作系统,那么用户只需要编写各个任务的程序,不必同时将所有任务运行的各种情况记在心中,不但大大减少了程序编写的工作量,而且减少了出错的可能性。

1 开发平台的选择和论证开发平台的选择至关重要,因为有时它不光影响进度、产品质量、可维护性等一般问题,还涉及到方案的可实现性。

在本系统中,选择51系列单片机作为操作系统的运行平台有以下原因。

首先,51系列单片机应用非常广泛,一大批性能优越的51兼容单片机相继推出。

这里包括:低功耗、高速度和增强型的Philips公司的系列产品;完美地将Flash(非易失闪存技术)EEPROM与80C51内核结合起来的Atmel公司的系列产品;在抗干扰性能,电磁兼容和通信控制总线功能上独树一帜,其产品常用于工作环境恶劣场合的Siemens公司的系列产品以及一些其它公司的产品。

既然产品如此丰富,性能如此优越,那么在处理多任务并且对实时性要求严格的系统设计中,为了充分挖掘单片机的潜能(尤其是在实时性方面),也是为了简化开发的过程,基于51系列单片机的实时操作系统的需求就十分强烈了。

Keil公司的RTX51 Full就是一个基于51系列单片机的有实用价值的实时操作系统,但该操作系统是一个源码不公开的收费软件。

其次,借助于Keil C51的集成开发环境,完全可以开发出适用于51系列单片机的操作系统代码。

Keil C51软件提供丰富的库函数和功能强大的Windows界面集成开发调试工具。

另外重要的一点,Keil C51生成的目标代码效率非常高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时,更能体现高级语言的优势。

C编译器能产生可重入代码,而且用C语言可以打开和关闭中断。

第3章 MCS-51单片机指令系统和汇编语言程序示例 136页 4.7M

第3章  MCS-51单片机指令系统和汇编语言程序示例 136页 4.7M

(7) bit:表示可位寻址的直接位地址。
(8) (X):表示X单元中的内容。
(9) ((X)):表示以X单元的内容为地址的存储器单元内容,
即(X)作地址,该地址单元的内容用((X))表示。
(10) / 和→符号:“/”表示对该位操作数取反,但不影响该
位的原值。“→”表示操作流程,将箭尾一方的内容送入箭头 所指另一方的单元中去。
第3章 MCS-51单片机指令系统和汇编语言程序示例
3.2.7 位寻址
位寻址是在位操作指令中直接给出位操作数的地址,可以 对片内RAM中的128位和特殊功能寄存器SFR中的93位进行寻 址。
第3章 MCS-51单片机指令系统和汇编语言程序示例
3.3 数据传送类指令
第3章 MCS-51单片机指令系统和汇编语言程序示例
采用机器语言编写的程序称之为目标程序。采用汇编语言编写
的程序称之为源程序。计算机能够直接识别并执行的只有机器 语言。汇编语言程序不能被计算机直接识别并执行,必须经过 一个中间环节把它翻译成机器语言程序,这个中间过程叫做汇 编。汇编有两种方式:机器汇编和手工汇编。机器汇编是用专
门的汇编程序,在计算机上进行翻译;手工汇编是编程员把汇
是用于访问高128个单元的特殊功能寄存器SFR的唯一方法。由于 52子系列的片内RAM有256个单元,其高128个单元与SFR的地址 是重叠的。为了避免混乱,单片机规定:直接寻址的指令不能访 问片内RAM的高128个单元(80H~FFH),若要访问这些单元只能用 寄存器间接寻址指令,而要访问SFR只能用直接寻址指令。另外, 访问SFR可在指令中直接使用该寄存器的名字来代替地址,如 MOV A,80H,可以写成MOV A,P0,因为P0口的地址为80H。 直接寻址访问程序存储器的转移、调用指令中直接给出了程 序存储器的地址,执行这些指令后,程序计数器PC的内容将更换 为指令直接给出的地址,机器将改为访问以所给地址为起始地址

rtx51小型实时操作系统的应用体会

rtx51小型实时操作系统的应用体会

rtx51小型实时操作系统的应用体会2007年06月27日星期三 23:53最近在做设计的时候老遇到一些几个任务需要同时进行的情况,刚开始想自己去做一个多任务的程序(因为称不上系统),想用一个脉冲计数的方法来实现多任务切换,但是感觉实现起来比较麻烦。

无意中发现了51单片机下个rtx51实时操作系统(本人以前不知道的),后来就去找相关资料。

发现这方面的资料在网上很少,也很杂乱。

经过一段时间的学习,我有了个大概的了解。

下面给大家讲述一下:RTX51是一个用于8051系列处理器多任务实时操作系统。

RTX51可以简化那些复杂而且时间要求严格的工程的软件设计工作。

有二个不同的RTX51版本可以利用:RTX51 Full 使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换 RTX51工作在与中断功能相似的状态下信号和信息可以通过邮箱系统在任务之间互相传递你可以从一存池中分配和释放内存你可以强迫一个任务等待中断超时或者是从另一个任务或中断发出的信号或信息RTX51 Tiny 是一个RTX51的子集它可以很容易地在没有任何外部存储器的单片8051系统上运转。

除了下列例外 RTX51 Tiny支持许多在RTX51中的特征。

RTX51 Tiny仅支持时间片轮转任务切换和使用信号进行任务切换不支持抢先式的任务切换。

不包括消息历程。

没有存储器池分配程序。

RTX51使用一个8051硬件计时器中断作为定时程序。

产生的周期性中断用于驱动 RTX51时钟。

RTX51不需要在你的程序中拥有一个主函数它将自动开始执行任务 0 如果你确实有一个主函数你必须利用 RTX51 Tiny中的 os_create_task函数或 RTX51中的os_start_system函数手工启动 RTX51。

下列例子显示一个只使用时间片轮转任务调度的简单的 RTX51应用程序在本程序里的二个任务是简单计数器回路 rtx51开始执行函数名为 job0的任务 0 。

51单片机的实时操作系统

51单片机的实时操作系统

51单片机的实时操作系统摘要:从Keil C51的内存空间管理方式入手,着重讨论实时操作系统在任务调度时的重入问题,分析一些解决重入的基本方式与方法:分析实时操作系统任务调度的占先性,提出非占先的任务调度是能更适合于Keil C51的一种调度方式。

为此,构造这一实时操作系统,并有针对性地介绍此系统的堆管理方法、任务的建立以厦任务的切换等。

关键词:51单片机实时操作系统任务重八调度目前,大多数的产品开发是在基于一些小容量的单片机上进行的。

51系列单片机,是我国目前使用最多的单片机系列之一,有非常广大的应用环境与前景,多年来的资源积累,使51系列单片机仍是许多开发者的首选。

针对这种情况,近几年涌现出许多基于51内核的扩展芯片,功能越来越齐全,速度越来越快,也从一个侧面说明了51系列单片机在国内的生命力。

多年来我们一直想找一个合适的实时操作系统,作为自己的开发基础。

根据开发需求,整合一些常用的嵌入式构件,以节约开发时间,尽最大可能地减少开发工作量;另外,要求这个实时操作系统能非常容易地嵌入到小容量的芯片中。

毕竟,大系统是少数的,而小应用是多数而广泛的。

显而易见,μC/OS?II是不太适合于以上要求的,而Keil C所带的RTX Tiny 不带源代码,不具透明性,至于其FULL版本就更不用说了。

1 KeiI C51与重入问题说到实时操作系统,就不能不考虑重入问题。

对于PC机这样的大内存处理器而言,这似乎并不是一个很麻烦的问题,借用μC/OS?II RTOS的说法,即要求在重入的函数内,使用局部变量。

但5l系列单片机堆栈空间很小,仅局限在256字节之内,无法为每个函数都分配一个局部堆空间。

正是由于这个原因,Keil C51使用了所谓的可覆盖技术:①局部变量存储在全局RAM空间(不考虑扩展外部存储器的情况);②在编译链接时,即已经完成局部变量的定位;③如果各函数之间没有直接或间接的调用关系,则其局部变量空间便可覆盖。

大学课件MCS51单片机指令系统与汇编语言程序设计

大学课件MCS51单片机指令系统与汇编语言程序设计

ANL C, P ; (C)← (C)∧(P)
其中:P是PSW的第0位,C是PSW的第7位。
(4)字节符号地址(字节名称)加位序号的形式。对于部分特 殊功能寄存器(如状态标志寄存器PSW),还可以用其字节名 称加位序号形式来访问某一位。AC 如:
定义:操作数存放在MCS-51内部的某个工作寄存器Rn (R0~R7)或部分专用寄存器中,这种寻址方式称为 寄存器寻址。
特点:由指令指出某一个寄存器的内容作为操作数。 存放操作数的寄存器在指令代码中不占据单独的一个 字节,而是嵌入(隐含)到操作码字节中。
寻址范围:四组通用寄存器Rn(R0~R7)、部分专用 寄存器( A, B, DPTR, Cy )。
伪指令只出现在汇编前的源程序中,仅提供汇编用的某些控制 信息,不产生可执行的目标代码,是CPU不能执行的指令。
(1)定位伪指令ORG
格式:ORG n
其中:n通常为绝对地址,可以是十六进制数、标号或表达式。
功能:规定编译后的机器代码存放的起始位置。在一个汇编 语言源程序中允许存在多条定位伪指令,但每一个n值都应和前
2.2.2 直接寻址
定义:将操作数的地址直接存放在指令中,这种寻址方式称为 直接寻址。 特点:指令中含有操作数的地址。该地址指出了参与操作的数 据所在的字节单元地址或位地址。计算机执行它们时便可根据 直接地址找到所需要的操作数。
寻址范围:ROM、片内RAM区、SFR和位地址空间。P42
2.2.3 寄存器寻址
定义:指令中给出的操作数是一个可单独寻址的位地址,这种寻址 方式称为位寻址方式。
特点:位寻址是直接寻址方式的一种,其特点是对8位二进制数中 的某一位的地址进行操作。
寻址范围:片内RAM低128B中位寻址区、部分SFR(其中有83位 可以位寻址)。

基于8051系列单片机的实时操作系统设计

基于8051系列单片机的实时操作系统设计

第25卷 第1期 桂林工学院学报 Vol.25No.1 2005年1月 JOURNAL OF G U I L I N UN I V ERSI TY OF TECHNOLOGY Jan12005文章编号:1006-544X(2005)01-0128-05基于8051系列单片机的实时操作系统设计李明强,程小辉,沈 旭(桂林工学院电子与计算机系,广西桂林 541004)摘 要:8051系列单片机系统广泛应用于工控、仪器仪表、通信等领域,为了避免其软件开发的重复性工作,提高所编软件的可靠性,结合自主开发的、基于AT89C51单片机为核心的硬件平台,实现了一个基于该平台的实时操作系统.该操作系统具有一个基于C语言的、实时多任务的内核,有较好的移植性.关键词:实时操作系统;嵌入式系统;单片机;调度器中图分类号:TP316.2 文献标识码:A单片机在嵌入式微控制系统应用中具有十分重要的地位.在嵌入式系统中使用实时操作系统已经成为嵌入式应用的一种趋势,是单片机高水平应用开发的一个标志[1-4].一个好的实时操作系统可大大提高控制产品的研制效率,缩短开发时问,有利于多人的分工协作,用RT OS开发的产品稳定性、可靠性也会得到提高.1硬件平台简介1118051系列微控制器简介目前,8051系列芯片已达400多种,可分成3个主要类别:标准8051系列、小型8051系列和扩展8051系列.小型8051系列是8051系列芯片中低成本的类别,端口管脚数目少,不支持片外存储器,主要应用在低成本的消费类产品;扩展8051系列是8051芯片中加有扩展的片上设备,如CAN总线控制器、DAC、ADC等,其端口管脚数目比较多,且最近的此类芯片都支持大容量的片外存储器,主要应用在工业及汽车系统中[5].本文所述操作系统的硬件平台使用的微控制器是标准8051系列芯片.因为小型以及扩展的8051系列芯片都是由标准8051系列芯片衍变而来,所以本系统也可以在任何基于8051系列芯片的嵌入式系统上进行移植.112硬件平台一个典型的单片机应用系统包括基本部分、输入部分(测控增强部分)和输出部分(外设增强部分).基本部分主要是单片机及其外围芯片的扩展(如RAM和ROM)、功能键盘、显示器的配置等,它们是通过内总线连接而成.测控增强部分主要由传感器、变送器、转换器等接口及伺服驱动控制接口构成.外设增强部分主要是外设接口,它通过I/O口或扩展的I/O口构成,可接打印机等外设.该实时操作系统是基于AT89C51单片机为核心的单片机系统硬件平台上实现的,其结构如图1所示.图1 硬件平台结构Fig11 Structure of hardware p latfor m收稿日期:2004-12-13基金项目:广西区科技攻关项目(桂科攻02350142)作者简介:李明强(1980-),男,硕士研究生,研究方向:嵌入系统.2实时操作系统的设计211实时系统的特点对于实时响应时间,不同的应用系统有不同的要求,即使在同一个应用系统内部,不同的应用场合也有不同的要求.在实时系统里,除了实时响应外,另外一个问题是系统的流通量或吞吐量,实时系统的吞吐量可以定义为每单位时间系统可以处理的事件个数[2].实时任务具有截止期,分硬实时、软实时和固实时.硬实时是指如果响应超过了任务截止期,可能会导致严重后果;软实时是指虽然响应超过了任务截止期,但还是有一定的价值;固实时是指如果超过了截止期才响应处理,就完全没有价值了.实时任务具有可预测性,在最坏情况下的,都要求对最坏情况的预测与实际的差别尽可能的小,即使在出现峰值负载时,也应满足其截止期.212实时操作系统与实时系统的关系及其特点实时操作系统是实时系统软件的基础,所实现的功能是系统资源的管理和机器功能的扩充[2].因此实时操作系统和通用操作系统是有一定差别的,有其自己的一些重要特征,包括进程切换快、中断被屏蔽时间短、规模小等.213嵌入式系统的2种触发方式在嵌入式系统设计时,通常采用事件触发和时间触发2种方式来实现[1].事件触发行为往往通过使用中断实现,事件触发系统在系统总体结构上往往通过提供多级中断服务程序来支持该功能.如果多个中断源可能在“随机的”时间间隔产生中断,则中断响应可能被遗漏[1].8051的体系结构支持高和低两种不同的中断优先级,将可能出现中断信息丢失的情况.例如,有高优先级的中断1发生,并在极短的时间内又发生了中断2,这时无论中断2是高优先级还是低优先级中断,中断2的响应都会被延迟,并在一些情况下(如被延迟时间过长等)被完全忽略.因此,在某些与安全相关的应用系统中选用时间触发方法,这样设计人员能预先安排可控的顺序,保证一次只处理一个事件,提高了系统的可靠性并降低CP U的负荷,减少存储器的使用量.214调度器的设计调度器可以看作是一个简单的操作系统.从底层的角度来看,调度器可看作是一个由许多不同任务共享的定时器中断服务程序[1],允许以周期性或单次方式来调用任务,其分为合作式调度器与抢占式调度器两大类:合作式调度器提供的是一种单任务的系统结构,比较简单,用很少的代码就可实现,每次只需为一个任务分配存储器,具有可预测性和可靠性,但是在当前的程序运行期间,系统对外界的变化不敏感;抢占式调度器提供了一种多任务的系统结构,比较复杂,必须为抢占任务的所有中间状态分配存储器,对外部事件的响应速度快,但其可预测性和可靠性较低.实时系统的任务都有一个截止期,单独使用抢占式调度方式或合作式调度方式都不能完全满足实时系统的要求,必须使用一种混合式调度器,根据实时系统的要求来设置定时器的定时时间.假设有2个任务,1个必须在20m s内完成,另1个必须在30m s内完成,因此取它们的最大公约数10m s来作为定时器的定时时间.使用定时器0的模式1来进行定时,则可以计算出T0的初值为T0D8F0H,程序实现如下(部分程序):#define p re_t0H0x D8#define p re_t0L0xF0//根据定时时间计算出的初值void ti m er_t0_init(v oid){T MOD=0x10;//设置定时器0的工作模式TH0=p re_t0H;T L0=p re_t0L;//送初值,定时时间为10m sTR0=1;//启动定时ET0=1;//T0开中断EA=1;//CP U开中断}void atte mper_ti m er0(void)interrup t2using1//定时器0的中断服务程序{//定时时间到,判断是否进行任务切换(选择最高优先级的任务来执行,代码略)}调度器根据在系统进行初始化时用户的预设值将中断和某些外设设置为抢占式任务,抢占式任务是最高优先权的任务.在调度期间,只有1个抢占式任务,该任务一旦开始运行将连续运行到其完成,以减少任务切换所耗费的时间,因此要求这些中断处理任务和外设处理任务的时间必须小于定时器的时间间隔,尽量更短,否则会影921第25卷 第1期 李明强等:基于8051系列单片机的实时操作系统设计响系统对其他中断的响应或对其他设备的处理.对于除用户预设的中断和外设之外的事件将采用分时方式进行处理.215任务及任务间通信每个任务都分配在不同的存储空间,通过指针变量3T ASK_pnum来指向任务的首地址.每个任务都有自己的存在状态(运行态、就绪态、休眠态、挂起态和被中断态)和优先级(为了解决任务优先级翻转问题,系统可以通过函数void p ri o_change(un2 signed int3task_adr,unsigned char p ri o_st,unsinged char p ri o_ced)来动态调整任务的优先级),任务间使用信号量或消息队列来进行互相通信.任务的数据结构定义如下:typedef struct{unsigned char task_name;//任务名unsigned char realtask;//是否为实时任务,0为否,其他为是unsigned char p ri o;//任务优先级unsigned char state;//任务状态unsigned char err;//出错信息unsigned char3p t os;//栈顶指针unsigned int stk_size;//堆栈大小(以字节为单位)}T ASK;216中断处理系统中的实时任务不仅包括某些中断处理,还包括部分外设处理任务.中断是一种硬件机制,用于通知CP U有异步事件发生了,系统对中断(T0除外)分2步处理,第1步是中断响应,第2步是中断处理,共有3种处理方式.(1)在中断发生之前不存在实时任务,并且在中断处理过程中也没有其他的中断发生.中断响应:系统进入临界区,保存当前任务的信息,退出临界区并返回系统.中断处理:由调度器将该中断任务设置为实时任务并执行到结束,系统进入临界区,恢复被打断的非实时任务的信息,并执行该任务.(2)在中断发生之前不存在实时任务,但在中断处理过程中有其他的中断发生.中断响应:系统进入临界区,保存当前任务的信息,退出临界区并返回系统.中断处理:由调度器将该中断任务设置为实时任务并执行到结束,选择所发生的中断中急需处理的任务设置为实时任务并立即执行该任务.(3)在中断发生之前已存在实时任务,无论在中断处理过程中有没有其他的中断发生,系统的处理过程都是一样的.中断响应:系统进入临界区,修改中断发生标识,退出临界区并返回系统.中断处理:系统继续执行当前实时任务直到结束,选择所发生的中断中急需处理的任务设置为实时任务并立即执行该任务.临界区是指在此段时间内,不允许有任何事件来打断当前任务,比如在保护和恢复中断现场时,为了避免现场信息受到破坏,一般会关掉中断进行处理.如外部中断1的处理程序如下(通过外部中断1和P1口扩展了4个中断,外部中断1比外部中断0的优先级低).#define init_open()EA=1//CP U开中断#define init_cl ose()EA=0//CP U关中断extern unsigned char data init_sy mbol=0xE0//该变量低5位,表示5个中断发生的标识,其中低4位分别对应P110~P113扩展的中断,第5位(低到高)表示中断0 extern unsigned char data real_task=0void init1_res p(void)interrup t3using3{init_cl ose();if(real_task==0){//保存当前任务现场}else{//保留P1的低4位,第5位清零,然后与init_sy m2 bol相或}real_task++;init_open();//返回系统}void init1_deal(void){if(real_task==1){//执行中断处理程序init_cl ose();//恢复任务现场init_open();real_task--;//返回系统执行被中断的任务}else{//继续当前任务real_task--;//判断下一个优先级高的中断并调用该中断处理程序(代码略)}}217存储器管理031桂 林 工 学 院 学 报 2005年使用链表对存储器进行管理,对每个未分配的空闲区按位置顺序进行拉链,每次分配时,从头搜索空闲表,找到第1个满足要求的空闲区就进行分配,但其大小不一定刚好等于所需要的,将其分成2个区,1个按所需分配出去,另1个则仍为空闲区并留在原位置.链表的数据结构定义如下:typedef struct{ME M_chaintb3p rve,3next;//前指针和后指针unsigned int addr_start;//空闲区的起始地址unsigned int addr_size;//空闲区的大小(以字节为单位计算)}ME M_T ABLE;218外围设备的管理外部设备主要使用该外设对应的驱动程序.每个所使用到的设备都有自己的私有存储空间,数据结构随设备的类型不同有所变化.对于需要CP U周期性服务的设备(如本系统中的LCD和键盘),给它们分配相应的任务,与用户任务一起调度,实现起来比较简单.有些设备具有自己的中断(如串口),则可以利用消息队列将用户任务需要的服务通过消息队列排队、缓冲起来,利用中断功能服务.对于既没有自己的中断又不需要CP U周期性服务而且速度较慢的设备,定义一个宏,在宏中申请信号量,然后调用对设备操作的函数并释放信号量.3系统调试由于当初考虑只是要实现一个实时操作系统,所以笔者设计的硬件平台只是向用户提供了总线接口(增大了驱动后的总线接口)、外部中断接口(对外部中断进行了扩展)和I/O口(RAM的地址空间0FF00H~0FFFFH用作了I/O口),并没有将测控增强部分(模拟量、开关量和数字量的检测)及外设增强部分(外设、伺服控制和开关量控制)放入硬件平台,但在操作系统中编写了某些模块的驱动(如A/D模块的AD574A, ADC0809,D/A模块的DAC0832等).将该操作系统烧入了程序存储器后再进行调试.311键盘和LCD字符显示器的调试该步调试要求在LCD字符显示屏上显示预定键对应的英文字母.在没有其他外部事件发生时,测试结果良好;有外部事件发生时,键盘的反应较慢,有时出现不能对按键的反应,并且LCD字符显示器的刷新时间间隔变长.解决方法:将软件延时程序改为用定时器进行延时.312中断和外设调试中断调试要求能及时响应中断并处理中断任务(短任务);外设调试要求能正确处理外设向CP U发送的信息并能够将处理后的信息正确地送出去.用预留的一个I/O口(实际是某一个地址)来模拟中断发生,中断采用边沿触发方式,这样对外部地址的一个读或写操作占用的时间完全满足外部中断的高电平和低电平持续时间不短于一个状态周期的要求;用拨码开关、电阻、二极管和74HC245模拟输入设备;用74HC373、电阻和二极管模拟被控的外设.要求在有中断发生时从指定设备上读出数据,并将读取的数据取反,取反后的数据写入到指定的输出设备.测试结果显示,该操作系统能够在该硬件平台上良好的运行,但在模拟工业的某些环境下,在预留的接口上有时会有干扰信号输入,所以对系统软件进行了修改,即在操作系统进行初始化的时候,提示用户指出所用到的外部中断接口及硬件平台预留的I/O 口,系统对于除此之外的中断和预留的I/O口所产生的输入信号一律拒绝响应.如果用户需要动态的增加或删除外设,可通过键盘进入系统设定模式进行设置,这时系统会通过函数void ex_init_ set(unsigned char ex_init_num)和void ex_p rI O_set (unsigned char ex_I O_nu m)来修改初始化时的用户对外部中断和外设的设定,在该模式下,系统将关掉所有外部中断和外设,只响应键盘和刷新屏幕,待设置完成之后再恢复到系统的实时模式下.4实时操作系统在智能温度调节器中的应用411智能温度调节器简介智能温度调节器由系统控制模块、键盘模块、显示模块、温度采集模块和温度调节模块5部分组成.系统控制模块由单片机(AT89C51)和数据存储器(62256)组成;键盘模块由1个16键键盘构成;显示模块由1个4×16的字符型液晶显示器组成;温度采集模块由1个温度传感器、1片AD574A及相关电路组成;温度控制器由1片DAC0832及相关电路组成.131第25卷 第1期 李明强等:基于8051系列单片机的实时操作系统设计412实时操作系统在该仪器中的应用根据该系统的功能模块将其分成5个普通任务和1个中断任务,5个普通任务按优先级从高到低进行如下排列:数据采集任务、温度调节任务、键盘扫描任务、键盘处理任务和显示任务.中断任务的功能是判断数据采集是否结束.由于该仪器要求每015s采样1次,屏幕每2 s刷新1次,键盘去抖动的时间为50m s,故将定时器T0的定时时间设定为50m s,作为调度器的基本调度时间单位.系统的存储空间进行了如下划分:16个字节作为键盘输入缓冲区,64个字节作为显示输出缓冲区,8个字节作为温度调节任务初始值的存放地址空间(包括基准值等),其余的作为温度采样值的存储空间,以方便观测温度的变化规律.在该系统中温度的采样值是一个非常重要的变量,涉及到数据采集、温度调节和显示3个任务,因此使用信号量进行这3个任务之间的通信.对信号量做如下设定:用1个字的空间来存放该变量,低字节存放变量值,高字节表示现在的状态.系统中只有1个中断任务,因此中断任务的处理相对非常简单.5结束语实时多任务操作系统是当前单片机软件系统的发展方向[3],它使整个计算机系统实现了自动化,具有高效率和高可靠性,实用价值较高.很多实时系统应用在非常重要的地方,所以对系统的可靠性和安全性有着比较高的要求.实时操作系统在智能温度调节器上能够稳定的运行,但该系统在可靠性与安全性等方面仍需进一步的完善.参考文献[1]M ichael J Pont.时间触发嵌入式系统设计模式[M].周敏译.北京:中国电力出版社,2004:5-10.[2]郑宗汉.实时系统软件基础[M].北京:清华大学出版社,2003:7-9.[3]陈明计,周立功.嵌入式实时操作系统S mall RT OS51原理及应用[M].北京:北京航空航天大学出版社,2004: 12-14.[4]谢宜仁.单片机实用技术问答[M].北京:人民邮电出版社,2003:7-10.[5]M ichael J Pont.C语言嵌入式系统开发[M].陈继辉译.北京:中国电力出版社,2003:11-13.D esi gn of RTO S Ba sed on the8051M i crocon trollers Syste mL IM ing2qiang,CHENG Xiao2hui,SHEN Xu(D epart m ent of E lectron ics and Co m puter Science,Guilin U niversity of Technology,Guilin541004,China)Abstract:The syste m of8051single2chi p computer is w idely app lied in industry contr ol,apparatus and com2 municati on fields.To avoid the repeated work in p r ogra m writing and i m p r ove reliability of the s oft w are,a RT OS based on the p latfor m can be realized by the syste m combined w ith the hardware p latf or m of AT89C51 single2chi p computer.The operati on syste m has a realti m e multitask core w ritten in C,which is easy t o be trans2 p lanted.Key words:RT OS;e mbedded syste m;single2chi p computer;scheduler231桂 林 工 学 院 学 报 2005年。

最新武汉科技大学51单片机实现简易计算器

最新武汉科技大学51单片机实现简易计算器

二○一六~二○一七学年第一学期信息科学与工程学院电子技术综合设计(二)课程设计报告班级:电信1401班姓名:程赐项志雄学号:201404135016 201404135015指导教师:左韬二○一六年十二月一日一、实验要求利用普中科技HC6800-ES V2.0单片机开发板设计一款带蜂鸣器的电子计算器。

主要使用开发板上的数码管、LED点阵、矩阵键盘、蜂鸣器等模块功能。

开发板配有光盘,里面有各个模块的使用说明和程序范例可供参考。

1)每2位同学分工协作。

2)上电开机或者复位键按下之后,2个4位数码管分别自动显示2个同学学号的后4位。

3)定义矩阵键盘的S1-S9代表数字按键1-9,键盘S10代表数字按键0,键盘S11-S16分别代表按键+、-、×、÷、=、C,其中C按键为计算器清零按键,按下C键计算器开始新的计算。

4)计算器计算过程中,用LED点阵显示+、-、×、÷运算符号,用8位数码管显示键入的数字和运算的结果。

键入时依次显示并自动移位,例如18+9=27,先键入1,显示1,再键入8,1自动左移一位显示18,键入+,LED点阵显示+,键入9,数码管之前显示的18消失并重新显示为9,键入=,数码管显示运算结果27。

5)为这16个矩阵键盘的按键分配不同的蜂鸣器频率,使得按下不同的按键蜂鸣器响声不同,便于识别按键。

6)按键应具有一定的消除抖动功能。

7)所有单片机程序代码都用C语言编写,并烧写到单片机中上电自动运行。

二、设计思想程序流程图:三、实验原理1.单片机概述当今时代,是一个新技术层出不穷的时代。

在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。

单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。

目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。

RTX51tiny实时操作系统在单片机STC12C5A60S2上的移植

RTX51tiny实时操作系统在单片机STC12C5A60S2上的移植

RTX51tiny实时操作系统在单片机STC12C5A60S2上的移植【摘要】RTX51tiny实时操作系统是KeilC51单片机开发集成环境自带的一个实时操作系统,此操作系统功能强大,简单易用,本文讲解把它移植到单片机STC12C5A60S2上的方法。

【关键词】RTX51tiny实时操作系统单片机STC12C5A60S2RTX51tiny实时操作系统是KeilC51单片机集成开发环境自带的一个实时操作系统,它功能强大、简单易用。

它可以应用在所有的8051衍生的单片机系列中。

STC12C5A60S2单片机是深圳宏晶科技有限公司旗下的功能强大的1T单片机。

此单片机是新一代增强型8051单片机,运行的速度是传统8051单片机的8~12倍,这是相当快的速度。

它内部资源丰富,兼容性强,并且内部ROM可达60KB,对于一般的应用已经足够。

在一些比较复杂的应用中,如果使用超级循环进行编程,则在实时性,逻辑性,资源的共享等方面存在较为复杂的关联性,这对编程来说是不利的。

另外在增加与删除功能上也会增加编程的复杂性。

能不能把RTX51tiny操作系统移植到STC12C5A60S2单片机上呢?如果可以则在保证实时性的基础上,编程的复杂性会大幅降低,程序可维护性也会大幅提升。

增加或者删除功能会变得相当容易。

答案是肯定的。

RTX51tiny操作系统完全可以移植到STC12C5A60S2单片机上。

先来看看RTX51tiny操作系统介绍。

一、RTX51tiny操作系统的特性(一)采用时间片轮转调度策略进行任务切换,不支持抢占式任务调度策略。

(二)允许最大16个任务循环切换。

(四)内核很小,最大仅占用900字节。

(五)系统函数仅有13个,非常容易使用。

(六)支持硬件中断功能。

根据它的特点,我们可以得到这样的结论:RTX51tiny操作系统非常适合应用于8051系列单片机,可以实现多任务协同工作。

在实时性上,可以采用硬件中断响应,速度与没有使用操作系统一样快捷。

基于51单片机的实时门禁记录系统程序

基于51单片机的实时门禁记录系统程序
da_ad=0;//判断存储内容是否已经满
else
da_ad+=8;//修改2402存储地址
while(Compare());
}
else
{
DS1302_time();//显示当前时间
}
}
}
/**************T0定时器初始化******************/
void Init_T0(void)
DS1302_CLK=1;
DS1302_RST=0;
return(ucData);
}
/**************DS1302写保护设定******************/
void DS1302_SetProtect(bit flag)//是否写保护
{
if (flag)
Write_1302(0x8E,0x10);//WP=1,不能写入
0x00,0x00,0x00,0x8b};//默认访问者身份ID
uchar code dispcode[]={
0x7e,0x30,0x6d,0x79,
0x33,0x5b,0x5f,0x70,
0x7f,0x7b,0x77,0x1f,
0x4e,0x3d,0x4f,0x47};//共阴极显示代码
bit flag=0;
void Init_DS1302(void);//DS1302初始化
void Init_DS1990(void);//DS1990初始化
void Init_T0(void);//定时器T0初始化
void DS1302InputByte(uchar d);//DS1302
void Write_1302(uchar ucAddr, uchar ucDa);//DS1302写数据

51单片机20个实验-代码详细

51单片机20个实验-代码详细

第一章单片机系统板说明一、概述单片机实验开发系统是一种多功能、高配置、高品质的MCS-51单片机教学与开发设备。

适用于大学本科单片机教学、课程设计和毕业设计以及电子设计比赛。

该系统采用模块化设计思想,减小了系统面积,同时增加了可靠性,使得单片机实验开发系统能满足从简单的数字电路实验到复杂的数字系统设计实验,并能一直延伸到综合电子设计等创新性实验项目。

该系统采用集成稳压电源供电,使电源系统的稳定性大大提高,同时又具备完备的保护措施。

为适应市场上多种单片机器件的应用,该系统采用“单片机板+外围扩展板”结构,通过更换不同外围扩展板,可实验不同的单片机功能,适应了各院校不同的教学需求。

二、单片机板简介本实验系统因为自带了MCS-51单片机系统,因此没有配置其他单片机板,但可以根据教学需要随时配置。

以单片机板为母板,并且有I/O接口引出,可以很方便的完成所有实验。

因此构成单片机实验系统。

1、主要技术参数〔1〕MSC-51单片机板板上配有ATMEL公司的STC89C51芯片。

STC89C51资源:32个I/O口;封装DIP40。

STC89C51开发软件:KEIL C51。

2、MSC-51单片机结构〔1〕单片机板中央放置一块可插拔的DIP封装的STC89C51芯片。

〔2〕单片机板左上侧有一个串口,用于下载程序。

〔3〕单片机板的四周是所有I/O引脚的插孔,旁边标有I/0引脚的脚引。

〔4〕单片机板与各个模块配合使用时,可形成—个完整的实验系统。

三、母板简介主要技术参数〔1〕实验系统电源实验系统内置了集成稳压电源,使整个电源具有短路保护、过流保护功能,提高了实验的稳定性。

主板的右上角为电源总开关,当把220V交流电源线插入主板后,打开电源开关,主板得电工作。

为适用多种需要,配置了+5V,+12V,—5V电压供主板和外设需要,通过右上角的插针排和插孔输出到外设。

此外,还设有螺旋保险插孔保护实验箱。

〔2〕RS232接口RS232接口通过MAX232芯片实现与电脑的串行通讯,通过接口引出信号。

51单片机实例(含详细代码说明)

51单片机实例(含详细代码说明)

51单⽚机实例(含详细代码说明)1.闪烁灯1.实验任务如图4.1.1所⽰:在端⼝上接⼀个发光⼆极管L1,使L1在不停地⼀亮⼀灭,⼀亮⼀灭的时间间隔为秒。

2.电路原理图图4.1.13.系统板上硬件连线把“单⽚机系统”区域中的端⼝⽤导线连接到“⼋路发光⼆极管指⽰模块”区域中的L1端⼝上。

4.程序设计内容(1).延时程序的设计⽅法作为单⽚机的指令的执⾏的时间是很短,数量⼤微秒级,因此,我们要求的闪烁时间间隔为秒,相对于微秒来说,相差太⼤,所以我们在执⾏某⼀指令时,插⼊延时程序,来达到我们的要求,但这样的延时程序是如何设计呢下⾯具体介绍其原理:如图4.1.1所⽰的⽯英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOV R6,#20 2个 2D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498DJNZ R6,D1 2个2×20=4010002因此,上⾯的延时程序时间为。

由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。

如本实验要求秒=200ms,10ms×R5=200ms,则R5=20,延时⼦程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所⽰,当端⼝输出⾼电平,即=1时,根据发光⼆极管的单向导电性可知,这时发光⼆极管L1熄灭;当端⼝输出低电平,即=0时,发光⼆极管L1亮;我们可以使⽤SETB 指令使端⼝输出⾼电平,使⽤CLR 指令使端⼝输出低电平。

5.程序框图如图4.1.2所⽰图4.1.26.汇编源程序ORG 0START: CLRLCALL DELAYSETBLCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时⼦程序,延时秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语⾔源程序#include <>sbit L1=P1^0;void delay02s(void)4.2.14.2.14.2.24.3.14.3.14.3.20F0F4.4.14.4.14.4.24.5.1 4.5.20F0F0F0F7f7f7f7f4.6.14.6.2实验任务如图13所⽰,利⽤AT89S51单⽚机的P0端⼝的-连接到⼀个共阴数码管的a-h的笔段上,数码管的公共端接地。

51单片机实例(含详细代码说明)

51单片机实例(含详细代码说明)

1.闪烁灯1.实验任务如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。

2.电路原理图图4.1.13.系统板上硬件连线把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOV R6,#20 2个 2D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498DJNZ R6,D1 2个2×20=4010002因此,上面的延时程序时间为10.002ms。

由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。

如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。

5.程序框图如图4.1.2所示图4.1.26.汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void) {while(1){L1=0;delay02s();L1=1;delay02s();}2.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。

RTX51tiny实时操作系统在单片机STC12C5A60S2上的移植

RTX51tiny实时操作系统在单片机STC12C5A60S2上的移植

RTX51tiny实时操作系统在单片机STC12C5A60S2上的移植作者:余向阳来源:《数字化用户》2013年第06期【摘要】RTX51tiny实时操作系统是Keil C51单片机开发集成环境自带的一个实时操作系统,此操作系统功能强大,简单易用,本文讲解把它移植到单片机STC12C5A60S2上的方法。

【关键词】RTX51tiny 实时操作系统单片机 STC12C5A60S2RTX51tiny实时操作系统是Keil C51单片机集成开发环境自带的一个实时操作系统,它功能强大、简单易用。

它可以应用在所有的8051衍生的单片机系列中。

STC12C5A60S2单片机是深圳宏晶科技有限公司旗下的功能强大的1T单片机。

此单片机是新一代增强型8051单片机,运行的速度是传统8051单片机的8~12倍,这是相当快的速度。

它内部资源丰富,兼容性强,并且内部ROM可达60KB,对于一般的应用已经足够。

在一些比较复杂的应用中,如果使用超级循环进行编程,则在实时性,逻辑性,资源的共享等方面存在较为复杂的关联性,这对编程来说是不利的。

另外在增加与删除功能上也会增加编程的复杂性。

能不能把RTX51tiny操作系统移植到STC12C5A60S2单片机上呢?如果可以则在保证实时性的基础上,编程的复杂性会大幅降低,程序可维护性也会大幅提升。

增加或者删除功能会变得相当容易。

答案是肯定的。

RTX51tiny操作系统完全可以移植到STC12C5A60S2单片机上。

先来看看RTX51tiny操作系统介绍。

一、RTX51tiny操作系统的特性RTX51tiny操作系统是集成在Keil C51开发环境中的实时系统。

它的主要特点如下:(一)采用时间片轮转调度策略进行任务切换,不支持抢占式任务调度策略。

(二)允许最大16个任务循环切换。

(三)支持信号传递,不支持消息处理、队列处理、邮箱等功能。

(四)内核很小,最大仅占用900字节。

(五)系统函数仅有13个,非常容易使用。

51单片机经典实例源码

51单片机经典实例源码

51单片机经典实例源码预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制#include#include "LCD1602.h"uint Num=0;uchar NumCode[4]={0,0,0,0};//---------------中断加一--------------void my_INT1(void) interrupt 0{Num++;}//-----------------------------void Disp(){uint m;NumCode[0]=Num/1000;NumCode[1]=Num%1000/100;NumCode[2]=Num%100/10;NumCode[3]=Num%10;for(m=0;m<4;m++){LCD_Disp(0,5+m,NumCode[m]+0x30);}}//---------------------void main(){IT0=1;EA=1;EX0=1;LCD_Init();while(1){Disp();}} #include#include "LCD1602.h"uint Num=3728;uchar NumCode[4]={0,0,0,0};//-----------------------自动加一------------------------- void Disp(){uchar m;NumCode[0]=Num/1000;NumCode[1]=Num%1000/100;NumCode[2]=Num%100/10;NumCode[3]=Num%10;for(m=0;m<4;m++){LCD_Disp(0,6+m,NumCode[m]+0x30);}}//--------------------------------------------void main(){LCD_Init();while(1){Disp();Delay(50000);}}#include #include "LCD1602.h" uint Num=5432;uchar NumCode[4]={0,0,0,0};//----------定时器T0按键加一--------------- void T0Init() { TMOD=0x0d; TH0=5432/256; TL0=5432%256;TR0=1; }//------------------------------------------ void Disp() { int m;NumCode[0]=Num/1000; NumCode[1]=Num%1000/100; NumCode[2]=Num%100/10; NumCode[3]=Num%10; for(m=0;m<4;m++) {LCD_Disp(0,5+m,NumCode[m]+0x30); }}//------------------------------------------- void main() { T0Init(); LCD_Init(); while(1) { Num=TH0*256+TL0; Disp();}}#include #define uchar unsigned char uchar T0Num; sbit LED=P1^0;//--------定时器TO 使LED 自动一秒闪一下--------- void T0Init() { TMOD=0x01;TH0=(65536-10000)/256; TL0=(65536-10000)%256; TR0=1; ET0=1; EA=1;}//--------------------------- void T0Sever() interrupt 1 { TH0=(65536-10000)/256; TL0=(65536-10000)%256; T0Num++; if(T0Num==100) { LED=~LED;}}//--------------------------- void main() { T0Init(); while(1) { }}#include#define uchar unsigned char#define uint unsigned intuchar num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f ,0x6f};uint shu;//-----------外部中断按键加减一----------void my_INT1(void) interrupt 0{shu--;}//-----------------------------------------------------void my_INT2(void) interrupt 2{shu++;}//------------------------------------------------------void main(){shu=5;IT0=1;EA=1;EX0=1;IT1=1;EA=1;EX1=1;while(1){P2=num[shu];if(shu==10){shu=0;}if(shu==-1){shu=9;}}}#include#define uint unsigned int#define uchar unsigned charuchar Disp[4]={0x9a,0xca,0xa9,0xac};//------------------------交通灯--------------------- void delay3ms(uchar i){uint n,j,k;for(;i>=1;i--){for(n=2;n>=1;n--){for(j=250;j>=1;j--){for(k=200;k>=1;k--);}}}}//-------------------------------------void main(){while(1){P1=Disp[0];delay3ms(4);P1=Disp[1];delay3ms(1);P1=Disp[2];delay3ms(4);P1=Disp[3];delay3ms(1);}}#include#define uchar unsigned char uchar T0Num=0;uchar PWM=50;sbit LED=P3^7;//------------PWM频率------ void T0Init(){TMOD=0x01;TH0=(65536-100)/256;// 0.1ms TL0=(65536-100)%256;ET0=1;EA=1;TR0=1;}//-----------------------void Ex0Init(){IT0=1;EX0=1;EA=1;}//------------------------void main(){T0Init();Ex0Init();while(1){}}//------------------------void T0Server() interrupt 1 {TH0=(65536-100)/256;// 0.1ms TL0=(65536-100)%256;T0Num++;if(T0Num==PWM){LED=1;}if(T0Num==100){T0Num=0;LED=0;}}//-------------------------- void Int0Server() interrupt 0 {PWM=PWM+5;if(PWM>=100){PWM=0;}}include#define uchar unsigned charuchar i,Flagls,Scon,T0Num;uchar code LedCode[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40, 0x80};//-------串口74LS164驱动流水灯--------------void T0_Init(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;}//----------------void Serial_Init(){Scon=0x00;}//------------------void SerialSend (uchar ch){SBUF=ch;while(TI==0)}TI=0;}//--------------void main(){T0_Init();Serial_Init();while(1){if(Flagls==1){Flagls=0;SerialSend(LedCode[i]);i++;if(i>7){i=0;}}}}//------------------void Toserver() interrupt 1 {TH0=(65536-50000)/256; TL0=(65536-50000)%256; T0Num++;if(T0Num>20)T0Num=0;Flagls=1;}}#include#define uchar unsigned char#define uint unsigned intuchar DispCode[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0x3e,0xe0,0xfe,0xe6}; uint Num=9995;uchar NumCode[4]={0,0,0,0};uchar T1Num;bit Flag1s=0;//---------串口74LS164驱动数码管---------------- void SerialInit(){SCON=0x00;}//-----------------------------------------void T1Init(){TMOD=0x10;TH1= -10000/256;TL1= -10000%256;TR1=1;ET1=1;EA=1;}//------------------------------------------void Disp()uchar i;NumCode[0]=Num/1000;NumCode[1]=Num%1000/100;NumCode[2]=Num%100/10;NumCode[3]=Num%10;for(i=0;i<4;i++){SBUF=DispCode[NumCode[3-i]];while(TI==0){}TI=0;}}//------------------------------------------ void main(){SerialInit();T1Init();while(1){if(Flag1s==1){Flag1s=0;Disp();}}}//----------------------------------------- void T1Server() interrupt 3TH1= -10000/256;TL1= -10000%256;T1Num++;if(T1Num==100){T1Num=0;Flag1s=1;Num++;if(Num>9999){Num=0;}}}#include#define uchar unsigned char#define uint unsigned intuchar T0Num;bit Flag1s=0;uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};//--------MUC_MUC串口自发自收-----------void SerialInit(){SCON=0x50; //方式1 允许接收PCON=0x00; //串口波特率不加倍TMOD|=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器ES=1;EA=1;}//-------------------------------- void T0Init(){TMOD|=0x01;TH0=-10000/256;TL0=-10000%256;ET0=1;TR0=1;EA=1;}//-------------------------------- void main(){uchar k;SerialInit();T0Init();while(1){if(Flag1s==1){Flag1s=0;SBUF=DispCode[k];k++;if(k>9){k=0;}}}}//-------------------------------- void SerialServer() interrupt 4 {if(RI==1){RI=0;P2=SBUF;}else{TI=0;}}//-------------------------------- void T0Server() interrupt 1 {TH0=-10000/256;TL0=-10000%256;T0Num++;if(T0Num==100){T0Num=0;Flag1s=1;}}#include#define uchar unsigned char#define uint unsigned intuchar T0Num;bit Flag1s=0;uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};//-----------两机通信(主机代码)---------------------- void SerialInit(){SCON=0x50; //方式1 允许接收PCON=0x00; //串口波特率不加倍ES=1;EA=1;}//---------------------------------void T1Init(){TMOD=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器}//--------------------------------void T0Init(){TMOD|=0x01;TH0=-10000/256;TL0=-10000%256;ET0=1;TR0=1;EA=1;}//-------------------------------- void main(){uchar k;SerialInit();T1Init();T0Init();while(1){if(Flag1s==1){Flag1s=0;P2=DispCode[k];SBUF=DispCode[k];k++;if(k>9){k=0;}}}}//-------------------------------- void SerialServer() interrupt 4 {if(RI==1){RI=0;else{TI=0;}}//--------------------------------void T0Server() interrupt 1{TH0=-10000/256;TL0=-10000%256;T0Num++;if(T0Num==100){T0Num=0;Flag1s=1;}}#include#define uchar unsigned charuchar Ch;//------两机通信(从机代码)---------------- void SerialInit() {SCON=0x50; //方式1 允许接收PCON=0x00; //串口波特率不加倍ES=1;EA=1;}//---------------------------------void T1Init()TMOD=0x20; //定时器1,方式2 TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器}//-------------------------------- void main(){SerialInit();T1Init();while(1){P2=Ch;}}//-------------------------------- void SerialServer() interrupt 4 {if(RI==1){RI=0;Ch=SBUF;}else{TI=0;}}#include#define uchar unsigned charuchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};uchar Num=5;//----------------多机通信(主机代码)------------ void ExInit() { IT0=1;IT1=1;EX0=1;EX1=1;EA=1;}//---------------------------------void SerialInit(){ SCON=0xd0; //方式3 允许接收PCON=0x00; //串口波特率不加倍TMOD=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器ES=1;EA=1;}//--------------------------------void SBUFSend(uchar Ch){ SBUF=Ch;while(TI==0){ }TI=0; }//--------------------------------void SendControl(uchar Addr,uchar Data) { TB8=1;SBUFSend(Addr);TB8=0;SBUFSend(Data);}//-------------------------------- void main(){ SerialInit();ExInit();while(1){ }}//-------------------------------- void SerialServer() interrupt 4 { uchar Ch;if(RI==1){ RI=0;Ch=SBUF;if(Ch=='b'){P2=DispCode[1];}if(Ch=='c'){P2=DispCode[2];}}else{TI=0;}}//-------------------------------void Ex0Server() interrupt 0{ Num++;if(Num>9){Num=0;}SendControl('b',Num);}//-----------------------------void Ex1Server() interrupt 2{Num--;if(Num==255){Num=9;}SendControl('c',Num);}************************************* #include#define uchar unsigned charuchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};//------------多机通信(从机1)--------------------- void SerialInit(){SCON=0xf0; //方式3 允许接收,SM2=1PCON=0x00; //串口波特率不加倍TMOD=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器ES=1;EA=1;}//------------------------------- void SBUFSend(uchar Ch) {SBUF=Ch;while(TI==0){}TI=0;}//-------------------------------- void main(){SerialInit();while(1){}}//-------------------------------- void SerialServer() interrupt 4 {uchar Ch;if(RI==1){RI=0;Ch=SBUF;if(RB8==1) //地址{if(Ch=='b'){SM2=0; //是自己的地址,置SM2=0,开始接收数据SBUFSend('b');}else{SM2=1; //不是自己的地址,置SM2=1。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三章 基于 SMALL RTOS 51 应用................................................................................. 39
3.1 定义所需的变量和函数........................................................................................39 3.2 串口通信和显示电路及程序代码 ........................................................................45
武汉科技大学
学士学位论文
第 I页
本科毕业设计(论文)
基于 51 单片机的实时操作系统的研究
武汉科技大学
学士学位论文 中文摘要:
第 I页
基于 51 单片机的嵌入式 RTOS 操作系统技术的研究
本论文主要介绍了当前的 RTOS 的发展,及当前的 RTOS 的现状。现在基于单片机软件的发展 已经从单一的线程结构方式逐渐变为多任务的设计思想,和其他的 RTOS 一样,单片机 OS 也是采用 了微内核的结构,内核提供的功能有:任务的调度、任务之间的通信与同步、内存管理、时钟管理 中 断管理等。其他的应用组件可有用户自己添加,以系统进程或函数的方式工作,因而系统是可以裁 减的。SmallRTOS51 就是这样一内核,本论文将在此内核的基础上利用内核中的消息队列的函数实 现串口通信的功能,先建立消息的发送和接收队列,为了使发送和接收不冲突,再建立信号量,实 现消息队列访问的互斥。串口通信是使用中断的方式发送和接收数据的,要发送或接收的任务把数 据放入发送或接收的消息队列中,串口发送或接收中断依次从消息队列中取出数据并发送或接收, 再把数据在 LED 数码显示器上显示。当消息队列中没有数据,不会产生中断。
Key words: Mirocontroller; Real Time Operating System; Serial correspondence;
武汉科技大学
学士学位论文
第 III 页
目录
中文摘要:.................................................................................................................................................. I 英文摘要: ............Байду номын сангаас.................................................................................................................................... II
1.4.1 代码优化注意的问题..........................................................................................6 1.4.2 本论文中电路所使用的单片机的简单介绍.......................................................6 1.5 开发工具 KEIL C51 编译器简介..............................................................................8
第一章
简 介 ........................................................................................................................... 1
1.1 嵌入操作系统的发展现状 .........................................................................................1 1.2. 实时多任务操作系统(RTOS)简介.............................................................................1 1.3 嵌入操作系统的特点.................................................................................................4 1.4. 嵌入是系统的开发过程..............................................................................................5
: 附录 ......................................................................................................................................................... 58
后记........................................................................................................................................................... 58 参考文献:............................................................................................................................................... 59 翻译英文部分........................................................................................................................................... 60 翻译中文部分........................................................................................................................................... 72
关键词: 单片机 ; RTOS ; 任务; 串口通信 ;
第 II页
学士学位论文
武汉科技大学
英文摘要:
Research on Technology of Embedded Real-time Systems Based on 51 Mirocontroller
This thesis introduced the development of the current RTOS primarily, and the present condition of the current RTOS, now according to the development of the micro controller software have changed into gradually from the single line distance construction method to the design of multitasking thoughts, as the other RTOS , micro controller 's OS is construction to adopt the micro kernel construction , function of the micro kernel provided :The Task Management、Intertask Communication and Synchronization、Memory Management 、Time Management 、Interrupt Management etc.. Other applied module the useful an oneself increases, work by system progress or functions, as a result the system is what can cut. The SMALLRTOS51 is like this a RTOS kernel , this paper will make use of the kernel's message queues to realizes Serial's functions of correspondence. First establish the message queues of send out and receive, for the sake of making send out and receives to do not conflict, stablishing one more semaphore, realizing with each other scolding of Serial interface. Serial correspondence is a way to use the interruption to sending or receiving the data, Task to sending or receiving the data that put the data into message queues to sending or receiving, the interruption of a sending or a receiving take out from the message queues, data is on the LED figures display manifestation. . When have no the data in the message queues, it can't produce the interruption.
相关文档
最新文档