您的位置 首页 解答

运用STC12C5204AD单片机的数字电压表

这是一块使用STC12C5204AD数字电压表的制作程序,P00-P03共阴数码管位驱动端,P2口为共阴数码管段a-g及dp的段驱动端口,P0、P2

这是一块运用STC12C5204AD数字电压表的制造程序,P0.0-P0.3 共阴数码管位驱动端,P2口为共阴数码管段a-g及dp的段驱动端口,P0、P2口设置为推挽输出方法,段输出加470欧限流电阻,AD为8位,转化电压分度5/256=0.0195312V,分流电阻为实测阻值,AD值*0.0195312v/对地分流电阻,算出分流电流,然后用分流电流*分流电阻与限流电阻之和即为要显现的输入电压值。业余运用,精度现已够用了,比那个小的指针的要精确多了。其间涉及到端口设置的当地我们对照芯片手册更正。
#include //STC12C5204AD头文件 (6 K) 下载次数:15
#include //_nop_();
#define uchar unsigned char
#define uint unsigned int
//sfr ADC_CONTR=0XBC;//adc使能位.ADC电源操控位
sfr ADC_RES=0XBD;//adc数据高八位,即ADC值
sfr P1ASF=0X9D;//P1各端口ADC使能端
uchar led_bcd[]={0x3F,/*0*/ //共阴数码管
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
0x00,/* */
0x7c /*b*/
}
,ad_data
;
uint data dis[5]={0x00,0x00,0x00,0x00,0x00},ZZ; //界说四个显现数据单元和一个数据存储单元
//dis[4,3,2,1,5] 显现:12.34 5为存储单元

/*******************************************************************/
/* 延时子程序 */
/* */
/* */
/*******************************************************************/
void delay(uint z) //延时子函数
{
uchar de1,de2;
for(de1=z;de1>0;de1–)
for(de2=100;de2>0;de2–);
}
/*******************************************************/
//显现子函数 display(h1,h2,h3,h4)
//h1,h2,h3,h4 为四位LED数码管显现变量
//
//
//
/*******************************************************/
void display(uchar h1,uchar h2,uchar s1,uchar s2) ////LED显现函数(参数:LED1,LED2,LED3,LED4)
{

// 第一个数码管显现数据
if(h1==0x3f) h1=0x00; //0消隐句子
P2=h1;
//delay(2);
P00=0;
delay(2); //参数2-10 数值大LED亮度高但闪耀感强,数值小LED亮度低,但闪耀感小.
P2=0X00;
P00=1;
/*******************************************************/
// 第二个数码管显现数据
P2=h2|0x80;
//delay(2);
P01=0;
delay(2); //参数2-10 数值大LED亮度高但闪耀感强,数值小LED亮度低,但闪耀感小.
P2=0X00;
P01=1;
//delay(5);
/*******************************************************/
// 第三个数码管显现数据

P2=s1;
//delay(2);
P02=0;
delay(2); //参数2-10 数值大LED亮度高但闪耀感强,数值小LED亮度低,但闪耀感小.
P2=0X00;
P02=1;
// delay(5);
/*******************************************************/
// 第四个数码管显现数据
P2=s2;
//delay(2);
P03=0;
delay(2); //参数2-10 数值大LED亮度高但闪耀感强,数值小LED亮度低,但闪耀感小.
P2=0X00;
P03=1;

//delay(5);

}
void init()//体系初始化函数
{
P2M1=0Xff; //强推挽 推进a-g dp
P2M0=0X00; //强推挽 推进a-g dp
P0M1=0X0f; //强推挽 推进位
P0M0=0X00; //强推挽 推进位
P0=0XFF; //初始化
P2=0; //初始化
/***定时器0初始化设置*****/
TMOD = 0x01;
TH0 = 0xFC; //初值1ms
TL0 = 0x18; //初值1ms
EA = 1; //开总中止
ET0 = 1; //定时器0中止翻开
TR0 = 1; //翻开定时器 开端计时
/*************************/
ZZ=0;
}
void initADC() //AD初始化
{
P1ASF=0x01;//只运用P1.0端口做为ADC输入端.
ADC_RES=0;//ADC数据寄存器清零
ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //翻开ADC开关并设置 转化速率详见STC12C52.H
delay(2); //翻开ADC并延时.
}
uchar readADC() //读AD
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|0|ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FLAG));//等候转化完结标志
ADC_CONTR&=~ADC_FLAG;//close ADC
return ADC_RES;//回来ADC值.
}
void main()
{
init();
initADC();//初始化ADC
ad_data=readADC();//开机转化
while(1)
{
float j;
uchar ad_data;
while(ZZ>=500) //500毫秒读一次ADC
{
ad_data=readADC();//读入ADC数据
ZZ=0;
}
j=ad_data*19.5312;//由AD数据*19.5312(扩大1000倍)=分流后的电压
j=j/9890; //j(电压)/接地电阻(实测)9890欧
j=j*60190;//j(电流)*(输入限流电阻(实测)60190欧+接地电阻(实测)9890欧) 计算出实践输入电压假如运用高精度电阻,则直接输入电阻值
dis[4]=j/1000;
dis[3]=dis[4]/10;
dis[2]=dis[4]%10;
//h=(h-(dis[3]*10+dis[2]))*100;
dis[4]=j/10-dis[4]*100;
//dis[4]=j%100;//小数位第一位
dis[1]=dis[4]/10;
dis[0]=dis[4]%10;//小数位第二位
//delay(10000);
}
}
void Timer0Interrupt(void) interrupt 1
{
ZZ++; //AD读取间隔时间操控
TH0 = 0xFC;
TL0 = 0x18;
display(led_bcd[dis[3]],led_bcd[dis[2]],led_bcd[dis[1]],led_bcd[dis[0]]);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/318640.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部