搜索
您的当前位置:首页正文

嵌入式系统设计课程设计

来源:榕意旅游网


电气与电子信息工程学院

嵌入式系统设计课程设计

设计题目: 嵌入式系统设计课程设计 专业班级: 电子信息工程2007级(1)班 学 号: 200740210140 姓 名: 毛 勇 指导教师: 邓彬伟 李玉平

设计时间: 2010/11/22~2010/12/10 设计地点: K2—高频实验室

嵌入式系统设计课程设计成绩评定表

姓 名 专业班级 毛勇 电子信息工程2007级(1)班 学 号 200740210140 课程设计题目:嵌入式系统设计 课程设计答辩或质疑记录: 1、评价一个实时操作系统一般可以从哪些方面衡量? 答:一般有以下几个方面可以衡量: ①多任务;②标度方式;③时间偏转;④时间管理⑤中断响应时间。 2.所做的电路中有哪几个任务? 答:①液晶显示;②LED灯闪烁;③电子琴。 3.蜂鸣器接在哪个口上面? 答:P3.3口 成绩评定依据: 实物制作(40%): 课程设计考勤情况(20%): 课程设计答辩情况(20%): 完成设计任务及报告规范性(20%): 最终评定成绩(以优、良、中、及格、不及格评定) 指导教师签字:

2010年 12 月 20 日

一、课程设计题目

嵌入式系统设计课程设计 二、课程设计目的

为了提高嵌入式系统设计与实际的应用能力,开始为期三周的嵌入式系统设计课程设计。通过实训使学生在巩固所学单片机知识的基础之进一步把其与μC/OS-II操作系统的移植结合起来,增强学生对所学知识的实际应用能力和以及与当前专业的前沿知识结合,达到对μC/OS-II操作系统的学习和理解,为以后从事嵌入式工作的研究和开发打好基础。

三、课程设计内容

设计基于51单片机的嵌入式系统,把μC/OS-II操作系统移植到51单片机上,能完成基本的输入和输出,输入采用4*4的键盘,输出采用1602液晶。再此基础之上,每个同学根据自己的特长扩展应用系统,具体可参考以下五种扩展方案的实现。

1、设计的游戏机,在游戏机工作时有背景音乐放出。 2、设计的是电子琴以及1602液晶显示。 3、 设计的流水灯、蜂鸣器、闪烁灯任务。 4、设计的流水灯和电子书功能。 5、(1)所有灯灭,(2)1602显示 93)LED灯闪烁,显示字符。 四、进度安排 序号 1 2 3 4 5 设计内容 布置任务,学习μC/OS-II操作系统 开发μC/OS-II操作系统的移植代码 制作基于51单片机的硬件系统 软硬件集成和调试 答辩、撰写设计报告书 合 计 所用时间 5天 3天 2天 2天 3天 15天 五、基本要求

1、设计基于51单片机的输入和输出电路。 2、用4×4的键盘作为输入设备。 3、用LED或LCD进行显示。

4、开发μC/OS-II操作系统的移植代码。

5、对系统的进行综合和调试,通过硬件指示移植成功的标志。 6、在此嵌入式系统上,除过能完成最基本的输入和显示以外,每个同学根据自己的特长开发出应用系统。

7、编写课程设计的总结

嵌入式系统设计课程设计

一、概述

1. 单片机介绍

单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。 2. 单片机历史

单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。 1.SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。

2.MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公司。

3.单片机是嵌入式系统的独立发展之路,向MCU阶段发展的重要因素,就是寻求应用系统在芯片上的最大化解决;因此,专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。 3. 单片机的应用领域

目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用

与智能化控制的科学家、工程师。

单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,在大型电路中,这种模块化应用极大地缩小了体积,简化了电路,降低了损坏、错误率,也方便于更换。此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。

二、单片机的结构与原理

1. MCS-51单片机内部结构

MCS-51单片机芯片内部结构框图如图1所示。

图1 MCS-51单片机芯片内部结构

1.CPU

CPU即中央处理器的简称,是单片机的核心部件,它完成各种运算和控制操作,CPU由运算器和控制器两部分电路组成。

(1)运算器电路

