综合实践训练实验指导书.docx
- 文档编号:7257209
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:51
- 大小:349.34KB
综合实践训练实验指导书.docx
《综合实践训练实验指导书.docx》由会员分享,可在线阅读,更多相关《综合实践训练实验指导书.docx(51页珍藏版)》请在冰豆网上搜索。
综合实践训练实验指导书
测控技术与仪器
综合实践训练实验指导书
2010年9月
目录
目录2
第1章单片机系统的显示及键盘调试试验5
1.1实验目的:
5
1.2实验任务:
5
1.3参考程序:
6
1.4思考题13
第2章单片机系统温度测量实验14
2.1实践背景14
2.2实验任务14
2.3实验需用设备及器件14
2.4硬件设计15
2.4.1主板原理图15
2.5实验程序编写15
2.5.1DS18B20测温程序15
2.5.2显示程序19
2.6实验步骤22
2.7实验结果23
第3章单片机系统位移测量实验24
3.1实验目的24
3.2测量基本原理24
3.3实验需用器件与单元25
3.4实验程序编写25
3.5实验步骤26
3.6实验结果27
3.7思考题27
第4章单片机系统转速测量实验28
4.1实验目的28
4.2测量基本原理28
4.3实验需用器件与单元28
4.4实验程序编写28
4.5实验步骤29
4.6实验结果30
4.7思考题30
第5章单片机系统RS232通信实验31
5.1实验目的31
5.2RS232通信原理31
5.3实验需用器件与单元31
5.4实验程序编写31
5.5实验步骤32
5.6实验结果33
5.7思考题33
第6章单片机系统CAN通信实验34
6.1实验目的34
6.2CAN通信原理34
6.3实验需用器件与单元34
6.4实验程序编写34
6.4.1CAN发送程序34
6.4.2CAN接收程序37
6.5实验步骤39
6.6实验结果40
6.7思考题40
第7章DS18B20组网41
7.1功能要求41
7.2方案论证41
7.3系统程序设计41
7.4系统程序设计41
7.5控制源程序清单41
第1章单片机系统的显示及键盘调试试验
1.1实验目的:
了解单片机键盘显示系统的结构特点,及max7219的工作方式,完成系统显示及键盘部分的调试。
1.2实验任务:
(1)基于C8051F040的MAX7219显示设计。
四个LED数码管要求在C8051F040及MAX7219的控制下实现小数、负数的正确显示及对八个发光二极管亮灭的控制。
(2)用键盘实现控制界面的选择切换功能(为后续的实验做基础)。
Max7219简介:
MAX7219和MCU连接有三条引线(DIN、CLK、LOAD),采用16位数据串行移位接收方式。
即单片机将16位二进制数逐位发送到DIN端,在CLK上升沿到来前准备就绪,CLK的每个上升沿将一位数据移入MAX7219内移位寄存器,当16位数据移入完,在LOAD引脚信号上升沿将16位数据装入MAX7219内的相应位置,在MAX7219内部硬件动态扫描显示控制电路作用下实现动态显示。
本实验中DIN=P4.2,CLK=P4.1,LOAD=P4.3。
原理图:
1.3参考程序:
#include
#include
#include
#include"C8051F040.h"/*C8051F040头文件*/
#defineDecoding0x09/*译码模式*/
#defineBrightness0x0A/*亮度*/
#defineBoundaryScan0x0B/*扫描界限*/
#defineBrownout0x0C/*掉电模式*/
#defineDisplayTest0x0F/*显示测试*/
typedefunsignedcharuchar;
typedefunsignedintuint;
typedefunsignedlongulong;
//显示部分
ucharxdatadispbuff[7];
ucharbit_sym=0,bit_int,bit_dec,bit_all;/*符号位,整数位,小数位及全部位数*/
floatxdatapart_dec;/*小数部分*/
ulongxdatapart_int,part_dec_int;/*整数部分和小数部分取整*/
ucharnum[13]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B,0x00,0xFF,0x01};/*从0~9及全灭,全亮和"-"*/
sbitdis_LOAD=P4^3;/*MAX7219Load-DataInput:
risingedge*/
sbitdis_DIN=P4^2;/*MAX7219Serial-DataInput:
risingedge*/
sbitdis_CLK=P4^1;/*MAX7219Serial-ClockInput:
maximum10MHz*/
sbitring=P4^4;
//按键输入端定义
sbitk0=P5^0;
sbitk1=P5^1;
sbitk2=P5^2;
sbitk3=P5^3;
sbitk4=P5^4;
sbitk5=P5^5;
//延时纳秒
voiddelayns(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
//传送1字节(8位)
voidSendChar(ucharch)
{
uchari,temp;
dis_CLK=0;
for(i=0;i<8;i++)
{
temp=ch&0x80;
ch=ch<<1;
if(temp)
{
dis_DIN=1;
delayns();
dis_CLK=1;
delayns();
dis_CLK=0;
}
else
{
dis_DIN=0;
delayns();
dis_CLK=1;
delayns();
dis_CLK=0;
}
}
}
//向MAX7219写入字(16位)
voidWriteWord(ucharaddr,ucharnum)
{
dis_LOAD=0;
delayns();
SendChar(addr);
delayns();
SendChar(num);
delayns();
dis_LOAD=1;
delayns();
}
//数值显示
voiddis_result()
{
WriteWord(0x01,dispbuff[3]);
WriteWord(0x02,dispbuff[2]);
WriteWord(0x03,dispbuff[1]);
WriteWord(0x04,dispbuff[0]);
}
//利用递归法实现指数运算
ulongpower(ulongnumber,uintindex)reentrant
{
ulongresult;
if(index==0)result=1;
elseresult=number*power(number,index-1);
return(result);
}
//数值计算
voiddisp(floatf)
{
inti,j;
if(f<0.0)
{
bit_sym=1;
f=-f;
}
part_int=(long)f;
part_dec=f-part_int;
part_dec_int=(long)(part_dec*1000);/*小数部分取整*/
bit_dec=3;/*小数部分的最多位数*/
bit_int=1;/*整数部分的最少位数*/
bit_all=1;/*总显示的最少位数*/
//计算小数位数
for(i=1;i<=3;i++)
{
if(part_dec_int%(power(10,i))==0)
bit_dec=bit_dec-1;
}
//计算整数位数
for(i=0;i<=3;i++)
{
if(part_int>=power(10,i))
bit_int=i+1;
}
//总的显示位数最多为4
if(bit_dec+bit_int+bit_sym>4)
bit_dec=4-bit_int-bit_sym;
//总的显示位数
bit_all=bit_sym+bit_int+bit_dec;
//显示小数位
if(bit_dec>0)
{
for(i=bit_dec-1,j=3;i>=0,j>=1;i--,j--)
{
dispbuff[i]=num[(part_dec_int%(power(10,j)))/(power(10,j-1))];/*该语句实现对各位的求取*/
}
}
//显示整数位
for(i=bit_all-bit_sym-1,j=bit_int;i>=bit_dec,j>=1;i--,j--)
{
dispbuff[i]=num[(part_int%(power(10,j)))/(power(10,j-1))];
}
//显示符号位
if(bit_sym==1)
dispbuff[bit_all-1]=num[12];
//小数点位置
if(bit_dec>0)
dispbuff[bit_dec]=dispbuff[bit_dec]+0x80;
//位不足则高位不显示
if(4-bit_all>0)
{
for(i=0;i<4-bit_all;i++)
{
dispbuff[bit_all+i]=num[10];
}
}
}
voidConfigC8051F040()
{
inti;/*延时计数器*/
//看门狗禁止
WDTCN=0x07;/*设置看门狗超时间隔*/
WDTCN=0xDE;
WDTCN=0xAD;
//交叉开关使能配置,使得P0~P3口能输出
SFRPAGE=0x0F;
XBR0=0x00;
XBR1=0x00;
XBR2=0x40;
XBR3=0x00;
//管脚输出配置
SFRPAGE=0x0F;
P4MDOUT=0x0F;/*P4[4:
0]推挽输出,用以显示部分*/
//晶振配置
SFRPAGE=0x0F;
OSCXCN=0x77;
/*配置为外部石英晶振2分频模式,且配置相应频率的驱动电流*/
for(i=0;i<256;i++);/*等待外部晶振稳定*/
while(!
(OSCXCN&0x80));
/*查询XTLVLD是否为1,若为1,表明外部晶振稳定,可切换到外部时钟*/
CLKSEL=0x01;/*选择外部晶振*/
OSCICN=0x00;/*将内部晶振关闭,也可不关闭,不关闭时MCU耗能高*/
}
//MAX7219初始化
voidInitDis(void)
{
WriteWord(Brownout,0x00);/*设置电源工作模式*/
WriteWord(BoundaryScan,0x06);/*设置扫描界限*/
WriteWord(Brightness,0x05);/*设置亮度*/
WriteWord(Decoding,0x00);/*设置译码模式*/
WriteWord(DisplayTest,0x00);/*设置非测试模式*/
WriteWord(Brownout,0x01);/*设置电源工作模式*/
}
main()
{
ConfigC8051F040();
InitDis();
while
(1)
{
ring=1;
if(k0==0)
disp(0);
if(k1==0)
disp
(1);
if(k2==0)
disp
(2);
if(k3==0)
disp(3);
if(k4==0)
disp(4);
if(k5==0)
disp(5);
ring=0;
dis_result();
WriteWord(0x07,0x04);}/*发光二极管显示*/
}
1.4思考题
1.修改数值处理部分函数,让数值都以六位显示,比如12.5显示为12.5000。
2.通过实验读取8个指示灯亮时对应数值,并分析原理,写出原因。
第2章单片机系统温度测量实验
2.1实践背景
在日常生活及工农业生产中经常要用到温度的检测及控制,传统的测温元件有热电耦和热电阻,而热电耦和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持,硬件电路复杂,软件调试复杂,制作成本高。
DS18B20是美国DALLAS半导体公司的一种改进型智能温度传感器,测温范围为-55~125
,分辨率最大可达0.0625
。
DS18B20可以直接读出被测温度值,而且采用3线制与单片机相连,减少了外部硬件电路,具有低成本和易使用的特点。
2.2实验任务
(1)单个DS18B20数字温度计的设计。
数字温度计要求测温范围在-30~110
,误差在
0.0625
,用LED数码管直读显示。
2.3实验需用设备及器件
主机电源箱、DS18B20温度传感器、多功能检测实验装置。
2.4硬件设计
2.4.1主板原理图
图1.1主板原理图1
2.5实验程序编写
2.5.1DS18B20测温程序
//返回0,有设备连接;返回1,无设备连接
bitRstDS18B20(void)
{
uchari;
bitRstFlag=1;
DQ=0;
for(i=0;i<40;i++)/*延时480us*/
{
Delay15us();
}
DQ=1;
for(i=0;i<4;i++)/*延时15~60us*/
{
Delay15us();
}
for(i=0;i<16;i++)/*延时60~240us*/
{
Delay15us();
if(DQ==0)RstFlag=0;
}
for(i=0;i<16;i++)/*240us*/
{
Delay15us();
}
returnRstFlag;
}
voidWriteDS18B20(ucharval)
{
uchari;
DQ=1;
Delay1us
(1);
for(i=0;i<8;i++)
{
DQ=0;
Delay15us();
DQ=val&0x01;
Delay15us();Delay15us();Delay15us();
DQ=1;
val=val/2;
Delay1us
(1);
}
}
ucharReadDS18B20(void)
{
uchari,value=0;
DQ=1;
Delay1us
(1);
for(i=0;i<8;i++)
{
DQ=0;
Delay1us(4);
DQ=1;
Delay10us();
value>>=1;
if(DQ==1)
{
value|=0x80;
}
Delay15us();Delay15us();Delay15us();
}
return(value);
}
//主机发送跳过读序列号的操作命令:
0xCC
voidSkipROMCode(void)
{
RstDS18B20();
WriteDS18B20(0xCC);
}
voidStartADC(void)
{
RstDS18B20();/*复位*/
WriteDS18B20(0xCC);/*skipROM*/
WriteDS18B20(0x44);/*启动温度转换12位700ms*/
}
//读取温度值的程序
floatGetTempValue(void)
{
uchari,j;
floatT;
SkipROMCode();
WriteDS18B20(0xBE);/*发布读取温度值的命令(0xBE)*/
i=ReadDS18B20();
j=ReadDS18B20();
StartADC();
T=i+j*256;
if(T==0xFFFF)return0xFFFF;
if(T>0x8000)/*温度为负号*/
return((T-65536)/16.0);/*计算温度值*/
else/*温度为正*/
return(T/16);/*计算温度值*/
}
voidInitDS18B20(void)
{
SkipROMCode();
WriteDS18B20(0x44);
}
voidsleep_ms(uintcount)
{
ucharii,jj;
for(ii=0;ii { for(jj=0;jj<250;jj++) _nop_(); } } 2.5.2显示程序 //传送1字节(8位) voidSendChar(ucharch) { uchari,temp; dis_CLK=0; for(i=0;i<8;i++) { temp=ch&0x80; ch=ch<<1; if(temp) { dis_DIN=1; delayns(); dis_CLK=1; delayns(); dis_CLK=0; } else { dis_DIN=0; delayns(); dis_CLK=1; delayns(); dis_CLK=0; } } } //向MAX7219写入字(16位) voidWriteWord(ucharaddr,ucharnum) { dis_LOAD=0; delayns(); SendChar(addr); delayns(); SendChar(num); delayns(); dis_LOAD=1; delayns(); } //数值显示 voiddis_result() { WriteWord(0x01,dispbuff[3]); WriteWord(0x02,dispbuff[2]); WriteWord(0x03,dispbuff[1]); WriteWord(0x04,dispbuff[0]); } //利用递归法实现指数运算 ulongpower(ulongnumber,uintindex)reentrant { ulongresult; if(index==0)result=1; elseresult=number*power(number,index-1); return(result); } //数值计算 voiddisp(floatf) { inti,j; if(f<0.0) { bit_sym=1; f=-f; } part_int=(long)f; part_dec=f-part_int; part_dec_int=(long)(part_dec*1000);/*小数部分取整*/ bit_dec=3;/*小数部分的最多位数*/ bit_int=1;/*整数部分的最少位数*/ bit_all=1;/*总显示的最少位数*/ //计算小数位数 for(i=1;i<=3;i++) { if(part_dec_int%(power(10,i))==0) bit_dec=bit_dec-1; } //计算整数位数 for(i=0;i<=3;i++) { if(part_int>=power(10,i)) bit_int=i+1; } //总的显示位数最多为4 if(bit_dec+bit_int+bit_sym>4) bit_dec=4-bit_int-bit_sym; //总的显示位数 bit_all=bit_sym+bit_int+bit_dec; //显示小数位 if(bit_dec>0) { for(i=bit_dec-1,j=3;i>=0,j>=1;i--,j--) { dispbuff[i]=num[(part_dec_int%(power(10,j)))/(power(10,j-1))];/*该语句实现对各位的求取*/ } } //显示整数位 for(i=bit_all-bit_sym-1,j=bit_int;i>=bit_dec,j>=1;i--,j--) { dispbuff[i]=num[(part_int%(power(10,j)))/(power(10,j-1))]; } //显示符号位 if(bit_sym==1) dispbuff[bit_all-1]=num[12]; //小数点位置 if(bit_dec>0) dispbuff[bit_dec]=dispbuff[bit_dec]+0x80; //位不足则高位不显示 if(4-bit_all>0) { for(i=0;i<4-bit_all;i++) { dispbuff[bit_all+i]=num[10]; } } } 2.6实验步骤与实验结果 (1)将图1.7中的+5VIN与主机箱上+5V电源连接,GND与地线连接,JTAG端口与计算机连接; (2)将DS18B20温度传感器按图1.8接线,GND与检测装置的GND连接,VDD与检测装置的+5OUT连接,DQ与I/O连接; (3)合上主机箱电源开关,把温度测量程序下载入检测实验装置;点击运行即可。 (4)用手握住或用嘴吹DS18B20温度传感器观察温度值变化。 图1.1检测实验装置接口图 图1.2DS18B20引脚图 (5)用DS18B20测量记录自己的体温. 2.7思考题 1试分析DS18B20温度传感器的优缺点。 2如何组成一恒温控制电路,画出组成框图。 第3章单片机系统位移测量实验 3.1实验目的 了解电容式传感器结构及其特点和测量位移的工作原理和特性。 掌握C8051F040单片机的工作原理,结构特点和操作指令,重点完成单片机A/D转换功能的设计。 3.2测量基本原理 作为一种非接触式精确测量仪器,电容传感器具有温度稳定性好、测量范围大、测量精度高、动态响应好、结构简单、稳定可靠、使用方便,并可实现无接触式测量等一系列优点,特别适宜动态、在线检测,并能在特殊环境下工作。 本测量系统选用电容式位移传感器对微
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合 实践 训练 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)