嵌入式技术基础与实践Word格式.docx
- 文档编号:16455341
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:16
- 大小:388.97KB
嵌入式技术基础与实践Word格式.docx
《嵌入式技术基础与实践Word格式.docx》由会员分享,可在线阅读,更多相关《嵌入式技术基础与实践Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
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,&
//LCD显示字符长度
SCIReN(1,LCDLen,ShowBuff);
//LCD显示的内容
elseif(flag==132)//时钟标志
//接收3个字节的数据
SCIReN(1,3,time);
elseif(flag==133)//LED标志
//pwm处理模块
pwmDutyPC=SCIRe1(1,&
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,&
}
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<
<
TOFBit);
//2.向定时器溢出标志位TOF写0
EnableMCUint();
//开放总中断}
3.3主程序
主程序是完成系统各模块的初始化,完成各模块控制工作。
//主函数
voidmain()
//仅在本函数中用
uint8i;
uint8flag;
uint8ma;
uint8LCDi=0;
//定义初始显示缓存并赋初值
constuint8DisPalyInit[]
="
WaitReceiving..Soochow2010.09"
LCDLen=0;
chanelNum=30;
//为30,说明没有收到AD转换的客户端信息
pwmDutyPC=101;
//1关总中断
//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]='
LEDBuff[2]='
LEDBuff[3]='
//5.开放各模块中断
EnableSCIReInt();
//
(1)开放SCI接收中断
EnableTimer
(2);
//
(2)开放定时器1溢出中断
EnableKBint();
//6.开放总中断
//主循环
while
(1)
if(LightBuff!
=3)
//不等于3表明PC机有命令发送过来,然后进行处理
Light_Change(Light_Run_PORT,Light_Run);
SCISend1(1,130);
SCISend1(1,LightBuff);
if(LCDLen!
=0)//接收在中断中进行
for(i=LCDLen;
32;
i++)//为了满足32个字符
ShowBuff[i]='
*'
//LCD显示MCU从串口接收到的32个数据
LCDshow((uint8*)ShowBuff);
SCISend1(1,131);
//发送LCD的标志
SCISendN(1,32,ShowBuff);
//发回给PC机
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);
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<
len;
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"
\\..\\..\\Pictures\\buttonOff.BMP"
\\..\\..\\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))
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)
privatevoidLEDOpr(bytei,bytej,stringstr)
privatevoidbtnLED_Click(objectsender,EventArgse)
publicstaticboolGetBit(byteb,intindex)
第五章心得体会
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 技术 基础 实践