运算器电路包括ALU(算术逻辑单元)、ACC(累加器)、B寄存器、状态寄存器、暂存器1和暂存器2等部件,运算器的功能是进行算术运算和逻辑运算。运算电路以ALU为核心单元,可以完成半字节、单字节以及多字节数据的运算操作,其中包括加、减、乘、除、十进制调整等算术运算以及与、或、异或、求补和循环等逻辑操作,运算结果的状态由状态寄存器保存。

(2)控制器电路

控制器电路包括程序计数器PC、PC加1寄存器、指令寄存器、指令译码器、数据指针DPTR、堆栈指针SP、缓冲器以及定时与控制电路等。控制电路完成指

挥控制工作,协调单片机各部分正常工作。程序计数器PC用来存放即将要执行的指令地址,它可以完成64K的外部存储器寻址,执行指令时,PC内容的高8位经P2口输出,低8位经P0口输出。数据指针DPTR为16位数据指针,它可以对64K的外部数据存储器和I/O口进行寻址,它的低8位为DPL(地址82H),高8位为DPH(地址为83H)。堆栈指针SP在片内RAM(128字节)中开辟栈区,并随时跟踪栈顶地址,它按先进后出的原则存取数据,上电复位后,SP指向07H。

2.定时器/计数器

MCS-51单片机片内有两个16位的定时/计数器,即定时器0和定时器1。它们可以用于定时控制、延时以及对外部事件的计数和检测等。

3.存储器

MCS-51系列单片机的存储器包括数据存储器和程序存储器,其主要特点是程序存储器和数据存储器的寻址空间是相互独立的,物理结构也不相同。对MCS-51系列(8031除外)而言,有4个物理上相互独立的存储器空间:即内、外程序存储器和内、外数据存储器。对于8051其芯片中共有256个RAM单元,其中后128个单元被专用寄存器占用,只有前128个单元供用户使用。

4.并行I/O口

MCS-51单片机共有4个8位的I/O口(P0、P1、P2和P3),每一条I/O线都能独立地用作输入或输出。P0口为三态双向口,能带8个TTL门电路,P1、P2和P3口为准双向口,负载能力为4个TTL门电路。

5.串行I/O口

MCS-51单片机具有一个采用通用异步工作方式的全双工串行通信接口,可以同时发送和接收数据。它具有两个相互独立的接收、发送数据缓冲器,两个缓冲器共用一个地址(99H),发送缓冲器只能写入,不能读出,接收缓冲器只能读出,不能写入。

6.中断控制系统

MCS-51单片机的中断功能较强,以满足控制应用的需要。8051共有5个中断源,即外中断2个,定时/计数中断2个,串行中断1个。所有中断分为高级和低级两个中断优先级。

7.时钟电路

MCS-51芯片内部有时钟电路,但晶体振荡器和微调电容必须外接。时钟电路为单片机产生时钟脉冲序列,振荡器的频率范围为1.2MHz~12MHz,典型取值

为6MHz。

8.总线

以上所有组成部分都是通过总线连接起来,从而构成一个完整的单片机。系统的地址信号、数据信号和控制信号都是通过总线传送的,总线结构减少了单片机的连线和引脚,提高了集成度和可靠性。 2. 89C58RD+型单片机介绍

