模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

2433查看 | 15回复

[DIY交流] 电压表求助被小学数学题难到了

[复制链接]
发表于 2016-12-27 03:04:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
求助萝莉大神  
东拼西凑的程序搞了个电压表
采集10位adc值怎么计算
adc=adc/1024
我用这个公式求的值小数点后2位直接去掉了
只能精确到小数点第一位


#include<reg51.h>
#include "intrins.h"

/* stc15w204s
                 _______
        P1.2--1 |       | 16--P1.1
        P1.3--2 |       | 15--P1.0
        P1.4--3 |       | 14--P3.7--txd
        P1.5--4 |       | 13--P3.6--rxd
        P5.4--5 |       | 12--P3.3
        VCC --6 |       | 11--P3.2
        P5.5--7 |       | 10--P3.1--txd
        GND --8 |_______| 9 --P3.0--rxd
*/
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P4   = 0xC0;
sfr P5   = 0xC8;


sbit DA=P3^0;   //数码管每个引脚
sbit DB=P5^5;  //P1.2--1 |      B1| 16--P1.1
sbit DC=P3^3;  //P1.3--2 |a     E | 15--P1.0
sbit DD=P3^7;  //P1.4--3 |F     D | 14--P3.7--txd
sbit DE=P1^0;  //P1.5--4 |B2    DP| 13--P3.6--rxd
sbit DF=P1^4;  //P5.4--5 |B3    C | 12--P3.3
sbit DG=P3^2;  //VCC --6 |      G | 11--P3.2
sbit DP=P3^6;  //P5.5--7 |B     B4| 10--P3.1--txd
                           //GND --8 |______ _| 9 --P3.0--rxd
sbit B1=P1^1;   //四个数码管的引脚定义
sbit B2=P1^5;
sbit B3=P5^4;
sbit B4=P3^1;
typedef unsigned int BYTE;
#define u8 unsigned char
#define u16 unsigned int     
sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
sfr ADC_RES     =   0xBD;           //ADC高8位结果
sfr ADC_LOW2    =   0xBE;           //ADC低2位结果
sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

#define ADC_POWER   0x80            //ADC电源控制位
#define ADC_FLAG    0x10            //ADC完成标志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540个时钟
#define ADC_SPEEDL  0x20            //360个时钟
#define ADC_SPEEDH  0x40            //180个时钟
#define ADC_SPEEDHH 0x60            //90个时钟


u8 Data1;        //第一个数码管要显示的数据
u8 Data2;        //第二个数码管要显示的数据
u8 Data3;        //第三个数码管要显示的数据
u8 Data4;        //第四个数码管要显示的数据

u8 count;        //计时
u8 display_time;        //定义变量用于显示次数
u16 v;//电压
void Delay10us()                //@12.000MHz
{
        u8 i;

        i = 27;
        while (--i);
}

void delay_n_10us(u16 n)//延时n个10us的函数
{
        while(n)         
        {
                Delay10us();
                n=n-1;//每循环一次n减小1
        }
}

void display(u8 x)//控制数码管显示内容的函数
{
        //判断x的值来决定显示什么
        if(x==0){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=0;} //显示“0”        
        if(x==1){DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示“1”        
        if(x==2){DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=0;} //显示“2”        
        if(x==3){DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=0;} //显示“3”
        if(x==4){DA=0;DB=1;DC=1;DD=0;DE=0;DF=1;DG=1;DP=0;} //显示“4”        
        if(x==5){DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示“5”        
        if(x==6){DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示“6”        
        if(x==7){DA=1;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示“7”        
        if(x==8){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示“8”        
        if(x==9){DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示“9”
                                                        
        if(x==10){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=1;} //显示“0”带小数点        
        if(x==11){DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=1;} //显示“1”带小数点        
        if(x==12){DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=1;} //显示“2”带小数点        
        if(x==13){DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=1;} //显示“3”带小数点
        if(x==14){DA=0;DB=1;DC=1;DD=0;DE=0;DF=1;DG=1;DP=1;} //显示“4”带小数点        
        if(x==15){DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;DP=1;} //显示“5”带小数点        
        if(x==16){DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;DP=1;} //显示“6”带小数点
        if(x==17){DA=1;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=1;} //显示“7”带小数点        
        if(x==18){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;DP=1;} //显示“8”带小数点
        if(x==19){DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;DP=1;} //显示“9”带小数点

}

/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{   P1ASF = 0x04;  //0000 0100设置P1.2 引脚为模拟功能
    //P1ASF = 0xff; //设置P1口为AD口
    ADC_RES  = 0;  //清除高8位结果寄存器
    ADC_LOW2= 0;  //清除低2位结果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDHH;
    delay_n_10us(5);   //等待50us,AD转换完成
}

/*----------------------------
读取ADC结果
----------------------------*/
BYTE ADC(u8 ch)
{        u16        ADC_value;
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    _nop_();                        //等待4个NOP
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC
        ADC_value=ADC_RES*4+ADC_LOW2+1;  //读取转换结果
    return ADC_value;                 //返回ADC结果
}

u16 adcs(u8 x)//测量电压40次去除最大最小求平均
{
    u16 U[40],min,max,S;
    u8 i;
    for(i=0;i<40;i++)
    {
    U=ADC(x);//获取x通道ADC结果
    }
    for(i=1,min=U[0];i<=39;i++)
    {
    if(U<min)  min=U;                     //求最小值
    }
    for(i=1,max=U[0];i<=39;i++)
    {
        if(U>max)  max=U;
    }                                        //求最大值
    for(i=0,S=0;i<=39;i++)  S=S+U;
    S=S-min-max;
    S=S / 38    ; //减去最大最小求平均
    return S;  //返回计算结果
   
}

void main()
{        u16 v;
        //P1.2--1 |      B1| 16--P1.1
        //P1.3--2 |      E | 15--P1.0
        //P1.4--3 |F     D | 14--P3.7--txd
        //P1.5--4 |B2    DP| 13--P3.6--rxd
        //P5.4--5 |B3    C | 12--P3.3
        //VCC --6 |      G | 11--P3.2
        //P5.5--7 |B     B4| 10--P3.1--txd
        //GND --8 |______A_| 9 --P3.0--rxd

  P3M0=0xcD;    //3.7 3.6 3.3、3.2 1100 1101需要高电平大电流的引脚3.7 3.3、3.2填入数值
  P5M0=0X20;    //5.5          0010 0000
  P1M0=0X19;    //1.4 1.3 1.0  0001 1001
  P1ASF=0x04;  //0000 0100设置P1.2 引脚为模拟功能
        
        while(1)
        {
                delay_n_10us(400);//系统周期4ms
               
                count=count+1;
                if(count>4)  //每20ms秒插入一次高电平
                {
                        count=0;
                        B1=1;B2=1;B3=1;B4=1;//暂时关闭数码管,避免闪烁                                            
                                                v=adcs(2);
                                               
                                                v=v*10/204*10;
                                               
                                                Data1=v/1000;   //千位数据
                                                //Data1=Data1+10;                                       
                        Data2=v/100;   //百位数据
                                                Data2=Data2+10;   //加10,display函数显示的数字会带小数点                               
                        Data3=v0/10; //十位数据
                                                //Data3=Data3+10;   //加10,display函数显示的数字会带小数点               
                        Data4=v;     //个位数据
                                                //Data4=Data4+10;                                                
                }
               
               
               
                ///////////////////////////////////////////////////////
                //显示程序模块化,只需要改变Data1/2/3/4的值就可以控制显示内容
               
                display_time=display_time+1;
                if(display_time>3)
                {
                        display_time=0;  //0、1、2、3 四个循环
                }
               
                if(display_time==0)//第0次显示第一个数码管
                {
                        B1=0;B2=1;B3=1;B4=1;        
                        display(Data1);                //显示第1位数据
                }
               
                if(display_time==1)//第1次显示第二个数码管
                {
                        B1=1;B2=0;B3=1;B4=1;        
                        display(Data2);                //显示第2位数据
                }
               
                if(display_time==2)//第2次显示第三个数码管
                {
                        B1=1;B2=1;B3=0;B4=1;        
                        display(Data3);                //显示第3位数据
                }
               
                if(display_time==3)//第3次显示第四个数码管
                {
                        B1=1;B2=1;B3=1;B4=0;        
                        display(Data4);                //显示第4位数据
                }
        }
}
电压表求助被小学数学题难到了 小学数学题,东拼西凑,小学数学,到小数,小数点 作者:ldy7474 8723
电压表求助被小学数学题难到了 小学数学题,东拼西凑,小学数学,到小数,小数点 作者:ldy7474 9891
发表于 2016-12-27 07:29:52 | 显示全部楼层
表示看不懂!
发表于 2016-12-27 07:35:48 | 显示全部楼层
不懂学习一下
发表于 2016-12-27 07:38:16 | 显示全部楼层
看不懂
发表于 2016-12-27 08:01:42 | 显示全部楼层
不错,顶顶顶
发表于 2016-12-27 08:30:05 | 显示全部楼层
这是51单片机?怎么这么少的引脚?
发表于 2016-12-27 08:45:09 | 显示全部楼层
学习,顶帖!
发表于 2016-12-27 09:35:26 | 显示全部楼层
顶一个
发表于 2016-12-27 11:43:04 | 显示全部楼层
看不懂,但是好高端
发表于 2016-12-27 11:53:46 | 显示全部楼层
顶贴是一种美德!
发表于 2016-12-27 22:50:07 | 显示全部楼层
顶顶顶顶
发表于 2016-12-27 23:44:38 | 显示全部楼层
本帖最后由 我爱萝丽爱萝丽 于 2016-12-27 23:49 编辑

v=v*10/204*10;
这个不对,要先乘后除,不然除的时候小数点都已经掉了等下我在电压表课程中再详细说明一下
发表于 2016-12-28 04:54:13 | 显示全部楼层
shen me gui
odfhb th9....../
发表于 2016-12-29 00:08:14 | 显示全部楼层
不懂,咱不装懂。
发表于 2016-12-31 21:25:13 | 显示全部楼层
帮顶                       
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于模吧|APP下载|广告报价|小黑屋|手机版|企业会员|商城入驻|联系我们|模吧 ( 冀公网安备13080502000084号 )

© 2013-2020 Moz8.com 模吧,玩出精彩!