DSP课程设计

更新时间:2023-08-15 22:44:01 阅读量: 教学研究 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1 课程设计目的

通过我们对DSP控制器及其应用课程的学习和理解,综合运用课本中所学到的理论知识完成一个温度采集与显示的课程设计。通过这次实践锻炼我们查阅资料、方案比较、团结合作的能力。在这个过程我们必须掌握温度采集技术的硬件设计、熟悉A/D转换技术和DSP液晶显示功能的软件设计。学会采用简单电路的实验调试和整机指标测试方法,增强我们的动手能力,为以后学习和工作打下坚实基础 2 课程设计正文 2.1 系统分析

2.1.1 设计的任务及步骤

(1)熟悉MC1403芯片的应用;

(2)根据实验测得热敏电阻和温度的一些数据,设计温度——电阻公式; (3)设计外部硬件电路;

(4)软件完成程序流程图设计和编程,其中包括A/D转换和液晶显示部分; (5)编写上位机程序 (6)软硬件联合调试; (7)书写设计说明书。 2.1.2 技术要求

此系统利用热敏电阻测得电阻—温度之间的关系,找到电阻和温度之间的代数关系,从而检测温度,设计硬件外扩电路,同时设计软件程序,包括A/D程序设计,进行软硬件联系调试,能在液晶显示屏上显示温度。 2.1.3 设计思路

首先设计温度采集电路,由于考虑到使用的是非线性负温度系数的热敏电阻,因此采用了桥式电路尽量减小因外接不必要因素导致的误差,通过多次试验测得几个点,并拟合出一条合适的线性函数关系。其次进行软件设计,主要包括AD转换模块、液晶显示模块、算法转换模块、主函数模块以及上位机模块。最后进行软硬件联系调试,并能在液晶上正常显示温度值。 2.2 总体设计 2.2.1 硬件设计

TMS320F2812作为本次课设使用的DSP芯片。它包含33个电源引脚(为使器件正常运行,所有电源引脚必须正确连接且不能悬空)时钟源模块,DSP有六种信号可以使DSP控制器复位,即电源复位、复位引脚~RS、软件复位、非法地址复位、看门狗定时器溢出、欠压复位六种复位信号。所以在设计的初期,把它分成了五个模块。其中复位采用电源复位的方式,由引脚PCRESET引起。

为了可靠复位,其中低电平的有效时间至少6个CPU时钟周期。DSP最小系统组成框图如图1所示。

图1 DSP最小系统

其中:开关SW-PB、电容以及电阻构成一个简单的抚慰电路;晶振与两个并联电容接在XTAL1与XTAL2为2812提供外部时钟;HT7133芯片将5V直流电源转换为3.3V直流电源构成电源模块为2812供电。 2.2.2系统框图设计

该系统包括温度采集模块、F2812芯片、AD转换模块以及液晶显示模块,首先通过热敏电阻对外界温度的变化,从而改变其电位的变化,F2812芯片等待中断并接收数据,然后送入AD转换模块,AD对模拟信号进行转换,并将转换结果存放在结果寄存器的高12位,为保证数据精确多次采样求平均值,最后通过算法转换,将结果显示在LCD液晶上。系统设计流程如图2所示。

统设计流程图

2 系

2.3 单元电路的设计 2.3.1 温度采集电路

考虑到此次使用的是非线性负温度系数的热敏电阻,因此采用桥式电路尽量确保其精度,并使用低压基准芯片MC1403为电路提供基准电压,确保其尽量减少外界不必要因素的影响。温度采集电路如图4所示。

图3 温度采集电路

2.3.2 单元模块的分析

(1)MC1403低压基准芯片引脚如图4所示。

图4 MC1403低压基准芯片引脚图

Vin端口输入一个4.5~40V的模拟电压值(接P2口的1引脚),在Vout端输出了一个稳定的电压值(接P2口的1引脚,为AD模块提供参考模拟高电平),GND端接模拟地(接P2口的33引脚)为AD提供参考模拟低电平,并与数字地短接。 (2)AD转换模块