89C58RD+是一种带32KB闪烁可编程/可擦除制度存储器(EPEROM-Flash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS的8位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51的指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,因而ATMEL的89C58RD+是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。并且,比起跟它同种类型的89C51,

它具有更大的Flash存储器,可下载很大容量的程序代码,因此功能更加强大,应用范围更广泛。

89C58RD+有40个引脚,32个外部双向输入/输出(I/O)端口,9个中断源,内含2个外中断口,3个16位可编程定时计数器,可编程UART串行通信口,SPI串行口,89C58RD+可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。89C58RD+有PDIP、TQFP及PLCC等三种封装形式,以适应不同应用系统的需求。

89C58RD+管脚如图2所示,其中

图2 89C58RD+

(1) 时钟引脚

XTAL1:接外部晶体的一个引脚。在单片机内部,它是构成片内振荡器的反相放大器的输入端。当采用外部振荡器时,该引脚接收振荡器的信号,即把此信号直接接到内部时钟发声器的输入端。

XTAL2:接外部晶体的另一个引脚。在单片机内部,它是构成内部振荡器的反相放大器的输出端。当采用外部振荡器时,此引脚应悬浮不连接。

注意:如果采用片内的振荡电路,要在单片机的引脚XTAL1和XTAL2之间连接一个石英晶体或陶瓷谐振器,并接两个电容到地。

(2) 控制线或其他电源的复位引脚 RST:复位输入端。

ALE/PROG:当访问外部寄存器时,地址锁存允许的输出电平用于锁存地址的低位字节。在Flash编程期间,此管脚用于输入编程脉冲。在平时,变的频率周期输出正脉冲信号,次频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如果禁止ALE的输出可在SFR8EH地址上置0。此时,只有在执行外部执行状态ALE禁止,置位无效。

PSEN:外部程序存储器的选通信号。在有外部程序存储器取指令期间,每个机器周期两次PSEN有效。但在访问外部数据存储器时,这两次有效的信号将不出现。

EA/Vpp:当EA保持低电平时,则在此期间访问外部程序(0000H-FFFFH),不管是否有内部程序存储器。注意要加密方式1时,部锁定为RESET;当EA断保持高电平时,此间访问内部程序存储器。在编程期间,此管脚也用于施加12V编程电源(Vpp)。

(3) 输入/输出引脚

P0口:P0口为一个8位漏极开路双向I/O口,每脚可吸收8个TTL当P1口的管脚第一次写“1”时,被定义为高阻输入。P0口能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在Flash编程时,P码输入口,当Flash进行校验时,P0口输出原码,此时,P0口外部必须被拉高。P1口:P1口为一个内部提供上拉电阻的8位双向I/O,P1口缓冲器能接收输出4个TTL门电流。P1口管脚写入“1”后,被内部上拉为高,可用作输入,口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在编程和校验时,P1口为第八位地址接收。

P2口:P2口为一个内部提供上拉电阻的8位双向I/O,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高。且作为输入。并因此作为输入时,P2口的管脚被外部拉底,将输出电流。这是由于内

以不ALEPSEN存储器

EA将内FlashP1FlashALE门电流。0口作为原

部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部8位地址数据校验时,P2口输出其特殊功能起存器的内容。P2口在Flash编程和校验时,接收高8位地址信号和控制信号。

P3口:P3口为一个内部提供上拉电阻的8位双向I/O,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为一些特殊功能口,如表1所示。

表1 P3口功能 口 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 管脚 RXD TXD 备选功能 串行输入口 串行输出口 外部中断0 外部中断1 计时器0外部输入 计数器1外部输入 外部数据存储器写选通 外部数据存储器读选通 INT0 INT1 T0 T1 WR RD 三、uC/OS-II在51单片机上的移植

1. uC/OS-II简介

uC/OS-II并非一个完备的实时操作体系,它只是一个实时内核。uC/OS-II不像其它实时操作体系一样,提提供用户的是一个尺度的API函数,步伐开发职员使用操作体系提供的API函数举行应用步伐的开发。要想在uC/OS-II内核上举行应用步伐的开发,就需要步伐开发职员在实时内核的基础上创建自己的实时操作体系。首先,把uC/OS-II移植到自己的硬件目的板上,写出相应的驱动步伐以及用户图形界面等等;在这些接口函数之上,加上用户自己的应用步伐,就组成了嵌入式软件。

2. uC\\os-II在MCS-51上的移植

虽然μC/OS-II大部分源代码是用C语言写的,但是完成和处理器一些有关

的代码时,照旧必须要用汇编语言来实现的。

要使uC\\OS-II正常运行,必须满足一下要求: (1)处理器的C编译器能产生可重入型代码。 (2)用C语言就可以打开和关闭中断。

(3)处理器支持中断,并且能产生定时中断(通常频率在10至100Hz之间)。 (4)处理器能支持容纳一定量的数据存储硬件堆栈(可能是几千字节)。 (5)处理器有将堆栈指针和其他CPU寄存器的内容读出并存储到堆栈或内存中的指令。

MCS-51与KeilCx51编译器可以满足以上条件,可以将MCS-51系列处理器。需要说明一点,目前uC\\OS-II兼容性也很好,本例采用的是uC\\OS-II V2.52μC/OS-II的移植包括以下几个部分。 (1)设置与编译器有关的代码[OS_CPU.H]

在差异的处理器中有差异的字长,所以必须界说一系列数据范例以确保移植的准确性。另外,在uC/OS-II中,不使用C的这些都是和编译器相干的。下面即是uC/OS-IItypedef unsigned char BOOLEAN;

typedef unsigned char INT8U; /*无标志typedef signed char INT8S; /*有标志typedef unsigned int INT16U; /*无标志typedef signed int INT16S; /*有标志typedef unsigned long INT32U; /*无标志typedef signed long INT32S; /*有标志typedef float FP32; /*单精度浮点数typedef double FP64; /*双精度浮点数首先来看对临界段的处理,就是关中断,处理完毕后在开中断。提供了3种方法来处理,针对MCS-51单片机,可以使用方法在MCS-51系列单片机中,中断允许寄存器IE的第EA=0屏蔽所有中断、EA=1允许所有中断。

MCS-51堆栈从低地址往高地址增长(OS_STK_GROWTH定义为0。

uC\\OS-II移植到的版本较多,但基本都一致,

、int和long等数据范例,

8位整数 */ 8位整数 */ 16位整数 */ 位整数 */ 32位整数 */ 32位整数 */ */ */

uC\\OS-II1来处理临界段。7位EA为中断允许控制为,向下,0=向上),因此将版。short界说的一部分数据范例。16 1=

