历史上的今天
返回首页

历史上的今天

今天是:2025年04月21日(星期一)

正在发生

2020年04月21日 | 51单片机:用ADC0832做模数转换,测量电压大小

2020-04-21 来源:eefocus

问题要求

利用51单片机,外加一个ADC0832模数转换器,设计一个可以实时测量电压的电路。测量电压的范围是0-5V(允许误差),要求测出的电压用数码管实时显示,精确到小数点后两位。


代码编写:

//----------------------------------------------------------

//       用ADC0832测量电压,并将测量值显示在数码管上

//----------------------------------------------------------

#include

#include

#define uchar unsigned char

#define uint  unsigned int 

uchar Get_AD_Result();   //模数转换结果

void ET0_init();         //定时器0中断

void RT1_init();          //定时器1中断



//ADC0832引脚定义

sbit CS   = P1^0;

sbit CLK  = P1^1;

sbit DIDO = P1^2;


//数码管位选

sbit qian = P2^4;   

sbit bai  = P2^5;

sbit shi  = P2^6;

sbit ge   = P2^7;


//数码管位选

unsigned char date[4];

//共阴极七段数码

unsigned char code tb[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

          0x7f,0x6f,0x77,0x7c,0x39,0x5e,

  0x79,0x71,0x00,0X80};




//------------------------------

//            主函数

//-------------------------------

void main()

{  

   ET0_init();    //定时器0初始化

   RT1_init();    //定时器1初始化

   ET0  = 1;

   TR0  = 1;

   ET1  = 1;

   TR1  = 1;

   EA   = 1;     //打开总中断

   CLK = 0;      //ADC0832初始化

   CS   = 1;   

   while(1);


}


//---------------------------------

//            定时器0中断

//---------------------------------

void ET0_INT() interrupt 1   

{

    static uchar i;

    

TH0  = (65536-2000)/256; // 重装初值

    TL0  = (65536-2000)%256;


P2 |= 0xf0;  //消影

switch(i) //位选,选择点亮的数码管,

{

    case(0):

  P0 = date[0];qian = 0;break;//显示千位

    case(1):

  P0 = date[1];bai  = 0;break;//显示百位

    case(2):

  P0 = date[2];shi  = 0;break;//显示十位

case(3):

  P0 = date[3];ge   = 0;break;//显示个位

  }


i++;

    if(i==4)

   {

  i=0;

   }


}


//---------------------------------------------

//        定时器T1中断服务程序

//---------------------------------------------

void ET1_INT() interrupt 3   

{

 // float L = 500.0/256.0;

  uint vt;

  uchar AD;


  TH1  = (65536-2000)/256; // 重装初值

  TL1  = (65536-2000)%256;

  

  AD = Get_AD_Result();

  vt = (500.0/256.0)*AD; //测量电压值

 

  date[0] =tb[vt/1000];

  date[1] =tb[vt/100%10]|0x80; //点亮小数点

  date[2] =tb[vt/10%10];

  date[3] =tb[vt%10];

}


//------------------------------

//     获取AD转换结果(0通道)

//------------------------------

uchar Get_AD_Result()         //包含11个CLK下降沿      

{

    uchar i, dat;

    CS = 1;              //ADC0832未工作时,CS端为高电平,此时芯片禁用

    _nop_;               //对于延时很短的,要求在us级的,采用“_nop_”函数      

    CLK =1;                  

    CS = 0;

    DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第一个下降沿来到时,DI = 1启动ADC0832

    DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第二个下降沿 

    DIDO = 0; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第三个下降沿,发送1,0选择通道cho

    DIDO = 1;                                //释放总线

    for(i = 0; i < 8; i++)                  //第4个下降沿到第11个下降沿

    {

        CLK = 0;                           //clk处于下降沿,每一个下降沿DO端输入下一个

        _nop_;                              //对于延时很短的,要求在us级的,采用_nop_函数      

        if(DIDO) dat |= 0x01;              // dat = dat | 0x01,dat和0x01做“或”的运算,意思是最低位置1,其它位保持不变。

        CLK = 1; _nop_;                      //clk处于上升沿

        dat <<= 1;                          //数据左移

    }

    return (dat);

    CS = 1;                                  //ADC0832停止工作

}


