[STC单片机]

给单片机输入电压,数码管显示的问题

[复制链接]
2190|16
手机看帖
扫描二维码
随时随地手机跟帖
768619722|  楼主 | 2016-12-7 09:00 | 显示全部楼层 |阅读模式
想要给单片机的P1.2口输入一个电压,通过数码管显示。但是现在所显示的数据不对,麻烦大家看看我哪里有问题,下面是我的程序。
#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=0;
uchar tp=0;

//-------模块延时程序---------------------------- 1ms
void delay1ms(uint delay1ms)
{
uint i,j;  
for(;delay1ms>0;delay1ms--)
   for(i=0;i<7;i++)
     for(j=0;j<210;j++);
}
void delay(uint delay)
{
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采样数据
{  
//   uchar i=0,q=0,p=0;
//   for(i=0;i<10;i++)
//   {
       tp=0;
       ADC_RES=0;     //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同
       ADC_RESL=0;    //低两位清零
       ADC_CONTR|=0x08; //启动AD转换
       while(!tp)     //判断AD转换是否完成  
         {
           tp=0x10;
           tp&=ADC_CONTR;
         }     
   ADC_CONTR&=0xe7;  //标志位 开AD位清零
   delay(2);
   ad_average_result1=ADC_RES;                         //取高八位数据
   ad_average_result2=ADC_RESL;                  //取低2位数据
//   q=q+ad_average_result1;                        //各取十次平均
//   p=p+ad_average_result2;
//   }        
//   ad_average_result=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=0x04;                         //设置P1.2为输入AD转换口
ADC_CONTR=0xe2;   
delay(2);
get_ad_result();        //取转换数据
Vin=ad_average_result;
}
void display()
{
   P3=0x00;                    //每次显示之前消影
   P3=dispbuf[sh1]; //十位
   P2=0xef;
   delay1ms(300);
   P3=0x00;       
   P3=dispbuf1[ge1]; //个位显示带有小数点
   P2=0xfd;
   delay1ms(300);
   P3=0x00;       
   P3=dispbuf[n1]; //小数点后1位
   P2=0xfb;
   delay1ms(300);
   P3=0x00;       
   P3=dispbuf[m1]; //小数点后第二位
   P2=0xf7;
   delay1ms(300);
   P3=0x00;       
}
void displayP10()
{
    float ad1;
        ad1=Vin*4.8828125;   //得到输入的十进制电压值 单位为 mv
//        ad1=Vin*1.953125;
//        temp1=(int)((ad1-2000)/66);
    temp1=(int)ad1;
        sh1=temp1/1000;    //十位
        ge1=(temp1%1000)/100;   //个位
        n1=((temp1%1000)%100)/10; //小数点后一位
        m1=((temp1%1000)%100)%10; //小数点后二位
    display();                //计算完上边的数据后显示
}
void main()
{
P3M0|=0xff;         //设P3_0为推挽模式
P3M1|=0x00;
AUXR1&=0xfb;  
EA=1;
ADC_Power_On();     //开AD电源
while(1)
{
   delay(10);
   caiyangP10();    //测电压
   displayP10();
   delay(10);
}
}

相关帖子

768619722|  楼主 | 2016-12-7 09:02 | 显示全部楼层
麻烦大家指点我一下吧,卡住了挺久了。。。

使用特权

评论回复
768619722|  楼主 | 2016-12-7 09:56 | 显示全部楼层
帮忙看一下0 0

使用特权

评论回复
NE5532| | 2016-12-7 09:59 | 显示全部楼层
请读《程序调试黑宝书》,你觉得Windows是一口气写完了一起调试的么?

使用特权

评论回复
768619722|  楼主 | 2016-12-7 10:51 | 显示全部楼层
NE5532 发表于 2016-12-7 09:59
请读《程序调试黑宝书》,你觉得Windows是一口气写完了一起调试的么?

我是新手,以前没用过这个stc单片机,我显示模块让它每秒加1,四位数码管1111,,2222,3333.。。。都没问题,所以显示部分应该是正确的,然后我让它P1.2输入电压大于3V和小于3V时,P3.0对应输出不同的电压值也可以实现,随后我加入了显示电压的程序,但是显示的电压却不准确,无输入时显示确实是00.00或者00.04,但是有电压时显示相差很远,5V时它显示01.22,自己看不出来问题出在哪里了,麻烦指导一下。。。

使用特权

评论回复
长的帅怪我落| | 2016-12-7 10:57 | 显示全部楼层
显示对的,那就是你数字采集错了呗

使用特权

评论回复
768619722|  楼主 | 2016-12-7 10:59 | 显示全部楼层
NE5532 发表于 2016-12-7 09:59
请读《程序调试黑宝书》,你觉得Windows是一口气写完了一起调试的么?

请前辈指点一下。。

使用特权

评论回复
768619722|  楼主 | 2016-12-7 11:00 | 显示全部楼层
长的帅怪我落 发表于 2016-12-7 10:57
显示对的,那就是你数字采集错了呗

对,是采样和转换有问题,但是我检查不出来哪里有问题,无输入电压的时候显示00.00,但是有电压就不一样了。。。

使用特权

评论回复
长的帅怪我落| | 2016-12-7 11:07 | 显示全部楼层
·建议你先这样,先显示AD采集到的数,看是不是正确的,这个应该很好实现吧,这样你就知道是采样值不对还是采样值转换成电压过程中出错了。

使用特权

评论回复
长的帅怪我落| | 2016-12-7 11:08 | 显示全部楼层
其实你ad1转换成temp1的时候我感觉会有错,你最好是把ad1乘个1000转化成整数在搞

使用特权

评论回复
768619722|  楼主 | 2016-12-7 11:09 | 显示全部楼层
长的帅怪我落 发表于 2016-12-7 11:07
·建议你先这样,先显示AD采集到的数,看是不是正确的,这个应该很好实现吧,这样你就知道是采样值不对还是 ...

好,我去试试谢谢你

使用特权

评论回复
NE5532| | 2016-12-7 13:06 | 显示全部楼层
边写边调,程序模块化。

使用特权

评论回复
NE5532| | 2016-12-7 13:07 | 显示全部楼层
768619722 发表于 2016-12-7 10:51
我是新手,以前没用过这个stc单片机,我显示模块让它每秒加1,四位数码管1111,,2222,333 ...

你应该直接输入0V和VCC,看AD的结果是不是0和FF,然后输入VCC/2,看是不是FF/2,就好调了。先证明AD运行正确,再运算和显示。

使用特权

评论回复
guanyanqin1992| | 2016-12-7 13:12 | 显示全部楼层
版主说的很在理。程序要一点点写,分模块调试好,再组合一起。
你这样一堆搞在一起,除了问题都不知道怎么查找

使用特权

评论回复
768619722|  楼主 | 2016-12-7 14:06 | 显示全部楼层
NE5532 发表于 2016-12-7 13:07
你应该直接输入0V和VCC,看AD的结果是不是0和FF,然后输入VCC/2,看是不是FF/2,就好调了。先证明AD运行 ...

受教了,版主我回去试试,谢谢你

使用特权

评论回复
songchenping| | 2016-12-8 08:53 | 显示全部楼层
分开设计,先保证数码管显示正常,在保证数据采集正常,最好保证数据传输正常

使用特权

评论回复
coody| | 2016-12-8 11:37 | 显示全部楼层
先显示ADC值,正常了再往下调试。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

0

粉丝