OS_TASK_SW()是一个宏,在uC\\OS-II从低优先级任务切换到高优先级任务是被调用。uC\\OS-II假定任务切换时靠中断级代码完成的,或者说uC\\OS-II的任务切换时靠模仿中断动作来完成的。uC\\OS-II需要一条处理器指令,使其行为就像是硬件中断。MCS-51没有软中断指令,在这种情况下,需要将堆栈结构设置成与中断堆栈结构一样,在用函数调用的方式来实现任务切换,也就是说,通过函数来模仿软中断指令。

(2)用C语言编写6个与操作体系有关的函数[OS_CPU_C.C]这10个函数是:OSTaskStkInit()、OSTaskCreatHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()、OSTaskIdleHook()、OSTimeTickHook()、OSInitHookBegin()、OSInitHookEnd()和OSTCBInitHook()。

这10个函数只对OSTaskStkInit()编写代码,后9个函数必须声明,但是内部并没有代码。

在对堆栈设计时需要考虑一下因素:

<1>传统的8051处理器在中断来临时只将程序计数器PC的值压入堆栈。 <2>按照uC\\OS-II的要求,保存全部寄存器,MCS-51的寄存器有PSW、ACC、B、DPL、DPH、R0-R7和SP。

<3>Cx51编译器允许用CPU寄存器传递3个参数。 <4>堆栈从低地址向高地址增长。 <5>堆栈指针指向上次入栈地址。 <6>MCS-51存在系统栈。 <7>系统栈深度为256字节。

因为需要进行任务栈与系统栈的复制,获得系统栈的起始地址,所以需要对系统进行一些定义。首先,堆栈起点由Keil决定,只关心大小,然后通过SOStack获得keil分配的SP起点。下面的代码就是相关的汇编代码,可以放在启动代码中,也可以放在相关的文件中。

为了函数重入,形参和局部变量必须保存在堆栈里。MCS-51硬件堆栈太小,Keil将根据内存模式在相应内存空间仿真堆栈,增长方向由上向下,与硬件栈相反。对于大模式编译,函数返回地址保存在硬件堆栈里,形参和局部变量放在仿真堆栈中,对MCS-51咬使用大模式编译。 3. 编写4个汇编语言函数[OS_CPU_A.S]

uC/OS-II的移植实例要求用户编写4个简略的汇编语言函数:

OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。

表2移植所需要的具体材料及移植的参数

编译器 硬任系统栈每定时号 单片机型件堆栈务栈大保存参数秒切器初值 大小 小 (包括模栈换次指针?C_XBP) 数 Keil Cx51 H 30H 5017 0 5H B800E STC11F48X4. 测试、编写驱动和应用步伐

做完以上事情以后,就要测试移植的是否准确。测试一个μC/OS-II实时内核并不庞大,即是让这个实时内核在自己的目的板上跑起来。开始时,可以运行一些简略的使命和时钟节奏停止使命,如果调试乐成就可以在上面添加应用步伐。

