《DSP控制器及其应用课程设计-温度采集与显示.doc》由会员分享,可在线阅读,更多相关《DSP控制器及其应用课程设计-温度采集与显示.doc(16页珍藏版)》请在三一文库上搜索。
1、信息与电气工程学院课程设计说明书(2010/2011学年第二学期)课程名称 : DSP控制器及其应用 题 目 : 温度采集与显示 专业班级 : 学生姓名 : 学 号 : 指导教师 : 设计周数 : 2周 设计成绩 : 2011年7月7日1 课程设计目的通过我们对DSP控制器及其应用课程的学习和理解,综合运用课本中所学到的理论知识完成一个温度采集与显示的课程设计。通过这次实践锻炼我们查阅资料、方案比较、团结合作的能力。在这个过程我们必须掌握温度采集技术的硬件设计、熟悉A/D转换技术和DSP液晶显示功能的软件设计。学会采用简单电路的实验调试和整机指标测试方法,增强我们的动手能力,为以后学习和工作打
2、下坚实基础。2 课程设计正文2.1 系统分析2.1.1 设计的任务及步骤(1)熟悉MC1403芯片的应用; (2)根据实验测得热敏电阻和温度的一些数据,设计温度电阻公式; (3)设计外部硬件电路; (4)软件完成程序流程图设计和编程,其中包括A/D转换和液晶显示部分; (5)软硬件联合调试;(6)书写设计说明书。2.1.2设计思路 首先设计温度采集电路,由于考虑到使用的是非线性负温度系数的热敏电阻,因此采用了桥式电路尽量减小因外接不必要因素导致的误差,通过多次试验测得几个点,并拟合出一条合适的线性函数关系。其次进行软件设计,主要包括AD转换模块、液晶显示模块、算法转换模块以及主函数模块。最后进
3、行软硬件联系调试,并能在液晶上正常显示温度值2.2 总体设计2.2.1 硬件设计TMS320F2812作为本次课设使用的DSP芯片。它包含33个电源引脚(为使器件正常运行,所有电源引脚必须正确连接且不能悬空)时钟源模块,DSP有六种信号可以使DSP控制器复位,即电源复位、复位引脚RS、软件复位、非法地址复位、看门狗定时器溢出、欠压复位六种复位信号。所以在设计的初期,把它分成了五个模块。其中复位采用电源复位的方式,由引脚PCRESET引起。为了可靠复位,其中低电平的有效时间至少6个CPU时钟周期。DSP最小系统组成框图如图1所示。图1 DSP最小系统其中:开关SW-PB、电容以及电阻构成一个简单
4、的抚慰电路;晶振与两个并联电容接在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温度采集电路考虑到此
5、次使用的是非线性负温度系数的热敏电阻,因此采用桥式电路尽量确保其精度,并使用低压基准芯片MC1403为电路提供基准电压,确保其尽量减少外界不必要因素的影响。温度采集电路如图3所示。图3 温度采集电路2.3.2单元模块的分析(1)MC1403低压基准芯片引脚如图4所示。图4 MC1403低压基准芯片引脚图Vin端口输入一个4.540V的模拟电压值(接P2口的1引脚),在Vout端输出了一个稳定的电压值(接P2口的1引脚,为AD模块提供参考模拟高电平),GND端接模拟地(接P2口的33引脚)为AD提供参考模拟低电平,并与数字地短接。(2)AD转换模块12位数字结果=4095*(输入电压/基准电压)
6、基准电压:3V输入电压:A/D采集的电压12位数字结果:12位的转换结果是放在结果寄存器的高12位上。(3)LCD液晶显示模块液晶显示为128行和64列的矩阵,它分左右两个平面,而一个字是16行和16列的矩阵,在按页的显示中每一页是一个8行和128列的矩阵,所以每一行字是分两页显示的系统设计总电路图如图5所示。图.5 系统设计总电路图2.4 软件程序设计2.4.1 软件系统流程图图6 软件系统流程图3联机调试调试结果如图7 所示。图7 联机调试结果4课程设计总结这次课程设计除了关于DSP方面的心得体会,还有是关于人与人之间关系方面的。在这期间,我得到了很多同学的帮助。我本人对DSP也并不是很熟
7、悉,学的东西应用不是很好,理论联系不了实际。以前的C语言没学好,一开始的程序这块儿就要令我束手无策了。后来请教同学和老师,看他边做边给我讲解,是我取得了很大的进步。最后说明自己对这门课程的感受,课堂教学考虑到大多数同学的需求,主要强调“基本”基本知识、基本理论、基本方法、基本技能。而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。回顾起此课程设计,至今我仍感慨颇多,从理论到
8、实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。 实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。此次设计也让我明白
9、了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。5 参考文献1 苏奎峰,吕强,.TMS32OX281xDSP原理及C程序开发. 北京航空航天大学出版社,20082 郁有文,常健,程继红.传感器原理及工程应用.西安电子科技大学出版社,2008主程序模块代码:#include DSP281x_Device.h / DSP281x Headerfile Include File#include DSP281x_Examples.h / DSP281x Examples Include File/声明子函数interrupt v
10、oid adc_isr(void);void Wendu(float c);void Delay( int nDelay);void TurnOnLCD();void LCDCLS();void LCDWrite(unsigned int x,unsigned int y,unsigned int LR,unsigned int n);void WriteNb(unsigned int x,unsigned int y,unsigned char *No,unsigned f,unsigned int LR);/定义全局变量Uint16 LoopCount;Uint16 ConversionC
11、ount;Uint16 Voltage11024;Uint16 Voltage21024;float temp;float temperature;Uint16 i,j;int T_tempe,D_tempe,T_tempe0,T_tempe1; /温度的整数部分和小数部分/宏定义#define LCDDELAY 1#define LCDCMDTURNON 0x3f#define LCDCMDTURNOFF 0x3e#define LCDCMDSTARTLINE 0xc0#define LCDCMDPAGE 0xb8#define LCDCMDVERADDRESS 0x40/定义数字字模uns
12、igned char ledkey108=0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,/00x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00,/10x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00,/20x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00,/30x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00,/40x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00,/50x00,0x00,0x7C,0x92,0x92,0x
13、92,0x64,0x00,/60x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00,/70x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00,/80x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00/9;main() InitSysCtrl();/初始化CPU EALLOW; SysCtrlRegs.HISPCP.all = 0x3; / HSPCLK = SYSCLKOUT/6 EDIS; DINT; InitPieCtrl();/初始化Pie寄存器 IER = 0x0000;/ier为中断使能寄存器,赋值清0 I
14、FR = 0x0000;/中断标志寄存器,复位 InitPieVectTable();/初始化向量表 EALLOW; / This is needed to write to EALLOW protected register PieVectTable.ADCINT = &adc_isr;/把中断首地址赋值给tit0 EDIS; / This is needed to disable write to EALLOW protected registers InitAdc(); / 初始化AD PieCtrlRegs.PIEIER1.bit.INTx6 = 1;/使用6号中断 IER |= M_
15、INT1; / Enable CPU Interrupt 1使用第一组中断 EINT; / Enable Global interrupt INTM ERTM; / Enable Global realtime interrupt DBGM LoopCount = 0; ConversionCount = 0;TurnOnLCD(); /打开显示 LCDCLS(); /清除显示内存 *(int *)0x108000=0x80;/ 初始化ICETEK-CTRDelay(LCDDELAY);*(int *)0x108000=0x0;Delay(LCDDELAY);*(int *)0x108000=
16、0x80;Delay(LCDDELAY);*(int *)0x108001=LCDCMDSTARTLINE;/ 设置显示起始行Delay(LCDDELAY);*(int *)0x108002=0;Delay(LCDDELAY); for(;) Wendu(temp); LCDWrite(2,0,0,0); LCDWrite(2,16,0,1); LCDWrite(2,32,1,2); LCDWrite(2,48,1,3); LCDWrite(6,48,1,4);/在液晶屏上显示相应的汉字及符号 WriteNb(6,6,ledkeyT_tempe0&0x000f,0,0); WriteNb(6,
17、5,ledkey(T_tempe1&0x000f),0,0); WriteNb(6,2,ledkeyD_tempe&0x000f,0,1);6 上位机程序设计(1) 控制界面如下(2) 上位机程序如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;using System.IO.Ports;nam
18、espace 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.ReadBu
19、fferSize = 500000; serialPort1.RtsEnable = true; /如果是RS232转RS485,此句必须要,否则不能通讯 serialPort1.NewLine = rn; private void button1_Click(object sender, EventArgs e) if (button1.Text = 打开串口) if (!serialPort1.IsOpen) /如果串口是关闭的 /设定串口信息和波特率 serialPort1.PortName = boBox1.SelectedItem.ToString(); serialPort1.Ba
20、udRate = 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.Ena
21、bled = 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.E
22、nabled = 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 = fal
23、se; 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() +
24、温度: + serialReadString + + rn); 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 = tr
25、ue; string1 = ; 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(s
26、aveFileDialog1.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, Eve
27、ntArgs e) serialReadString = serialPort1_DataReceived1(); if (serialReadString != & (serialReadString != cc | textBox1.Text = ) textBox1.AppendText(时间: + DateTime.Now.ToString() + 温度: + serialReadString + + rn); cc = serialReadString; serialReadString = ; else public bool ReceiveData(byte data, int
28、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
29、 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; c
30、ase 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.SelectedIte
31、m); 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
32、 void Form1_Load(object sender, EventArgs e) #region -以下各赋值语句都会触发相应的SelectedIndexChanged事件,同时会对串口进行初始化设- boBox1.SelectedItem = boBox1.Items3; /COM4; boBox2.SelectedItem = boBox2.Items3; /9600; boBox3.SelectedItem = boBox3.Items0; /8; boBox4.SelectedItem = boBox4.Items0; /Parity.None; boBox5.SelectedItem = boBox5.Items0; /StopBits.One #endregion