单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:1408|回复:0
打印上一主题下一主题

STC8G1K08-TSSOP20单片机 数码管显示ADC电压

[复制链接]
跳转到指定楼层
楼主
ID:796012发表于 2023-5-24 15:01|只看该作者回帖奖励
  1. /*10位就是10位二进制数的意思,即0000000000-1111111111等于10进制的0-1023*/
  2. /*ADC转换结果右对齐: ADC_RES (高2位寄存器),ADC_RESL (低8位寄存器)*/
  3. //ADC被转换通道的输入电压Vin=MCU工作电压或参考源电压*10位ADC转换结果/1024
  4. //分压前最高输入电压=MCU工作电压或参考源电压/[对地电阻阻值/(对地电阻阻值+串接电阻阻值)]
  5. //分压倍率=分压前最高输入电压/MCU工作电压   分压前输入电压(方法一)=ADC管脚输入电压*分压倍率(精确到小数点)
  6. //分压前输入电压(方法二,会有很多位小数)=ADC管脚输入电压/[对地电阻阻值/(对地电阻阻值+串接电阻阻值)]
  7. #include "STC8G.h"
  8. #include "intrins.h"
  9. unsigned char q,b,s,g;/*位选*/
  10. unsigned char code dm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*共阴段码*/
  11. void delayms(unsigned int i){while(i--);}/*延时函数*/
  12. void display()/*数码管扫描*/
  13. {
  14.        unsigned char i;
  15.        for(i=0;i<4;i++)
  16.        {
  17.            switch(i)/*选择显示位置*/
  18.        {
  19.            case(0):P34=0;P35=1;P36=1;P37=1;break;/*千位*/
  20.            case(1):P34=1;P35=0;P36=1;P37=1;break;/*百位*/
  21.            case(2):P34=1;P35=1;P36=0;P37=1;break;/*十位*/
  22.        case(3):P34=1;P35=1;P36=1;P37=0;break;/*个位*/
  23.        }
  24.    if(i==0){P1=dm[q];}     /*千位*/
  25.        if(i==1){P1=dm[b];}     /*百位*/ //用作ADC十位
  26.        if(i==2){P1=dm[s]+0x80;}/*十位*/ //用作ADC个位固定小数点
  27.        if(i==3){P1=dm[g];}     /*个位*/ //用作ADC小数点后一位
  28.        delayms(50); /*间隔一段时间扫描*/
  29.        P1=0x00;           /*消隐*/
  30.        }
  31. }
  32. void main()
  33. {
  34.        unsigned int dy;unsigned char i;
  35.    P1M0=0xff; P1M1=0;
  36.        P3M0=0;   P3M1=0x01;                 /*设置P3.0为ADC口*/
  37.        P5M0=0;   P5M1=0;
  38.    P_SW2 |= 0x80;
  39.    ADCTIM = 0x3f;                     /*设置ADC内部时序*/
  40.    P_SW2& = 0x7f;ADCCFG = 0x0f;           /*设置ADC时钟为系统时钟/2/16*/
  41.    ADC_CONTR = 0x88;                   /*使能ADC模块 设置P30ADC8*/
  42.        q=b=s=g=0;
  43.    while (1)
  44.    {
  45.                  dy=0;
  46.                  for(i=0;i<8;i++)                   //读取8次数据
  47.                  {      
  48.        ADC_CONTR |= 0x40;               /*启动AD转换*/
  49.        _nop_();
  50.        _nop_();
  51.        while (!(ADC_CONTR& 0x20));         //查询ADC完成标志
  52.        ADC_CONTR& = ~0x20;               //清完成标志          
  53.                    ADCCFG = 0x20;                   //设置结果右对齐                
  54.                    dy+=ADC_RES<<8|ADC_RESL;
  55.                  }
  56.                    dy>>=3;                       //取平均值
  57.                        //g=dy%10;s=dy/10%10;b=dy/100%10;q=dy/1000%10;/*ADC转换结果0-1023*/
  58.                    dy=5000*(long)dy/1024;/*强制转换数据类型(32位)运算,得到管脚电压毫伏(mV)*/
  59.                    dy=dy*7.06;/*分压倍率*/          
  60.                    //dy=dy/(3.3/(3.3+20));/*方法二*/          
  61.                    g=dy/100%10;
  62.                s=dy/1000%10;
  63.                b=dy/10000%10;
  64.                q=0;
  65.                    display();/*数码管扫描*/
  66.    }
  67. }
复制代码

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

Powered by 单片机教程网