uC/OS-II移植完成以后,就要在这个实时内核之上编写接口驱动步伐。由于嵌入式操作体系体积更小,功效更强,且快速、稳固,更具有针对性,因此不像其它操作体系那样,对体系的全部接口配置都需要驱动、管理、调治和监视。由于嵌入式产品是针对特别的用途而计划的,有很强的埋头性,因此,在编写驱动步伐时内容更精简,更具有稳固性,编写出的驱动模块更小。编写驱动步伐应完成以下基本功效:①对配置初始化和开释;②把数据从内核传送到硬件和从硬件读取数据;③读取应用步伐传送给配置文件的数据和回送应用步伐恳求的数据;④检测和处理配置出现的错误。实现了以上功效以后,一个嵌入式操作体系就基本组成了。

四、设计方案

1. 两种设计方案比较

方案一

附录一硬件电路设计含有三种功能:电子琴、闪烁灯、1602液晶显示 软件移植部分: 1)裁剪部分: 修改os_cfg.h

#define OS_MAX_TASKS 5

文件将任务数设置为5个

#define OS_LOWEST_PRIO 修改os_cpu.h

5 优先级别也修改为5个

#define CPU_MAX_STK_SIZE 0x40 2)任务部分:

保证能运行较大程序

任务1:电子琴,可以通过按键发出 Do Re Mi Fa So La Si Do_H

void Task1(void xdata * ppdata) reentrant {

ppdata = ppdata; while(1) {

dzq();

OSTimeDlyHMSM(0, 0, 0, 50); } }

任务2:led闪烁;

void Task2(void xdata * ppdata) reentrant {

ppdata = ppdata; led1=0; while(1) {

led1=~led1;

OSTimeDlyHMSM(0, 0, 0, 100); } }

任务3:1602液晶显示

void Task3(void xdata * ppdata) reentrant {

ppdata = ppdata; lcdinit(); while(1)

{ display(); } 方案二

附录二硬件电路设计设计含有三种功能:流水灯、闪烁灯和蜂鸣器 软件移植部分: 1)裁剪部分: 修改os_cfg.h

#define OS_MAX_TASKS 5 #define OS_LOWEST_PRIO 修改os_cpu.h

#define CPU_MAX_STK_SIZE 2)任务部分: 任务1:1Hz的led闪烁

void Task1(void xdata * ppdata) reentrant {

ppdata = ppdata; while(1) {

OSTimeDlyHMSM(0, 0, 1, 0); P3=0x01;

OSTimeDlyHMSM(0, 0, 1, 0); P3=0x00; } }

任务2:0.5Hz的led闪烁

void Task2(void xdata * ppdata) reentrant {

ppdata = ppdata;

0x40

保证能运行较大程序 文件将任务数设置为5个

OSTimeDlyHMSM(0, 0, 0, 50); }

5 优先级别也修改为5个

while(1) {

OSTimeDlyHMSM(0, 0, 2, 0); P2=0x01;

OSTimeDlyHMSM(0, 0, 2, 0); P2=0x00; } }

任务3:1602液晶显示

void Task3(void xdata * ppdata) reentrant {

ppdata = ppdata; lcdinit(); while(1); }

方案1:采用xdata扩展的国产cpu芯片。例如国内STC公司生的STC89C54RD+和STC89C58RD+。这两款芯片都有256字节的内部 RAM,并已经扩展好有1K的XRAM。另外这两款芯片都自带有复位芯片,在外部晶振小于20Mhz时可以省去外部复位电路。更重要的是这款芯片价格较低很适合做ucos的移植。在考虑到可能要移植多功能的情况下,这里选用较大Flash的STC89C58RD+,有32K Flash。

方案2:仍采用AT89C52作主控芯片,另外增加外部RAM芯片,实现xdata的扩展。由于裁剪后的xdata>600字节。所以这里最好采用RAM为1k左右的芯片。但需要外部扩展电路,有些芯片还得有驱动电流。这增加了硬件电路的复杂性,故不采用此方案。

因此本课程设计采用方案1 2.最佳方案硬件设计

按照方案2可以所说的电路即为本设计的最佳硬件设计方案,在此方案中硬件电路图如附录二所示,在焊接结束后,电路板的元件的排列以及电路板完成的焊接情况如附录三所示。 3.最佳方案软件设计

程序流程图如图3所示。