当模/数转换完成后,读取结果寄存器前,最好先读取模/数转换控制寄存器ADCRL2的ADCRESULT0或ADCRESULT1,以确定当前结果寄存器的状态,保证读取的结果是正确。另外,要注意12位的转换结果放在结果寄存器中的高12位上,要进行位移转换,该12位数据与外部模拟输入电压的关系为:

12位数字结果=4095*(输入电压/基准电压)

基准电压:3V

输入电压:A/D采集的电压

12位数字结果:12位的转换结果是放在结果寄存器的高12位上。 (3)LCD液晶显示模块

DSP经常会对读写周期较慢的输入/输出设备(如液晶显示模块、打印机、键盘等)进行访问,通常以下两种方法来解决DSP与这些慢速设备之间的输入/输出时序匹配问题。直接访问方式是将DSP的读写信号限于慢速设备接口控制板引出的读写信号线直接相连,时序由DSP内部读写逻辑控制。由于慢速外设的读写周期相对DSP较慢,是两者的时序匹配,还必须进行一些时序方面的控制处理。一中处理方法是软件编程等待状态发生器,将外部总线周期扩展到数个机器周期。由于受硬件条件的限制,这种扩展通常也是有限的。

液晶显示为128行和64列的矩阵,它分左右两个平面,而一个字是16行和16列的矩阵,在按页的显示中每一页是一个8行和128列的矩阵,所以每一行字是分两页显示的 系统设计总电路图如图5所示。

图.5 系统设计总电路图

(4)单片机与PC机串口通讯

DSP有一个全双工的串行通讯口,所以DSP和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而DSP的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和DSP的11脚连接,第9

TXD

DSP 控 制 器

MC1488

RXD GND

TXD GND

R S 2 3 2

PC 机

RXD

MC1489

脚和单片机的10脚连接,第15脚和单片机的20脚连接。全双工的串行通讯口原理图如图1所示: 图 1 异步串行通讯原理图

DSP控制器串行通信接口(SCI)是一个标准的通用异步接收/发送(UART)通信接口。它的接收器和发送器都是双缓冲的。DSP控制器串行通信接口(SCI)有自已的使能和中断位,它们可以半双工或全双工方式工作。为了保证数据的完整性,串行通信接口对接收的数据进行间断检测、奇偶性、超时和帧错误的检查。位速率(波特率)可通过一个16位的比特率选择寄存器进行编程,因此,可以有超过65000种不同的速率。

SCI模块是一个8位片内外设,通过DSP的16位外部数据总线的低8位与外部设备通信。 SCI的物理描述: (1)两个I/O引脚。

*SCIRXD(SCI接收数据输入) *SCITXD(SCI发送数据输出)

(2)通过一个16位波特率选择寄存器的编程,可得到超过65000种不同的可编程位速率。 (3)1~8的可编程数据字长。

(4)长度为1位或2位的可编程停止位。 (5)内部产生的串行时钟。 (6)四个错误检测标志。 *奇偶性错误 *超限错误 *帧错误 *间断检验

(7)两种唤醒多处理器模式,可与任意通信格式一起使用。 *空闲线路唤醒 *位寻址唤醒 (8)半双工或全双工操作。 (9)双缓冲接收和发送功能。

(10)接收和发送操作均可通过中断或查询操作进行,相应的状态标志如下:

发送器:TXRDY标志(发送器缓冲寄存器准备好接收另一个字符)和TXEMPTY标志(发送移位寄存器空)。

接收器:RXRDY标志(准备从接收缓冲寄存器中读出一个新字符)、BRKDT标志(间断条件发生)

和RXERROR,可用来监视四个中断条件。

(11)发送器和接收器中断的分立的使能位(间断除外)。

(12)SCI数据,不管是接收的、还是发送的,都是NRZ(非归零)格式的。 2.4 软件程序设计 2.4.1 软件系统流程图 软件系统流程如图6 所示。

图6 软件系统流程图

2.4.2 软件程序设计

程序主要包括主程序、中断、延时、A/D转换、算法转换、液晶显示等子程序,实现温度采集与显示的功能,程序详见附录。此次课设我主要负责AD转换、算法转换和主程序部分。

