简易数字电压表+ADC0809+程序查询(延时等待)方式

发布者:DelightWish123最新更新时间:2024-07-26 来源: cnblogs关键字:简易数字电压表  ADC0809 手机看文章 扫描二维码
随时随地手机看文章

1 实验现象

2 实验原理

3 系统设计

4 硬件设计

5 软件设计


5.1 主程序


#include

#include 'DisplaySmg.h'

#include 'ADC0809.h'

#include 'Timer0.h'

#include 'Timer1.h'


unsigned char  adc_result = 0;

int adc_result_show = 0;


void disp_num(void)            //显示四位十进制数

{

    LedBuf[0]= 23;                    //千位,不显示

    LedBuf[1]= adc_result_show/100;    //百位

    LedBuf[2]= adc_result_show/10%10;//十位    

    LedBuf[3]= adc_result_show%10;    //个位

}


void main()

{

    Timer0_Init();        //定时/计数器T0初始化

    Timer1_Init();        //定时/计数器T1初始化

    EA=1;                //中断总开关

    DotDig1=1;            //点亮第二个数码管的小数点

    while(1)

    {

        adc_result = ADC_Conv();

        adc_result_show = adc_result*1.0*100*5/255;    //数据变换处理(线性标度变换)

        disp_num();        //显示数据

    }

}


void Timer0_ISR(void) interrupt 1 

{

    TR0=0;                //关闭定时器

    DisplaySmg();        //每过1ms,刷新一次数码管显示函数

    TL0 = 0x66;            //设置定时初始值,定时1ms

    TH0 = 0xFC;            //设置定时初始值,定时1ms

    TR0=1;                //打开定时器

}


5.2 数码管显示模块


#ifndef __DisplaySmg_H__

#define __DisplaySmg_H__


#include


#define GPIO_SEG P0        //段选端

#define GPIO_SEL P2        //位选端


extern unsigned char LedBuf[];    //外部变量声明

extern unsigned char DotDig0,DotDig1,DotDig2,DotDig3;


void DisplaySmg(void);


#endif


#include 'DisplaySmg.h'


unsigned char code LedData[]={    //共阴型数码管的段码表,字符,序号

                0x3F,  //'0',0

                0x06,  //'1',1

                0x5B,  //'2',2

                0x4F,  //'3',3

                0x66,  //'4',4

                0x6D,  //'5',5

                0x7D,  //'6',6

                0x07,  //'7',7

                0x7F,  //'8',8

                0x6F,  //'9',9

                0x77,  //'A',10

                0x7C,  //'B',11

                0x39,  //'C',12

                0x5E,  //'D',13

                0x79,  //'E',14

                0x71,  //'F',15

                0x76,  //'H',16

                0x38,  //'L',17

                0x37,  //'n',18

                0x3E,  //'u',19

                0x73,  //'P',20

                0x5C,  //'o',21

                0x40,  //'-',22

                0x00,  //熄灭 23

                         };

unsigned char DotDig0=0,DotDig1=0,DotDig2=0,DotDig3=0;    //小数点控制位

unsigned char code LedAddr[]={0xfe,0xfd,0xfb,0xf7};        //数码管位选

unsigned char LedBuf[]={22,22,22,22};    //显示缓存区


void DisplaySmg()                    //四位数码管,考虑小数点

{

    unsigned char     i;                 //等价于 'static unsigned char i = 0;'

    unsigned char     temp;

    switch(i)

    {

        case 0:

        {

            GPIO_SEG = 0x00;                //消影

            if(DotDig0==1)                    //小数点

            {

                temp = LedData[LedBuf[0]] | 0x80;  //点亮小数点

            }

            else

            {

                temp = LedData[LedBuf[0]];            

            }

            GPIO_SEG = temp;                //段码

            GPIO_SEL = LedAddr[0];            //位选

            i++;

            break;

        }

            

        case 1:

            GPIO_SEG = 0x00;    

            if(DotDig1==1)                    //小数点

            {

                temp = LedData[LedBuf[1]] | 0x80;

            }

            else

            {

                temp = LedData[LedBuf[1]];

            }

            GPIO_SEG = temp;

            GPIO_SEL = LedAddr[1];

            i++;

            break;

        case 2:

            GPIO_SEG = 0x00;

            if(DotDig2==1)                    //小数点

            {

                temp = LedData[LedBuf[2]] | 0x80;

            }

            else

            {

                temp = LedData[LedBuf[2]];

            }

            GPIO_SEG = temp;

            GPIO_SEL = LedAddr[2];

            i++;

            break;

        case 3:

            GPIO_SEG = 0x00;

            if(DotDig3==1)                    //小数点

            {

                temp = LedData[LedBuf[3]] | 0x80;

            }

            else

            {

                temp = LedData[LedBuf[3]];

            }

            GPIO_SEG = temp;

            GPIO_SEL = LedAddr[3];

            i=0;

            break;

        default:break;

    }

}