1602液晶 放大电路、 STC89C58RD+型单片机 图3 程序流程图型单片机为系统核心,我能将以前四年所学到的专业知识与实践相联系,同时,我也认识到自己知识上不足的地方,通过本次设计,PCB这不仅锻炼了我独立完成设计工作的能力,为将来投入工作增加了宝贵的经验,2×4键盘 1602液晶模组及1602液晶显示功能。Proteus再进行焊接。其中的主要归纳起来,主要有以下几

本次设计从理论从软件编程到最后的×将内喇叭和闪烁灯

本设计系统以STC89C58RD+配合24键盘和放大电路加喇叭等,很好地实现了电子琴、闪烁灯、 其中软件部分在keilC51上做的程序修改及其运行,然后再连接到上面对硬件电路进行仿真从而确定程序设计是否是完美的,程序如附录四所示。

五、课程设计心得

经过这次课程设计,我觉得自己学到了不少东西。点:

1.通过这次课程设计,所学到的知识充分运用到本次设计中。体会到了所学理论知识的重要性,知识掌握得越多,设计得就更全面、更顺利、更好。

2.进一步熟悉了单片机的知识。我对单片机的基本原理、部结构、各引脚功能、定时器和中断的应用都有了更深刻的理解。并且,能够以单片机为基础的情况下对单片机进行核移植,对嵌入式系统方面有了一定的了解,其中对嵌入式中的时间设定方式和时间之间的间隔有了很大的了解,这也是嵌入式的重点,对优先级的设定有了一个初步的了解。3.通过本次设计,熟悉了设计一个项目所必经的几个阶段。研究到硬件原理图设计,从元器件的选择到板的制作,调试过程都由我独立完成。更重要的是了解了一个电子产品的设计流程,奠定了坚实的基础。

4.在焊接时要认真仔细,在焊接上的技术要过关,不然检查出来会出现很多问题,在我做出来的线路板上载最后检查出来了很多漏焊、虚焊的问题,导致最后检查特别的麻烦。

5.提高了自己查找资料的能力。在设计过程中,我碰到了一些暂时无法解决的问题,于是我通过上网查阅和图书馆借阅资料,或是通过与老师同学交流一步步地解决了。从中我懂得了我们这个专业的知识面相当广泛,我们需要不断通过各种途径更新自己的知识,不断充实自己,同时要懂得与他人交流意见,积极听取别人的建议,懂得团队合作的重要性。

参考文献

[1] 王新颖 单片机原理及应用.北京大学出版社2008

[2] 陈忠平 单片机基础与最小系统实践.北京航空航天大学出版社 [3] 窦振中 单片机外围器件实用手册存储器分册.北京航空航天大学出版 [4] 沈庆阳,郭庭吉 8051单片机实践与应用.清华大学出版社

[5] 侯玉宝,李成群 基于Proteus的51系列单片机设计与仿真 电子工业出版社

[6] 陈明荧. 8051单片机课程设计实训教程[M].北京:清华大学出版 [7] 郁慧娣.微机系统及其接口技术[M].南京:东南大学出版社,1999年. [8] 何立民.单片机高级教程[M].北京:北京航空航天大学出版社,2003年.

[9] 王毓银.数字电路逻辑设计[M].北京:高等教育出版社. [10] 李广弟. 单片机原理及应用[M] 北京航空航天大学出版社,2004年. [11] 谢嘉奎.电子线路[M].高等教育出版社,1999年. [12] 张鑫.单片微机原理及应用.电子工业出版社 2005.8 [13] 张毅刚. 单片微机原理及应用 高等教育出版社 2003.12 [14] 薛晓书.单片微机原理及接口技术.西安石油大学 2002.3 [15] 黄智伟 朱卫华.单片机与嵌入式系统应用.南华大学 2005.3

附录一

附录二

附录三

附录四

#include \"..\_II\\includes.h\" #include \"..\\driver\\lcd1602.h\" INT8U keys;

// 声明变量

// 定义按键位置

#define SW_Port P2 sbit led1=P3^3;

