嵌入式技术基础与实践.docx
- 文档编号:3550025
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:16
- 大小:388.97KB
嵌入式技术基础与实践.docx
《嵌入式技术基础与实践.docx》由会员分享,可在线阅读,更多相关《嵌入式技术基础与实践.docx(16页珍藏版)》请在冰豆网上搜索。
嵌入式技术基础与实践
课程设计报告
课程设计名称:
嵌入式技术基础与实践
系别:
三系
学生姓名:
班级:
09通信工程
学号:
成绩:
指导教师:
王志超
开课时间:
2012-2013学年1学期
第一章嵌入式系统的需求分析
HC08和HCS08单片机是Freescale(飞思卡尔)公司于2000年前后推出的新一代单片机。
HC08、HCS08系列单片机使用相当的广泛,集成度高不需外扩,减少外扩带来的干扰,符合嵌入式单片机的要求,性能稳定、性价比高。
飞思卡尔半导体是全球领先的半导体公司,为汽车、消费、工业、网络和无线市场设计并制造嵌入式半导体产品。
在全球30多个国家和地区拥有设计、研发、制造和销售机构。
飞思卡尔半导体是全球最大的半导体公司之一。
Freescale公司(2004年7月之前称为Motorola公司的半导体事业部)为全球提供的各种MCU已突破170片,广泛用于各大品牌的产品:
摩托罗拉手机、索尼电子、惠尔普电器、罗技(Logitech)键盘与鼠标、美国力健(Lifefitness)心血管与力量训练器材、思科(Cisco)路由器、Bose音响、Trane供暖与制冷设备以及奔驰、宝马、福特、现代和通用汽车。
然而我国国内大多数“熟悉”单片机的人却不知晓这一底细,国内的微控制器市场从20世纪80年代开始,一直由Intel公司推出的MCS-51占据着绝对的统治地位。
人们又逐渐发现,从进口的电子信息类产品,特别是各类通信产品中,其中有MCU的,多数使用了Freescale的产品,而不是MCS-51。
因此学习FreescaleHCS08是非常重要,本报告描述一个FreescaleHCS08单片机实验系统软件实例,通过各个不同模块,验证单片机各模块工作是否正常。
可以独立工作观察MCU工作是否正常,也可以通过串行通信与PC机连接,实现与PC机的相互控制。
嵌入式系统设计的学习,首先把嵌入式系统软件与硬件基础打好了,再根据实际需要,选择一种实时操作系统(RTOS)进行学习实践。
使用RTOS也是视实际情况而定,使用RTOS适合实时多任务多线程的情况。
在此设计,MCU与PC机间通信的数据是几种不同外设,为了区分,需给不同的外设数据前标识不同的标识符,用于确定不同外设的数据。
编程之前确定每个模块硬件正常与否,测试方法参考“实验指导”教材相应章节。
编程设计方法:
MCU端每个模块程序编写完成后,及时用串行通信软件通过SCI连接PC机调试MCU端程序。
MCU的每个模块调试成功后,再使用高级语言开发编写PC端的相应通信模块程序,直至综合实验系统完全实现。
完成普通I/O口输入输出、驱动LCD显示、串行通信数据接收与发送、定时器计时、PWM、键盘输入、AD转换、FLASH读写模块等功能。
第2章系统构成
2.1硬件原理图
图C-1系统硬件原理图(最小系统)
系统使用MC9S08AW60MCU为核心,其最小原理图见图C-1所示。
(1)用PTC口的2引脚连接1号小灯;
(2)用PTD口的1引脚连接拨码开关;
(3)用PTE口的0引脚、1引脚分别连接SCI串行通信的发射口、接收口;
(4)用PTA口的0~7引脚连接LCD的数据口,PTC口的4、6引脚、PTF口的6引脚连接LCD的控制引脚RS、RW、E,共3个引脚驱动LCD显示;
(5)用PTD口的2、3、7引脚以及PTG口的0~4引脚共8个引脚连接键盘;其中PTD口的2、3、7引脚和PTG口的4引脚定义为输入线,PTG口的0~3引脚定义为输出线,利用扫描方式获取健值;
(6)用PTD口的6引脚定义为AD采样线,MCU读取该引脚,显示对象的量化值;
(7)PTE口的2引脚输出PWM波,控制连接在该引脚小灯的亮度。
具体连线方式见图C-2。
图C-2系统连线图
2.2软件结构图
软件包括MCU端与PC端2部分组成,下面分别介绍2部分软件的结构。
2.2.1MCU端软件结构
图C-3MCU端软件结构图
根据需求分析,选择MCU端所需资源,MCU可以开关控制、小灯显示、LCD显示、LED显示、键盘输入、AD转换、定时器溢出计时、产生PWM波、FLASH读写、SCI串行通信数据发送与接收等。
MCU端软件结构图,如图C-3所示。
硬件组建的方法:
测试所选择的每个模块,成功一个添加一个,同时做好测试软件的备份,并注释日期。
模块验证的方法见各实验的章节。
2.2.2PC端软件结构
图C-4PC端软件结构图
PC端使用C#编程,以串行通信为核心,使用串行通信与MCU进行通信实现,对MCU的控制和对MCU反馈信息进行处理,并反映在用户界面上。
根据MCU提供的功能,编写程序匹配其工作。
PC端程序包括串行通信数据输入输出、开关小灯控制、AD转换数据显示、Time(定时器)、PWM控制、FLASH读写、键盘数据显示模块。
软件结构图如图C-4所示。
第3章MCU方的程序设计
本章节将详细介绍MCU端的主程序和中断程序,利用各个模块完成本实验的各个功能,其中包括串行通信数据输入输出、LCD显示、键盘、AD转换、PWM、定时器计时、FLASH读写。
程序基于C语言编写,使用面向硬件对象模块封装的思想。
面向硬件对象模块的封装是对系统中的每个硬件对象建立相对应的头文件和硬件驱动程序文件。
头文件中主要包含该硬件的接口和相应的寄存器设置参数,硬件驱动程序文件主要是对该硬件的驱动,同时标注出各个功能模块的功能,入口,出口和堆栈深度。
所以编程人员可以不用了解模块的编程方法,即可利用这些模块程序。
于是剩下的编程工作只是面向总体各模块配合以及PC显示与控制的主程序和中断程序的编程。
硬件模块封装屏蔽了具体硬件对象的差异性,提高了程序的移植性和复用性。
各个模块的驱动程序见随书光盘。
3.1串行通信数据接收与发送
interruptvoidSCI1_Recv(void)
{
uint8f,i,flag;//标志是否接受到数据
DisableInterrupt();//禁止总中断
//接收32个字节的数据
f=SCIReN(1,1,SerialBuff);
//若收到数据,则发送接到的数据
if(f==0)
{
if(SerialBuff[0]>=130&&SerialBuff[0]<=137)
{
flag=SerialBuff[0];
}
if(flag==130)
{
//light模块
LightBuff=SCIRe1(1,&i);
}
elseif(flag==131)//LCD标志
{//连续接收可以,代码如下
LCDLen=SCIRe1(1,&i);//LCD显示字符长度
SCIReN(1,LCDLen,ShowBuff);//LCD显示的内容
elseif(flag==132)//时钟标志
{
//接收3个字节的数据
SCIReN(1,3,time);
}
elseif(flag==133)//LED标志
{
//pwm处理模块
pwmDutyPC=SCIRe1(1,&i);
}
elseif(flag==135)//LED标志
{
//接收4个字节的数据
i=SCIReN(1,4,LEDBuff);
if(i==0)
{
SCISend1(1,135);
SCISendN(1,4,LEDBuff);
for(i=0;i<4;i++)
LEDBuff[i]+='0';
}}
elseif(flag==137)
{
//AD模块
chanelNum=SCIRe1(1,&i);}
else
{
SCISendN(1,1,SerialBuff);
}}
EnableInterrupt();//开放总中断
}
3.2定时器控制
MCU端的定时器1s产生1次中断实现计时功能,MCU初始时钟的设定通过PC端发送而确定,MCU内部的定时器1实现计时,该定时器同时用作产生PWM波。
定时器溢出中断服务程序:
interruptvoidisrT1Out(void)
{INT8Utemp;
DisableMCUint();//禁止总中断
SecAdd1();//1s到,递增时,分,秒缓冲区的值
SCIsend1(132);//发送串口的标志
SCIsendN(3,time);
temp=T1SC;//1.读取定时器1状态和控制寄存器T1SC
T1SC&=~(1< EnableMCUint();//开放总中断} 3.3主程序 主程序是完成系统各模块的初始化,完成各模块控制工作。 //主函数 voidmain() { //仅在本函数中用 uint8i; uint8flag; uint8ma; uint8LCDi=0; //定义初始显示缓存并赋初值 constuint8DisPalyInit[] ="WaitReceiving..Soochow2010.09"; LCDLen=0; chanelNum=30;//为30,说明没有收到AD转换的客户端信息 pwmDutyPC=101; //1关总中断 DisableInterrupt();//禁止总中断 //1.1芯片初始化 MCUInit(); //2.模块初始化 SCIInit(1,SYSTEM_CLOCK,9600);// (1)串口初始化 Light_Init(Light_Run_PORT,Light_Run,Light_OFF);// (2)灯的引脚初始化 KBInit();//(3)按键初始化 TPMinit (2);//(4)定时器2初始化 LEDinit(); PWM(1,0,0x800,0);//定时器2通道0初始输出占空比为0周期为1s的PWM波 ADCInit();//AD初始化 //3.LCD显示初始化 LCDshow((uint8*)DisPalyInit); //4.内存初始化 // (1)"时分秒"缓存初始化(00: 00: 00) time[0]=0; time[1]=0; time[2]=0; // (2)小灯状态初始化3,表示没有命令发送过来 LightBuff=3; //(3)数码管状态初始化 LEDBuff[0]='8'; LEDBuff[1]='8'; LEDBuff[2]='8'; LEDBuff[3]='8'; //5.开放各模块中断 EnableSCIReInt();// (1)开放SCI接收中断 EnableTimer (2);// (2)开放定时器1溢出中断 EnableKBint(); //6.开放总中断 EnableInterrupt(); //主循环 while (1) { if(LightBuff! =3) { //不等于3表明PC机有命令发送过来,然后进行处理 Light_Change(Light_Run_PORT,Light_Run); SCISend1(1,130);//发送串口的标志 SCISend1(1,LightBuff); LightBuff=3; } if(LCDLen! =0)//接收在中断中进行 { for(i=LCDLen;i<32;i++)//为了满足32个字符 ShowBuff[i]='*'; //LCD显示MCU从串口接收到的32个数据 LCDshow((uint8*)ShowBuff); SCISend1(1,131);//发送LCD的标志 SCISendN(1,32,ShowBuff);//发回给PC机 LCDLen=0; } if(pwmDutyPC<101) { PWM(1,0,0x800,pwmDutyPC); Delay(10); pwmDutyPC=101;} if(chanelNum<30){ ma=(uint8)ADCAve(chanelNum,50); SCISend1(1,137); SCISend1(1,ma); chanelNum=30; } LEDshow(LEDBuff); }} 第4章PC方程序设计 PC端程序以串行SCI为核心,用户界面上划分多个区域,实现不同控制功能。 PC端用户界面如图C-5所示。 图C-5PC端程序运行界面 4.1串行数据接收中断程序 串行数据接收中断服务实现对于正在接收模块标志的识别并接收该模块的工作状态,将其显示在用户PC界面上。 PC端的串行接收中断程序: privatevoidSCIPort_DataReceived(objectsender,System.IO.Ports.SerialDataReceivedEventArgse) { if(! SCIPort.IsOpen) { this.TSSLState.Text="串口没打开! "; return; } Stringstr=String.Empty; boolFlag;//标记串口接收数据是否成功 intlen;//标记接收的数据的长度 //调用串口接收函数,并返回结果 Flag=sci.SCIReceiveData(SCIPort,refPublicVar.g_ReceiveByteArray); if(Flag==true) { //显示MCU端发来的数据,以便于调试 len=PublicVar.g_ReceiveByteArray.Length str=Encoding.Default.GetString(PublicVar.g_ReceiveByteArray); if((this.TbShowString.Text).Length>100) { this.TbShowString.Text=string.Empty; this.TbShowDec.Text=string.Empty; this.TbShowHex.Text=string.Empty; } else SCIUpdateRevtxtbox(TbShowString,str); //十进制和十六进制形式按字节进行处理 for(inti=0;i { data=PublicVar.g_ReceiveByteArray[i];//获取命令类型 //十进制都是按照三位来显示,字节之间有空格表示区分 SCIUpdateRevtxtbox(TbShowDec,data.ToString("D3")+""); //十六进制都是按照两位来显示,字节之间有空格表示区分 SCIUpdateRevtxtbox(TbShowHex,data.ToString("X2")+""); if(data>=130&&data<=150) { commandType=data; //准备使长度值=0 if(commandType==131)this.tbLCDOutput.Text=string.Empty; if(commandType==132)this.tbMCUTime.Text=string.Empty; if(commandType==137)this.tbADValue.Text=string.Empty; continue; } if(commandType==130) { byteswKey=data;//获取开关状态数据 //小灯和开关模块 if(swKey==1)//注意: 这是硬件开关的状态不一定对应软件开关的状态。 =1,则亮,否则暗 { this.btnSwKey.Image=Image.FromFile(Application.StartupPath+"\\..\\..\\Pictures\\buttonOn.BMP"); this.btnLight.Image=Image.FromFile(Application.StartupPath+"\\..\\..\\Pictures\\LightOn.BMP"); } else { this.btnSwKey.Image=Image.FromFile(Application.StartupPath+"\\..\\..\\Pictures\\buttonOff.BMP"); this.btnLight.Image=Image.FromFile(Application.StartupPath+"\\..\\..\\Pictures\\LightOff.BMP"); } } elseif(commandType==131) { //LCD测试模块 SCIUpdateRevtxtbox(tbLCDOutput,((char)data).ToString()); } elseif(commandType==132) { //timer模块 bytetmr=data; tmrCount++; tmrStr+=(tmrCount>1? ": ": "")+(tmr<10? ("0"+tmr.ToString()): tmr.ToString()); if(tmrCount>=3) { SCIUpdateRevtxtbox(tbMCUTime,tmrStr); tmrCount=0; tmrStr=string.Empty; commandType=0; } } elseif(commandType==133) { //PWM测试模块 //高端不作处理仅留一接口在此 } elseif(commandType==134) { //键盘测试模块 bytekbKey=data; for(bytej=0;j<16;j++) if(KBBoard[j]==(char)kbKey) { kb[j].Image=Image.FromFile(Application.StartupPath+"\\..\\..\\Pictures\\KeyDown.BMP"); KBi=j; SCIUpdateRevtxtbox(tbKBShow,KBBoard[j].ToString()); break; } } elseif(commandType==135) { //LED测试模块 bytedtLED=data; //复原 LEDOpr(ledCount,j,"Off"); //再根据条件使相应的条型变换 if(GetBit(ledTBL[dtLED],j)) { LEDOpr(ledCount,j,"On"); } } ledCount++; if(ledCount>=4) { ledCount=0; } } elseif(commandType==137) { //AD转换模块 intADValue=data; SCIUpdateRevtxtbox(tbADValue,ADValue.ToString()); }}}} 4.2PC端其它发送以及处理子程序 PC机与MCU端通信,可以将PC端控制指令发送给MCU端,从而控制MCU相应模块的工作状态。 其他子程序: privatevoidbtnTimeUpdate_Click(objectsender,EventArgse) privatevoidbtnLCDSend_Click(objectsender,EventArgse) privatevoidhScrollBar1_Scroll(objectsender,ScrollEventArgse) privatevoidcbADNum_SelectedIndexChanged(objectsender,EventArgse) privatevoidbtnFlashSend_Click(objectsender,EventArgse) privatevoidbtnFlashRead_Click(objectsender,EventArgse) privatevoidgbKeyBoard_Click(objectsender,System.EventArgse) privatevoidbtnSwKey_Click(objectsender,EventArgse) privatevoidcbADNum_SelectedIndexChanged(objectsender,EventArgse) privatevoidLEDOpr(bytei,bytej,stringstr) privatevoidbtnLED_Click(objectsender,EventArgse) publicstaticboolGetBit(byteb,intindex) 第五章心得体会
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 技术 基础 实践