5.3 ADC0809模数转换模块


#ifndef __ADC0809_H__

#define __ADC0809_H__


#include

//#include 'DelayXms.h'


#define ADC_DATA P3


sbit ADDR_A = P1^0;

sbit ADDR_B = P1^1;

sbit ADDR_C = P1^2;

sbit CLK    = P1^3;

sbit START    = P1^4;

sbit EOC    = P1^5;

sbit OE        = P1^6;


unsigned char ADC_Conv(void);


#endif


#include 'ADC0809.h'


/*ADC0809的工作过程:

    首先输入3位地址,并使ALE=1,将地址输入地址锁存器中。此地址经

译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。

下降沿启动ADC转换,之后EOC输出信号变低,指示转换正在进行。直到ADC

转换完成,EOC变为高电平,指示ADC转换结束,结果数据已存入锁存器,

这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的

数字量输出到数据总线上。*/


unsigned char ADC_Conv()

{

    unsigned char adc_result;

    

    OE = 0;     //数据输出允许信号,高电平有效

    START = 0;     //ADC转换启动信号,高电平有效, 电路中与ALE(地址锁存允许信号)连在一起

    

    ADDR_A = 1;    //3位地址输入线

    ADDR_B = 1;    //用于选通8路模拟输入中的一路

    ADDR_C = 0;

    

    START = 1;    //上升沿,同时将ADC内部的寄存器清零

    START = 0;    //产生一定的脉冲,Typ=100ns,下降沿启动AD转换

    

    while(EOC==0); //查询方式,ADC转换结束信号,EOC=1,转换结束

//    DelayXms(1);    //延时等待方式

    OE = 1;        //数据更新到输出端口

    adc_result = ADC_DATA;    //单片机读取数据

    OE = 0;        //本次过程结束

    return adc_result;

}


//定时器T1产生500KHz时钟信号,即2us, 定时器每1us中断一次

void Timer1_ISR(void) interrupt 3 

{

    CLK =!CLK;

}


5.4 定时器T0


#ifndef __Timer0_H__

#define __Timer0_H__


#include


void Timer0_Init(void);


#endif


#include 'Timer0.h'


void Timer0_Init(void)        //1毫秒@11.0592MHz

