历史上的今天
今天是:2025年01月25日(星期六)
2021年01月25日 | 基于51单片机和ADC0809的数字电压表设计
2021-01-25 来源:eefocus
本课题是利用单片机设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,使用的元器件数目较少。外界电压模拟量输入到A/D转换部分的输入端,通过A/D转换变为数字信号,输送给单片机。然后由单片机给数码管数字信号,控制其发光,从而显示数字。
注:因为ADC0809的通道选择端口是使用插针,做出电路板后再用导线连起来的,在程序里也少了通道选择的语句,请注意一下。
一.原理图

二.仿真图

三.存储空间定义
(1)70H用于存放A/D转换结果,71H、72H、73H、74H分别存储显示用的三位数据如表所示。

(2)地址30H~39H存放显示在数码管上0~9的数。如表所示。

四.程序

程序可分为数据采集系统、数据转换系统、显示系统,这三部分先独立测试,然后整体调试。
①数据采集系统:因为ADC0809本身并没有内部时钟,需要外部时钟来提供工作的时钟频率。如果利用单片机ALE端脚提供的频率为6MHZ,而ADC0809工作的频率在10KHZ-1MHZ。因此,需要增加含触发器功能的器件,从面增加了系统的复杂程度。后来,最终用软件编程来提供ADC0809工作的时钟频率,从而解决了这个问题。
②显示系统的调试:要显示的数据存放在71H、72H、73H、74H单元中,先在30H~39H分单元中存放0~9的数,运行显示程序,进行查表指令,察看显示的结果是否与存放值一样。在测试的过程中发现小数点没有显示,通过下面几条指令,把小数点显示出来。
MOVC A,@A+DPTR
CJNER2,#0FEH,NOT_ONE ;不是左边第一个数码管,则转移
ORL A,#80H ;左边第一个数码管显示小数点
NOT_ONE: MOVP0,A ;数码管段选
(1)汇编语言程序清单
QIANEQU71H
BAI EQU 72H
SHI EQU 73H
GEWEI EQU 74H ;71H-74H存放显示数据,依次为个位、十位、百位、千位
SHUJU EQU 70H ;地址70H存放采集数据
STBITP3.0 ;START和ALE共用一个端口
OEBIT P3.6
EOC BIT P3.7
CLK BITP3.3
ORG0000H
LJMPSTART
ORG 0030H
TAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
START:
MAIN: LCALLTEST ;数据采集函数
LCALL TURNDATA ;数据处理函数
LCALLDISPLAY ;显示函数
LJMP MAIN
DELAY: MOV R7,#06H ;约延时1.5ms
LOOP1: MOVR6,#0FFH
LOOP2: DJNZ R6,LOOP2
DJNZR7,LOOP1
RET
TEST: CLRST
CLROE
SETB ST
CLRST ;ST端口下降沿,开始转换
LOOPCLK: SETBCLK ;由软件来提供ADC0809工作的时钟频率
CLRCLK
JNB EOC,LOOPCLK ;EOC=1时,退出循环
SETBOE ;转换后数据的传送
MOV P1,#0FFH ;P1端口读数据,需先给高电平
MOV A,P1
CLROE
MOV SHUJU,A ;存储数据到地址70H
RET
TURNDATA:
MOVA,SHUJU
MOVB,#51
DIV AB ;余数在B,相除以后C=0
MOVQIAN,A ;储存千位
CLRF0
MOV A,B
SUBBA,#1AH ;A减去26,测试上面AB相除时,余数与26相比较
MOV F0,C ;余数<26,则C=1,不用加5调整
MOVA,#10
MULAB
MOVB,#51
DIVAB
JB F0,LP1
ADD A,#5 ;若AB相除后B>=26,百位加五
LP1: MOV BAI,A ;储存百位
CLRF0
MOV A,B
SUBBA,#1AH
MOVF0,C
MOVA,#10
MULAB
MOVB,#51
DIVAB
JB F0,LP2 ;F0=1时,转移
ADD A,#5 ;若AB相除后B>=26,十位加五
LP2: MOV SHI,A ;储存十位
CLRF0
MOVA,B
SUBBA,#1AH
MOVF0,C
MOVA,#10
MULAB
MOVB,#51
DIVAB
JB F0,LP3 ;F0=1时,转移
ADD A,#5 ;若AB相除后B>=26,个位加五
LP3: MOV GEWEI,A ;储存个位
RET
DISPLAY:
MOVR1,#4 ;循环四次
MOV R2,#0FEH
MOVR0,#71H ;存放显示初始地址
XIANSHI:
MOV DPTR,#TAB
MOVA,@R0
MOVCA,@A+DPTR
CJNER2,#0FEH,NOT_ONE ;不是左边第一个数码管,则转移
ORL A,#80H ;左边第一个数码管显示小数点
NOT_ONE: MOVP0,A ;数码管段选
MOVP2,R2 ;数码管位选
LCALLDELAY ;延时
MOV A,R2
RL A ;循环左移
MOV R2,A
INCR0 ;选取下一个地址
DJNZR1,XIANSHI
RET
END
(2) C语言程序清单
#include sbit CLK=P3^3; sbit OE=P3^6; sbit ST=P3^0; sbit EOC=P3^7; unsigned int dianya; unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay(unsigned int z) { while(z--); } void ADC_0809() { unsignedchar temp=2; ST=0; OE=0; ST=1; ST=0; CLK=1; CLK=0; CLK=1; CLK=0; while(!EOC) { CLK=1; CLK=0; } OE=1; P1=0xff; //读取P1端口数据 temp=P1; dianya=(unsigned int)temp*19.53; OE=0; } void Vpp_Show() { unsignedchar qian,bai,shi,ge; qian=dianya/1000; bai=dianya00/100; shi=dianya0/10; ge=dianya; P2=0xfe; P0=table[qian]|0x80; //显示小数点 delay(50); P2=0xfd; P0=table[bai]; delay(50); P2=0xfb; P0=table[shi]; delay(50); P2=0xf7; P0=table[ge]; } void main() { while(1) { ADC_0809(); Vpp_Show(); } }
史海拾趣
|
我手里的CY1C12开发板上的芯片是FPGA的EP1C12Q240C8,今天我用一个小程序,试图点亮那四个七段数码管。用的动态显示。然而,当我配置管脚,下载到板上后,数码管能够顺序点亮,但是不是之前程序里面设计的数字,有些乱码的感觉。 我怀疑是管脚配置 ...… 查看全部问答> |
|
XILINX FPGA 设计的点滴 1、为时钟信号选用全局时钟缓冲器BUFG 2、尽量只用一个时钟沿来寄存数据 3、除了用CLKDLL或DCM产生的时钟外不要在内部产生时钟 4、注意状态机编码的可靠性:状态机转移状态改变的位数越少,则功能越可靠。 5、逻辑 ...… 查看全部问答> |
|
evc中怎样编辑多国语言 比如说我要SetWindowText(_T(\"? ?? ??\")); 但在Evc中成了SetWindowText(_T(\"? ?? ??\")); … 查看全部问答> |
|
我在初始化ARM9260EJ-S CPU(AT91SAM9260EJ-S)时遇到了一个问题,SDRAM 8M,按Section初始化,影射成8个块,每块1M,SDRAM的物理地址为0x20000000,未启动MMU时,SDRAM上的所有读写都正常,启动MMU之后,0x20500000开始的1M SDRAM读写就发现异常,MMU初 ...… 查看全部问答> |
|
EE_FPGA V1.0 调试进展(2010.10.17更新) 正面: 反面: 目前进展: 1. 最小系统工作 2. LED工作 3. key工作 4. usb转串口驱动正常,串口工作正常 稍后上图,敬请关注 10.17更新 [ 本帖最后由 chenzhufly 于 2010-10-17 14:20 编辑 ]… 查看全部问答> |
|
这是为LED灯T8管供电的隔离驱动电源,那个最长的驱动电源,装在灯管后,售价是在200元以上的,只是这些驱动电源在装进灯管时,都是用热缩套管套着得,这在欧美是不允许的,但是国内可以! [ 本帖最后由 dongguanze 于 2011-7-31 09:23 编辑 ]… 查看全部问答> |




