电子技术综合实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
code unsigned char Tab[] = {100,10};
unsigned char i;
unsigned char t;
for ( i=0; i<2; i++ )
{
t = c / Tab[i];
*s++ = '0' + t;
c -= t*Tab[i];
}
*s++ = '0' + c;
{
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位定时器
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);
};
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;
//分离出整数和小数部分
ET0 = 0;
Delay(1800);
t = LM75A_GetTemp();
DispTemp(t);
DispChar(0,s[2]);
DispChar(1,s[6]);
DispChar(2,s[10]);
DispChar(5,s[10]);
ReloadH=0xEE;
ReloadL=0x00;
TH0 = ReloadH;
2、掌握KEIL C51的基本使用方法
3、熟悉SMART SOPC实验箱的应用
4、连接电路,编程调试,实现各部分的功能
5、完成系统软件的编写与调试
五、实验器材
1、PC机一台
2、SMART SOPC实验箱一套
六、实验原理、步骤及内容
试验要求:
1、第一、二个数码管显示最后两位学号,第三、六个数码管显示“-”号,第四、五个数码管显示设定温度,第七、八个数码管显示当前环境温度。设定温度初值为(当前环境温度-2)度,每隔2秒设定温度值加2,加到(当前环境温度+2)度后,隔2秒,设定温度值变回(当前环境温度-2)度,进入循环状态。
DispInit();//数码管扫描显示初始化
I2C_Init();//初始化I2C总线
}
/*
函数:LM75A_GetTemp
功能:读出LM75A的温度值
返回:LM75A温度寄存器的数值(乘以0.125可得到摄氏度值)
*/
int LM75A_GetTemp()
{
unsigned char buf[2];
//显示整数部分
DispStr(6,disp);
DispStr(3,disp1);
}
void DispTemp2(int t)
{
code unsigned char Tab[8][4] =
{
"000",
"125",
"250",
"375",
"500",
"625",
"750",
"875"
};
unsigned char buf[4];
unsigned char KeyScan()
{
unsigned char k = '\0';
if ( K2 == 0 ) k = '+';
return k;
}
/*
函数:Delay()
功能:延时1ms~65.536s
参数:
t>0时,延时(t*0.001)s
t=0时,延时65.536s
*/
void Delay(unsigned int t)
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、由设定温度和实际环境温度的温差驱动蜂鸣器发声。若温度等于环境温度,蜂鸣器发出标准的声音0.2秒;温差不同,蜂鸣器发不同声音0.2秒,温差值越大,蜂鸣器声音越尖。
3、增加按键,当其按下,数码管显示学号后8位,同时,第一个LED灯亮,再次按该键,恢复温度的显示,LED灯灭。
1、硬件设计
实验平台核心板原理图如下:
此次实验除主板外,还用到数码管、按键、蜂鸣器和温度传感器等其他功能模块。
2、各部分硬件原理
LED原理图:
由于I/O口输出低电平时,可以驱动LED,输出高电平时,无法点亮LED,因此设计利用I/O口在低电平时点亮LED。
蜂鸣器原理图:
利用单片机中的定时中断通过I/O口控制交流蜂鸣器发声,不同的定时器初值可得到不同的蜂鸣器音调。
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时,显示温度。
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);
程序:
/*
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;
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();
电子科技大学电工学院
实验报告
实验名称现代电子技术综合实验
姓名:
学号:
评分:
教师签字:
电子科技大学教务处制
电 子 科 技 大 学
实 验 报 告
学生姓名:学号:指导教师:
实验地点:科A333实验时间:第一周
一、实验室名称:电子技术综合实验室
二、实验项目名称:
三、实验学时:32
四、实验目的与任务:
1、熟悉系统设计与实现原理
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"
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]);
"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;
int t;
I2C_Gets(0x90,0x00,2,buf);
t = buf[0];
t <<= 8;
t += buf[1];
t >>= 5;//去掉无关位
return t;
}
/*
函数:ByteToStr()
功能:字节型变量c转换为十进制字符串
*/
void ByteToStr(unsigned char idata *s, unsigned char c)
i2=i+2;
//整数部分转换成字符串
ByteToStr(buf,i);
ByteToStr(buf1,i2);
disp[0]=buf[1];
disp[1]=buf[2];
数码管动态扫描原理图:
数码管动态驱动以多位连体的形式提供,连线较少。一位数码管可以看成由abcdefg和dp共8段单个LED组成的。在动态扫描中,abcdefg和dp是共用的称为段选信号,而位选信号DIS_COMx是分开的,扫描方式为:先把第1个数码管的显示数据送到数据线,同时选通DIS_COM1,其他数码管位选信号禁止。再把第2个数码管的显示数据送到数据线,选通DIS_COM2,其他数码管位选信号禁止。整个扫描频率应大于50Hz,防止出现明显的闪烁。
八、对本实验过程及方法、手段的改进建议
本实验第三部分内容“增加按键,当其按下,数码管显示学号后8位,同时,第一个LED灯亮,再次按该键,恢复温度的显示,LED灯灭”仅能实现一次,不能在温度显示与学号显示之间切换。这个功能一直未能解决,在之后的测试中要注意这个功能的实现,并寻找方法实现此功能。
九、附录
*s = '\0';
}
/*
函数:DispTemp()
功能:在数码管上显示出温度值
参数:
t:补码,除以8以后才是真正温度值
*/
void DispTemp1(int t)
{
code unsigned char Tab[8][4] =
{
"000",
"125",
"250",
"375",
"500",
"625",
//分离出整数和小数部分
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];
//清除所有显示
中断服务程序:
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');
七、总结及心得体会
次实验在三次基础课程之后,在实验室利用开发平台,完成了一个综合性较强的实验题目,利用之前上课时学习和运行的例程中的知识和子程序模块,完成了题目要求。发现各个程序模块之间的拼接并不是想象中那么简单,要兼顾到程序整体的各个方面,并将主程序进行大量调整。本实验的主程序参考了数码管动态扫描,按键检测,蜂鸣器的发声,温度传感器的显示等多个例程的内容,在程序编写时遇到了诸多问题,但都成功解决,蜂鸣器的发声借鉴了利用蜂鸣器演奏乐曲中将定时器初值设为变量,并改变变量值的方法来改变蜂鸣器音调,温度循环显示设置了多个子函数,实现了实时更新温度显示的功能。通过此次实验加深了对理论知识的理解。
code unsigned char Tab[] = {100,10};
unsigned char i;
unsigned char t;
for ( i=0; i<2; i++ )
{
t = c / Tab[i];
*s++ = '0' + t;
c -= t*Tab[i];
}
*s++ = '0' + c;
{
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位定时器
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);
};
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;
//分离出整数和小数部分
ET0 = 0;
Delay(1800);
t = LM75A_GetTemp();
DispTemp(t);
DispChar(0,s[2]);
DispChar(1,s[6]);
DispChar(2,s[10]);
DispChar(5,s[10]);
ReloadH=0xEE;
ReloadL=0x00;
TH0 = ReloadH;
2、掌握KEIL C51的基本使用方法
3、熟悉SMART SOPC实验箱的应用
4、连接电路,编程调试,实现各部分的功能
5、完成系统软件的编写与调试
五、实验器材
1、PC机一台
2、SMART SOPC实验箱一套
六、实验原理、步骤及内容
试验要求:
1、第一、二个数码管显示最后两位学号,第三、六个数码管显示“-”号,第四、五个数码管显示设定温度,第七、八个数码管显示当前环境温度。设定温度初值为(当前环境温度-2)度,每隔2秒设定温度值加2,加到(当前环境温度+2)度后,隔2秒,设定温度值变回(当前环境温度-2)度,进入循环状态。
DispInit();//数码管扫描显示初始化
I2C_Init();//初始化I2C总线
}
/*
函数:LM75A_GetTemp
功能:读出LM75A的温度值
返回:LM75A温度寄存器的数值(乘以0.125可得到摄氏度值)
*/
int LM75A_GetTemp()
{
unsigned char buf[2];
//显示整数部分
DispStr(6,disp);
DispStr(3,disp1);
}
void DispTemp2(int t)
{
code unsigned char Tab[8][4] =
{
"000",
"125",
"250",
"375",
"500",
"625",
"750",
"875"
};
unsigned char buf[4];
unsigned char KeyScan()
{
unsigned char k = '\0';
if ( K2 == 0 ) k = '+';
return k;
}
/*
函数:Delay()
功能:延时1ms~65.536s
参数:
t>0时,延时(t*0.001)s
t=0时,延时65.536s
*/
void Delay(unsigned int t)
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、由设定温度和实际环境温度的温差驱动蜂鸣器发声。若温度等于环境温度,蜂鸣器发出标准的声音0.2秒;温差不同,蜂鸣器发不同声音0.2秒,温差值越大,蜂鸣器声音越尖。
3、增加按键,当其按下,数码管显示学号后8位,同时,第一个LED灯亮,再次按该键,恢复温度的显示,LED灯灭。
1、硬件设计
实验平台核心板原理图如下:
此次实验除主板外,还用到数码管、按键、蜂鸣器和温度传感器等其他功能模块。
2、各部分硬件原理
LED原理图:
由于I/O口输出低电平时,可以驱动LED,输出高电平时,无法点亮LED,因此设计利用I/O口在低电平时点亮LED。
蜂鸣器原理图:
利用单片机中的定时中断通过I/O口控制交流蜂鸣器发声,不同的定时器初值可得到不同的蜂鸣器音调。
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时,显示温度。
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);
程序:
/*
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;
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();
电子科技大学电工学院
实验报告
实验名称现代电子技术综合实验
姓名:
学号:
评分:
教师签字:
电子科技大学教务处制
电 子 科 技 大 学
实 验 报 告
学生姓名:学号:指导教师:
实验地点:科A333实验时间:第一周
一、实验室名称:电子技术综合实验室
二、实验项目名称:
三、实验学时:32
四、实验目的与任务:
1、熟悉系统设计与实现原理
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"
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]);
"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;
int t;
I2C_Gets(0x90,0x00,2,buf);
t = buf[0];
t <<= 8;
t += buf[1];
t >>= 5;//去掉无关位
return t;
}
/*
函数:ByteToStr()
功能:字节型变量c转换为十进制字符串
*/
void ByteToStr(unsigned char idata *s, unsigned char c)
i2=i+2;
//整数部分转换成字符串
ByteToStr(buf,i);
ByteToStr(buf1,i2);
disp[0]=buf[1];
disp[1]=buf[2];
数码管动态扫描原理图:
数码管动态驱动以多位连体的形式提供,连线较少。一位数码管可以看成由abcdefg和dp共8段单个LED组成的。在动态扫描中,abcdefg和dp是共用的称为段选信号,而位选信号DIS_COMx是分开的,扫描方式为:先把第1个数码管的显示数据送到数据线,同时选通DIS_COM1,其他数码管位选信号禁止。再把第2个数码管的显示数据送到数据线,选通DIS_COM2,其他数码管位选信号禁止。整个扫描频率应大于50Hz,防止出现明显的闪烁。
八、对本实验过程及方法、手段的改进建议
本实验第三部分内容“增加按键,当其按下,数码管显示学号后8位,同时,第一个LED灯亮,再次按该键,恢复温度的显示,LED灯灭”仅能实现一次,不能在温度显示与学号显示之间切换。这个功能一直未能解决,在之后的测试中要注意这个功能的实现,并寻找方法实现此功能。
九、附录
*s = '\0';
}
/*
函数:DispTemp()
功能:在数码管上显示出温度值
参数:
t:补码,除以8以后才是真正温度值
*/
void DispTemp1(int t)
{
code unsigned char Tab[8][4] =
{
"000",
"125",
"250",
"375",
"500",
"625",
//分离出整数和小数部分
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];
//清除所有显示
中断服务程序:
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');
七、总结及心得体会
次实验在三次基础课程之后,在实验室利用开发平台,完成了一个综合性较强的实验题目,利用之前上课时学习和运行的例程中的知识和子程序模块,完成了题目要求。发现各个程序模块之间的拼接并不是想象中那么简单,要兼顾到程序整体的各个方面,并将主程序进行大量调整。本实验的主程序参考了数码管动态扫描,按键检测,蜂鸣器的发声,温度传感器的显示等多个例程的内容,在程序编写时遇到了诸多问题,但都成功解决,蜂鸣器的发声借鉴了利用蜂鸣器演奏乐曲中将定时器初值设为变量,并改变变量值的方法来改变蜂鸣器音调,温度循环显示设置了多个子函数,实现了实时更新温度显示的功能。通过此次实验加深了对理论知识的理解。