AD转换部分我采用单通道采样方式对温度采集电路发送的值进行转换,并使用了第一组的6号中断对电路进行定时采样,由于考虑到热敏电阻比较灵敏,我采用了多次采样求平均值的方法确保数据精确。

算法转换部分主要是对AD采集并转换的值进行进一步的转换,主要是将桥式电路的电压与热

敏电阻的关系和拟合的温度与电阻的关系整合在一起,使其转换为我们能看懂的温度,并将其一位一位拆分开来复制到LCD液晶显示子程序,将结果显示字液晶屏上。 (1)NTC热敏电阻原理及应用

NTC热敏电阻器在室温下的变化范围在10O~1000000欧姆,温度系数-2%~-6.5%。NTC热敏电阻器可广泛应用于温度测量、温度补偿、抑制浪涌电流等场合。 NTC热敏电阻为负温度系数热敏电阻。

零功率电阻值 RT(Ω):RT指在规定温度 T 时,采用引起电阻值变化相对于总的测量误差来说可以忽略不计的测量功率测得的电阻值。 电阻值和温度变化的关系式为:

RT = RN expB(1/T – 1/TN)

RT :在温度 T ( K )时的 NTC 热敏电阻阻值。 RN :在额定温度 TN ( K )时的 NTC 热敏电阻阻值。 T :规定温度( K )。

B : NTC 热敏电阻的材料常数,又叫热敏指数。 exp :以自然数 e 为底的指数( e = 2.71828 …)。

该关系式是经验公式,只在额定温度 TN 或额定电阻阻值 RN 的有限范围内才具有一定的精确度,因为材料常数 B 本身也是温度 T 的函数。

额定零功率电阻值 R25 (Ω):根据国标规定,额定零功率电阻值是 NTC 热敏电阻在基准温度 25 ℃ 时测得的电阻值 R25,这个电阻值就是 NTC 热敏电阻的标称电阻值。通常所说 NTC 热敏电阻多少阻值,亦指该值。

材料常数(热敏指数) B 值( K )

RT1 :温度 T1 ( K )时的零功率电阻值。 RT2 :温度 T2 ( K )时的零功率电阻值。 T1, T2 :两个被指定的温度( K )。

对于常用的 NTC 热敏电阻, B 值范围一般在 2000K ~ 6000K 之间。已知150Ω时为25℃,即R25 = 150Ω,120Ω时为45℃,经计算,B约为2121.7K。代入得:

r=150*exp(2121.7*((1/t)-1/298))

取曲线上的任意几点,再用Matlab进行曲线拟合,得到几条直线,经筛选后得到如图7的图形。经变换单位后,得到温度与电阻值之间的关系式:

T = 125 –

2/3*R

图7 拟合后的直线

其中横坐标为温度,单位为K;纵坐标为电阻值。

由硬件部分(电桥电路)得到电压与电阻值之间的关系:V = 2.5*R1/(R1+R),其中R1=200Ω,与上式相结合并经调试修改后,得到温度值与电压之间的关系:

T=140.0-0.67*(500.0/V-200.0)

//温度计算子程序 void Wendu(float c) {

temperature=140.0-0.67*(500.0/c-200.0);

T_tempe=(int)temperature; T_tempe1=T_tempe/10; T_tempe0=T_tempe%10;

D_tempe=(int)(10*(temperature-T_tempe)); } (2)上位机

SCI波特率的设置:

16位的波特率数值用BRR表示。

SCI使用16位的波特率选择寄存器值来选择64K种不同的串行时钟频率中的一种。 选择可以通过以下方法来确定:

当 BRR =1~65535时(BRR=波特率选择寄存器中的16位值):

SCI异步波特率

SYSCLK

RR

SYSCLK

波特率是按位计算的,而每位需要8个SCICLK周期。 当 BRR = 0 时

串行通信过程:

① 在进行串行通信之前,先对 SCI 通信控制寄存器 SCICCR 进行设置。 信息块的起始位始终是1位,停止位可选择1位或2位。

