单片机课程设计报告简易数字电压表.docx
《单片机课程设计报告简易数字电压表.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告简易数字电压表.docx(13页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告简易数字电压表
单片机课程设计报告
简易数字电压表
(一)实验目的
1.了解A/D芯片TLC0834转换性能及编程方法。
2.掌握A/D转换器与单片机的接口方法
3.学会使用A/D转换器进行电压信号采集。
(二)设计任务及要求
利用实验平台上的串行模/数转换芯片TLC0834及4位数码管,设计完成一个数字电压表。
要求:
数字电压表可测量0~5V输入电压,电压值通过数码管显示。
(三)工作原理及设计思路
简易数字电压表的设计由A/D转换、数据处理及显示控制等组成。
A/D转换由集成电路TLC0834完成,利用TLC0834将模拟电压转换为数字量,经单片机将数字量转换成对应的电压值,并通过数码管输出。
TLC0834是8位串行A/D转换器,它有4个可多路选择的输入通道。
其多路器可用软件配置为单端输入或差分输入。
多路器地址通过DI端移入转换器。
TLC0834与单片机的接口参考电路如图1所示,
图1
1)A/D转换部分
1.1TLC0834AD转换器
TLC0834的启动和转换可以由软件自由控制。
根据TLC0834的工作时序图,
图2控制逻辑表
图3时序图
其转换过程是:
片选置CS为低(保证CS有一个从高到低的跳变),该电平能使所有的逻辑功能有效,CS引脚在整个转换过程中应保持低电平。
此时DO端为高阻,DI端等待指令
起始向DI端输出第一个逻辑高,表示起始位。
由于DI端的数据移入多路器地址移位寄存器是在每个时钟的上升跳变时发生的,因此每次向DI端置入一位数据时,应在CLK端输出一个从0到1的跳变。
配置接下来的3位是配置位,用以选择输入通道及输入方式。
连续3个时钟的上升沿将3位配置位移入移位寄存器。
转换当启始位、3位配置位移入移位寄存器后,转换便开始,即在第4个时钟的下降沿转换开始。
同时DI端转为高阻状态,DO端脱离高阻状态,为输出数据做准备。
读取在第5个脉冲的下降沿单片机即可读取DO端的数据,第5至第12个脉冲,共读取8位数据,读取的顺序是从高到低(D7D6D5D4D3D2D1D0)。
TLC0834在输出以最高位(MSB)开头的数据流后,又以最低位(LSB)开头重输出一遍数据流,最低位共用。
如果你需要,可以接着向CLK端输出第12至19个脉冲,以读取7位数据(D1D2D3D4D5D6D7),如果不需要,可以省去第13至第20个脉冲,直接结束这一次转换周期,即置CS高电平
1.2硬件电路设计
图4硬件电路图
其中P1.7口接TLC0834的片选端,P1.6用于产生A/D转换的时钟,P1.5和P1.4分别接芯片的DO和DI端,用于对TLC0834进行初始化和接收转换得到的数据。
这里参考电压是5V,即A/D转换器的输入电压范围为0-5V。
1.3TLC0834初始化程序
CLRP1.6;清时钟
CLRP1.5
SETBP1.7;CS=1
CLRP1.7;CS=0
SETBP1.5;置1启动位
SETBP1.6
CLRP1.6
SETBP1.5;1写SGL
SETBP1.6;时钟0-1跳变
CLRP1.6
CLRP1.5;0写ODD
SETBP1.6
CLRP1.6
CLRP1.5;0写SELECTBIT1
SETBP1.6
CLRP1.6;通道0,单端输入
SETBP1.6
CLRP1.6
LCALLADCONV
ADCONV:
MOVR0,#08H
ADLOP0:
SETBP1.4;置1使P1.4为输入
MOVC,P1.4
RLCA;a左移并将c补到最低位
SETBP1.6
CLRP1.6
DJNZR0,ADLOP0
MOV70H,A
MOVR0,#07H
ADLOP1:
SETBP1.6
CLRP1.6
DJNZR0,ADLOP1
SETBP1.6
CLRP1.6
SETBP1.6
CLRP1.6
SETBP1.7;结束一次转换
RET
2)数据处理
数据处理部分主要是将ADC转换得到的数据进行处理,转换成相应的电压值,因为TLC0834是8位AD模数转化器而且参考电压为5V,所以就是把0~255十进制数转换成0.00V~5.00V。
可根据下面的公式转换:
(
为十进制数)
程序的流图如图所示:
图5
数据处理的程序如下:
TURN_SUB:
MOVA,70H
MOVB,#51
DIVAB;除与51,余数放在B
MOV78H,A;存个位数
MOVA,B
CLRF0
SUBBA,#1AH
MOVF0,C
MOVA,#10
MULAB
MOVB,#51
DIVAB
JBF0,LOOP1
ADDA,#5
LOOP1:
MOV79H,A
MOVA,B
CLRF0
SUBBA,#1AH
MOVF0,C
MOVA,#10
MULAB
MOVB,#51
DIVAB
JBF0,LOOP2
ADDA,#5
LOOP2:
MOV7AH,A
RET
3)显示功能
显示子程序采用动态扫描法实现三位数码管的数值显示。
测量所得的A/D转换数据放在70H内存中,转换成十进制BCD码放在78H~7AH单元中,寄存器R1用作数据地址指针。
程序流图如下:
图6
4)源程序代码
org0000h
jmpMAIN
;startoftheprogram
org0100h
;初始化tlc0834
MAIN:
CLRP1.6;清时钟
CLRP1.5
SETBP1.7;CS=1
CLRP1.7;CS=0
SETBP1.5;置1启动位
SETBP1.6
CLRP1.6
SETBP1.5;1写SGL
SETBP1.6;时钟0-1跳变
CLRP1.6
CLRP1.5;0写ODD
SETBP1.6
CLRP1.6
CLRP1.5;0写SELECTBIT1
SETBP1.6
CLRP1.6;通道0,单端输入
SETBP1.6
CLRP1.6
SETBP1.4;P1.4输入
LCALLADCONV;
;调用数据转换子程序
LCALLTURN_SUB
;调用显示子程序
LCALLDISP_SUB
;转换成通道1
CH1:
CLRP1.6;清时钟
CLRP1.5
SETBP1.7;CS=1
CLRP1.7;CS=0
SETBP1.5;置1启动位
SETBP1.6
CLRP1.6
SETBP1.5;1写SGL
SETBP1.6;时钟0-1跳变
CLRP1.6
SETBP1.5;1写ODD
SETBP1.6
CLRP1.6
CLRP1.5;0写SELECTBIT1
SETBP1.6
CLRP1.6;通道0,单端输入
SETBP1.6
CLRP1.6
SETBP1.4;P1.4输入
LCALLADCONV
LCALLTURN_SUB
LCALLDISP_SUB
LJMPMAIN
;----------------------------------------------
ADCONV:
MOVR0,#08H
ADLOP0:
MOVC,P1.4
RLCA;a左移并将c补到最低位
SETBP1.6
CLRP1.6
DJNZR0,ADLOP0
MOV70H,A
MOVR0,#07H
ADLOP1:
SETBP1.6
CLRP1.6
DJNZR0,ADLOP1
SETBP1.6
CLRP1.6
SETBP1.6
CLRP1.6
SETBP1.7;置CS为高,停止转换
RET
TURN_SUB:
MOVA,70H
MOVB,#51
DIVAB
MOV78H,A
MOVA,B
CLRF0
SUBBA,#1AH
MOVF0,C
MOVA,#10
MULAB
MOVB,#51
DIVAB
JBF0,LOOP1
ADDA,#5
LOOP1:
MOV79H,A
MOVA,B
CLRF0
SUBBA,#1AH
MOVF0,C
MOVA,#10
MULAB
MOVB,#51
DIVAB
JBF0,LOOP2
ADDA,#5
LOOP2:
MOV7AH,A
RET
;---------------------------------------
DISP_SUB:
MOVR1,#78H
CLRA
LCALLPLAY
CLRP3.7
SETBP2.0
LCALLDELAY
CLRP2.0
INCR1
LCALLPLAY
SETBP2.1
LCALLDELAY
CLRP2.1
INCR1
LCALLPLAY
SETBP2.2
LCALLDELAY
CLRP2.2
RET
PLAY:
MOVA,@R1
MOVDPTR,#TAB
MOVCA,@A+DPTR;查表
MOVP3,A
RET
DELAY:
MOVR6,#10H
D1:
MOVR7,#10H
D2:
DJNZR7,D2
DJNZR6,D1
RET
;共阳极数码管的段码
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
5)整体硬件电路
图7
6)设计心得
在这次设计中,收获真的挺大的,首先在硬件的设计上就是就收获很多,首先,我们需要设计硬件电路,在设计中我们要考虑各个I/O口的驱动能力,当使用P0口驱动外接电路时,需要接上拉电阻。
I/O口在作为输入应先对I/O口的寄存器先写1。
硬件电路设计完成后就要根据硬件电路开始编写程序了,在对TLC0834芯片的编程过程中,首先需要知道该芯片的时序图,即我们要根据时序图编写程序从而去控制该芯片正常的工作。
这次我设计的是一个简易的电压表,一开始,我先利用了protues软件进行电路的连接与仿真,设计了51的最小系统,包括了复位电路,晶振电路。
而后设计了ADC与51的接口电路,用P1.7的高低电平来产生ADC的时钟信号。
数码管用的三显示共阳的,使用动态扫描法来驱动数码管。
这个过程不仅让我温习了单片机的知识,也让我对单片机有了更深的了解。