找回密码
 立即注册

QQ登录

只需一步,快速开始

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

使用单片机的A/D转换口,采集外部输入电压在四位数码管上显示出来,单位为V

[复制链接]
跳转到指定楼层
楼主
ID:442670 发表于 2018-12-21 12:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验五 A/D转换实验
一、实验目的
1. 了解单片机的A/D的工作原理。
2. 掌握单片机的A/D的应用。
二、实验内容

//1. 编写程序,使用单片机的A/D转换口,采集外部输入电压,并把采集到的电压在四位数码管上显示出来,单位为V,并保留两位小数。
typedef unsigned char uchar;
typedef unsigned char u8;
typedef unsigned int  u16;
typedef unsigned int  uint;


#include <stc15.h>
#include <intrins.h>


void AdInit();
void Timer1Init(void);        //2毫秒@11.0592MHz
void tuiwan();
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
u8 code BLOCK[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

uint advcc[8]={0};
uint advin[8]={0};
u16 vin,vcc,vee;
uchar n=0;
uchar ch=3;
u8 wei=1;


void main()
{
    tuiwan();
    Timer1Init();        //2毫秒@11.0592MHz
    AdInit();
    EA=1;
    while(1)
    {

        
    }
}

void AdInit()
{
  P1M0=0x00;  
  P1M1=0xFF;
  P1ASF=0x28;  
  ADC_CONTR=0x80;
  EADC=1;
  ADC_CONTR=0x88|ch;   
}

void Adsevr() interrupt 5
{

  ADC_CONTR=0x80;
    if(ch==3)
    {
        advcc[n]=(ADC_RES<<2)+(ADC_RESL&0x03);
        ch=5;
        ADC_CONTR=0x88|ch;
    }
    else if(ch==5)
    {
        advin[n]=(ADC_RES<<2)+(ADC_RESL&0x03);
        n++;
        if(n>=8)
        {
            n=0;
        }
        ch=3;
        ADC_CONTR=0x88|ch;
    }
   
}
void tuiwan()
{
    P2M0 |=  0xF0;
    P2M1 &= ~0xF0;

    P0M0 = 0xFF;
    P0M1 = 0x00;

}

void Timer1Init(void)        //2毫秒@11.0592MHz
{
    AUXR |= 0x40;        //定时器时钟1T模式
    TMOD &= 0x0F;        //设置定时器模式
    TL1 = 0x9A;        //设置定时初值
    TH1 = 0xA9;        //设置定时初值
    TF1 = 0;        //清除TF1标志
    ET1 = 1;                        //使能定时器0中断
    TR1 = 1;        //定时器1开始计时
   
}

void tm1_isr() interrupt 3
{
  
        u8 i;
        vin=0;
        vcc=0;
   

        for(i=0;i<8;i++)
        {
            vin=vin+advin[i];
            vcc=vcc+advcc[i];
        }
        vcc=vcc>>3;
        vin=vin>>3;
             vin=vcc/1024.0*vin;

            
        
        switch ( wei )
    {
       case 1:
       P27=1;
       P0=BLOCK[vin/1000%10]|0x80;
       P24=0;
       wei=2;
       break;

       case 2:
       P24=1;
       P0=BLOCK[vin/100%10] ;
       P25=0;
       wei=3;
       break;

       case 3:
       P25=1;
       P0=BLOCK[vin/10%10];
       P26=0;
       wei=4;
       break;

       case 4:
       P26=1;
       P0=BLOCK[vin%10];
       P27=0;
       wei=1;
       break;        
    }
}

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

使用道具 举报

沙发
ID:449881 发表于 2020-2-26 10:44 | 只看该作者
显示的电压值范围是多少啊?精确几个小数点
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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