数据位的长度是可编程的,可设置1~8位,由SCICCR的SCICHAR2:0设置。数据位长度小于8位时,写到发送缓冲寄存器SCITXBUF的数据只有低L位被发送(这些数据位必须右对齐,因为对于少于8位的字符,左边的位是被忽略的)。

校验位可设,由SCICCR的PARITY ENABLE(5位)设置。校验方式有两种,奇、偶校验,由SCICCR的PARITY(6位)设置。

空闲线方式与地址位方式的选择,由SCICCR的ADDR/IDLE MODE(3位)设置。 SCICCR的SCIENA(4位)是一个总开关位。

② 在信息块的格式确定后就要确定串行通信的波特率。

串行通信的时钟SCICLK是由时钟源模块的SYSCLK按照SCI波特率寄存器规定的分频系数分频后得到的。

16位的波特率寄存器SCIHBAUD和SCILBAUD分别决定了波特率寄存器的高、低8位,二者共同构成了16位的波特率数值。

③ 设置好串行通信的波特率后,就要确定接收、发送部分的控制位,这些由SCI控制寄存器SCICTL1、2来完成,

④ 当数据写入SCITXBUF时,SCICTL2的TXRDY(7位)被清0;当SCITXBUF的数据全部移出后,则SCICTL2的TXRDY被置1,并且产生发送中断TXINT。 (3)SCI下位机程序

#include”DSP281x_Device.h”

//使用的函数原型声明 void Gpio_select(void); void SpeedUpRevA(void); void SCI_Init(void);

interrupt void SCI_TX_isr(void); interrupt void SCI_RX_isr(void); //全局变量

char message[]=temperature; void main(void)

SCI异步波特率