OS_STK xdata Task1Stack[CPU_MAX_STK_SIZE]; OS_STK xdata Task2Stack[CPU_MAX_STK_SIZE]; OS_STK xdata Task3Stack[CPU_MAX_STK_SIZE]; OS_STK xdata Task4Stack[CPU_MAX_STK_SIZE]; void Task4(void xdata * ppdata) reentrant {

INT8U temp; ppdata = ppdata; while(1) {

SW_Port = 0xff; // 将LED关闭,SW_Port规划成输入 keys=~SW_Port; temp=keys&0xff;

switch (keys)

// 判读

// 读取按键

{ case 0x01:sound(0);write_char('1',15,1);break; //

按下S1,发Do音

case 0x02:sound(1);write_char('2',15,1);break; //

按下S2,发Re音

case 0x04:sound(2);write_char('3',15,1);break; //

按下S3,发Mi音

case 0x08:sound(3);write_char('4',15,1);break; //

按下S4,发Fa音

case 0x10:sound(4);write_char('5',15,1);break; //

按下S5,发So音

case 0x20:sound(5);write_char('6',15,1);break; //

按下S6,发La音 }

void Task1(void xdata * ppdata) reentrant {

ppdata = ppdata; while(1) {

write_char('A',0,0); OSTimeDlyHMSM(0, 0, 0,100); write_char('B',1,0); OSTimeDlyHMSM(0, 0, 0,100); write_char('C',2,0); OSTimeDlyHMSM(0, 0, 0,100); write_char('D',3,0); OSTimeDlyHMSM(0, 0, 0,100); write_char('E',4,0); OSTimeDlyHMSM(0, 0, 0,100); write_char('F',5,0); OSTimeDlyHMSM(0, 0, 0,100); write_char('G',0,0); OSTimeDlyHMSM(0, 0, 0,100); write_char('H',1,0); OSTimeDlyHMSM(0, 0, 0,100); write_char('I',2,0); }

case 0x40:sound(6);write_char('7',15,1);break; case 0x80:sound(7);write_char('8',15,1);break;

}

OSTimeDlyHMSM(0, 0, 0, 20);

}

}

OSTimeDlyHMSM(0, 0, 0,100); write_char('J',3,0); OSTimeDlyHMSM(0, 0, 0,100); write_char('K',4,0); OSTimeDlyHMSM(0, 0, 0,100); write_char('L',5,0); OSTimeDlyHMSM(0, 0, 0,100); write_com(0x80);

OSTimeDlyHMSM(0, 0, 0,100);

void Task2(void xdata * ppdata) reentrant { }

void Task3(void xdata * ppdata) reentrant {

ppdata = ppdata; ppdata = ppdata; while(1) { }

write_char('1',15,0); OSTimeDlyHMSM(0, 0, 0,500); write_char('2',15,0); OSTimeDlyHMSM(0, 0, 0,500); write_char('3',15,0); OSTimeDlyHMSM(0, 0, 0,500); write_char('4',15,0); OSTimeDlyHMSM(0, 0, 0,500);

led1=0;

while(1)

}

{ }

led1=~led1;

OSTimeDlyHMSM(0, 0, 0,100);

void SerialInitial() {

/* set TI to 1, set TR1 to 1 */

SCON = 0x52;/* SM0 SM1 =1 SM2 REN TB8 RB8 TI RI */ TMOD = 0x20;/* GATE=0 C/T-=0 M1 M0=2 GATE C/T- M1 M0 */ TH1 = 0xE6;

/*

TH1=E6

4800bit/s

when

at

24MHz,TH1=F3,9600bit/s,24MHz */ }

void InterruptInitial() { } main() {

// SerialInitial();

InterruptInitial();

/* set timer. 50ms, THTL = 3caf when cpu at 12MHz */ TMOD |= 0x01; TH0 = 0x70; TL0 = 0x00;

/* TR0 is set in OSStart() */ ET0 = 1; PCON = 0x80;

TCON = 0x40;/* 01101001 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT */

OSInit();

// printf(\"\\nstart\");

lcdinit();

OSTaskCreate(Task1, (void xdata *)0, &Task1Stack[0],2); OSTaskCreate(Task2, (void xdata *)0, &Task2Stack[0],3); OSTaskCreate(Task3, (void xdata *)0, &Task3Stack[0],4); OSTaskCreate(Task4, (void xdata *)0, &Task4Stack[0],5);

OSStart(); }

因篇幅问题不能全部显示,请点此查看更多更全内容

Top