OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 用STC12C2052AD单片机制作的电压表

共6条 1/1 1 跳转至

用STC12C2052AD单片机制作的电压表

工程师
2020-05-18 21:44:26    评分

用STC12C2052AD单片机制作的电压表


这是一个用STC12C2052AD单片机制作的电压表,A/D转换单元用的是单片机的自己带的,比较适合初学者自己动手仿制。单片机采用的是STC12C2052AD,4位共阳极数码管,TL431作为电压基准。电路板采用的感光蓝油制作,使用环保刻蚀剂刻蚀。整个电压表制作容易,非常容易成功!






源码附上:

/**********************************************************************


基于STC12C4052AD单片机的0-99V数字电压表程序


P1.6口为0-5V模拟量输入端,P1.5口连接TL431l输出的2.5V基准电源,4位串行LED数码管显示


**********************************************************************/


#include <STC/STC12C2052AD.H> //单片机头文件


#include <intrins.h> //51基本运算(包括_nop_空函数)


#define uchar unsigned char


#define uint unsigned int


#define LEDBus P3


//a3.0-b3.1-c3.2-d3.3-e3.4-f3.5-g3.7-dp1.0


sbit ge=P1^4;            //个位位选


sbit shi=P1^3;            //十位位选


sbit bai=P1^2;            //百位位选


sbit qian=P1^1;            //千位位选


sbit db=P1^0;


char d[5];


uint R,M,N;//若定义成uchar型就只能显示2.5V以下的数值


uchar code LEDTab[]={0xc0,0xf9,0x64,0x70,0x59,0x52,0x42,0xf8,0x40,0x50};//应为没有P3.6,所以这里管脚定义和普通的有点区别


unsigned char port[4]={0xfe,0xfd,0xfb,0xf7};


/*****************************************************************


函数名:毫秒级CPU延时函数


调  用:delay (?);


参  数:1~65535(参数不可为0)


返回值:无


结  果:占用CPU方式延时与参数数值相同的毫秒时间


备  注:应用于1T单片机时i<600,应用于12T单片机时i<125


/******************************************************************/


void delay(uint t)


{


uint i;               //定义变量


for(;t>0;t--)             //如果t大于0,t减1(外层循环)


  for(i=600;i>0;i--);         //i等于124,如果i大于0,i减1


}


/*******************************************************************


函数名:ADC初始化及8位A/D转换函数


返回值:8位的ADC数据


结  果:读出指定ADC接口的A/D转换值,并返回数值


备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)


*******************************************************************/


uchar Read (uchar CHA){


uchar AD_FIN=0; //存储A/D转换标志;若在函数外定义此变量则不能得到连续变化的模拟量的显示


/******以下为ADC初始化程序****************************/


    CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)


    ADC_CONTR = 0x60;  //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)


    _nop_();


    ADC_CONTR |= CHA;       //选择A/D当前通道


    _nop_();


    ADC_CONTR |= 0x80;      //启动A/D电源


    delay(1);            //使输入电压达到稳定(1ms即可?


/******以下为ADC执行程序****************************/


    ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)


    _nop_();


    _nop_();


    _nop_();


    _nop_();


    while (AD_FIN ==0){     //等待A/D转换结束


    AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否


    }


    ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,


return (ADC_DATA);          //返回A/D转换结果(8位)


}


/******************************************************************


显示函数转换函数:


M=模拟量采样值,N=基准电压源采样值(本例为2.5V),R=模拟量输入值(待显示值)


N=256*2.5/Vcc;变形后得Vcc=256*2.5/N; 代入M=256*R/Vcc;得到M=R*N/2.5;变形后得R=M*2.5/N


1为输入端分压比。


******************************************************************/


void transfer(void){


M=Read(6);//P1.6口模拟量转换


N=Read(5);//P1.5口2.5V基准电压源采样(转换)


R=((M*2.5)/N)*9.31*1000;//输入模拟量换算并放大1000倍;


/***以下为3位显示转换***/


d[3]=R/1000;


R=R%1000;


d[2]=R/100;


R=R%100;


d[1]=R/10;


d[0]=R%10;


}


/******************************************************************


函数功能:显示子程序


********************************************************************/


void xian_shi (void)


{


   P1=0xfe;        //P1.3引脚输出低电平


   P3=LEDTab[d[0]];          //显示个位


   delay(1);


   P1=0xfd;       //P1.2引脚输出低电平


   P3=LEDTab[d[1]];         //显示十位


    delay(1);


    db=0;


   P1=0xfb;       //P1.1引脚输出低电平


   P3=LEDTab[d[2]];         //显示百位


   


    delay(1);


   if (LEDTab[3]!=0) 


   P1=0xf7;       //P1.0引脚输出低电平


   P3=LEDTab[d[3]];         //显示千位


   db=0;


    delay(1);


    P1=0xff;     //关闭所有数码管


  


}


/******************************************************************


函数名:主函数


调  用:无


参  数:无


返回值:无


结  果:程序开始处,无限循环


备  注:


******************************************************************/


void main (void)


{


P1M0 = 0x60; //P1.0/P1.1:0000 0011(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。


P1M1 = 0x00; //P1.0/P1.1:0000 0000


while(1){


uchar i;


delay(1);


i++;


if (i==30)


{


transfer();


i=0;


}


xian_shi();


//delay(10);


}


}





关键词: STC12C2052AD     电压表     源码    

工程师
2020-05-18 22:36:18    评分
2楼

铜皮手工走线,  在线江湖!


助工
2020-05-18 22:42:38    评分
3楼

正好我最近也想在开关电源的输出端添加一个单片机显示电压电流的功能,学习了!


工程师
2020-05-18 22:44:30    评分
4楼

动手能力真强啊


工程师
2020-05-18 22:51:06    评分
5楼
准确度如何?稳定性怎样?总觉得实用性欠佳。。。

高工
2021-03-29 11:31:42    评分
6楼

动手能力强,点赞!


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]