标题:
STC8G1K08-TSSOP20单片机 数码管显示ADC电压
[打印本页]
作者:
玉萌业余发展
时间:
2023-5-24 15:01
标题:
STC8G1K08-TSSOP20单片机 数码管显示ADC电压
/*10位就是10位二进制数的意思,即0000000000-1111111111等于10进制的0-1023*/
/*ADC转换结果右对齐: ADC_RES (高2位寄存器),ADC_RESL (低8位寄存器)*/
//ADC被转换通道的输入电压Vin=MCU工作电压或参考源电压*10位ADC转换结果/1024
//分压前最高输入电压=MCU工作电压或参考源电压/[对地电阻阻值/(对地电阻阻值+串接电阻阻值)]
//分压倍率=分压前最高输入电压/MCU工作电压 分压前输入电压(方法一)=ADC管脚输入电压*分压倍率(精确到小数点)
//分压前输入电压(方法二,会有很多位小数)=ADC管脚输入电压/[对地电阻阻值/(对地电阻阻值+串接电阻阻值)]
#include "STC8G.h"
#include "intrins.h"
unsigned char q,b,s,g;/*位选*/
unsigned char code dm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*共阴段码*/
void delayms(unsigned int i){while(i--);}/*延时函数*/
void display()/*数码管扫描*/
{
unsigned char i;
for(i=0;i<4;i++)
{
switch(i)/*选择显示位置*/
{
case(0):P34=0;P35=1;P36=1;P37=1;break;/*千位*/
case(1):P34=1;P35=0;P36=1;P37=1;break;/*百位*/
case(2):P34=1;P35=1;P36=0;P37=1;break;/*十位*/
case(3):P34=1;P35=1;P36=1;P37=0;break;/*个位*/
}
if(i==0){P1=dm[q];} /*千位*/
if(i==1){P1=dm[b];} /*百位*/ //用作ADC十位
if(i==2){P1=dm[s]+0x80;}/*十位*/ //用作ADC个位固定小数点
if(i==3){P1=dm[g];} /*个位*/ //用作ADC小数点后一位
delayms(50); /*间隔一段时间扫描*/
P1=0x00; /*消隐*/
}
}
void main()
{
unsigned int dy;unsigned char i;
P1M0=0xff; P1M1=0;
P3M0=0; P3M1=0x01; /*设置P3.0为ADC口*/
P5M0=0; P5M1=0;
P_SW2 |= 0x80;
ADCTIM = 0x3f; /*设置ADC内部时序*/
P_SW2 &= 0x7f;ADCCFG = 0x0f; /*设置ADC时钟为系统时钟/2/16*/
ADC_CONTR = 0x88; /*使能ADC模块 设置P30ADC8*/
q=b=s=g=0;
while (1)
{
dy=0;
for(i=0;i<8;i++) //读取8次数据
{
ADC_CONTR |= 0x40; /*启动AD转换*/
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR &= ~0x20; //清完成标志
ADCCFG = 0x20; //设置结果右对齐
dy+=ADC_RES<<8|ADC_RESL;
}
dy>>=3; //取平均值
//g=dy%10;s=dy/10%10;b=dy/100%10;q=dy/1000%10;/*ADC转换结果0-1023*/
dy=5000*(long)dy/1024;/*强制转换数据类型(32位)运算,得到管脚电压毫伏(mV)*/
dy=dy*7.06;/*分压倍率*/
//dy=dy/(3.3/(3.3+20));/*方法二*/
g=dy/100%10;
s=dy/1000%10;
b=dy/10000%10;
q=0;
display();/*数码管扫描*/
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1