当前位置:文档之家› 电子技术综合实验报告

电子技术综合实验报告

八、对本实验过程及方法、手段的改进建议
本实验第三部分内容“增加按键,当其按下,数码管显示学号后8位,同时,第一个LED灯亮,再次按该键,恢复温度的显示,LED灯灭”仅能实现一次,不能在温度显示与学号显示之间切换。这个功能一直未能解决,在之后的测试中要注意这个功能的实现,并寻找方法实现此功能。
九、附录
//分离出整数和小数部分
i = t / 8;
i1=i-2;
i2=i+2;
//整数部分转换成字符串
ByteToStr(buf,i);
ByteToStr(buf1,i1);
disp[0]=buf[1];
disp[1]=buf[2];
disp1[0]=buf1[1];
disp1[1]=buf1[2];
//清除所有显示
i2=i+2;
//整数部分转换成字符串
ByteToStr(buf,i);
ByteToStr(buf1,i2);
disp[0]=buf[1];
disp[1]=buf[2];
TL0 = ReloadL;//设置定时器初值
ET0 = 1;//使能定时器T0中断
EA = 1;//使能总中断
TR0 = 1;
Delay(50);
ET0 = 0;
Delay(1800);
t = LM75A_GetTemp();
DispTemp2(t);
DispChar(0,s[2]);
DispChar(1,s[6]);
I2C和温度传感器原理图:
该模块在I2C串行总线基本协议的基础上,利用LM75A内置分辨率为0.125摄氏度的带隙传感器测量外界温度,并将模数转换得到的11位二进制补码数据存放到器件temp寄存器中,寄存器的数据可以随时被I2C总线上的控制器读出,利用数码管显示。
3、软件设计
思考题:按键改用外部中断模式,电路如何修改(画示意图)?程序如何修改,写出中断服务程序。
DispClear();
//显示整数部分
DispStr(6,disp);
DispStr(3,disp1);
}
void DispTemp(int t)
{
code unsigned char Tab[8][4] =
{
"000",
"125",
"250",
"375",
"500",
"625",
"750",
"875"
DispChar(2,s[10]);
DispChar(5,s[10]);
ReloadH=0xFF;
ReloadL=0x00;
TH0 = ReloadH;
TL0 = ReloadL;//设置定时器初值
ET0 = 1;//使能定时器T0中断
EA = 1;//使能总中断
TR0 = 1;
Delay(200);
数码管动态扫描原理图:
数码管动态驱动以多位连体的形式提供,连线较少。一位数码管可以看成由abcdefg和dp共8段单个LED组成的。在动态扫描中,abcdefg和dp是共用的称为段选信号,而位选信号DIS_COMx是分开的,扫描方式为:先把第1个数码管的显示数据送到数据线,同时选通DIS_COM1,其他数码管位选信号禁止。再把第2个数码管的显示数据送到数据线,选通DIS_COM2,其他数码管位选信号禁止。整个扫描频率应大于50Hz,防止出现明显的闪烁。
ET0 = 0;
Delay(1800);
}
说明:用杜邦线将实验底板上P7接口的8563_INT_R(引脚17,对应MC8051的INT0)和KEY_IN2(引脚25)相连,LM75_OS_R(引脚19,对应MC8051的INT1)和KEY_IN3 (引脚23)连接。运行程序,按键KEY2,显示学号。按键KEY3时,显示温度。
{
do
{
TH0 = 0xFA;
TL0 = 0x24;
TR0 = 1;
while ( !TF0 );
TR0 = 0;
TF0 = 0;
} while ( --t != 0 );
}
/*
函数:SysInit()
功能:系统初始化
*/
void SysInit()
{
TMOD &= 0xF0;
TMOD |= 0x01;//设置T0为16位定时器
*s = '\0';
}
/*
函数:DispTemp()
功能:在数码管上显示出温度值
参数:
t:补码,除以8以后才是真正温度值
*/
void DispTemp1(int t)
{
code unsigned char Tab[8][4] =
{
"000",
"125",
"250",
"375",
"500",
"625",
2、由设定温度和实际环境温度的温差驱动蜂鸣器发声。若温度等于环境温度,蜂鸣器发出标准的声音0.2秒;温差不同,蜂鸣器发不同声音0.2秒,温差值越大,蜂鸣器声音越尖。
3、增加按键,当其按下,数码管显示学号后8位,同时,第一个LED灯亮,再次按该键,恢复温度的显示,LED灯灭。
1、硬件设计
实验平台核心板原理图如下:
程序:
/*
main.c
LM75A数字温度计
*/
#include "Disp.h"
#include "I2C.h"
#include <reg51.h>
#include <string.h>
sbit BUZZER = P1^0;
sbit K2 = P2^0;
unsigned char ReloadH;
unsigned char ReloadL;
//显示整数部分
DispStr(6,disp);
DispStr(3,disp1);
}
void DispTemp2(int t)
{
code unsigned char Tab[8][4] =
{
"000",
"125",
"250",
"375",
Ş",
"875"
};
unsigned char buf[4];
"750",
"875"
};
unsigned char buf[4];
unsigned char buf1[4];
unsigned char disp[2];
unsigned char disp1[2];
unsigned char i;//整数部分
unsigned char i1;
unsigned char i2;
中断服务程序:
void INT0SVC() interrupt 0
{
DispChar(0,'2');//显示学号
DispChar(1,'9');
DispChar(2,'0');
DispChar(3,'1');
DispChar(4,'0');
DispChar(5,'0');
DispChar(6,'2');
unsigned char buf1[4];
unsigned char disp[2];
unsigned char disp1[2];
unsigned char i;//整数部分
unsigned char i1;
unsigned char i2;
//分离出整数和小数部分
i = t / 8;
i1=i-2;
DispChar(7,'6');
P0 =0xFE;//点亮第一盏LED
}
void INT0SVC() interrupt2
{
EX0 = 0;//禁止INT0中断
P0=0xFF;
t = LM75A_GetTemp();
DispTemp1(t);
DispChar(0,s[2]);
DispChar(1,s[6]);
此次实验除主板外,还用到数码管、按键、蜂鸣器和温度传感器等其他功能模块。
2、各部分硬件原理
LED原理图:
由于I/O口输出低电平时,可以驱动LED,输出高电平时,无法点亮LED,因此设计利用I/O口在低电平时点亮LED。
蜂鸣器原理图:
利用单片机中的定时中断通过I/O口控制交流蜂鸣器发声,不同的定时器初值可得到不同的蜂鸣器音调。
i = t / 8;
i1=i-2;
i2=i+2;
//整数部分转换成字符串
ByteToStr(buf,i);
ByteToStr(buf1,i);
disp[0]=buf[1];
disp[1]=buf[2];
disp1[0]=buf1[1];
disp1[1]=buf1[2];
//清除所有显示
DispClear();
int t;
I2C_Gets(0x90,0x00,2,buf);
t = buf[0];
t <<= 8;
t += buf[1];
t >>= 5;//去掉无关位
return t;
}
/*
相关主题