{

    TMOD &= 0xF0;        //设置定时器模式

    TMOD |= 0x01;        //设置定时器模式

[1] [2]
关键字:简易数字电压表  ADC0809 引用地址:简易数字电压表+ADC0809+程序查询(延时等待)方式

上一篇:简易数字电压表+ADC0809+中断方式实现一路数据转换
下一篇:数码管动态显示(定时器中断方式)+小数点+高位为0不显示

推荐阅读最新更新时间:2026-03-24 10:35

简易数字电压表+ADC0832+串行SPI方式实现1路数据转换
1 实物与模型 (1)为什么DO和DI引脚连在一个引脚上? 由于ADC0832在通信时并不是会同时使用DO和DI端口,并且DO和DI端口与单片机的接口是双向的,所以在设计电路中可以用一根线将DO端和DI端连接到一起。 (2)ADC0832的外部连接采用SPI总线结构,这样便把它的连接方式与其他设备统一起来了。ADC0832采用同步串行传输,同步是通过时钟线进行数据同步;串行传输通过DO 数据口一位一位传输数据。 2 实验原理 3 系统设计 传统的51单片机没有配置SPI,但是可以利用其并行接口线模拟SPI串行总线时序,以实现与SPI的器件连接。 4 软件设计 1 ADC0832模数转换函数(结合ADC时
[单片机]
<font color='red'>简易</font><font color='red'>数字电压表</font>+ADC0832+串行SPI方式实现1路数据转换
基于单片机的简易数字电压表设计
以单片机为核心器件,组成一个简单的直流数字电压表。 (1)采用1路模拟量输入,能够测量0-5V之间的直流电压值。 (2)电压显示可采用4位LED数码管显示,至少能够显示两位小数。 简易数字电压表的制作,主要涉及数据(电压)测量、A/D转换及控制显示方面的知识。 (1)A/D转换采用ADC0808、0809实现。 (2)电压显示采用4位的LED数码管。 (3)单片机选用AT89C51 系统初步方案设计 A/D转换器是实现模拟量向数字量转换的器件,按转换原理可分为四种:计数式A/D转换器、双积分式A/D转换器、逐次逼近式A/D转换器和并行式A/D转换器。 目前最常用的A/D转换器是双积分式A/D转换器和逐次逼近式A
[单片机]
基于单片机的<font color='red'>简易</font><font color='red'>数字电压表</font>设计
一种简易数字电压表的设计与制作
  1.引言   在电量的测量中,电压、电流和频率是最基本的三个被测量,而电压的测量最为常见,现在学生使用的数字万用表能够测量多种电量,并且具有一定的精度,使用方便。为了让学生更好地了解数字电压表的工作原理,从而激发他们对单片机课程的学习兴趣。本文从软硬件设计、proteus仿真、制作实物、误差分析几个方面着手,阐述数字电压表的工作原理、数据的程序处理方法、数字信号软件滤波原理。   2.硬件设计   硬件电路设计由4个部分组成:a/d转换电路,at89c 51单片机 系统, led显示 系统、测量电压输入电路。硬件电路设计框图如图1所示。其总设计框图如下:      此电路的工作原理是:+5v模拟电压信号通过
[单片机]
一种<font color='red'>简易</font><font color='red'>数字电压表</font>的设计与制作
STC12C5A60S2汇编(ADC查询方式)示例程序
STC12C5A60S2汇编(ADC查询方式)示例程序 ;/*Declare SFR associated with the ADC */ ADC_CONTR EQU 0BCH ;ADC control register ADC_RES EQU 0BDH ;ADC high 8-bit result register ADC_LOW2 EQU 0BEH ;ADC low 2-bit result register P1ASF EQU 09DH ;P1 secondary function control register ;/*Define ADC operation co
[单片机]
AVR串口查询模式程序实例
* Code adapted from Atmel AVR ApplICation Note AVR306 * PolLED mode driver for UART, this is the similar to the * library default putchar() and getchar() in ICCAVR */ #include io8515.h #include macros.h #include uart.h /* initialize UART */ void InitUART( unsigned char baudrate ) { UBRR = baudrate; /* set the baud r
[单片机]
AVR单片机键盘子程序(中断方式和查询方式 )
AVR 单片机 键盘子程序 键盘扫描有中断方式和查询方式 #include jn8515def.h /******以下是键盘排列图****** | | | PC0 ___1|__2|__3|__ | | | PC1 ___4|__5|__6|__ | | | PC2 ___7|__8|__9|__ | | | PC3 ___C|__0|__S|__ | | | | | | PC4 PC5 PC6 *************
[单片机]
ATMega8 查询方式 A/D转换测试程序
/******************************** ATMega8 查询方式 A/D转换测试程序 文件名:main.c 编译:WinAVR-20070122 硬件环境:CA-M8X 打开的开关如下 S6(1,2) - 外部4MHz晶振 S1(7) - PC0连接电位器 S5(5,6) - UART通信 *******************************/ #include avr/io.h #include util/delay.h #include stdio.h #include stdint.h static uint16_t g_aAd
[单片机]
AVR查询方式 A/D 转换测试程序
/*============================================================ File Name :main.c 说明 : 1.查询方式 A/D 转换测试程序 =============================================================*/ #include avr/io.h #include util/delay.h #define uchar unsigned char #define uint unsigned int uint AdcConvert(void) { unsigned char i; unsigned int ret
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved