微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 帮忙看一下程序,红包致谢。

帮忙看一下程序,红包致谢。

时间:10-02 整理:3721RD 点击:
#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;
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采样数据
{  
   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;
   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=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(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);
}
}

大致看了下。知道你的意图了。首先你要一步步来,显示了1234.至少证明显示部分没问题,能正常显示。之所以一直是1234,证明是shi,ge,什么的不对,这个数据又是你的temp1来的,这里我就看不懂了,你把temp1注释掉了,ad1是你采集的值结果你用了temp1,如果你ad1是小数,你可以乘1000在运算。接上去,目测你要保证ad1的值是正确的,ad1是哪来的,ad_average_result,你看你怎么确定你AD采样是不是正确的。然后你用的哪路AD,对应那个结果寄存器。说的差不多了。试试吧

希望大家帮一下我,卡在这里好多天了。

如果能解决,穷学生愿意发一顿饭的红包。

通过P1.0输入电压,数码管显示电压值,但是无论如何调整,都不能正确输出,总是显示12.45.

程序实在看不出来什么问题了,麻烦大帮忙看看吧

不知道你的是那个板子

第一行#include后面是没复制出来吗?

#include<STC12C5A60S2.H> 复制出来了呀

是什么板子?单片机用的是STC12C5A60S2

程序不全,看个锤子

麻烦问问哪里不全,我就是采样电压完了之后用数码管显示。

有人在吗?麻烦帮忙看看

有人在吗?麻烦帮忙看看

怎么有很多屏蔽行啊,把它们都删除了再重新编译一遍试试。

这个是我之前写的,不影响的本来想转换十次提高精度的。

这个,我也遇过显示程序没问题,就是不执行,根据我初学我现在就只知道, 可能是数据类型没有给对或着变量定义没有放在可执行语句前。程序没有看懂,瞎说的,您试试看吧

看不全,只能看到延时函数

printf调试吧

#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;
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采样数据
{  
   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;
   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=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(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);
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top