云南大学单片机实验84doc.docx
《云南大学单片机实验84doc.docx》由会员分享,可在线阅读,更多相关《云南大学单片机实验84doc.docx(12页珍藏版)》请在冰豆网上搜索。
云南大学单片机实验84doc
实验8.4简易数字显示温度计实验
一实验目的于要求
用PIC16F877A单片机和两只七段式LED数码管制作一个能够测量和显示室温的简易数显温度计。
要求测量范围为0至40摄氏度,误差控制在正负1摄氏度以内。
当用手触摸温度传感器时,能够观测到显示温度随之变化。
二实验内容
1.硬件电路设计
为了完成本实验的要求,除了单片机及其附属电路之外,还要设计两部分的硬件电路:
温度测量部分和数字显示部分,其中数字显示部分已经在本书第五章的相关实验中做过详细描述,这里不再重复,下面主要就温度测量电路进行阐述。
一般而言,任何物理量的测量电路分为两个功能块:
传感器和传感器调理电路,其中传感器主要将各种被测物理量转换为单片机系统能够认知的电信号,而调理电路则对传感器输出的电信号进行适当调整,以适应单片机系统的ADC模块的要求。
这种调整包括电流/电压转换,阻抗/电压转换,信号线性矫正,信号放大以及阻抗匹配等,调理电路多由运算放大器构成。
温度传感器是一种将温度转换为电量的转换装置,根据输出电量的种类,属性和灵敏度的不同,温度传感器的种类也非常庞杂。
常用的温度传感器有热电偶,金属热电阻,半导体温度传感器等几类。
2.软件设计思路
本实验的软件设计部分分为三个部分:
ADC模块的初始化、AD转换结果到显示数据的转换以及AD转换的控制。
1.ADC模块初始化
实验要求测量温度范围是0~40度,这个范围内LM35的输出电压在0~0.4V,其最高电压0.4V小于参考电压的1/4,也就是说,10位的转换结果的高两位一定是0,采用右对齐的存放方式使得转换结果寄存器的高字节ADRESH总是0,而转换结果可以完全存放在转换结果低字节寄存器ADRESL中。
2.A/D转换结果到显示数据的转换
A/D转换结果到显示数据的变化是本实验的难点,但理解这部分内容对于正确使用A/D转换结果具有重要意义。
3.A/D转换结果的控制
本实验软件设计的第三个部分是A/D转换的控制,即如何处理A/D转换、结果变化以及数码管显示之间的关系。
由于ADC模块能够独立于PIC16F877A的CPU内核进行采样和转换工作,处理A/D转换及其他CPU内核之间关系的基本原则是令他们同时进行,以节约耗费的总体时间。
三实验步骤及结果
1.从实验套件提供的元器件中找出TO-92封装,标有LM35的集成电路,将其焊接在标有TEMP的位置上。
2.找出一只标有104,容量为0.1uF的电容,将其焊接在电路板上标有C6的位置。
3.选择跳线器JP_RA的第二个跳线器用于选择引脚RA1/AN1的硬件连接方式。
4.选择跳线器JP_RD用于选择单片机RD口的连接方法。
5.两只七段数码管及其配套电路的识别和焊接方法已经在本书第四章进行过描述。
6.从PC的缺省路径上安装MPLAB及ICD3的驱动程序。
7.从开始菜单运行MPLAB,打开MPLAB后,在Project菜单中选择ProjectWizard。
单击弹出的工程向导窗口中的“下一步”按钮;在工程向导第一步(StopOne)的窗口中选择本工程要使用的单片机型号——PIC16F877A;在工程向导第二部(StepTwo)的窗口中选择合适的编译工具包——MicrochipMPASMToolsuite,窗口中部显示了这个编译工具包内的工具,单击任何一个工具就会在窗口下部显示这个工具所在的路径,如果MPLAB安装在缺省路径则无需修改这些工具的路径;在工程向导第三步(StepThree)的窗口中给新创建工程命名并选择新创建的工程所在的路径;在工程向导第四步(StopThree)的窗口中,可以将能重复使用的程序文件拷贝到本工程中。
完成以上四步后就输入了创建新工程所需的所有参数,工程向导将在最后的总结窗口中显示这些参数,核实无误后单击“完成”即可完成新工程的创建工作。
8.配置单片机的基本工作方式。
单击MPLAB开发环境中单击Configure菜单下ConfigurationBits,在弹出的配置位窗口中首先去掉ConfigurationBitssetcode复选框前面的小钩。
接着逐一设置窗口中提供的单片机配置位:
将振荡器(Oscillator)类型设置为“XT”;“看门狗(WatchdogTimer)”应该关闭,将其设置为“OFF”;将上电复位定时器(PowerUpTimer)关闭;将电压检测电路(BrownOutDetect)关闭;低电压编程(LowVoltageProgram)设置为“Disabled”;将数据EEPROM读保护(DataEEReadProtect)关闭;将用户程序Flash写保护(FlashProgramWrite)设置为“WriteProtectionOff”;将代码保护(CodeProtect)关闭。
完成以上设置后关闭配置位窗口。
9.将仿真器ICD3和实验套件电路板相连,连接时注意仿真器连接电缆的第一脚应该和本实验套件电路板上仿真器连接端子的第一脚相连。
10.将仿真器和PC端用USB电缆连接起来。
11.将外接电源适配器的一端连接在220V的市电插座上,另一端连接在实验套件电路板上供电。
12.单击MPLAB中出现的ResetandConnecttoICD按钮,如果以上所有连接和设置正确,MPLAB信息窗口中会显示连接正确,如果无法正确连接,请逐一检查以上每一步是否正确。
13.选择File菜单下的New命令新建一个汇编语言文件,输入按本实验要求所写的代码,保存时注意选择文件的类型为汇编语言源文件。
14.用右键单击MPLAB的工程管理窗口(可以用View菜单下Project打开或关闭),从弹出的快捷菜单中选择AddFiles.....,将上一步编写好的汇编文件加入工程中。
15.编译工程。
在Project菜单中选择BuildAll。
如果有错误,则根据输出窗口的提示改正之,直到完全正确。
16.单击ProgramTargetDevice快捷方式,分别将刚才编译成功的主机和从机的程序下载到目标单片机中。
17.运行程序,从数码管观察程序测得的室温。
18.用手触摸LM35,可以观察到数码管上显示的温度值有所增加。
手离开LM35后可以观察到数码管上显示的温度值逐渐恢复原先的室温。
#includep16f877a.inc
COUNT1EQU20H;定义外部循环变量COUNT1
COUNT2EQU21H;定义内部循环变量COUNT2
COUNT3EQU22H;定义循环变量COUNT3
TEMP1_HEQU23H;定义TEMP1_H寄存器
TEMP1_LEQU24H;定义TEMP1_L寄存器
TEMP2_HEQU25H;定义TEMP2_H寄存器
TEMP2_LEQU26H;定义TEMP2_L寄存器
TEN_BITEQU27H;定义十位
ONE_BITEQU28H;定义个位
ORG00H
NOP;空指令
GOTOMAIN
;**函数名称:
main
;**函数功能:
初始化各引脚,测量温度
;**使用说明:
MAIN
CALLINITIAL;调初始化子程序
LOOP
CALLADC;调A/D转换子程序
CALLCHANGE;调用转换结果变换程序
CALLDISPLAY;调用显示程序
GOTOLOOP
;**函数名称:
INITIAL
;**函数功能:
初始化各引脚
;**使用说明:
INITIAL
BCFSTATUS,RP1;转到体1
BSFSTATUS,RP0;
MOVLW0x85;设定A/D转换的输入端为RA1,转换
MOVWFADCON1;结果右对齐,参考电压为外接电源
BSFTRISA,1;设RA1为输入
BCFTRISE,0;设RE0为输出
BCFTRISE,1;设RE1为输出
CLRFTRISD;定义RD端口全为输出
BCFSTATUS,RP1;转到体0
BCFSTATUS,RP0
MOVLW0xC9;选择模拟通道AN1,设定工时
MOVWFADCON0;钟为fRC,启动A/D转换
RETURN
;**函数名称:
ADC
;**函数功能:
A/D转换
;**使用说明:
ADC
CALLDELAY_11us;调11us延时子程序
BCFSTATUS,RP1;转到体0
BCFSTATUS,RP0
BSFADCON0,0;启动ADC
BSFADCON0,2
NEXT
BTFSCADCON0,2;检查转换是否结束
GOTONEXT
RETURN
;**函数名称:
CHANGE
;**函数功能:
将A/D转换结果转化成十进制温度值
CHANGE
BANKSELADRESL;选择体1
MOVFADRESL,0;将ADRESL的值存到W寄存器
BANKSELTEMP1_L;选择体0
CLRFTEMP1_H;寄存器清零
CLRFTEMP1_L
CLRFTEMP2_H
CLRFTEMP2_L
CLRFTEN_BIT
CLRFONE_BIT
MOVWFTEMP1_L;将A/D转换结果存到TEMP1_L
MOVWFTEMP2_L;将A/D转换结果存到TEMP2_L
MOVFTEMP1_L,0;TEMP1左移8位
MOVWFTEMP1_H
CLRFTEMP1_L
MOVLWB'11100000';TEMP2结果左移3位
ANDLWTEMP2_L
MOVWFTEMP2_H
RRFTEMP2_H,1
RRFTEMP2_H,1
RRFTEMP2_H,1
RRFTEMP2_H,1
RRFTEMP2_H,1
MOVLWB'00011111'
ANDWFTEMP2_L,1
RLFTEMP2_L,1
RLFTEMP2_L,1
RLFTEMP2_L,1
MOVFTEMP2_L,0;TEMP1=TEMP1-TEMP2
SUBWFTEMP1_L,1
BTFSSSTATUS,C;减法后,若无借位跳过下一条指令
DECFTEMP1_H
MOVFTEMP2_H,0
SUBWFTEMP1_H,1
CLRFTEMP2_L;TEMP2_L清零
BANKSELADRESL;选择体1
MOVFADRESL,0
BANKSELTEMP2_L;选择体0
MOVWFTEMP2_L;将A/D转换结果存到TEMP2_L
CLRFTEMP2_H;TEMP2_H清零
MOVFTEMP2_L,0;TEMP2结果左移1位
ANDLWB'10000000'
MOVWFTEMP2_H
RRFTEMP2_H,1
RRFTEMP2_H,1
RRFTEMP2_H,1
RRFTEMP2_H,1
RRFTEMP2_H,1
RRFTEMP2_H,1
RRFTEMP2_H,1
MOVLWB'01111111'
ANDWFTEMP2_L,1
RLFTEMP2_L,1
MOVFTEMP2_L,0;TEMP1=TEMP1+TEMP2
ADDWFTEMP1_L,1
BTFSCSTATUS,C;加法后,若无进位则跳过下一条指令
INCFTEMP1_H
MOVFTEMP2_H,0
ADDWFTEMP1_H,1
CLRFTEMP1_L
MOVFTEMP1_H,0;TEMP1结果右移10位
ANDLWB'11111100';
MOVWFTEMP1_L
RRFTEMP1_L,1
RRFTEMP1_L,1
LOOP1MOVLWD'10'
SUBWFTEMP1_L,0
BTFSSSTATUS,C;减法后,若无借位则跳过下一条指令
GOTOLOOP2
MOVWFTEMP1_L
INCFTEN_BIT
GOTOLOOP1
LOOP2
MOVFTEMP1_L,0;将个位存到个位寄存器
MOVWFONE_BIT
RETURN
;**函数名称:
DISPLAY
;**函数功能:
将十进制温度值通过数码管显示
DISPLAY
CLRFPORTD
MOVFTEN_BIT,0
ANDLW0FH
CALLTABLE;调用查表指令
MOVWFPORTD;显示十位段码
BCFPORTE,0;关闭个位显示位码
BSFPORTE,1;选通十位显示位码
CALLDELAY_10ms
MOVFONE_BIT,0
ANDLW0FH
CALLTABLE;调用查表指令
MOVWFPORTD;显示个位段码
BCFPORTE,1;关闭十位显示位码
BSFPORTE,0;选通个位显示位码
CALLDELAY_10ms
RETURN
;查表子程序,用于显示段码数字
;数码管为共阴数码管
TABLE
ADDWFPCL,1
RETLW3FH;"0"
RETLW06H;"1"
RETLW5BH;"2"
RETLW4FH;"3"
RETLW66H;"4"
RETLW6DH;"5"
RETLW7DH;"6"
RETLW07H;"7"
RETLW7FH;"8"
RETLW6FH;"9"
;**函数名称:
DELAY_11us
;**函数功能:
延时11us
;**使用说明:
DELAY_11us
MOVLWD'2';设置循环次数
MOVWFCOUNT3;
LOOP3
DECFSZCOUNT3,1;循环变量自减1,为0则跳转
GOTOLOOP3;
RETURN;返回主程序
;**函数名称:
DELAY_10ms
;**函数功能:
延时10ms
;**使用说明:
DELAY_10ms
MOVLWD'14';设置外部循环次数
MOVWFCOUNT1;
LOOP4
MOVLWD'250';设置内部循环次数
MOVWFCOUNT2;
LOOP5
DECFSZCOUNT2,1;内部循环变量自减1,为0则跳转
GOTOLOOP5;
DECFSZCOUNT1,1;外部循环变量自减1,为0则跳转
GOTOLOOP4;
RETURN;返回主程序
END
四实验心得
本次实验较为困难,我们事先认真阅读了实验指导书上的内容,根据书上的流程图认真写了程序,在写程序的过程中出现了一些问题,在询问了同学之后都顺利解决了。
在程序下载之后我们发现数码管显示错误,认真检查之后发现跳线没接对,重新连接了跳线端子之后我们顺利地完成了实验。