找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18467|回复: 13
打印 上一主题 下一主题
收起左侧

ADC0809模数转换与显示-详细解释版

  [复制链接]
跳转到指定楼层
楼主
ADC0809模数转换与显示

ADC0809模数转换并显示过程对于初学者来讲比较难理解的部分,所以把转换程序详细的

解释对于初学者有很大的帮助。

程序解释部分如下:

-------------------------------------

/*名称:ADC0809数模转换与显示
  说明:ADC0809采样通道3输入的
  模拟量,转换后的结果显示在数码管上。*/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

/*各数字的数码管段码,共阴*/
uchar code LEDData[]= {
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};

sbit OE  = P1^0;  //输出使能,OE=0高阻,OE=1 ADC转换结果输出到单片机
sbit EOC = P1^1;  //转换结束信号,EOC=0 表示ADC正在转换 EOC=1 ADC转换结束
sbit ST  = P1^2;  //启动信号,上升沿复位清零ADC,下降沿启动转换,低电平保持转换
sbit CLK = P1^3;  //时钟信号,一般500KHz始终信号

/*延时*/
void DelayMS(uint ms) {
        uchar i;
        while(ms--) {
             for(i=0;i<120;i++);
        }
}

/*ADC0809输入电压0-5v对应数字信号00H-FFH,也就是0-255.
模拟输入看成X,数字输出看成Y则Y=255*X/5=51*X,前提条件
VREF+=5V,VREF-=0V.如:X=2.5V Y=51*2.5=127
*/
/*显示转换结果*/
void Display_Result(uchar d)  {
        P2 = 0xf7;  /*11110111,第4个数码管显示个位数*/
        P0 = LEDData[d%10];/*Y=51*2.5=127 个位=127%10=7*/
        DelayMS(5);
        P2 = 0xfb;  /*11111011,第3个数码管显示十位数*/
        P0 = LEDData[d%100/10];/*Y=51*2.5=127 十位=127%100/10=2*/
        DelayMS(5);
        P2 = 0xfd;  /*11111101,第2个数码管显示百位数*/
        P0 = LEDData[d/100];/*Y=51*2.5=127 百位=127/100=1*/
        DelayMS(5);
}

/*主程序*/
void main()  {
        TMOD = 0x02;/*M1=1,M0=0,T0定时器,工作模式2
                      如果TMOD = 0x01,M1=0,M0=1,T0定时器,工作模式1*/
/*
       TMOD=0x21; 00100001
       TM0D的高四位配置T1也就是你说的0010 这个是设置定时\计数器1的
       低四位配置T0也就是你说的0001是设置定时器0的.
       所以你说的TMOD = 0x21,00100001,是将定时器1设置与工作方式2.将定时器0设置成工作方式1.
*/
        TH0  = 0x14;/*20us发生溢出中断一次,定时器专用寄存器,TH0高位*/
        TL0  = 0x00;/*定时器专用寄存器,TL0地位,
                    当TL0满了后自动清零同时TH0进一位,当TL0,TH0都满了会发生溢出中断*/

        IE   = 0x82;/*10000010,EA=1,中断总开关允许,ET=1,溢出中断允许*/
        TR0  = 1;    /*启动定时器*/
        P1   = 0x3f;/*选择ADC0809的通道3(0111)*/
        while(1) {
                 ST = 0;ST = 1;ST = 0;/*启动A/D转换,上升沿复位清零ADC,下降沿启动转换,低电平保持转换*/
                while(EOC == 0);     /*等待转换完成,EOC=0 表示ADC正在转换 EOC=1 ADC转换结束*/
                OE = 1;              //输出使能,OE=0高阻,OE=1 ADC转换结果允许输出到单片机
                Display_Result(P3);
                OE = 0;               //输出使能,OE=0高阻
        }
}

/*T0定时器中断给ADC0808提供时钟信号*/
void Timer0_INT() interrupt 1 {
        CLK = !CLK;  /*每20us发生溢出中断一次,给AD0809提供时钟信号*/
}
-------------------------------------






评分

参与人数 2黑币 +53 收起 理由
kajskj753 + 3 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:138707 发表于 2018-6-21 16:35 | 只看该作者
回复

使用道具 举报

板凳
ID:369321 发表于 2018-7-12 17:19 | 只看该作者
学些了
回复

使用道具 举报

地板
ID:370491 发表于 2018-7-12 20:22 来自手机 | 只看该作者
好东西,下去仔细看看
回复

使用道具 举报

5#
ID:370552 发表于 2018-7-12 22:08 | 只看该作者
感谢!
回复

使用道具 举报

6#
ID:579145 发表于 2019-7-6 21:39 | 只看该作者
想问一下楼主,这个做出来量程应改为多少,为什么我电位器调成零数码管还有数显示,而且我把参考电压调成2.5V后,量程变大了。可否解答
回复

使用道具 举报

7#
ID:579183 发表于 2019-7-6 23:50 | 只看该作者
感谢楼主!
回复

使用道具 举报

8#
ID:259315 发表于 2019-7-29 15:28 | 只看该作者
很好很好
回复

使用道具 举报

9#
ID:648516 发表于 2019-11-25 09:39 | 只看该作者
讲的太详细了!非常感谢这位师傅!
回复

使用道具 举报

10#
ID:450784 发表于 2019-11-25 13:28 | 只看该作者
非常详细,认真学习
回复

使用道具 举报

11#
ID:751311 发表于 2020-5-13 23:59 | 只看该作者
感谢感谢 帮了大忙
回复

使用道具 举报

12#
ID:570458 发表于 2020-5-14 10:11 | 只看该作者
为什么ADC0809的数字量输出端口与单片机P3口的通道不是一一对应的?比如OUT1怎么对应P3.7了
回复

使用道具 举报

13#
ID:731394 发表于 2020-5-16 23:03 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

14#
ID:837412 发表于 2020-11-7 17:13 来自手机 | 只看该作者
怎么还加一个数码管显示通道号
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表