现代电子技术实验报告.docx
《现代电子技术实验报告.docx》由会员分享,可在线阅读,更多相关《现代电子技术实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
现代电子技术实验报告
电子科技大学电子信息工程学院
实验报告
实验名称现代电子技术综合实验
姓名:
张彦婷
学号:
2012029070030
评分:
教师签字
电子科技大学教务处制
电子科技大学
实验报告
学生姓名:
张彦婷学号:
2012029070030指导教师:
熊万安
实验地点:
科A333实验时间:
2015。
4。
23
一、实验室名称:
电子技术综合实验室
二、实验项目名称:
三、实验学时:
32
四、实验目的与任务:
1、熟悉系统设计与实现原理
2、掌握KEILC51的基本使用方法
3、熟悉SMARTSOPC实验箱的应用
4、连接电路,编程调试,实现各部分的功能
5、完成系统软件的编写与调试
五、实验器材
1、PC机一台
2、SMARTSOPC实验箱一套
六、实验原理、步骤及内容
试验要求(必须写):
1、八个数码管显示最后八位学号,八个发光二极管(LED灯)依次亮灭,进入循环流水灯显示状态,每个灯亮0。
3秒后,灭0.2秒。
循环两轮后,转入任务2.
2、第一、二个数码管显示室温,第三、六个数码管显示“-”号,第四、五个数码管显示ADC的值,第七、八个数码管显示设定温度,设定温度值为(当前环境温度-1)度加上电压值的整数值。
旋转按钮,调节电压值,同时也调整了设定温度值.
3、由设定温度和实际环境温度的温差驱动蜂鸣器发声。
若温度等于环境温度,蜂鸣器不发声;有温差时,蜂鸣器发声0。
2秒。
4、增加按键,当其按下,转入任务1.
1、硬件设计(可打印)
硬件结构:
系统原理图:
2、各部分硬件原理(可打印)
(1)数码管动态扫描原理:
先把第一个数码管的显示数据送到数据线,同时选通DIS_COM1,而其他数码管的DIS_COMx信号禁止;延迟一段时间(通常不超过10ms),再把第二个数码管的显示数据送到数据线,同时选通DIS_COM2,而其他数码管的DIS_COMx信号禁止;延时一段时间,在显示下一个.注意:
整个数码管的扫描频率应当大于50Hz,防止出现明显的闪烁。
(2)外部中断原理:
如果外部中断请求信号在产生后能在较短时间每自动撤销,则选择低电平触发。
由于这是“一次性的”,中断处理程序执行完毕后科立即返回主程序,而不必等待中断信号请求信号恢复为高电平。
INT0和INH1的中断信号分别是0和2,入口地址分别是0003H和0013H。
(3)LED流水灯:
在LED1~LED8引脚上周期性的输出流水数据。
如前一个输出二进制数据是11111100,点亮了LED1~LED2,下一个输出二进制数据则应是11111000,点亮LED1~LED3,继续这一方式并循环,就可实现LED流水灯。
流水速率最好在2Hz左右.
(4)I2C工作原理:
为了使这些相似之处对系统设计者和器件厂商都得益而且使硬件效益最大电路最简单Philips开发了一个简单的双向两线总线实现有效的IC之间控制这个总线就称为InterIC或I2C总线现在Philips包括超过150种CMOS和双极性兼容I2C总线的IC可以执行前面提到的三种类型的功能所有符合I2C总线的器件组合了一个片上接口使器件之间直接通过I2C总线通讯这个设计概念解决了很多在设计数字控制电路时遇到的接口问题。
(5)LM75特征及应用:
LM75A是一个使用了内置带隙温度传感器和∑-△模数转换技术的温度-数字转换器。
它也是一个温度检测器,可提供一个过热检测输出。
LM75A包含许多数据寄存器:
配置寄存器(Conf),用来存储器件的某些配置,如器件的工作模式、OS工作模式、OS极性和OS故障队列等(在功能描述一节中有详细描述);温度寄存器(Temp),用来存储读取的数字温度;设定点寄存器(Tos&Thyst),用来存储可编程的过热关断和滞后限制,器件通过2线的串行I2C总线接口与控制器通信。
LM75A还包含一个开漏输出(OS),当温度超过编程限制的值时该输出有效.LM75A有3个可选的逻辑地址管脚,使得同一总线上可同时连接8个器件而不发生地址冲突。
LM75A可配置成不同的工作条件。
它可设置成在正常工作模式下周期性地对环境温度进行监控或进入关断模式来将器件功耗降至最低。
OS输出有2种可选的工作模式:
OS比较器模式和OS中断模式。
OS输出可选择高电平或低电平有效。
故障队列和设定点限制可编程,为了激活OS输出,故障队列定义了许多连续的故障.温度寄存器通常存放着一个11位的二进制数的补码,用来实现0.125℃的精度。
这个高精度在需要精确地测量温度偏移或超出限制范围的应用中非常有用。
正常工作模式下,当器件上电时,OS工作在比较器模式,温度阈值为80℃,滞后75℃,这时,LM75A就可用作一个具有以上预定义温度设定点的独立的温度控制器.本文为互联网收集,请勿用作商业用途
(6)蜂鸣器工作原理:
三极管主要是用来驱动的.因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,你要是输出高电平,三极管导通,集电极电流蜂鸣器让蜂鸣器发出声音,当输出低电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。
3.软件设计
(完成程序框图,手写画出框图)
思考题:
按键改用外部中断模式,电路如何修改(画示意图)?
程序如何修改,写出中断服务程序.
(1)硬件部分:
若要是按键改用外部中断,如使用INT0、INT1,则需要将按键(如按键KEY1、KEY2)分别用杜邦线连到INT0、INT1外部中断口
(2)软件部分:
A。
程序部分在系统初始化函数中,需要加上下几段语句进行外部中断的初始化:
EA=0;//禁止总中断;EX0=1;//使能/INT0中断;EX1=1;//使能/INT1中断;EA=1//使能总中断;B。
定义中断函数:
voidkeyscan()interrupt1
{TR1=0;
TH1=0xFC;
TL1=0x66;
t=0;
TR1=1;
if(key2==0)
{delay(50);
if(key2==0)
{t=1;
while(key2==0);}}}
C.使用时在函数中添加:
if(keyscan()==1)break;
七、总结及心得体会
通过本次实验,我学会了如何快速、有效地学习掌握相关软件程序的调试方法,同时还学会了如何融合多个程序,以及在融合调试过程中找错、纠错的方法,得到了不少的经验;也明白了对实验原理和一些常用的软件用法的掌握很重要;实验的过程中,自己排除解决困难的技能很重要;要多讨论交流才能获得新的知识。
最后经过了多天的奋战,终于完成了实验任务,确实心里感到非常开心。
在这两周的学习和调试中,确实经历了很多的困难和烦恼,最终还是静下心来,仔细找错和思考,才使得自己能顺利掌握实验任务所要求的实验知识的综合运用方法。
八、对本实验过程及方法、手段的改进建议
如果LED灯和数码管同时循环移动效果更美观
九、附录
1、程序
/*
main.c
LM75A数字温度计
*/
#include"Disp.h”
#include"I2C。
h"
#includeh〉
#include〈string。
h〉
#include〈absacc。
h>
#include〈ctype。
h〉
sbitKEY2=P2^0;//按键1
sbitCS=P1^5;
sbitDAT=P1^7;
sbitCLK=P1^6;
sbitBUZZER=P1^0;
voidT0INTSVC()interrupt1
{TR0=0;//暂时停止定时器(在重新设置初值之前必须暂停)
TH0=0xFD;
TL0=0xC0;//重新设置定时器初值
TR0=1;//重新启动定时器
BUZZER=!
BUZZER;
//翻转BUZZER,以产生方波}
/*
函数:
Delay()
功能:
延时1ms~65.536s
参数:
t>0时,延时(t*0.001)s
t=0时,延时65。
536s
*/
voidDelay(unsignedintt)
{do
{TH0=0xFA;
TL0=0x24;
TR0=1;
while(!
TF0);
TR0=0;
TF0=0;}while(-—t!
=0);
}
charkeyscan()
{chark=0;
if(KEY2==0)
{Delay(50);
if(KEY2==0)
{k=1;
while(KEY2==0);}}
returnk;
}
/*
函数:
SysInit()
功能:
系统初始化
*/
voidSysInit()
{TMOD&=0xF0;
TMOD|=0x01;//设置T0为16位定时器
DispInit();//数码管扫描显示初始化
I2C_Init();//初始化I2C总线
}
/*
函数:
LM75A_GetTemp
功能:
读出LM75A的温度值
返回:
LM75A温度寄存器的数值(乘以0.125可得到摄氏度值)
*/
intLM75A_GetTemp()
{unsignedcharbuf[2];
intt;
I2C_Gets(0x90,0x00,2,buf);
t=buf[0];
t<<=8;
t+=buf[1];
t〉>=5;//去掉无关位
returnt;
}
/*
函数:
ByteToStr()
功能:
字节型变量c转换为十进制字符串
*/
voidByteToStr(unsignedcharidata*s,unsignedcharc)
{
codeunsignedcharTab[]={100,10};
unsignedchari;
unsignedchart;
for(i=0;i<2;i++)
{
t=c/Tab[i];
*s++=’0'+t;
c—=t*Tab[i];
}
*s++=’0'+c;
*s='\0';
}
/*
函数:
DispTemp()
功能:
在数码管上显示出温度值
参数:
t:
补码,除以8以后才是真正温度值
*/
voidDispTemp(intt)
{codeunsignedcharTab[8][4]=
{”000”,”125”,"250”,"375”,”500”,”625",”750","875”};
unsignedcharbuf[4];
bits;//符号位
unsignedchari;//整数部分
unsignedcharx;//临时变量
//分离出符号
s=0;
if(t<0)
{s=1;
t=-t;}
//分离出整数和小数部分
i=t/8;
/*d=t%8;*/
//整数部分转换成字符串
ByteToStr(buf,i);
/*x=2-strlen(buf);
//清除所有显示
DispClear();
/*显示符号
if(s)DispChar(x,'—');
x++;*/
for(x=0;x〈=1;x++)
{DispChar(x,buf[x+1]);}
/*显示整数部分
DispStr(x,buf);
/*显示小数点
DispDotOn(4);
/*显示小数部分
DispStr(5,Tab[d]);*/
}
/*
函数:
ReadAdc()
功能:
读取A/D转换结果
返回:
8位ADC代码
*/
unsignedcharReadAdc()
{unsignedchard;
unsignedcharn;
CS=0;
n=5;
while(--n!
=0);
n=8;
do
{d<〈=1;
if(DAT)d++;
CLK=1;
CLK=0;
}while(—-n!
=0);
CS=1;
returnd;
}
/*
函数:
AdcInit()
功能:
初始化ADC接口
*/
voidAdcInit()
{CS=1;
CLK=0;
DAT=1;
ReadAdc();}
/*
函数:
DispVol()
功能:
将ADC值转换成电压值,并显示
参数:
v:
8位ADC结果
*/
voidDispVol(unsignedcharv)
{unsignedcharx;
unsignedcharbuf[4];
v=(v*250)/256;
ByteToStr(buf,v);
for(x=3;x<=4;x++)
{DispChar(x,buf[x-3]);
DispDotOn(3);}
/*DispStr(5,buf);
DispDotOn(5);*/
voidmain()
{
unsignedchars[]=”29070021”;
unsignedchari;
unsignedcharx;
intt,h;
unsignedchara[4];
unsignedcharc;
unsignedcharb;
unsignedcharv;
unsignedcharz,y;
SysInit();
for(;;)
{
for(i=0;i〈2;i++)
{for(x=0;x<8;x++)
{DispChar(x,s[x]);}
for(b=0;b<8;b++)
{c=~(0x80〉〉b);
P0=c;
Delay(300);
P0=0xff;
Delay(200);}
if(b==8)b=0;}
SysInit();
for(;;)
{ET0=0;
t=LM75A_GetTemp();
//h=0x0681;
DispTemp(t);
DispChar(2,’-');
DispChar(5,’—');
v=ReadAdc();
DispVol(v);
z=t/8-1+v/100;
ByteToStr(a,z);
for(y=6;y〈=7;y++)
{DispChar(y,a[y—5]);}
if(z!
=t/8)
{TR0=1;
ET0=1;
Delay(200);
ET0=0;}
Delay(300);
if(keyscan()==1)
break;
}
}
2、画一个包括51单片机、外部RAM和外部ROM的原理图.