{

InitSystem();//初始化DSP内核寄存器 Gpio_select();//配置GPIO复用功能寄存器

InitPieCtrl();//调用外设中断扩展初始化单元PIE-unit //(代码:DSP281x_PieCtrl.c)

InitPieVectTable();//初始化PIE vector向量表 // (代码:DSP281x_PieCtrl.c) EALLOW;//解除寄存器保护

PieVectTable.TXAINT=& SCI_TX_isr; PieVectTable.RXAINT=& SCI_RX_isr; EDIS;// 使能寄存器保护

//使能PIE中的SCI_A_TX_INT中断 PieCtrlRegs.PIEIER9.bit.INTx2=1; //使能PIE中的SCI_A_RX_INT中断 PieCtrlRegs.PIEIER9.bit.INTx1=1; //使能CPU INT 9 IER |=ox100;

//全局中断使能和更高优先级的实时调试事件 EINT;// 全局中断使能INTM ERTM;// 使能实时调试中断DBGM SCI_Init(); While(1) {

PieCtrlRegs.WDKEY=ox55;//看门狗控制 PieCtrlRegs.WDKEY=oxAA; EDIS;// 使能寄存器保护 } }

void Gpio_select(void) {

EALLOW;//解除寄存器保护

GpioMuxRegs.GPAMUX.all=ox0;//所有GPIO端口配置为I/O GpioMuxRegs.GPBMUX.all=ox0; GpioMuxRegs.GPFMUX.all=ox0; GpioMuxRegs.GPDMUX.all=ox0;

GpioMuxRegs.GPAMUX.bit.SCIRXDA_GPIOF5=1;//配置SCI_RX GpioMuxRegs.GPAMUX.bit.SCIXTDA_GPIOF4=1;//配置SCI_TX GpioMuxRegs.GPEMUX.all=ox0; GpioMuxRegs.GPGMUX.all=ox0;

GpioMuxRegs.GPADIR.all=ox0;//GPIO PORT 配置为输入 GpioMuxRegs.GPBDIR.all=ox0; //GPIO PORT 配置为输入 GpioMuxRegs.GPDDIR.all=ox0; //GPIO PORT 配置为输入 GpioMuxRegs.GPEDIR.all=ox0; //GPIO PORT 配置为输入 GpioMuxRegs.GPFDIR.all=ox0; //GPIO PORT 配置为输入 GpioMuxRegs.GPGDIR.all=ox0; //GPIO PORT 配置为输入 //设置所有GPIO输入的量化值等于0

GpioMuxRegs.GPAQUAL.all=ox0; GpioMuxRegs.GPBQUAL.all=ox0; GpioMuxRegs.GPDQUAL.all=ox0; GpioMuxRegs.GPEQUAL.all=ox0; EDIS;// 使能寄存器保护 }

void InitSystem(void) //初始化DSP内核寄存器 {

EALLOW;//解除寄存器保护

SysCtrlRegs.WDCR=ox00AF;//配置看门狗

//ox00E8 禁止看门狗,预定标系数Prescaler=1

//ox00AF 不禁止看门狗,预定标系数Prescaler=64 SysCtrlRegs.SCSR=0;//看门狗产生复位

SysCtrlRegs.PLLCR.bit.DIV=10;//配置处理器锁相环,倍频系数为5 SysCtrlRegs.HISPCP.all=ox1;// 配置高速外设时钟分频系数为2 SysCtrlRegs.LOSPCP.all=ox2;// 配置低速外设时钟分频系数为4 //设置使用的外设时钟

//一般不使用的外设时钟禁止,降低系统功能 SysCtrlRegs.PCLKCR.bit.EVAENCLK=0; SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;

SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;//使能SCI模块的时钟 SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1; SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0; SysCtrlRegs.PCLKCR.bit.SPIENCLK=1; SysCtrlRegs.PCLKCR.bit.ECANENCLK=0; SysCtrlRegs.PCLKCR.bit.ADCENCLK=0; EDIS;// 使能寄存器保护 }

void SCI_Init(void) {

SciaRegs.SCICCR.all=ox0007;//1bit停止位 无循环模式 //无极性,字符长度:8bit //异步模式,空闲线协议

SciaRegs.SCICTL1.all=ox0003;//使能TX、RX、内部SCICLK //RX ERR、SLEEP、TXWAKE

SciaRegs.SCIHBAUD=487>>8;//波特率:9600(LSPCLK=37.5MHz) SciaRegs.SCILBAUD=487&ox00FF;

SciaRegs.SCICTL2.bit.TXINTENA=1;//使能SCI发送中断 SciaRegs.SCICTL2.bit.RXBKINTENA=1;//使能SCI接收中断 SciaRegs.SCIFFTX.all=oxE060; //bit15=1:退出复位 //bit14=1:使FIFO增强模式 //bit13=1:使能TX FIFO操作 //bit6=1:CLR TXEFINT-标志 //bit5=1:使能TX FIFO 匹配

//bit4~0:如果TX FIFO=0,产生TX_ISR中断

SciaRegs.SCIFFRX.all=oxE065;//Rx中断级设置为5 SciaRegs.SCICTLI.all=ox0023;//使SCI退出复位 }

//SCI_A发送中断服务程序 //发送字符串message[]

interrupt void SCI_TX_isr(void) {

int i;

for(i=0;i<16;i++)

SciaRegs.SCITXBUF= message[i];

//重新初始化PIE,为SCI_A TX准备接收下一次中断 PieCtrlRegs.PIEACK.all=ox0100;//响应中断 }

(4)上位机程序如下: using System;

using System.Collections.Generic; using ponentModel; using System.Data; using System.Drawing; using System.Text;

using System.Windows.Forms; using System.IO;

using System.IO.Ports; namespace WEUDUCELIANG {

public partial class Form1 : Form {

string serialReadString, ss, cc, string1; int i = 0; public Form1() {

InitializeComponent();

timer1.Interval =1;//设置timer控件时间间隔 timer1.Enabled = false; serialPort1.DataBits = 8;

serialPort1.StopBits = System.IO.Ports.StopBits.One; serialPort1.ReadBufferSize = 500000;

serialPort1.RtsEnable = true; //如果是RS232转RS485,此句必须要,否则不能通讯

serialPort1.NewLine = ""; }

private void button1_Click(object sender, EventArgs e) {

if (button1.Text == "打开串口") {

if (!serialPort1.IsOpen) //如果串口是关闭的

{

//设定串口信息和波特率

serialPort1.PortName = boBox1.SelectedItem.ToString();

serialPort1.BaudRate =

Convert.ToInt32(boBox2.SelectedItem.ToString()); serialPort1.Parity = Parity.None; serialPort1.DataBits =

Convert.ToInt16(boBox4.SelectedItem.ToString()); serialPort1.StopBits = StopBits.One; try {

serialPort1.Open(); //打开串口 button1.Text = "关闭串口"; //改变按钮上的字符 comboBox1.Enabled = false; comboBox2.Enabled = false; comboBox3.Enabled = false; comboBox4.Enabled = false; comboBox5.Enabled = false; } catch {

MessageBox.Show("串口打开失败!\n可能是串口已被占用!"); } }

else //如果串口是打开的 {

serialPort1.Close(); //关闭串口

button1.Text = "打开串口"; //改变按钮上的字符 comboBox1.Enabled = true; comboBox2.Enabled = true; comboBox3.Enabled = true; comboBox4.Enabled = true; comboBox5.Enabled = true; } } else {

serialPort1.Close();

serialPort1.Dispose(); //关闭串口

button1.Text = "打开串口"; //改变按钮上的字符 comboBox1.Enabled = true; comboBox2.Enabled = true; comboBox3.Enabled = true; comboBox4.Enabled = true; comboBox5.Enabled = true; btnCJ.Enabled = true; button4.Enabled = false; } }

private void btnCJ_Click(object sender, EventArgs e) { try

{

if (serialPort1.IsOpen) {

btnCJ.Enabled = false;

button4.Enabled = true; serialReadString = serialPort1_DataReceived1(); if (serialReadString != ""&&(serialReadString != cc|| textBox1.Text == "")) {

textBox1.AppendText("时间:" + DateTime.Now.ToString() + "温度:" + serialReadString + "℃" + "");

cc = serialReadString; }

timer1.Start(); } else

{

MessageBox.Show("串口未打开请先打开串口!"); } }

catch//抛出异常 {

MessageBox.Show("没找到设备"); serialPort1.Close(); serialPort1.Dispose(); } }

private void button4_Click1(object sender, EventArgs e) {

timer1.Stop();

button4.Enabled = false; btnCJ.Enabled = true; string1 = "";

//serialPort1.Close(); //serialPort1.Dispose(); }

private void button2_Click(object sender, EventArgs e) //清除listbox控件中的内容 {

textBox1.Text = ""; }

private void button3_Click(object sender, EventArgs e) //保存温度数据 {

System.IO.FileStream objfile; saveFileDialog1.ShowDialog();

if (@saveFileDialog1.FileName != null) {

objfile = System.IO.File.Create(@saveFileDialog1.FileName); objfile.Close(); objfile.Close(); objfile.Dispose();

System.IO.StreamWriter objfiles = new StreamWriter(@saveFileDialog1.FileName);

objfiles.Write(textBox1.Text); objfiles.Close(); objfiles.Dispose();

} else {

MessageBox.Show("路径不可为空!"); } }

private void timer1_Tick(object sender, EventArgs e) {

serialReadString = serialPort1_DataReceived1();

if (serialReadString != "" && (serialReadString != cc || textBox1.Text == ""))

{

textBox1.AppendText("时间:" + DateTime.Now.ToString() + "温度:" + serialReadString + "℃" + "");

cc = serialReadString; serialReadString = ""; } else {

//textBox1.AppendText("时间:" + DateTime.Now.ToString() + "温度:" + cc + "℃" + ""); } }

/// <summary> /// 接收信息 /// </summary>

/// <param name="data">存储接收的信息</param>

/// <param name="offset">缓冲区数组中开始写入的偏移量</param> /// <param name="count">要读取的字节数</param> /// <param name="serialPort">串行口</param> /// <returns></returns>

public bool ReceiveData(byte[] data, int offset, int count, SerialPort serialPort) {

if (serialPort1.IsOpen) {

try {

serialPort1.Read(data, offset, count); return true; } catch {

return false; } } else {

return false; } }

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)

{

this.serialPort1.PortName = boBox1.SelectedItem.ToString(); }

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) {

this.serialPort1.BaudRate = Convert.ToInt32(boBox2.SelectedItem); }

private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) {

switch (boBox3.SelectedItem.ToString()) {

case "None":

this.serialPort1.Parity = Parity.None; break; case "Even":

this.serialPort1.Parity = Parity.Even; break; case "Odd":

this.serialPort1.Parity = Parity.Odd; break;

default: this.serialPort1.Parity = Parity.None; break; } }

private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) {

this.serialPort1.DataBits = Convert.ToInt16(boBox4.SelectedItem); }

private void comboBox5_SelectedIndexChanged(object sender, EventArgs e) {

switch (Convert.ToInt16(boBox5.SelectedItem)) {

case 1:

this.serialPort1.StopBits = StopBits.One; break; case 2:

this.serialPort1.StopBits = StopBits.Two; break; default:

this.serialPort1.StopBits = StopBits.One; break; } }

private void Form1_Load(object sender, EventArgs e) {

#region ------以下各赋值语句都会触发相应的SelectedIndexChanged事件,同时会对串口进行初始化设------

boBox1.SelectedItem = boBox1.Items[3]; //"COM4";

boBox2.SelectedItem = boBox2.Items[3]; //9600; boBox3.SelectedItem = boBox3.Items[0]; //8; boBox4.SelectedItem = boBox4.Items[0];//Parity.None;

boBox5.SelectedItem =boBox5.Items[0];///StopBits.One

#endregion }

string serialPort1_DataReceived1() {

//ss = null;

serialPort1.Write("");//把数据写入输入缓冲器区 string1 += serialPort1.ReadExisting(); if (i >= string1.Length) {

i = 0; string1 = ""; return string1; } else {

if (string1.Length >= 5) {

for (; i < string1.Length; ) {

ss = string1.Substring(i, 5); i += 5; return ss; }

return string1.Substring(i-5, 5); } else {

string1 = ss; return ss; }

} }

private void Form1_FormClosing(object sender, FormClosingEventArgs e) {

DialogResult rst = MessageBox.Show(this, "您真的要退出温度测量系统吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); switch (rst) {

case DialogResult.Yes:

Application.ExitThread(); Application.Exit(); break;

case DialogResult.No: e.Cancel = true; break; } }

private void button4_Click(object sender, EventArgs e) {

//timer1.Stop();

button4.Enabled = false; btnCJ.Enabled = true; string1 = "";

//serialPort1.Close();

//serialPort1.Dispose(); //button1.Text = "打开串口"; } } } 3 联机调试

经过团队不懈努力终于将这个方案全部做出来了,并且理论上已经得到老师的认可,程序调试

也没有出现问题。首先按照电路图将外扩部分连接好,并与PC机连接正常,再按照CCS2000软件的使用步骤,打开要调试的程序,下载程序,查看实验结果。实验结果出来后语我们预期的结果大相径庭,而且跳变分常快。后来我们才发现问题所在,并将之修改正确。 调试结果如图7 所示。

图7 联机调试结果

4 课程设计总结

5 参考文献

[1] 万山明.TMS320F281x DSP原理及应用实例.北京航空航天大学出版社,2007 [2] 郑红,王鹏,董云凤,吴冠.DSP应用系统设计实践.北京航空航天大学出版社,2006 [3] 徐科军,张瀚,陈智渊.TMS320F281xDSP 原理与应用.北京航空航天大学出版社,2006 [4] 苏奎峰,吕强,.TMS32OX281xDSP原理及C程序开发. 北京航空航天大学出版社,2008 [5] 郁有文,常健,程继红.传感器原理及工程应用.西安电子科技大学出版社,2008

课程设计 评 语

课程设计 成 绩

指导教师 (签字) 年 月 日

第 19 页 共 19 页

本文来源:https://www.bwwdw.com/article/nmoj.html

Top