《现代电子技术综合实验报告熊万安.doc》由会员分享,可在线阅读,更多相关《现代电子技术综合实验报告熊万安.doc(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、电子科技大学 通信与信息工程 学院实 验 报 告实验名称 现代电子技术综合实验姓名:学号:评分:教师签字电子科技大学教务处制电 子 科 技 大 学实 验 报 告学生姓名: 学号: 指导教师:熊万安实验地点: 科A333 实验时间:2016.3.7-2016.3.17 一、 实验室名称: 电子技术综合实验室二、 实验项目名称:电子技术综合实验 三、 实验学时: 32四、 实验目的与任务:1、 熟悉系统设计与实现原理2、 掌握KEIL C51的基本使用方法3、 熟悉SMART SOPC实验箱的应用4、 连接电路,编程调试,实现各部分的功能5、 完成系统软件的编写与调试五、 实验器材1、 PC机一台
2、2、 SMART SOPC实验箱一套六、 实验原理、步骤及内容试验要求:1. 数码管第1、2位显示“1-”,第3、4位显示秒表程序:从8.0秒到1.0秒不断循环倒计时变化;同时,每秒钟,蜂鸣器对应发出0.3秒的声音加0.7秒的暂停,对应第8秒到第1秒,声音分别为“多(高音1)西(7)拉(6)索(5)发(4)米(3)莱(2)朵(中音1)”;数码管第5位显示“-”号,数码管第6、7、8位显示温度值,其中第6、7位显示温度的两位整数,第8位显示1位小数。按按键转到任务2。2. 停止声音和温度。数码管第1、2位显示“2-”,第3、4位显示学号的最后2位,第5位显示“-”号,第6到第8位显示ADC电压三
3、位数值,按按鍵Key后转到任务3,同时蜂鸣器发出中音2的声音0.3秒;3. 数码管第1、2位显示“3-”,第3、4位显示秒表程序:从8.0秒到1.0秒不断循环倒计时变化;调节电压值,当其从0变为最大的过程中,8个发光二极管也从最暗(或熄灭)变为最亮,当电压值为最大时,秒表暂停;当电压值为最小时,秒表回到初始值8.0;当电压值是其他值时,数码管又回到第3、4位显示从8.0秒到1.0秒的循环倒计时秒表状态。按按鍵Key回到任务1,同时蜂鸣器发出中音5的声音0.3秒。1、 硬件设计核心板硬件资源如下:(1)50MHz 晶振;(2)5V、3.3V、2.5V 和 1.2V 电源;(3)一个 Xilinx
4、 公司 Spartan3E 系列的 FPGA 器件,型号为 XC3S250E-144;(4)一片 32KB 的 SRAM 存储 IS61LV256AL;(5)基于 JTAG 的 FPGA 配置器件 XCF02S/04S;(6)基于 SPI(Serial Peripheral Interface)的 FPGA 配置器件 M25P16,含 2MB 空间;(7)JTAG 接口,可下载配置数据到 FPGA 和调试程序;(8)Flash 编程接口,对 SPI Flash 器件编程;(9)8 个用户 LED 灯和 8 位数码管;(10)8 位拨码开关和 4 个用户按键;(11)配置成功指示 LED;(12
5、)重新配置按键,按下此按键后,FPGA 将重新配置;(13)一个全局时钟输入和输入输出接口;(14)通过 2 个 60 针接口将用户 I/O 口、8 位数据总线、15 位地址总线和读写信号引出,用于 实验底板的各外设功能扩展。 硬件结构图如下图1:图1实验平台核心板硬件结构Quick51电路原理图为下图2:图2 Quick51电路原理图 MC51单片机定制在FPGA芯片内实现,如下图3所示,在MC8051外添加了地址地址锁存模块,形成对单片机数据总线的拓展。添加了一个地址译码模块,形成了数据总线的复用,实验平台上的多种应用模块,可敬数据总线,通过外部寻址的方式进行访问。图3 片内MC8051单
6、片机原理图其中FPGA与51单片机的引脚对应为下表一:2、 各部分硬件原理(1) 数码管动态扫描原理:图4 数码管的动态扫描动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。先把第一个数码管的显示数据送到数据线,同时打开第一个三极管,而其他数码管的对应的三极管关闭;延迟一段时间(通常不超过10ms),再把第二个数码管的显示数据送到数据线,同时打开第二个三极管,而其他数码管的对应的三极管关闭;延时一段时间,
7、在显示下一个。注意:整个数码管的扫描频率应当大于50Hz,防止出现明显的闪烁。(2) I2C工作原理:图5 I2C电路图为了使这些相似之处对系统设计者和器件厂商都得益而且使硬件效益最大电路最简单Philips开发了一个简单的双向两线总线实现有效的IC之间控制这个总线就称为Inter IC或I2C总线现在Philips包括超过150种CMOS和双极性兼容I2C总线的IC 可以执行前面提到的三种类型的功能所有符合I2C总线的器件组合了一个片上接口使器件之间直接通过I2C总线通讯这个设计概念解决了很多在设计数字控制电路时遇到的接口问题。(3) LM75特征及应用:图4 LM75应用电路LM75A是一
8、个使用了内置带隙温度传感器和-模数转换技术的温度-数字转换器。它也是一个温度检测器,可提供一个过热检测输出。LM75A包含许多数据寄存器:配置寄存器(Conf),用来存储器件的某些配置,如器件的工作模式、OS工作模式、OS极性和OS故障队列等(在功能描述一节中有详细描述);温度寄存器(Temp),用来存储读取的数字温度;设定点寄存器(Tos & Thyst),用来存储可编程的过热关断和滞后限制,器件通过2线的串行I2C总线接口与控制器通信。LM75A还包含一个开漏输出(OS),当温度超过编程限制的值时该输出有效。LM75A有3个可选的逻辑地址管脚,使得同一总线上可同时连接8个器件而不发生地址冲
9、突。LM75A可配置成不同的工作条件。它可设置成在正常工作模式下周期性地对环境温度进行监控或进入关断模式来将器件功耗降至最低。OS输出有2种可选的工作模式:OS比较器模式和OS中断模式。OS输出可选择高电平或低电平有效。故障队列和设定点限制可编程,为了激活OS输出,故障队列定义了许多连续的故障。温度寄存器通常存放着一个11位的二进制数的补码,用来实现0.125的精度。这个高精度在需要精确地测量温度偏移或超出限制范围的应用中非常有用。(4) 按键原理:图7 按键原理图由原理图可知,按键的另一端接地,当按键按下时,按键对应的接口对应低电平,为逻辑0,当按键抬起时,由于上拉电阻的存在,接口为高电平,
10、为逻辑1,因此可以通过查询对应的接口状态来判断是否按键是否按下。(5) 蜂鸣器工作原理:图8 蜂鸣器电路原理图三极管有两个作用:一是根据开通或者关闭控制蜂鸣器发生与否;二是驱动蜂鸣器工作,因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以通过三极管放大驱动电流,从而可以让蜂鸣器发出声音。输出高电平,三极管导通,集电极电流蜂鸣器让蜂鸣器发出声音;当输出低电平时,三极管截止,没有电流流过蜂鸣器,不会发出声音。(6) LED显示原理:图9 LED显示原理由原理图可知,当输出低电压时,LED亮;输出高电平时,LED灭。在一个很短的时间间隙循环时,亮的时间占比越多,呈现的亮度越亮,从而可以通过亮的时间
11、的占比达到控制亮度的目的。(7) AD实现原理:图TLC549串行ADC当/CS变为低电平后, TLC549芯片被选中, 同时前次转换结果的最高有效位MSB (A7)自 DATA OUT 端输出,接着要求自 I/O CLOCK端输入8个外部时钟信号,前7个 I/O CLOCK信号的作用,是配合 TLC549 输出前次转换结果的 A6-A0 位,并为本次转换做准备:在第4个 I/O CLOCK 信号由高至低的跳变之后,片内采样/保持电路对输入模拟量采样开始,第8个 I/O CLOCK 信号的下降沿使片内采样/保持电路进入保持状态并启动 A/D开始转换。转换时间为 36 个系统时钟周期,最大为 1
12、7us。直到 A/D转换完成前的这段时间内,TLC549 的控制逻辑要求:或者/CS保持高电平,或者 I/O CLOCK 时钟端保持36个系统时钟周期的低电平。由此可见,在自 TLC549的 I/O CLOCK 端输入8个外部时钟信号期间需要完成以下工作:读入前次A/D转换结果;对本次转换的输入模拟信号采样并保持;启动本次 A/D转换开始。3、 软件设计思考题: 按键改用外部中断模式,电路如何修改(画示意图)?程序如何修改,写出中断服务程序。答:若按键改用外部中断模式,可以使用INT0、INT1,需要将按键(如按键KEY1、KEY2)分别用杜邦线连到INT0、INT1外部中断口,如下图:图11
13、外部中断程序则做如下修改:各个函数无需调用按键扫描函数,但在主函数或者系统初始化函数,添加几段语句进行外部中断的初始化:EX0 = 1; /使能/INT0中断;EX1 = 1; /使能/INT1中断;EA = 1 /使能总中断; 中断服务程序为:void INT0SVC() interrupt 0 task+; for(;Key1=0;) Delay(81);七、 总结及心得体会八、 对本实验过程及方法、手段的改进建议九、 附录1、 程序程序包括main.c文件和修改过的Disp.c和Disp.h文件,其中Disp.c添加了利用定时器的软件延时函数void Delay(unsigned int
14、 t),而Disp.h添加了该函数的声明。main.c文件:main.c现代电子综合实验#include VolTab.h#include Disp.h#include I2C.h#include #include #define M20xFCEF/587.33#define M30xFD45/659.26#define M40xFD6C/698.46#define M50xFDB4/783.99#define M60xFDF4/880.00#define M70xFE2D/987.77#define H10xFE48/1046.5sbit BUZZER = P10;/交流蜂鸣器由P1.0管脚
15、控制sbit KEY1 = P20;/按键1/定义TLC549操作接口sbit CS = P15;sbit DAT = P17;sbit CLK = P16;/定义PWM最大级数#define PWM_MAX26/定义PWM级数,分为0PWM_MAX-1级unsigned char PwmValue;unsigned int MusicTab = H1,M7,M6,M5,M4,M3,M2 /定义定时器T1重装值volatile char ReloadH;volatile char ReloadL;/定义任务、中断标志位unsigned int task,flg;函数:T0INTSVC()功能:
16、定时器T0中断服务函数void T0INTSVC() interrupt 1 static unsigned char temp = 0;if(flg=3)TR0 = 0;TH0 = 0xFF;TL0 = 0x00;TR0= 1;temp+;if ( temp = PWM_MAX ) temp = 0;if ( temp 8);ReloadL = (unsigned char)(note);TR0 = 0;TH0 = 0xFF;TL0 = 0xF0;TR0 = 1;flg=1;EA=1;ET0=1;函数:Delay()功能:延时1ms65.536s本函数只是简单延时函数,非秒表使用void D
17、elays(unsigned int t) unsigned int t1;do for(t1=1200;t10;t1-); while ( -t != 0 );/按键扫描函数void KeyScan()if ( KEY1 = 0 ) task+;for(;KEY1 = 0;) Delay(81);函数:SysInit()功能:系统初始化void SysInit()TMOD &= 0xF0;TMOD |= 0x01;/设置T0为16位定时器DispInit();/数码管扫描显示初始化I2C_Init();/初始化I2C总线函数:LM75A_GetTemp功能:读出LM75A的温度值返回:LM7
18、5A温度寄存器的数值(乘以0.125可得到摄氏度值)int LM75A_GetTemp()unsigned char buf2;int t;I2C_Gets(0x90,0x00,2,buf);t = buf0;t = 5;/去掉无关位return t;函数:ByteToStr()功能:字节型变量c转换为十进制字符串void ByteToStr(unsigned char idata *s, unsigned char c)code unsigned char Tab = 10,1;unsigned char i;unsigned char t;for ( i=0; i2; i+ )t = c
19、/ Tabi;*s+ = 0 + t;c -= t*Tabi;*s = 0;函数:DispTemp()功能:在数码管上显示出温度值参数:t:补码,除以8以后才是真正温度值void DispTemp(int t)code unsigned char Tab8 =0,1,3,4,5,6,8,9unsigned char buf3;unsigned char i;/整数部分unsigned char d;/小数部分/分离出整数和小数部分i = t / 8;d = t % 8;/整数部分转换成字符串ByteToStr(buf,i);/显示整数部分DispStr(5,buf);/显示小数点DispDot
20、On(6);/显示小数部分DispChar(7,Tabd);函数:ReadAdc()功能:读取A/D转换结果返回:8位ADC代码unsigned char ReadAdc()unsigned char d;unsigned char n;CS = 0;n = 5;while ( -n != 0 );n = 8;dod 235) Delay(81); else if(!(T1t1=1&T2t2=0) t2+; if(t2=10) t2=0; if(t2=1)t1+;if(t1=8) t1=0; if(t1=0&t2=1) t1+; else t1=0;t2=0; /按键扫描 Delay(81);
21、 KeyScan(); if(task%3!=2) break;void main()for (;) SysInit(); switch(task%3) case 0: firstf(); break; case 1: twof(); if(task%3=2) Sound(MusicTab6); Delay(486); break; case 2: threef(); if(task%3=0) Sound(MusicTab3); Delay(486); break;Disp.h:添加了软件延时函数的定义void Delay(unsigned int t);Disp.h数码管扫描显示驱动程序头文
22、件#ifndef Disp_h_#define Disp_h_/清除数码管的所有显示void DispClear();/在数码管位置x(07)处显示字符c(仅限十进制数字和减号)void DispChar(unsigned char x, unsigned char c);/在数码管位置x(07)处显示字符串*svoid DispStr(unsigned char x, unsigned char *s);/显示指定位置x(07)处的小数点void DispDotOn(unsigned char x);/数码管扫描显示初始化void DispInit();void Delay(unsigned
23、 int t);#endif/Disp_h_Disp.c:添加了软件延时函数:Disp.c数码管扫描显示驱动程序#include #include /定义显示缓冲区(由定时中断程序自动扫描)unsigned char DispBuf8;bit SWTF;/软件定时器溢出标志unsigned int SWTV;/软件定时器定时值bit SWTR;/软件定时器运行标志函数:T1INTSVC()功能:定时器T1的中断服务函数void T1INTSVC() interrupt 3code unsigned char com = 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x
24、80;static unsigned char n = 0;TR1 = 0;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;XBYTE0x7800 = 0xFF;/暂停显示XBYTE0x7801 = DispBufn;/更新扫描数据XBYTE0x7800 = comn;/重新显示n+;n &= 0x07;/模拟一个软件定时器if ( SWTR )if ( -SWTV = 0 ) SWTF = 1;函数:Delay()void Delay(unsigned int t)SWTV = t;/软件定时器赋初值SWTR = 1;/启动软件定时器while ( !SWTF );/等待溢出SW
25、TR = 0;/停止软件定时器SWTF = 0;/清除溢出标志函数:DispClear()功能:清除数码管的所有显示void DispClear()unsigned char i;for ( i=0; i= 0 ) & ( c = 9 ) )DispBufx = Tabc-0;函数:DispStr()功能:在数码管上显示字符串参数:x:数码管的坐标位置(07)*s:要显示的字符串(字符仅限十进制数字和减号)void DispStr(unsigned char x, unsigned char *s)unsigned char c;for (;)c = *s;if ( c = 0 ) break;s+;DispChar(x,c);x+;函数:DispDotOn()功能:显示指定位的小数点参数:x为数码管坐标void DispDotOn(unsigned char x)DispBuf7-x |= 0x80;函数:DispInit()功能:数码管扫描显示初始化void DispInit()DispClear();EA = 0;TMOD &= 0x0F;TMOD |= 0x10;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;ET1 = 1;EA = 1;2、画一个包括51单片机、外部RAM和外部ROM的原理图。
限制150内