//------------------------------

//定时器0初始化

//------------------------------

void ET0_init()             

{

TMOD &= 0xf0; //定时器0

    TMOD |= 0x01;

    TH0  = (65536-2000)/256; //2ms溢出

    TL0  = (65536-2000)%256; 

}


//---------------------------------

//         定时器1初始化

//-----------------------------------

void RT1_init()   

{

   TMOD &= 0x0f;  

   TMOD |= 0x10;

   TH1  = (65536-2000)/256; //2ms溢出

   TL1  = (65536-2000)%256; 

}


电路设计图:

在这里插入图片描述

仿真结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

推荐阅读

史海拾趣

Franz Binder GmbH & Co公司的发展小趣事

Franz Binder GmbH & Co公司的发展故事

故事一:初创与奠基

Franz Binder GmbH & Co公司,简称宾德集团,成立于1960年,由Franz Binder在德国创立。起初,公司仅是一个机械加工车间,专注于加工车削件。然而,随着技术的不断积累和市场需求的增长,宾德开始专注于圆形连接器的生产。1967年,公司成功生产出第一只连接器,这标志着宾德正式进入连接器制造领域。此后,宾德不断投入研发,提升产品质量,逐渐在行业内崭露头角。

故事二:全球化布局

随着业务的不断扩展,宾德集团开始寻求全球化发展。1979年,宾德在瑞士成立了分公司Binder Electronic Components,标志着公司正式走向世界。此后,宾德在全球范围内迅速扩张,相继在美国、中国、法国、瑞典、英国、新加坡、荷兰和韩国等国家成立了子公司,并与全球45个经销商建立了合作关系。这一全球化布局不仅提升了宾德的品牌影响力,还为公司带来了更多的市场机会。

故事三:技术创新与产品多样化

宾德集团始终将技术创新视为企业发展的核心动力。公司不断投入研发资源,推出了一系列具有创新性的连接器产品。从微型连接器到电源连接器,再到医疗设备连接器和自动化技术连接器,宾德的产品线日益丰富,满足了不同行业的需求。特别是在工业自动化领域,宾德连接器以其高可靠性、高传输率和易于安装的特点,赢得了众多客户的青睐。

故事四:品质与认证

品质是宾德集团赖以生存和发展的基石。公司始终坚持高标准、严要求,确保每一件产品都符合国际质量标准。为此,宾德不仅通过了ISO 9001和ISO 14001等国际质量管理体系认证,还获得了UL、VDE和ESTI+等多项国际认证。这些认证不仅证明了宾德产品的卓越品质,也为客户提供了更多的信心和保障。

故事五:中国市场的发展

中国作为全球最大的电子市场之一,对宾德集团的发展具有重要意义。2001年,宾德在中国成立了全资子公司——南京宾德电气有限公司(宾德中国),负责中国地区的销售和客户服务。自成立以来,宾德中国凭借优质的产品和服务,迅速赢得了中国市场的认可。特别是在智能制造、自动化技术和医疗等领域,宾德连接器的应用越来越广泛,为中国电子行业的发展做出了积极贡献。

FRONTIER公司的发展小趣事

背景:虽然此处的FRONTIER可能指的是边疆通信公司(Frontier Communications),但为符合电子行业背景,我们假设其在农村宽带服务方面的创新。

发展故事:在21世纪初期,FRONTIER Communications认识到农村地区对于宽带服务的迫切需求,于是开始大规模投资农村宽带基础设施建设。通过引入先进的通信技术和设备,FRONTIER Communications成功地将高速互联网带到了偏远地区,极大地改善了当地居民的生活和工作条件。这一举措不仅赢得了市场的广泛赞誉,也为公司带来了稳定的收入来源和持续增长的动力。

ERGOBAHCO公司的发展小趣事

为了进一步提升公司的竞争力,ERGOBAHCO公司开始积极拓展国际市场。公司组建了一支专业的国际业务团队,参加了多场国际展会,并与多家国际知名企业建立了合作关系。通过不断努力,ERGOBAHCO公司的产品成功打入了欧美、东南亚等国家和地区的市场,公司的国际化程度得到了显著提升。

