一、 设计目标
1. 完成温度显示系统的设计,即以单片机位核心微处理器,完成接收处理温度信号和
控制八段数码管显示两部分功能电路的设计; 2. 使用Protel绘制电路原理图和PCB版图
3. 通过使用凌阳单片机开发系统掌握单片机系统的基本开发方法,系统配置方法,IO
口的读写方式以及数据处理方法。
4. 掌握基于C语言编程的单片机控制技术,完成实现温度采集、显示系统功能的控制
程序设计(信号的接收、信息的处理及八段数码管显示控制程序); 5. 软硬件联调,完成系统的最终功能。 二、 设计任务
1. 完成基于单片机的温度检测显示系统设计,利用自己设计的温度传感电路输出模拟
信号,选用相应的A/D转换芯片将模拟信号转换成数字信号送入单片机,单片机对
接收的信号进行处理;单片机输出经译码电路连接至八段数码管显示温度值。 2. 具体要求完成内容:
1)传感器模块学习及信号输入设计 2)LED数码管显示部分设计 3)绘制电路原理图和PCB版图
3)数据处理转换(使用C语言进行) 4)软硬件联调实现完整系统设计要求; 5)撰写实训报告。
第一部分:原理图及PBC版图制作
制作原理图,我们选用的软件是proteldxp2004,我们选用这个软件是因为Protel DXP在前版本的基础上增加了许多新的功能。新的可定制设计环境功能包括双显示器支持,可固定、浮动以及弹出面板,强大的过滤和对象定位功能及增强的用户界面等。Protel DXP是第一个将所有设计工具集于一身的板级设计系统,电子设计者从最初的项目模块规划到最终形成生产数据都可以按照自己的设计方式实现。Protel DXP运行在优化的设计浏览器平台上,并且具备当今所有先进的设计特点,能够处理各种复杂的PCB设计过程。通过设计输入仿真、PCB绘制编辑、拓扑自动布线、信号完整性分析和设计输出等技术融合,Protel DXP提供了全面的设计解决方案。与较早的版本——Protel99相比,Protel DXP 2004不仅在外观上显得更加豪华、人性化,而且极大地强化了电路设计的同步化,同时整合了VHDL和FPGA设计系统,其功能大大加强
了。
首先是设计出系统整体框图,系统采用凌阳单片机61板及相关模组构成,系统整体分三部分设计,分别为信号采集部分、单片机系统部分和显示部分。(如图所示)
温度传 A/D(数模)八段数码 单片机系统 译码器 感器电转换电路 管显示 路 系统整体框图 信号采集部分:
本设计采用图1的惠斯登电桥电路,该电路采用4块电阻搭建组成,其中3块为普通电阻,另外一块为热敏电阻。这四块电阻在正常室温(25?)的情况下,电阻
值相同。此时,加上如图所示的电压后,测量桥的两外两点的电位差接近为0V。当热敏电阻由于与体温接触,温度、阻值发生变化时,其测量2点的电位发生显著的变化,从而产生温度信号向电信号的转化。
运算放大器的选择:
选用AD624集成运放,对电路进行放大处理。图2所示为 AD624放大器的引脚位图。
、2引脚接输入,差分放大。7、8 引脚需提供正负相等的工作电压,由 9引脚输出其中1
放大后的电压值。引脚6则是参考基准值,如果接地则引脚9 的输出即为对地的相对电压。AD624的放大增益公式如式(1)所示,由此我们可使用连接在11~13引脚的电阻来对增益值进行设置。
电路整体说明:
八段数码管显示电路控制部分
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;
按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
八段数码管需配合相应的译码驱动电路配合显示。 电源模块
系统需要DC 5V的电源为核心微处理器(单片机)和LED供电,电源模块的参考电路图如图7所示。
电源电路
在设计该部分电路时,要注意为电源模块添加LED提示系统上电的情况是否正常,减少系统供电问题被忽略的可能。
然后就是利用proteldxp2004画原理图了,在这之中,有些器件在系统默认的库中是找不到的,所以需要添加新的库而且找到需要的元器件,而元器件的使用说明则需要在网上进行查询。然后根据实验方案,选择出所有所需要的器件,在这之
中最好把所有的器件进行标注,以免出现错误,名称不能重复,这对后面制作PCB版图的时候十分关键。做好标注后开始连线,连线时要注意时候线是否全部连接,避免出错,检查无误后,原理图的工程就基本完成了。(如图所示)
原理图创建完成后,就是制作PCB版图,操作的步骤是创建网络表,进行电气检查,检查后无误后就会自动生成PCB版图,但是器件都是落在一起的,需要合理的分布开,不能用重叠,PCB版图如图所示:
第二部分:单片机的显示系统设计 一. 设计目标
a) 通过使用凌阳单片机开发系统掌握单片机系统的基本开发方法,系统配 置方法,IO口的读写方式以及数据处理方法。
b) 掌握基于C语言编程的单片机控制技术,显示系统功能的控制程序设计 (八段数码管显示控制程序);
c) 软硬件联调,完成系统的最终功能。 二. 设计任务
a) 完成基于单片机的显示系统设计,单片机输出经译码电路连接至八段数 码管显示。
b) 具体要求完成内容: 1)LED数码管显示部分设计
2)显示的数据,依照实例5在数码管显示数据,分别显示出学号在1,2和5,6
数码管,在3,4数码管进行计时,每10个显示一次学号,直到计数到99,然后清 零,继续循环计数(使用C语言进行) 3)软硬件联调实现完整系统设计要求; 三. 设计要求
系统采用凌阳单片机61板及相关模组构成
系统整体分二部分设计,分别为单片机系统部分和显示部分。 八段数码 译码器 单片机系统 管显示 四. 设计方案 1. 系统框图
I/O 单片机 串口 点阵LED 电源模块 2.程序流程图 开始 Dig<=9&&a<=9 Dig=0
3号数码管显示a的值,4号数码管显示Dig的值 Dig++ 如果
Dig>9 a++,Dig=0,3号数码管显示a的值,4号数码管显示Dig的值 TimerCnt=0 TimerCnt++
3,4号数码管显示1,2,5,6数码管分0 别显示1,5,2,7 TimerCnt++ 3,4号数码管显示0 结束 3.程序代码
依照实例5用数码管显示数据
//=================================================== // 工程名称: LED5_c
// 功能描述: 控制所有数码管循环显示0,9十个数字 // 硬件连接: 将61板的IOB0,7用排线连接到LED键盘模组的 SEG排针上; IOB8~IOB15连接到LED键盘模组的DIG排针上。 // 文件来源:《61板实验教程》,\"实验五 数码管显示0,9\" // IDE环境: SUNPLUS u'nSPTM IDE 1.8.4 // 涉及的库:LED5_c.h // 组成文件: main.c
//===============================================
//===================================================// 文件名称:main.c
// 实现功能:
//===================================================#define P_IOB_Data (volatile unsigned int *)0x7005 #define P_IOB_Buffer
(volatile unsigned int *)0x7006 #define P_IOB_Dir (volatile unsigned int *)0x7007 #define P_IOB_Attrib (volatile unsigned int *)0x7008 #define P_Watchdog_Clear (volatile unsigned int *)0x7012 #define LED_SEG 0x00ff //IOB0~IOB7
#define LED_DIG 0x3f00 //IOB8~IOB13 const unsigned char DigCode[10]={0x3F,0x06,0x5B,
0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0~9十个数字 的LED编码
//===================================================
==========
// 函数名称: LedDispDig
// 功能描述: 在指定的数码管上显示数字
// 语法: void LedDispDig(int Pos,int Dig) // 输入: Pos: 要显示数字的数码管位置,取值范围1~6
// Dig: 要显示的数字,取值范围0~9 // 输出: 无
//=================================================== void LedDispDig(int Pos,int Dig) { *P_Watchdog_Clear=1; //初始化IOB为同相输出 *P_IOB_Dir|=LED_SEG+LED_DIG; *P_IOB_Attrib|=LED_SEG+LED_DIG;
*P_IOB_Data=(unsigned)0x0100<<(Pos-1); //将数字的位置转换 为IOB高8位值,选中相应的数码管
*P_IOB_Data|=DigCode[Dig]; //将数字转换为编码,作为IOB低8位输出 }
int main() {
int Pos,Dig,TimerCnt,a; a=0;
while(Dig<=9&&a<=9) {
for(Dig=0;Dig<=9;Dig++)
{
for(TimerCnt=0;TimerCnt<1000;TimerCnt++) {
LedDispDig(4,Dig); LedDispDig(3,a); } } if(Dig>9) { a++; Dig=0;
LedDispDig(3,a); LedDispDig(4,Dig); }
for(TimerCnt=0;TimerCnt<1000;TimerCnt++) {
LedDispDig(1,1); LedDispDig(2,5); LedDispDig(5,2); LedDispDig(6,9); } }
LedDispDig(3,0); LedDispDig(4,0); }
第三部分:成果展示
第四部分:实训总结
经过了这次实训,对dxp的掌握加深了,对于c语言的使用也有了进一步的掌握,同时还熟悉了单片机硬件方面的搭接,初步了解单片机的开发,这次最大的困难就是在用dxp搭电路并生成pcb版图,这一过程比较曲折,还有在用c语言编写程序时调试了很多次,因为一些低级的错误,导致硬件不能正确的显示,总的来说,经过这次实训,我学到的只是很多,同时也体会到团队合作的重要,伙伴的重要,一个人是不能完成的。
因篇幅问题不能全部显示,请点此查看更多更全内容