嵌入式-课程设计报告
- 格式:doc
- 大小:3.36 MB
- 文档页数:19
目录前言 (2)一、U-Boot分析 (3)1、引导程序U-Boot第一阶段分析 (3)2、引导过程 (4)3、程序流程图 (8)二、程序设计 (8)三、心得体会 (9)前言ARM嵌入式处理器已被广泛应用于消费电子厂品、无线通信、网络通信和工业控制等领域。
在嵌入式操作系统中,Linux、Vxworks、WinCE三足鼎立,其中Linux由于其开源性、稳定性、安全性、可裁剪性更是一支独秀。
在嵌入式系统中,如何实现在ARM平台下Linux操作系统的引导工作是嵌入式技术开发的重要环节。
BootLoader就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。
在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader 来完成。
比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
一、U-Boot分析嵌入式Linux系统中常用的Bootloader引导程序有U-Boot,redboot, blob 和vivii等,其中U-Boot遵循GPL条款的开放源码项目,功能最为强大,U-Boot 对PowerPC系列处理器支持最丰富,同时还支持MIPS,x86,ARM,XScale等诸多常用系列的处理器;U-Boot引导程序分为Stage1和Stage2量大部分,Stage1中主要包括设备初始化、中断设置、时间设置和储存器初始化等工作,并且采用汇编语言实现,而一些通用功能大多采用C语言实现,放在Stage2中。
1、引导程序U-Boot第一阶段分析Stage1的代码在CPU/arm920t/start.s中定义,它包括从系统上电后在0x00000000地址开始执行的部分。
嵌入式系统课程设计报告一、教学目标本课程的教学目标是使学生掌握嵌入式系统的基本概念、原理和设计方法,能够运用嵌入式系统进行实际项目的开发和实现。
具体来说,知识目标包括了解嵌入式系统的定义、特点、分类和应用领域;掌握嵌入式系统的硬件和软件组成及工作原理;熟悉嵌入式操作系统的基本概念和常用操作系统。
技能目标包括能够使用嵌入式系统开发工具和平台进行程序设计和调试;具备嵌入式系统硬件电路的设计和调试能力;能够运用嵌入式系统进行实际项目的开发和实现。
情感态度价值观目标包括培养学生的创新意识和团队合作精神,提高学生解决实际问题的能力和责任感。
二、教学内容根据课程目标,本课程的教学内容主要包括嵌入式系统的基本概念、原理和设计方法。
具体包括以下几个方面:1. 嵌入式系统的定义、特点、分类和应用领域;2. 嵌入式系统的硬件组成,如处理器、存储器、输入输出接口等;3. 嵌入式系统的软件组成,如固件、操作系统、应用程序等;4. 嵌入式操作系统的基本概念和常用操作系统;5. 嵌入式系统的设计方法和开发流程;6. 嵌入式系统硬件电路的设计和调试方法;7. 嵌入式系统在实际项目中的应用和案例分析。
三、教学方法为了实现课程目标,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
通过多样化的教学方法,激发学生的学习兴趣和主动性。
具体教学方法如下:1. 讲授法:通过讲解嵌入式系统的基本概念、原理和设计方法,使学生掌握相关知识;2. 讨论法:通过分组讨论和课堂讨论,培养学生的思考能力和团队合作精神;3. 案例分析法:通过分析实际项目案例,使学生了解嵌入式系统在实际中的应用和设计方法;4. 实验法:通过实验操作和调试,锻炼学生的动手能力和实际问题解决能力。
四、教学资源为了支持教学内容和教学方法的实施,本课程将选择和准备以下教学资源:1.教材:选用权威、实用的嵌入式系统教材,为学生提供系统的学习资料;2. 参考书:推荐学生阅读相关参考书籍,丰富学生的知识体系;3. 多媒体资料:制作课件、教案等多媒体教学资料,提高课堂教学效果;4. 实验设备:准备嵌入式系统开发板、仿真器等实验设备,为学生提供实践操作的机会。
一、实训目的通过本次嵌入式课程设计实训,使学生掌握嵌入式系统设计的基本原理和方法,提高学生的实际操作能力和创新意识,培养学生的团队协作精神。
同时,通过实训,使学生熟悉嵌入式系统的硬件平台、软件开发环境,掌握嵌入式编程语言,了解嵌入式系统的调试和测试方法。
二、实训内容本次实训以设计一个简单的温室环境监测系统为例,主要包括以下几个方面:1. 系统需求分析温室环境监测系统主要实现对温室内部光照、温度、湿度的实时监测,并根据监测结果自动调节环境参数,确保温室内的作物生长环境稳定。
系统需具备以下功能:(1)实时监测光照、温度、湿度等环境参数;(2)根据预设阈值,自动调节环境参数;(3)通过LCD显示屏实时显示监测数据;(4)通过串口通信将数据传输至上位机;(5)具有按键控制功能,如开关报警、手动调节等。
2. 硬件平台设计本次实训采用STM32系列微控制器作为核心控制单元,结合DS18B20数字温度传感器、DHT11数字湿温度传感器、光敏电阻、LCD显示屏、蜂鸣器、按键等外围设备,构建温室环境监测系统硬件平台。
3. 软件设计(1)系统初始化:初始化微控制器,配置相关外设参数,设置中断优先级等。
(2)数据采集:通过ADC读取光敏电阻的模拟值,计算光照强度;通过DS18B20和DHT11传感器读取温度和湿度数据。
(3)数据处理:对采集到的数据进行处理,如温度、湿度阈值判断,光照强度阈值判断等。
(4)环境参数调节:根据预设阈值,自动调节加热装置、风扇等设备,以实现环境参数的自动调节。
(5)数据显示:通过LCD显示屏实时显示光照、温度、湿度等数据。
(6)串口通信:通过串口将数据传输至上位机。
(7)按键控制:实现报警功能、手动调节等功能。
4. 系统调试与测试在系统开发过程中,对硬件平台和软件进行调试和测试,确保系统稳定运行。
主要测试内容包括:(1)硬件测试:检查各外设是否正常工作,如传感器、显示屏、按键等。
(2)软件测试:测试系统功能是否满足需求,如数据采集、处理、显示、通信等。
嵌入式课程设计报告毕业论文教案一、教学目标通过本课程的学习,学生应该能够:1.了解嵌入式系统设计的基本原理和流程2.掌握基本的嵌入式硬件和软件开发技术3.能够使用开发板和相关工具进行嵌入式系统的设计和开发4.掌握常用的接口协议和通信方式,包括串口通信、SPI、I2C、CAN等5.能够设计和开发基本的嵌入式应用程序,如LED灯的控制、按键的检测、温度传感器的读取等二、教学内容及安排1.嵌入式系统概述内容:介绍嵌入式系统的定义、特点、应用领域、市场和发展趋势等内容。
时间:2学时2.嵌入式系统设计流程内容:介绍嵌入式系统设计的主要步骤和流程,包括需求分析、硬件设计、软件设计、测试和调试等内容。
时间:4学时3.嵌入式开发环境搭建内容:介绍嵌入式开发环境的基本配置和使用,包括Keil C51软件、ST-LINK下载器、ST-FLASH工具等。
时间:4学时4.嵌入式硬件设计内容:介绍嵌入式硬件设计的基本原理和方法,包括硬件选型、电路原理图设计、PCB布局和焊接等内容。
时间:10学时5.嵌入式软件设计内容:介绍嵌入式软件设计的基本原理和方法,包括汇编语言、C语言、编译、调试和下载等内容。
同时讲解如何使用方案手册和数据手册加速学习。
时间:16学时6.嵌入式应用程序设计内容:介绍嵌入式应用程序的设计和开发,包括LED灯的控制、按键的检测、温度传感器的读取、串口通信、SPI/I2C接口的应用等内容。
时间:14学时7.嵌入式系统测试和调试内容:介绍嵌入式系统的测试和调试方法,包括硬件测试、软件测试、仿真测试和调试工具等内容。
时间:4学时三、教学方法1.理论教学与实践结合,提高学生的实际操作能力。
2.讲授代码编写方法,由浅入深、由简到难地进行讲解。
3.组织实验、调试和考试等考核环节,促进学生知识的巩固和提高。
4.引导学生通过网络、图书馆等途径自主学习和获取嵌入式技术知识,培养学生的自主学习和创新能力。
四、教学手段1.教师演示和现场演示,帮助学生理解课程内容并进行实践操作。
最小嵌入式课程设计报告一、课程目标知识目标:1. 让学生理解嵌入式系统的基础知识,掌握最小嵌入式系统的设计与搭建方法。
2. 使学生掌握常见嵌入式硬件组件的原理与使用,如微控制器、传感器等。
3. 引导学生了解嵌入式软件编程的基础,学会使用至少一种编程语言进行嵌入式开发。
技能目标:1. 培养学生具备分析问题、设计解决方案的能力,能够针对特定需求设计最小嵌入式系统。
2. 提高学生的动手实践能力,能够独立搭建最小嵌入式系统并进行调试。
3. 培养学生具备一定的编程能力,能够编写简单的嵌入式程序,实现对硬件的控制。
情感态度价值观目标:1. 激发学生对嵌入式系统的兴趣,培养其探索精神,提高学习积极性。
2. 培养学生具备良好的团队合作意识,学会与他人共同解决问题。
3. 引导学生认识到嵌入式技术在现实生活中的广泛应用,培养其创新意识和社会责任感。
本课程针对高年级学生,具有较强的实践性和综合性。
在分析课程性质、学生特点和教学要求的基础上,将课程目标分解为具体的学习成果。
通过本课程的学习,学生将能够掌握嵌入式系统的基础知识,具备设计和搭建最小嵌入式系统的能力,同时培养良好的情感态度和价值观。
为实现课程目标,后续教学设计将注重理论与实践相结合,充分调动学生的主动性和积极性。
二、教学内容1. 嵌入式系统概述:介绍嵌入式系统的基本概念、发展历程、应用领域及特点。
- 教材章节:第1章 嵌入式系统概述- 内容:嵌入式系统定义、分类、发展概况、典型应用。
2. 最小嵌入式系统硬件:讲解微控制器、传感器、执行器等硬件组件的原理与使用。
- 教材章节:第2章 嵌入式系统硬件- 内容:微控制器原理、传感器原理及应用、执行器原理及应用。
3. 嵌入式系统软件:介绍嵌入式编程基础,学习使用C语言进行嵌入式开发。
- 教材章节:第3章 嵌入式系统软件- 内容:嵌入式编程环境、C语言基础、I/O编程、中断处理。
4. 最小嵌入式系统设计与实践:结合实际案例,设计并搭建最小嵌入式系统。
一、实验目的1. 熟悉嵌入式系统开发的基本流程和常用工具;2. 掌握嵌入式系统硬件资源的使用方法;3. 熟悉嵌入式系统软件开发的基本方法;4. 提高嵌入式系统设计能力。
二、实验内容1. 硬件平台:基于STM32F103系列单片机的开发板;2. 软件平台:Keil uVision5集成开发环境;3. 实验任务:设计一个简单的嵌入式系统,实现按键输入和LED灯控制功能。
三、实验原理1. 硬件原理:STM32F103系列单片机是一款高性能、低功耗的ARM Cortex-M3内核微控制器,具有丰富的片上外设资源,如GPIO、定时器、ADC等。
在本实验中,主要使用GPIO进行按键输入和LED灯控制。
2. 软件原理:嵌入式系统软件开发主要包括底层驱动程序、中间件和应用层。
底层驱动程序负责硬件资源的管理和配置;中间件提供系统服务,如通信、定时器等;应用层实现用户功能。
在本实验中,主要使用C语言编写程序,实现按键输入和LED灯控制功能。
四、实验步骤1. 硬件连接:将开发板上的按键和LED灯分别连接到单片机的GPIO端口;2. 软件编写:(1)创建项目:在Keil uVision5中创建一个新的项目,选择STM32F103系列单片机作为目标设备;(2)添加源文件:添加一个C语言源文件,用于编写主程序;(3)配置GPIO:在源文件中编写GPIO初始化代码,配置按键和LED灯的GPIO端口为输入和输出模式;(4)编写按键输入程序:编写按键扫描函数,用于检测按键状态,并根据按键状态控制LED灯;(5)编译程序:编译项目,生成目标文件;(6)下载程序:将编译好的程序下载到开发板;3. 实验验证:在开发板上运行程序,观察按键输入和LED灯控制功能是否正常。
五、实验结果与分析1. 实验结果:按键按下时,LED灯点亮;按键松开时,LED灯熄灭;2. 实验分析:通过编写程序,实现了按键输入和LED灯控制功能,验证了嵌入式系统开发的基本流程和常用工具。
嵌入式课程设计报告嵌入式课程设计报告一、设计目的和背景嵌入式系统在现代社会中起着越来越重要的作用,它们广泛应用于各个领域,如消费电子、汽车、医疗保健等。
本次课程设计旨在让学生深入了解嵌入式系统的设计原理和方法,并通过实践项目,提高学生的实际操作能力。
二、设计内容和方法本次课程设计的内容是一个智能家居控制系统。
该系统能够通过无线网络实现对家居设备的远程控制,如灯光、温度、窗帘等。
设计方法主要包括硬件设计和软件设计两个方面。
硬件设计部分主要包括选择合适的微控制器作为控制核心,选取各类传感器和执行器,以及设计电路板进行组装。
在此基础上,还需设计无线通信模块,以实现远程控制的功能。
软件设计部分主要包括嵌入式系统的编程和通信协议的设计。
编程部分可采用C语言或其他嵌入式开发语言,通过编写相应的控制程序实现各个功能模块的控制。
通信协议设计部分需要考虑数据传输的安全性和稳定性,可采用常见的无线通信协议,如Wi-Fi、蓝牙等。
三、设计结果和实现效果通过本次课程设计,我成功实现了一个智能家居控制系统的功能。
通过手机APP或电脑端软件,我可以远程实现对家居设备的控制,如开关灯光、调节温度、控制窗帘等。
同时,该系统还具备一定的安全性,用户可以通过身份验证来确保系统的安全性。
四、设计过程中的问题和解决方案在设计过程中,我遇到了一些问题,如硬件的选型和软件的编写。
对于硬件的选型,我需要根据系统的需求和预算来选择合适的微控制器和传感器。
对于软件的编写,我需要理解各个功能模块的工作原理,并编写相应的控制程序。
我通过查阅资料和与同学、老师的交流解决了这些问题。
通过分析和比较不同的硬件和软件方案,我最终选择了适合我项目需求的方案。
五、设计总结和展望本次课程设计使我对嵌入式系统的设计有了更深入的了解,提高了我的实际操作能力。
通过实践项目,我学会了如何选择合适的硬件和软件方案,并成功实现了一个功能完备的智能家居控制系统。
未来,我希望能继续深入研究嵌入式系统的设计,探索更多有意义的项目。
嵌入式系统课程设计报告摘要:本次设计的嵌入式系统为基于单片机的数字时钟设计。
系统主要由AT89C51单片机、LCD液晶显示屏和RTC模块组成。
通过组合这些元器件,实现了时钟的精确显示和功能操作。
本文将详细介绍设计过程中所采用的硬件和软件设计及其实现过程,最终得到了效果良好的数字时钟。
一、设计目的本次课程设计的主要目的是熟练掌握嵌入式系统设计的基本流程和方法。
同时通过本次设计,学员还需对AT89C51单片机及RTC模块等嵌入式系统所需的元器件有所了解,并能够熟练地进行元器件的选型、电路设计、软件编程及系统调试等工作。
二、设计原理1. 系统硬件设计原理数字时钟主要由AT89C51单片机、LCD液晶显示屏和RTC模块组成,它们之间的连接如下图所示:图1 数字时钟系统框图其中,AT89C51单片机是整个系统的核心部件,其外部晶振采用11.0592MHZ的振荡器,为系统提供时钟信号。
RTC模块采用DS1302芯片,它具有精度高、稳定性好、且具有多种测试功能的特点,可以提供更加精确的时间信息。
时钟的显示模块采用16×2字符型LCD液晶显示屏。
2. 软件设计原理软件设计主要包括两部分——RTC模块的驱动程序和数字时钟主程序的编写。
其中,RTC模块的驱动程序主要实现对DS1302芯片的驱动,包括寄存器的读写、校时以及晶振稳定等功能。
数字时钟主程序主要是对AT89C51单片机的程序编写,实现数字时钟的显示和操作。
三、系统设计过程系统设计主要分为硬件设计和软件设计两个方面的工作,具体步骤如下:1. 硬件设计(1) 按照电路原理图进行元器件的选型、连线以及设备安装,需要注意每个元器件的接口定义和功能实现。
(2) 对DS1302芯片进行驱动程序的编写,实现对时间信息的读取和校时功能。
(3) 对LCD液晶显示模块进行驱动程序的编写,实现数字时钟的显示和操作。
2. 软件设计(1) 编写RTC模块的驱动程序,在AT89C51单片机调用RTC 模块时,直接调用驱动程序。
课程设计报告课程设计名称:嵌入式技术基础与实践系别:三系学生姓名:石亦哲班级:08计本(2)学号:080303223成绩:指导教师:张兵开课时间:2010-2011 学年下学期目录第一章系统概要...............................................................错误!未定义书签。
1.1系统背景............................................ 错误!未定义书签。
1.2系统功能............................................ 错误!未定义书签。
第二章系统硬件设计 (2)2.1 系统原理图 (2)2.2 单片机(MCU)模块 (2)2.2.1 MC9S08AW60单片机性能概述 (2)2.2.2 内部结构简图 (3)2.3 串行通信模块 (3)2.3.1 MAX232引脚图 (3)2.3.2串行通信的电路原理 (4)2.4 液晶显示模块 (5)第三章系统软件设计 (6)3.1 MCU方(C)程序 (6)3.1.1串行通信子程序 (9)3.1.2 LCD子程序 (12)第四章系统测试 (14)第五章总结展望 (15)5.1 总结 (15)5.2 展望 (15)参考文献 (15)第一章系统概要1.1 系统背景此系统是飞思卡S08的MCU,AW60作为主控制器,由定时器模块和LCD显示模块这2个模块组合而成。
其中的定时器模块是MCU中一个十分重要的组成部分,它不但有计数/定时功能,另外还有进行输入捕捉,模拟PWM等功能。
而LCD作为电子信息产品的主要显示器件,相对于其他类型的显示部件来说也有其自身的特点,这些特点主要包括:(1)低电压微功耗;(2)平板型结构;(3)使用寿命长;(4)被动显示;(5)显示信息量大且易于色彩化;(6)无电磁辐射等,而由这2个系统组成的电子钟也同时具备了相应的功能。
1.2 系统功能LCD功能概述点阵字符型LCD是专门用于显示数字,字母,图形符号及少量自定义符号的液晶显示器。
这类显示器把LCD控制器,点阵驱动器,字符存储器,显示体及少量的阻容元件等集成一个液晶显示模块。
鉴于字符型液晶显示模块目前在国际上已经规范化,其电特性及接口特性是统一的,因此,只要设计出一种型号的接口电路,在指令上稍加修改即可使用各种规格的字符型液晶显示模块。
AW60定时接口的功能概述S08系列的MCU定时器还具有输入捕捉,输出比较,PWM脉冲输出等功能,定时器的这些功能可以应用于不同的场合:利用输入捕捉测量脉宽,测量频率吗,输出特定的波形,直接输出脉宽调度波(PWM);使用输入捕捉配合输出比较还可以用来输出同步波形以及用于延时。
电子钟功能概述电子钟具有开关计时,定时,以及设定时间的功能,并可以通过LCD显示时间。
第二章系统硬件设计2.1 系统原理图该电路系统是飞思卡S08的MCU,AW60作为主控制器,由定时器模块和LCD显示模块这2个模块组合而成。
定时器模块是MCU中一个非常重要的部分,它不仅有计数/定时功能,还能进行输入捕捉,模拟PWM等功能。
LCD作为电子信息产品的主要显示器件,相对于其他类型的显示部件来说有其自身的特点。
其连接如下图所示:2.2 单片机(MCU)模块2.2.1 MC9S08AW60单片机性能概述S08是单芯片8位微控制器解决方案。
MC9S08AW60/AW48/AW32/AW16是低成本、高性能8位微处理器单元(MCU)S08家族中的成员。
家族中所有的MCU实用增强型S08核,且使用不同的模块、存储空间、存储器类型和封装类型。
1.AW60系列主要常规模块和特点(1)最高达40MHz的CPU工作频率和20MHz的内部总线工作频率;时钟源选项包括晶振、谐振器、外部时钟或内部产生的时钟。
(2)相比HC08CPU指令集,S08CPU增加了BUGND指令。
(3)单线后台调试模式接口;增强的断点能力,允许单一的断点设置在线调试(在片内调试模块加了多于两个的断点)(4)内含32个中断/复位源;内含2KB 的片内RAM ;内含60KB 的片内在线可编程Flash 存储器,带有块保护和安全选项。
(5)可选的计算机正常操作(COP )复位;低电压检测与复位或中断;非法操作码检测与复位;非法地址检测与复位。
(6)ADC :多达16个通道,10位A/D 转换器与自动比较功能;两个串行通信接口SCI 模块与可选的13位中断;一个串行外设接口SPI 模块;集成电路互连总线I2C 模块运行高达100kbps 的最高总线负载;8引脚键盘中断KBI 模块。
(7)Timers :1个2通道和1个6通道16位定时器/脉冲宽度调制器模块。
具有输入捕捉、输出比较、脉宽调制功能。
2.2.2 内部结构简图 1. 内部结构简图图2-1给出了AW60的内部结构框图,它对于我们理解和应用AW60MCU 有重要作用,在学习了基本的应用方法后,应反过来熟悉这个内部结构图,以便更好的理解AW60MCU 的基本原理。
从内部结构框图可以看出,AW60主要有以下几个部分:S08CPU 、存储器、定时器接口模块、定时器模块、看门狗模块、通用IO 模块、串口通信模块(SCI )、串行外设接口(SPI )模块、IIC 模块、A/D 转换模块、键盘中断模块、时钟发生模块、复位与中断模块等。
2.3 串行通信模块 2.3.1 MAX232引脚图在MCU 中,若用RS-232总线进行串行通信,则需要外界电路实现电平转换。
在发送端,需要用驱动电路将TTL 点评转换成RS-232电平;在接收端,需要用接收电路将RS-232点评转换为TTL 电平。
电平转换器不仅可以由晶振管分立元件构成,也可以直接使用集成电路。
目前使用MAX232芯片的较多,该芯片使用单一+5V 电源供电实现电平转换。
下图给出了MAX232的引脚说明。
各引脚含义简要说明如下。
·Vcc (16脚):正电源端,一般接+5V 。
·GND (15脚):地。
·Vs+(2脚):Vs+=2Vcc —1.5V=8.5V 。
·Vs-(6脚):Vs-=—2Vcc —1.5V=—11.5V 。
·C2+、C2-(4、5脚):一般接1μF 的电解电容。
·C1+、C1-(1、3脚):一般接1μF 的电解电容。
输入输出引脚分两组,基本含义如表6所示。
在实际使用时,若只需要一路串行通信借口,可以使用其中的任何一组。
表6 MAX232芯片输入输出引脚分类与基本接法2.3.2 串行通信的电路原理从基本原理的角度看,串行通信接口SCI的主要功能是:接收时,把外部的单线输入的数据变成一个字节的并行数据送入MCU内部;发送时,把需要发送的一个字节的并行数据转换为单线输入。
为了设置波特率,SCI应具有波特率寄存器。
为了能够设置通信格式、是否校验、是否允许中断等,SCI应具有控制寄存器。
而要知道串口是否有数据可收、数据是否发送出去等,需要有SCI状态寄存器。
当然,若一个寄存器不够用,控制与状态寄存器可能有多个。
而SCI数据寄存器存放要发送的数据,也存放接受的数据,这并不冲突,因为发送与接收的实际工作是通过“发送移位寄存器”和“接收以为寄存器”完成的。
编程时,程序员并不直接与“发送移位寄存器”和“接收移位寄存器”打交道,只与数据寄存器打交道,所以MCU中并没有设置“发送移位寄存器和“接收移位寄存器”的映像地址。
发送时,程序员通过判定状态寄存器的相应位,了解是否可以发送一个新的数据。
若可以发送,则将待发送的数据放入“SCI数据寄存器”中就可以了,剩下的工作由MCU自动完成:将数据从“SCI数据寄存器”送到“发送移位寄存器”,硬件驱动将“发送移位寄存器”的数据一位一位地按照规定的波特率移到发送引脚TxD,供对方接收。
接收时,数据一位一位地从接收引脚RxD进入“接收移位寄存器”,当收到一个完成字节时,MCU会自动将数据送入“SCI数据寄存器”,并将状态寄存器的相应位改变,供程序员判定并取出数据。
2.4 液晶显示模块点阵字符型LCD是专门用于显示数字、字母、图形符号及少量自定义符号的液晶显示器。
这类显示器把LCD控制器、点阵驱动器、字符存储器、显示体及少量的阻容元件等集成一个液晶显示模块。
鉴于字符型液晶显示模块目前在国际上已经规范化,其电特性及接口特性是统一的,因此,只要设计出一种型号的接口电路,在指令上稍加修改即可使用各种规格的字符型液晶显示模块。
点阵字符型液晶显示模块的控制器大多数为日立公司生产的HD44780及其兼容的控制电路,如SED1278(SEIKO EPSON)、KS0066(SAMSUNG)、NJU6408(NER JAPANRADIO)等。
字符型液晶显示模块的主要特点如下:MCU控制液晶显示接口接线图1.液晶显示屏是以若干5*8或5*11点阵块组成的显示字符群。
每个点阵块为一个字符位,字符间距和行距都为一个点的宽度。
2.主控制电路为HD44780(HITACHI)及其他公司的兼容电路。
从程序员的角度来说,LCD 的显示接口与编程是面向HD44780的,只要了解HD44780的编程结构即可进行LCD的显示编程。
3.内部具有字符发生器ROM,可显示192种字符(160个5*7点阵字符和32个5*10点阵字符)。
4.具有64字节的字符发生器RAM,可以定义8个5*8点阵字符或4个5*11点阵字符。
5.具有64字节的数据显示RAM,供显示编程时使用6.标准接口特性,与MC9S08系列MCU容易接口。
7.模块结构紧凑、轻巧、装配容易。
8.单+5V电源供电(宽温型需要加-7V驱动电源)。
9.低功耗、高可靠性。
第三章系统软件设计3.1 MCU方(C)程序Main.c:#include "Includes.h"#include "SCI.h"#include "LCD.h"#include "time.h"uint8 g_time[6];//在此添加全局变量定义void main(void){uint8 remember;uint8 g_DispalyInit[]="00:00:00";uint32 mRuncount=0;uint8 g_SCIFlag=0;DisableInterrupt(); //禁止总中断//2 芯片初始化MCUInit();//3 指示灯初始化TPMinit(TPM_NUM_1);LCDinit();SCIInit(SCI_NUM_1,SYSTEM_CLOCK,9600);g_time[0]=0;g_time[1]=0;g_time[2]=0;g_time[3]=0;g_time[4]=0;g_time[5]=0;remember=g_time[5];EnableSCIReInt();EnabletimerInt(TPM_NUM_1);EnableInterrupt();SCISendN(SCI_NUM_1,8,g_DispalyInit);LCDshow(g_DispalyInit);while(1){g_SCIFlag=SCIReN(SCI_NUM_1,8,g_DispalyInit);if(g_time[5]!=remember && !(GPIO_Get(Con_Run_PORT,Con_Run))) {if(1== g_SCIFlag){SCISendN(SCI_NUM_1,8,g_DispalyInit);g_DispalyInit[0]=g_time[0]+'0';g_DispalyInit[1]=g_time[1]+'0';g_DispalyInit[3]=g_time[2]+'0';g_DispalyInit[4]=g_time[3]+'0';g_DispalyInit[6]=g_time[4]+'0';g_DispalyInit[7]=g_time[5]+'0';LCDshow(g_DispalyInit);}SCISendN(SCI_NUM_1,6,g_time);remember=g_time[5];}}}Time.c:#include "time.h"void TPMinit(uint8 TPMNo) {if(TPMNo>2)TPMNo=2;else if(TPMNo<1)TPMNo=1;TPM_CSTR(TPMNo)=0b00010110;TPM_CNTH(TPMNo)=0x00;TPM_CNTL(TPMNo)=0x00;TPM_MODH(TPMNo)=0x7A;TPM_MODL(TPMNo)=0x12;}void SecAdd1(uint8 *p) {*(p+5)+=1;if(*(p+5)>=10) {*(p+5)=0;*(p+4)+=1;if(*(p+4)>=6) {*(p+4)=0;*(p+3)+=1;if(*(p+3)>=10) {*(p+3)=0;*(p+2)+=1;if(*(p+2)>=6){*(p+2)=0;*(p+1)+=1;if(((*p)*10+*(p+1))>=24){*p=0;*(p+1)=0;}if(*(p+1)>9){*(p+1)=0;*p+=1;} } } } } }Isr.c:#include "Includes.h"#include "time.h"#include "SCI.h"//此处为用户新定义中断处理函数的存放处//未定义的中断处理函数,本函数不能删除interrupt void isrT1Out(void) {uint8 temp;DisableInterrupt();if(!(GPIO_Get(Con_Run_PORT,Con_Run))) {SecAdd1(g_time);}TPM_CSTR(1) &=~(TPM1SC_TOF_MASK);EnableInterrupt();}interrupt void isrSCIre(void) {uint8 temp;DisableInterrupt();//temp=SCIReN(1,6,g_time);EnableInterrupt();}interrupt void isrDummy(void){}//中断处理子程序类型定义typedef void( *ISR_func_t)(void);//中断矢量表,如果需要定义其它中断函数,请修改下表中的相应项目const ISR_func_t ISR_vectors[] @0xFFCC ={isrDummy, // 0xFFCC //时基中断isrDummy, // 0xFFCE //IIC中断isrDummy, // 0xFFD0 //ADC转换中断isrDummy, // 0xFFD2 //键盘中断isrDummy, // 0xFFD4 //SCI2发送中断isrDummy, // 0xFFD6 //SCI2接收中断isrDummy, // 0xFFD8 //SCI2错误中断isrDummy, // 0xFFDA //SCI1发送中断isrSCIre, // 0xFFDC //SCI1接收中断isrDummy, // 0xFFDE //SCI1错误中断isrDummy, // 0xFFE0 //SPI中断isrDummy, // 0xFFE2 //TPM2溢出中断isrDummy, // 0xFFE4 //TPM2通道1输入捕捉/输出比较中断isrDummy, // 0xFFE6 //TPM2通道0输入捕捉/输出比较中断isrT1Out, // 0xFFE8 //TPM1溢出中断isrDummy, // 0xFFEA //TPM1通道5输入捕捉/输出比较中断isrDummy, // 0xFFEC //TPM1通道4输入捕捉/输出比较中断isrDummy, // 0xFFEE //TPM1通道3输入捕捉/输出比较中断isrDummy, // 0xFFF0 //TPM1通道2输入捕捉/输出比较中断isrDummy, // 0xFFF2 //TPM1通道1输入捕捉/输出比较中断isrDummy, // 0xFFF4 //TPM1通道0输入捕捉/输出比较中断isrDummy, // 0xFFF6 //ICG的PLL锁相状态变化中断isrDummy, // 0xFFF8 //低电压检测中断isrDummy, // 0xFFFA //IRQ引脚中断isrDummy // 0xFFFC //SWI指令中断//RESET是特殊中断,其向量由开发环境直接设置(在本软件系统的Start08.o文件中) };3.1.1串行通信子程序SCI.h:#ifndef SCI_H#define SCI_H#include "MC9S08AW60.h"#include "Type.h"#define SCI_BDH(x) (*(vuint8 *)(0x00000038+(x-1)*8))#define SCI_BDL(x) (*(vuint8 *)(0x00000039+(x-1)*8))#define SCI_C1(x) (*(vuint8 *)(0x0000003A+(x-1)*8))#define SCI_C2(x) (*(vuint8 *)(0x0000003B+(x-1)*8))#define SCI_S1(x) (*(vuint8 *)(0x0000003C+(x-1)*8))#define SCI_S2(x) (*(vuint8 *)(0x0000003D+(x-1)*8))#define SCI_C3(x) (*(vuint8 *)(0x0000003E+(x-1)*8))#define SCI_D(x) (*(vuint8 *)(0x0000003F+(x-1)*8))#define EnableSCIReInt() SCI1C2 |=(SCI1C2_RIE_MASK)#define DisableSCIReInt() SCI1C2 &=~(SCI1C2_RIE_MASK)#define SCI_NUM_1 1#define SCI_NUM_2 2void SCIInit(uint8 SCINo,uint8 sysclk,uint16 baud);void SCISend1(uint8 SCINo,uint8 ch);void SCISendN(uint8 SCINo,uint16 n,uint8 ch[]);uint8 SCIRe1(uint8 SCINo,uint8 *p);uint8 SCIReN(uint8 SCINo,uint16 n,uint8 ch[]); void SCISendString(uint8 SCINo,char *p);#endifSCI.c:#include "SCI.h"void SCIInit(uint8 SCINo, uint8 sysclk, uint16 baud) {uint16 ubgs;ubgs=0;if(SCINo>2) {SCINo=2;}ubgs=sysclk*(10000/(baud/100))/16;SCI_BDH(SCINo)=(uint8)((ubgs&0xFF00)>>8); SCI_BDL(SCINo)=(uint8)(ubgs&0x00FF);SCI_C1(SCINo)=0b00000000;SCI_C2(SCINo)=0b00001100;}void SCISend1(uint8 SCINo, uint8 ch) {if(SCINo>2) {SCINo=2;}while(!(SCI_S1(SCINo)&0b1000000));SCI_D(SCINo)=ch;}uint8 SCIRe1(uint8 SCINo, uint8 *p) {uint16 k;uint8 i;if(SCINo>2){SCINo=2;}for(k=0;k<0xfbbb;k++)if((SCI_S1(SCINo)&0b00100000)!=0) {i=SCI_D(SCINo);*p=0x00;break;}if(k>=0xfbbb) {i=0xff;*p=0x01;}return i;}void SCISendN(uint8 SCINo, uint16 n, uint8 ch[]) { uint16 i;if(SCINo>2) {SCINo=2;}for(i=0;i<n;i++)SCISend1(SCINo,ch[i]);}uint8 SCIReN(uint8 SCINo, uint16 n, uint8 ch[]) { uint16 m;uint8 fp;m=0;if(SCINo>2) {SCINo=2;}while(m<n) {ch[m]=SCIRe1(SCINo,&fp);if(fp==1) {return 1;}m++;}return 0;}void SCISendString(uint8 SCINo, char *p) {uint32 k;if(SCINo>2) {SCINo=2;}if(p==0) return;for(k=0;p[k]!='\0';++k) {SCISend1(SCINo,p[k]);}}3.1.2 LCD子程序LCD.h:#ifndef LCD_H#define LCD_H#include "MC9S08AW60.h"#include "Type.h"#include "GeneralFun.h"#define LCDdata PTAD#define LCDdataD PTADD #define LCDctrl1 PTCD#define LCDctrlD1 PTCDD #define LCDctrl2 PTFD#define LCDctrlD2 PTFDD #define LcdRS 4#define LcdRW 6#define LcdE 6void LCDinit(void);void LCDcommand(uint8 cmd); void LCDshow(uint8 str[]);#endifLCD.c:#include "LCD.h"void LCDinit(void) {uint16 i;LCDdataD=0b11111111; LCDctrlD1 |=(1<<LcdRS); LCDctrlD1 |=(1<<LcdRW); LCDctrl1 &=~(1<<LcdRS); LCDctrl1 &=~(1<<LcdRW); LCDctrlD2 |=(1<<LcdE); LCDctrl2 |=(1<<LcdE); LCDcommand(0b00111000); LCDcommand(0b00001000); LCDcommand(0b00000001); for(i=0;i<4000;i++)asm("NOP"); LCDcommand(0b00000110); LCDcommand(0b00010100); LCDcommand(0b00001100); }void LCDcommand(uint8 cmd) { uint16 i;for(i=0;i<1000;i++)asm("NOP");LCDdata=cmd;LCDctrl2 |=(1<<LcdE);asm("NOP");asm("NOP");asm("NOP");LCDctrl2 &=~(1<<LcdE);for(i=0;i<1000;i++)asm("NOP");;}void LCDshow(uint8 str[]) { uint8 i;LCDinit();LCDctrl1 &=~(1<<LcdRS); LCDctrl1 &=~(1<<LcdRW); LCDcommand(0b10000000); LCDctrl1 |=1<<LcdRS; LCDctrl1 |=~(1<<LcdRW); for(i=0;i<8;i++) {LCDcommand(str[i]);}LCDctrl1 &=~(1<<LcdRS); LCDctrl1 &=~(1<<LcdRW); LCDcommand(0b11000000); LCDctrl1 |=1<<LcdRS; LCDctrl1 &=~(1<<LcdRW); }5.1 总结回顾起此次单片机课程设计,我仍感慨颇多,在接近两个星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。