Gould Ami公司的发展小趣事
当水位达到预设的上下限时,传感器会发出信号给控制电路。
格莱尔(GLE)公司的发展小趣事

在稳步发展国内市场的同时,格莱尔也积极拓展海外市场。公司凭借优质的产品和服务,成功吸引了众多国际客户的关注与合作。格莱尔的产品广泛应用于液晶显示屏、笔记本计算机、手机、数码相机等多个领域,与众多知名企业建立了长期稳定的合作关系。此外,格莱尔还注重品牌建设,通过参加国际展会、发布新品等方式提升品牌知名度和影响力。

Ark-Les Connectors公司的发展小趣事

在电子行业中,品质是生存和发展的关键。Ark-Les Connectors公司从一开始就深知这一点,因此将品质控制作为公司发展的核心战略。公司建立了严格的质量管理体系,从原材料采购到生产流程控制,再到产品检测与售后服务,每一个环节都严格把关。这种对品质的坚持让Ark-Les的产品在市场上赢得了良好的口碑,也为公司积累了大量的忠实客户。

问答坊 | AI 解惑

郑铁职院无线电协会09年全国大学生电子设计竞赛全纪录——《破茧成蝶》

本帖最后由 paulhyde 于 2014-9-15 09:00 编辑 郑州铁路职业技术学院无线电协会在07年“全国大学生电子设计竞赛”中获得最高奖“索尼杯”、 “全国一等奖”后,在09年度“全国大学生电子设计竞赛”中再创佳绩:荣获全国一等奖一个、全国二等奖一个 ...…

查看全部问答>

短信猫在气象行业应用

短信猫在气象行业应用 气象信息采集系统利用实时采集的气象资料,对未来一定时段内的气象情况作出较为精确的预测和报警,包括进行短期的降雨预报、中期降水预报和洪水的预警预报,是防汛工作中非常重要的环节构建气象信息采集传输系统要求数据通信 ...…

查看全部问答>

新手: 独立按键问题。按下键松手后 接口的电位自动回复高电平???

就是 独立按键 按下键后 接口置零电位,松手后 ,接口回复高电位?? 是自动回复的么?…

查看全部问答>

RasSetEntryProperties()函数问题?

函数原型 DWORD RasSetEntryProperties(   LPWSTR lpszPhoneBook,   LPWSTR szEntry,   LPRASENTRY lpbEntry,   DWORD dwEntrySize,   LPBYTE lpb,   DWORD dwSize ); ...…

查看全部问答>

WinCE5中要禁止打开控制面板,有办法吗?

WinCE5中要禁止打开控制面板,有办法吗?…

查看全部问答>

嵌入式学什么?

我是一名学习软件工程嵌入式软件开发的学生,在大学4年应该掌握那些技术才更好的为将来有好的工作?…

查看全部问答>

各位大哥,我需要给2812外扩AD,请帮忙一下.

由于我要采样11路,所以问两个问题: 一\\\\请帮忙推荐一个比较适合的AD采样芯片 二,AD采样结果用SPI接收好,还是多通道缓冲接收好呢…

查看全部问答>

wince6 gpio读数据的驱动问题

小弟做毕设遇到个棘手问题,望各位好心人帮助小弟用的arm开发板是友坚恒天的S3C6410,将GPIO的GPK的15-8位和GPL的7-0位从高到低组合成16位数据,但在编写驱动时报错,可能是XXX_read函数有问题,代码如下:驱动部分代码:DWORD GIO_Init(LPCTSTR PC ...…

查看全部问答>

51做的俄罗斯方块游戏,有图有真相!

51做的俄罗斯方块游戏,有图有真相!…

查看全部问答>

二级引导文件没有被生成在out文件中

昨天更换了最新的ccs3.3。奇怪的是这个编译器没有把我用来做二级引导的boot.c文件生成在out文件中。 因为看.map文件时,内存的0至0x400没有使用。请问这是什么情况。 不能自启动很是着急,请问各位高手这应该怎么处理? 是不是编译器优化的问题 ...…

查看全部问答>