关于stc12c5a60s2问题
时间:10-02
整理:3721RD
点击:
问问大家,我这个想通过单片机带的AD转换功能用数码管显示出P1口的输入电压是多少,这是我写的程序麻烦大家看看,自己实在找不出问题,启动后显示的数字和输入电压没关系并且一直在递减。下面是我的程序,谢谢大家了。
#include<STC12C5A60S2.H>
#define uint unsigned int
#define uchar unsigned char
uchar dispbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar dispbuf1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uint temp1,sh1,ge1,n1,m1;
uchar ad_average_result1; //AD转换十次的平均值
uchar ad_average_result2; //AD转换十次的平均值
uchar ad_average_result; //AD转换十次的平均值
uchar Vin;
char tp=0;
//-------模块延时程序---------------------------- 1ms
void delay1ms(uint delay1ms) //STC11F60XE,22.1184M,延时1ms
{
uint i,j;
for(;delay1ms>0;delay1ms--)
for(i=0;i<7;i++)
for(j=0;j<210;j++);
}
void delay(uint delay) //STC11F60XE,22.1184M,延时170us
{
uint i,j;
for(;delay>0;delay--)
for(i=0;i<124;i++);
for(j=0;j<124;j++);
}
/*******************************************************
AD转换程序
*******************************************************/
void ADC_Power_On() //AD转换电
{
ADC_CONTR|=0x80;
delay(5); //必要的延时
}
void get_ad_result() //取AD结果函数,它是十位AD转换,每十次平均,最后取平均十位作为AD采样数据
{
uint i,q,p=0;
for(i=0;i<10;i++)
{
tp=0;
ADC_RES=0; //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同
ADC_RESL=0; //低两位清零
ADC_CONTR|=0x08; //启动AD转换
delay(1);
while(!tp) //判断AD转换是否完成
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe7;
delay(1);
ad_average_result1=ADC_RES; //取高八位数据
ad_average_result2=ADC_RESL; //取低2位数据
q=q+ad_average_result1; //各取十次平均
p=p+ad_average_result2;
}
ad_average_result1=q/10; //得到最后结果
ad_average_result2=p/10;
//ad_average_result=ad_average_result*4*5000/1024;
ad_average_result=ad_average_result1*4+ad_average_result2;
}
/********************电压采样程序********************/
void caiyangP10() //测电压
{
P1M0|=0x01; //设P1_0为开漏模式 如: P1_0= #00000000B
P1M1|=0x01;
P1ASF=0x01; //设置P1.0为输入AD转换口
ADC_CONTR=0xe0;
delay(2);
get_ad_result(); //取转换数据
Vin=ad_average_result;
}
void display()
{
P3=0x00; //每次显示之前消影
P3=dispbuf[sh1]; //十位
P2=0xfe;
delay1ms(1);
P3=0x00;
P3=dispbuf1[ge1]; //个位显示带有小数点
P2=0xfd;
delay1ms(1);
P3=0x00;
P3=dispbuf[n1]; //小数点后1位
P2=0xfb;
delay1ms(1);
P3=0x00;
P3=dispbuf[m1]; //小数点后第二位
P2=0xf7;
delay1ms(1);
P3=0x00;
}
void displayP10()
{
uint ad1;
ad1=Vin*500000/1024; //得到输入的十进制电压值 单位为 mv
// temp1=(ad1-2000)/66;
temp1=ad1;
sh1=temp1/1000; //十位
ge1=(temp1%1000)/100; //个位
n1=((temp1%1000)%100)/10; //小数点后一位
m1=temp1%10; //小数点后二位
display(); //计算完上边的数据后显示
}
void main()
{
P3M0|=0xff; //设P3_0为推挽模式
P3M1|=0x00;
EA=1;
ADC_Power_On(); //开AD电源
while(1)
{
delay(10);
//定时器
caiyangP10(); //测电压
displayP10();
delay(10);
}
#include<STC12C5A60S2.H>
#define uint unsigned int
#define uchar unsigned char
uchar dispbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar dispbuf1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uint temp1,sh1,ge1,n1,m1;
uchar ad_average_result1; //AD转换十次的平均值
uchar ad_average_result2; //AD转换十次的平均值
uchar ad_average_result; //AD转换十次的平均值
uchar Vin;
char tp=0;
//-------模块延时程序---------------------------- 1ms
void delay1ms(uint delay1ms) //STC11F60XE,22.1184M,延时1ms
{
uint i,j;
for(;delay1ms>0;delay1ms--)
for(i=0;i<7;i++)
for(j=0;j<210;j++);
}
void delay(uint delay) //STC11F60XE,22.1184M,延时170us
{
uint i,j;
for(;delay>0;delay--)
for(i=0;i<124;i++);
for(j=0;j<124;j++);
}
/*******************************************************
AD转换程序
*******************************************************/
void ADC_Power_On() //AD转换电
{
ADC_CONTR|=0x80;
delay(5); //必要的延时
}
void get_ad_result() //取AD结果函数,它是十位AD转换,每十次平均,最后取平均十位作为AD采样数据
{
uint i,q,p=0;
for(i=0;i<10;i++)
{
tp=0;
ADC_RES=0; //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同
ADC_RESL=0; //低两位清零
ADC_CONTR|=0x08; //启动AD转换
delay(1);
while(!tp) //判断AD转换是否完成
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe7;
delay(1);
ad_average_result1=ADC_RES; //取高八位数据
ad_average_result2=ADC_RESL; //取低2位数据
q=q+ad_average_result1; //各取十次平均
p=p+ad_average_result2;
}
ad_average_result1=q/10; //得到最后结果
ad_average_result2=p/10;
//ad_average_result=ad_average_result*4*5000/1024;
ad_average_result=ad_average_result1*4+ad_average_result2;
}
/********************电压采样程序********************/
void caiyangP10() //测电压
{
P1M0|=0x01; //设P1_0为开漏模式 如: P1_0= #00000000B
P1M1|=0x01;
P1ASF=0x01; //设置P1.0为输入AD转换口
ADC_CONTR=0xe0;
delay(2);
get_ad_result(); //取转换数据
Vin=ad_average_result;
}
void display()
{
P3=0x00; //每次显示之前消影
P3=dispbuf[sh1]; //十位
P2=0xfe;
delay1ms(1);
P3=0x00;
P3=dispbuf1[ge1]; //个位显示带有小数点
P2=0xfd;
delay1ms(1);
P3=0x00;
P3=dispbuf[n1]; //小数点后1位
P2=0xfb;
delay1ms(1);
P3=0x00;
P3=dispbuf[m1]; //小数点后第二位
P2=0xf7;
delay1ms(1);
P3=0x00;
}
void displayP10()
{
uint ad1;
ad1=Vin*500000/1024; //得到输入的十进制电压值 单位为 mv
// temp1=(ad1-2000)/66;
temp1=ad1;
sh1=temp1/1000; //十位
ge1=(temp1%1000)/100; //个位
n1=((temp1%1000)%100)/10; //小数点后一位
m1=temp1%10; //小数点后二位
display(); //计算完上边的数据后显示
}
void main()
{
P3M0|=0xff; //设P3_0为推挽模式
P3M1|=0x00;
EA=1;
ADC_Power_On(); //开AD电源
while(1)
{
delay(10);
//定时器
caiyangP10(); //测电压
displayP10();
delay(10);
}
有人在吗麻烦大家看看
大家帮忙看看吧~
我没有去翻数据手册了,我记得stc单片机的ADC是10位是分为高2位和低8位,看你的注释是分为高8位,低2位,这里有没有搞错
有配置AUXR寄存器,高八位低两位应该没问题。
有没有人呀,帮忙看一下,,
正准备学习单片 过来先学一下经验
你要确定是采集的问题还是显示的问题
g感觉是ad转换的问题,P1.0接收在用数码管显示电压,数码管显示其他的都可以
希望多多指点
希望多多指点
建议用Proteus仿真一下,查出是否硬件问题。
正常显示都没问题,让他显示1111,2222,每秒加1都可以,程序确实有问题但是看不问题在哪里,
大家帮忙看看程序吧。
帮帮看看程序吧,解决问题了发红包致谢啊
大家帮忙看一下吧,,,
初学者来取经的