打印
[STC单片机]

请教这个程序为什么不工作?

[复制链接]
1714|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nwjjdwx|  楼主 | 2017-1-18 22:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 nwjjdwx 于 2017-1-18 23:26 编辑

得到2片STC15W404AS芯片,搭了一个电路进行实验,电路如下:
程序如下:
#include"STC15.H"
    //#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char


sbit dula=P1^0;                //声明十位驱动(20脚)
sbit wela=P1^1;                //声明个位驱动(19脚)
sbit dianliang=P1^3;           //电量检测端

uchar code table[]={0x48,0x5f,0x38,0x19,                    //定义字段编码表
                    0x0f,0x89,0x88,0x5b,0x08,0x09};
uchar  shi,ge;
uint  num;                                    
               
////////////
/*初始化*/
///////////

    void init()
     {

       num=0;
             ADC_RES=0x00;
        ADC_RESL=0x00;

                        P1ASF=0x08;          //P1ASF为ADC功能控制寄存器,赋值0x08为P1.3口为ADC输入(电量检测)
         ADC_CONTR=0xE3;               /*电量检测端(打开电源、转换最快、完成标志置0、开关位ADC_START位关闭、
                                                       置P1.3为ADC输入*/
                   CLK_DIV=0x20;          //ADRJ=1;高2位在ADC_RES之中,低8位ADC_RESL中
                                                      //转换结果只取8位的话,读取ADC_RESL中的数据即可

                 }

       ///////////////////
      /*延时子程序*/
      ///////////////////

void delayms(uint xms)             //延时1ms子程序
    {
        uint i,j;
       for(i=xms;i>0;i--)
            for(j=400;j>0;j--);
     }



//////////////////////
/*    ADC转换程序   */
//////////////////////

void zhuanhuan()
    {
                    
                   P1ASF=0x08;          //P1ASF为ADC功能控制寄存器,赋值0x08为P1.3口为ADC输入(电量检测)
            ADC_CONTR=0xE3;      /*电量检测端(打开电源、转换最快、完成标志置0、开关位ADC_START位关闭、
                                                   置P1.3为ADC输入*/
          delayms(5);                           //延时2毫秒
                 ADC_CONTR=0xEB;      //电量检测开(开始检测)

       while(ADC_CONTR==0xFB)              //等待转换结束
                                  {
                num=ADC_RESL;                    //将转换结果赋值给num
             ADC_CONTR=0xE3;                   //开关位ADC_START位关闭、完成标志置0、电源不关
                                                                //置P1.3为ADC输入
            
                                         }

                                 
                  
                }

                 
                    ///////////////////////
                  /*--------------------
                      显示子程序函数
                   --------------------*/
                   ///////////////////////
         
           void display(uchar ge,uchar shi)
                    {
                  shi=num/10;                            //将num中的数求模,然后赋值给十位显示
                           ge=num%10;                  //将num中的数求余,然后赋值给各位显示
                            dula=1;
                            P3=table[shi];
                            dula=0;
                            delayms(5);
                             dula=1;
                      P3=table[ge];
                      wela=0;
                      delayms(5);
                      wela=1;
                 }


                 //////////////////
                /*---------------
                     主程序函数
                 ---------------*/
                 //////////////////

               
        void main()
   {
            init();   
       while(1)
            {
               display(ge,shi);  //显示程序
              zhuanhuan();    //A/D转换程序
           }

             }
出现的问题为:数码管只显示预先在num里设置的值,也就是0,不管怎样调电位器w,数码管数字不变,我用万用表测404AS的2脚,有电压变化。我将num的值修改为12,下载后数码管又正确的显示出12,证明显示程序没有问题,反复检查语句和寄存器设置的值,找不到问题。请教各位老师朋友,这个A/D程序问题到底出在那里,应该怎么写。有劳各位在这里先谢了。

实验电路图.jpg (49.88 KB )

实验电路图.jpg

相关帖子

沙发
nwjjdwx|  楼主 | 2017-1-18 22:33 | 只看该作者
本帖最后由 nwjjdwx 于 2017-1-18 23:20 编辑

头文件STC15.H里的内容:
#ifndef __STC15F2K60S2_H_
#define __STC15F2K60S2_H_

/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
//      高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
//        P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/////////////////////////////////////////////////

/////////////////////////////////////////////////

//包含本头文件后,不用另外再包含"REG51.H"

//内核特殊功能寄存器        // 复位值   描述
sfr ACC         =   0xE0;   //0000,0000 累加器Accumulator
sfr B           =   0xF0;   //0000,0000 B寄存器
sfr PSW         =   0xD0;   //0000,0000 程序状态字
sbit CY         =   PSW^7;
sbit AC         =   PSW^6;
sbit F0         =   PSW^5;
sbit RS1        =   PSW^4;
sbit RS0        =   PSW^3;
sbit OV         =   PSW^2;
sbit P          =   PSW^0;
sfr SP          =   0x81;   //0000,0111 堆栈指针
sfr DPL         =   0x82;   //0000,0000 数据指针低字节
sfr DPH         =   0x83;   //0000,0000 数据指针高字节

//I/O 口特殊功能寄存器
sfr P0          =   0x80;   //1111,1111 端口0
sbit P00        =   P0^0;
sbit P01        =   P0^1;
sbit P02        =   P0^2;
sbit P03        =   P0^3;
sbit P04        =   P0^4;
sbit P05        =   P0^5;
sbit P06        =   P0^6;
sbit P07        =   P0^7;
sfr P1          =   0x90;   //1111,1111 端口1
sbit P10        =   P1^0;
sbit P11        =   P1^1;
sbit P12        =   P1^2;
sbit P13        =   P1^3;
sbit P14        =   P1^4;
sbit P15        =   P1^5;
sbit P16        =   P1^6;
sbit P17        =   P1^7;
sfr P2          =   0xA0;   //1111,1111 端口2
sbit P20        =   P2^0;
sbit P21        =   P2^1;
sbit P22        =   P2^2;
sbit P23        =   P2^3;
sbit P24        =   P2^4;
sbit P25        =   P2^5;
sbit P26        =   P2^6;
sbit P27        =   P2^7;
sfr P3          =   0xB0;   //1111,1111 端口3
sbit P30        =   P3^0;
sbit P31        =   P3^1;
sbit P32        =   P3^2;
sbit P33        =   P3^3;
sbit P34        =   P3^4;
sbit P35        =   P3^5;
sbit P36        =   P3^6;
sbit P37        =   P3^7;
sfr P4          =   0xC0;   //1111,1111 端口4
sbit P40        =   P4^0;
sbit P41        =   P4^1;
sbit P42        =   P4^2;
sbit P43        =   P4^3;
sbit P44        =   P4^4;
sbit P45        =   P4^5;
sbit P46        =   P4^6;
sbit P47        =   P4^7;
sfr P5          =   0xC8;   //xxxx,1111 端口5
sbit P50        =   P5^0;
sbit P51        =   P5^1;
sbit P52        =   P5^2;
sbit P53        =   P5^3;
sbit P54        =   P5^4;
sbit P55        =   P5^5;
sbit P56        =   P5^6;
sbit P57        =   P5^7;
sfr P6          =   0xE8;   //0000,0000 端口6
sbit P60        =   P6^0;
sbit P61        =   P6^1;
sbit P62        =   P6^2;
sbit P63        =   P6^3;
sbit P64        =   P6^4;
sbit P65        =   P6^5;
sbit P66        =   P6^6;
sbit P67        =   P6^7;
sfr P7          =   0xF8;   //0000,0000 端口7
sbit P70        =   P7^0;
sbit P71        =   P7^1;
sbit P72        =   P7^2;
sbit P73        =   P7^3;
sbit P74        =   P7^4;
sbit P75        =   P7^5;
sbit P76        =   P7^6;
sbit P77        =   P7^7;
sfr P0M0        =   0x94;   //0000,0000 端口0模式寄存器0
sfr P0M1        =   0x93;   //0000,0000 端口0模式寄存器1
sfr P1M0        =   0x92;   //0000,0000 端口1模式寄存器0
sfr P1M1        =   0x91;   //0000,0000 端口1模式寄存器1
sfr P2M0        =   0x96;   //0000,0000 端口2模式寄存器0
sfr P2M1        =   0x95;   //0000,0000 端口2模式寄存器1
sfr P3M0        =   0xB2;   //0000,0000 端口3模式寄存器0
sfr P3M1        =   0xB1;   //0000,0000 端口3模式寄存器1
sfr P4M0        =   0xB4;   //0000,0000 端口4模式寄存器0
sfr P4M1        =   0xB3;   //0000,0000 端口4模式寄存器1
sfr P5M0        =   0xCA;   //0000,0000 端口5模式寄存器0
sfr P5M1        =   0xC9;   //0000,0000 端口5模式寄存器1
sfr P6M0        =   0xCC;   //0000,0000 端口6模式寄存器0
sfr P6M1        =   0xCB;   //0000,0000 端口6模式寄存器1
sfr P7M0        =   0xE2;   //0000,0000 端口7模式寄存器0
sfr P7M1        =   0xE1;   //0000,0000 端口7模式寄存器1

//系统管理特殊功能寄存器
sfr PCON        =   0x87;   //0001,0000 电源控制寄存器
sfr AUXR        =   0x8E;   //0000,0000 辅助寄存器
sfr AUXR1       =   0xA2;   //0000,0000 辅助寄存器1
sfr P_SW1       =   0xA2;   //0000,0000 外设端口切换寄存器1
sfr CLK_DIV     =   0x97;   //0000,0000 时钟分频控制寄存器
sfr BUS_SPEED   =   0xA1;   //xx10,x011 总线速度控制寄存器
sfr P1ASF       =   0x9D;   //0000,0000 端口1模拟功能配置寄存器
sfr P_SW2       =   0xBA;   //0xxx,x000 外设端口切换寄存器

//中断特殊功能寄存器
sfr IE          =   0xA8;   //0000,0000 中断控制寄存器
sbit EA         =   IE^7;
sbit ELVD       =   IE^6;
sbit EADC       =   IE^5;
sbit ES         =   IE^4;
sbit ET1        =   IE^3;
sbit EX1        =   IE^2;
sbit ET0        =   IE^1;
sbit EX0        =   IE^0;
sfr IP          =   0xB8;   //0000,0000 中断优先级寄存器
sbit PPCA       =   IP^7;
sbit PLVD       =   IP^6;
sbit PADC       =   IP^5;
sbit PS         =   IP^4;
sbit PT1        =   IP^3;
sbit PX1        =   IP^2;
sbit PT0        =   IP^1;
sbit PX0        =   IP^0;
sfr IE2         =   0xAF;   //0000,0000 中断控制寄存器2
sfr IP2         =   0xB5;   //xxxx,xx00 中断优先级寄存器2
sfr INT_CLKO    =   0x8F;   //0000,0000 外部中断与时钟输出控制寄存器

//定时器特殊功能寄存器
sfr TCON        =   0x88;   //0000,0000 T0/T1控制寄存器
sbit TF1        =   TCON^7;
sbit TR1        =   TCON^6;
sbit TF0        =   TCON^5;
sbit TR0        =   TCON^4;
sbit IE1        =   TCON^3;
sbit IT1        =   TCON^2;
sbit IE0        =   TCON^1;
sbit IT0        =   TCON^0;
sfr TMOD        =   0x89;   //0000,0000 T0/T1模式寄存器
sfr TL0         =   0x8A;   //0000,0000 T0低字节
sfr TL1         =   0x8B;   //0000,0000 T1低字节
sfr TH0         =   0x8C;   //0000,0000 T0高字节
sfr TH1         =   0x8D;   //0000,0000 T1高字节
sfr T4T3M       =   0xD1;   //0000,0000 T3/T4模式寄存器
sfr T3T4M       =   0xD1;   //0000,0000 T3/T4模式寄存器
sfr T4H         =   0xD2;   //0000,0000 T4高字节
sfr T4L         =   0xD3;   //0000,0000 T4低字节
sfr T3H         =   0xD4;   //0000,0000 T3高字节
sfr T3L         =   0xD5;   //0000,0000 T3低字节
sfr T2H         =   0xD6;   //0000,0000 T2高字节
sfr T2L         =   0xD7;   //0000,0000 T2低字节
sfr WKTCL       =   0xAA;   //0000,0000 掉电唤醒定时器低字节
sfr WKTCH       =   0xAB;   //0000,0000 掉电唤醒定时器高字节
sfr WDT_CONTR   =   0xC1;   //0000,0000 看门狗控制寄存器

//串行口特殊功能寄存器
sfr SCON        =   0x98;   //0000,0000 串口1控制寄存器
sbit SM0        =   SCON^7;
sbit SM1        =   SCON^6;
sbit SM2        =   SCON^5;
sbit REN        =   SCON^4;
sbit TB8        =   SCON^3;
sbit RB8        =   SCON^2;
sbit TI         =   SCON^1;
sbit RI         =   SCON^0;
sfr SBUF        =   0x99;   //xxxx,xxxx 串口1数据寄存器
sfr S2CON       =   0x9A;   //0000,0000 串口2控制寄存器
sfr S2BUF       =   0x9B;   //xxxx,xxxx 串口2数据寄存器
sfr S3CON       =   0xAC;   //0000,0000 串口3控制寄存器
sfr S3BUF       =   0xAD;   //xxxx,xxxx 串口3数据寄存器
sfr S4CON       =   0x84;   //0000,0000 串口4控制寄存器
sfr S4BUF       =   0x85;   //xxxx,xxxx 串口4数据寄存器
sfr SADDR       =   0xA9;   //0000,0000 从机地址寄存器
sfr SADEN       =   0xB9;   //0000,0000 从机地址屏蔽寄存器

//ADC 特殊功能寄存器
sfr ADC_CONTR   =   0xBC;   //0000,0000 A/D转换控制寄存器
sfr ADC_RES     =   0xBD;   //0000,0000 A/D转换结果高8位
sfr ADC_RESL    =   0xBE;   //0000,0000 A/D转换结果低2位

//SPI 特殊功能寄存器
sfr SPSTAT      =   0xCD;   //00xx,xxxx SPI状态寄存器
sfr SPCTL       =   0xCE;   //0000,0100 SPI控制寄存器
sfr SPDAT       =   0xCF;   //0000,0000 SPI数据寄存器

//IAP/ISP 特殊功能寄存器
sfr IAP_DATA    =   0xC2;   //0000,0000 EEPROM数据寄存器
sfr IAP_ADDRH   =   0xC3;   //0000,0000 EEPROM地址高字节
sfr IAP_ADDRL   =   0xC4;   //0000,0000 EEPROM地址第字节
sfr IAP_CMD     =   0xC5;   //xxxx,xx00 EEPROM命令寄存器
sfr IAP_TRIG    =   0xC6;   //0000,0000 EEPRPM命令触发寄存器
sfr IAP_CONTR   =   0xC7;   //0000,x000 EEPROM控制寄存器

//PCA/PWM 特殊功能寄存器
sfr CCON        =   0xD8;   //00xx,xx00 PCA控制寄存器
sbit CF         =   CCON^7;
sbit CR         =   CCON^6;
sbit CCF2       =   CCON^2;
sbit CCF1       =   CCON^1;
sbit CCF0       =   CCON^0;
sfr CMOD        =   0xD9;   //0xxx,x000 PCA 工作模式寄存器
sfr CL          =   0xE9;   //0000,0000 PCA计数器低字节
sfr CH          =   0xF9;   //0000,0000 PCA计数器高字节
sfr CCAPM0      =   0xDA;   //0000,0000 PCA模块0的PWM寄存器
sfr CCAPM1      =   0xDB;   //0000,0000 PCA模块1的PWM寄存器
sfr CCAPM2      =   0xDC;   //0000,0000 PCA模块2的PWM 寄存器
sfr CCAP0L      =   0xEA;   //0000,0000 PCA模块0的捕捉/比较寄存器低字节
sfr CCAP1L      =   0xEB;   //0000,0000 PCA模块1的捕捉/比较寄存器低字节
sfr CCAP2L      =   0xEC;   //0000,0000 PCA模块2的捕捉/比较寄存器低字节
sfr PCA_PWM0    =   0xF2;   //xxxx,xx00 PCA模块0的PWM寄存器
sfr PCA_PWM1    =   0xF3;   //xxxx,xx00 PCA模块1的PWM寄存器
sfr PCA_PWM2    =   0xF4;   //xxxx,xx00 PCA模块1的PWM寄存器
sfr CCAP0H      =   0xFA;   //0000,0000 PCA模块0的捕捉/比较寄存器高字节
sfr CCAP1H      =   0xFB;   //0000,0000 PCA模块1的捕捉/比较寄存器高字节
sfr CCAP2H      =   0xFC;   //0000,0000 PCA模块2的捕捉/比较寄存器高字节

//比较器特殊功能寄存器
sfr CMPCR1      =   0xE6;   //0000,0000 比较器控制寄存器1
sfr CMPCR2      =   0xE7;   //0000,0000 比较器控制寄存器2

//增强型PWM波形发生器特殊功能寄存器
sfr PWMCFG      =   0xf1;   //x000,0000 PWM配置寄存器
sfr PWMCR       =   0xf5;   //0000,0000 PWM控制寄存器
sfr PWMIF       =   0xf6;   //x000,0000 PWM中断标志寄存器
sfr PWMFDCR     =   0xf7;   //xx00,0000 PWM外部异常检测控制寄存器

//如下特殊功能寄存器位于扩展RAM区域
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
#define PWMC        (*(unsigned int  volatile xdata *)0xfff0)
#define PWMCH       (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL       (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS      (*(unsigned char volatile xdata *)0xfff2)
#define PWM2T1      (*(unsigned int  volatile xdata *)0xff00)
#define PWM2T1H     (*(unsigned char volatile xdata *)0xff00)
#define PWM2T1L     (*(unsigned char volatile xdata *)0xff01)
#define PWM2T2      (*(unsigned int  volatile xdata *)0xff02)
#define PWM2T2H     (*(unsigned char volatile xdata *)0xff02)
#define PWM2T2L     (*(unsigned char volatile xdata *)0xff03)
#define PWM2CR      (*(unsigned char volatile xdata *)0xff04)
#define PWM3T1      (*(unsigned int  volatile xdata *)0xff10)
#define PWM3T1H     (*(unsigned char volatile xdata *)0xff10)
#define PWM3T1L     (*(unsigned char volatile xdata *)0xff11)
#define PWM3T2      (*(unsigned int  volatile xdata *)0xff12)
#define PWM3T2H     (*(unsigned char volatile xdata *)0xff12)
#define PWM3T2L     (*(unsigned char volatile xdata *)0xff13)
#define PWM3CR      (*(unsigned char volatile xdata *)0xff14)
#define PWM4T1      (*(unsigned int  volatile xdata *)0xff20)
#define PWM4T1H     (*(unsigned char volatile xdata *)0xff20)
#define PWM4T1L     (*(unsigned char volatile xdata *)0xff21)
#define PWM4T2      (*(unsigned int  volatile xdata *)0xff22)
#define PWM4T2H     (*(unsigned char volatile xdata *)0xff22)
#define PWM4T2L     (*(unsigned char volatile xdata *)0xff23)
#define PWM4CR      (*(unsigned char volatile xdata *)0xff24)
#define PWM5T1      (*(unsigned int  volatile xdata *)0xff30)
#define PWM5T1H     (*(unsigned char volatile xdata *)0xff30)
#define PWM5T1L     (*(unsigned char volatile xdata *)0xff31)
#define PWM5T2      (*(unsigned int  volatile xdata *)0xff32)
#define PWM5T2H     (*(unsigned char volatile xdata *)0xff32)
#define PWM5T2L     (*(unsigned char volatile xdata *)0xff33)
#define PWM5CR      (*(unsigned char volatile xdata *)0xff34)
#define PWM6T1      (*(unsigned int  volatile xdata *)0xff40)
#define PWM6T1H     (*(unsigned char volatile xdata *)0xff40)
#define PWM6T1L     (*(unsigned char volatile xdata *)0xff41)
#define PWM6T2      (*(unsigned int  volatile xdata *)0xff42)
#define PWM6T2H     (*(unsigned char volatile xdata *)0xff42)
#define PWM6T2L     (*(unsigned char volatile xdata *)0xff43)
#define PWM6CR      (*(unsigned char volatile xdata *)0xff44)
#define PWM7T1      (*(unsigned int  volatile xdata *)0xff50)        
#define PWM7T1H     (*(unsigned char volatile xdata *)0xff50)        
#define PWM7T1L     (*(unsigned char volatile xdata *)0xff51)
#define PWM7T2      (*(unsigned int  volatile xdata *)0xff52)
#define PWM7T2H     (*(unsigned char volatile xdata *)0xff52)
#define PWM7T2L     (*(unsigned char volatile xdata *)0xff53)
#define PWM7CR      (*(unsigned char volatile xdata *)0xff54)

/////////////////////////////////////////////////

#endif

使用特权

评论回复
板凳
nwjjdwx|  楼主 | 2017-1-18 22:36 | 只看该作者
#include "intrins.h" 这个在这个程序里应该用不到。
各位朋友不吝赐教啊

使用特权

评论回复
地板
nwjjdwx|  楼主 | 2017-1-18 23:17 | 只看该作者
本帖最后由 nwjjdwx 于 2017-1-18 23:20 编辑

我把转换程序这样修改了一下行了,修改如下:

//////////////////////
/*    ADC转换程序   */
//////////////////////

void zhuanhuan()
    {
                    
                   P1ASF=0x08;          //P1ASF为ADC功能控制寄存器,赋值0x08为P1.3口为ADC输入(电量检测)
            ADC_CONTR=0xE3;      /*电量检测端(打开电源、转换最快、完成标志置0、开关位ADC_START位关闭、
                                                   置P1.3为ADC输入*/
          delayms(5);          //延时2毫秒
                 ADC_CONTR=0xEB;      //电量检测开(开始检测)

       //while(ADC_CONTR==0xFB)     //等待转换结束
                                  //{

                                    delayms(1);
                num=ADC_RESL;      //将转换结果赋值给num
                                    ADC_CONTR=0xE3;     //开关位ADC_START位关闭、完成标志置0、电源不关
                                                   //置P1.3为ADC输入
            
                                         //}
         
                                 
                  
                }
看来是我把while这句用错的,改后虽然能运行了,不过显然这样写是不合理的,希望大家赐教正确的写法。

使用特权

评论回复
5
徕泽| | 2017-1-19 08:35 | 只看该作者
这样写忙等待!
while(ADC_CONTR==0xFB);

使用特权

评论回复
6
renxiaolin| | 2017-1-19 09:26 | 只看该作者
那你R3,R4,那两个电阻接的LED那两个脚是啥脚

使用特权

评论回复
7
nwjjdwx|  楼主 | 2017-1-19 11:44 | 只看该作者
renxiaolin 发表于 2017-1-19 09:26
那你R3,R4,那两个电阻接的LED那两个脚是啥脚

我用的数码管是共阳的,R3、R4、是它的限流电阻,我只是实验一下,图的省事,其实这样接也是不合理的,理论上讲笔画多的数字显示亮度相对于笔画少的会暗一些,正确接法限流电阻应该接在数码管和单片机之间。

使用特权

评论回复
8
nwjjdwx|  楼主 | 2017-1-19 12:12 | 只看该作者
徕泽 发表于 2017-1-19 08:35
这样写忙等待!
while(ADC_CONTR==0xFB);

我也发现了,程序运行到这里就陷进去出不来了,希望赐教正确的写法。

使用特权

评论回复
9
nwjjdwx|  楼主 | 2017-1-19 12:32 | 只看该作者
renxiaolin 发表于 2017-1-19 11:57
看你的帖子,就是电压变化没有在num,那么你试试,不用ad,整个定时器,过1s,让led加1,试试num跟你的显 ...

显示的num的变量内容不用怀疑,有疑问提出来是对的,提出来我们共同学习吧,

使用特权

评论回复
10
nwjjdwx|  楼主 | 2017-1-19 12:37 | 只看该作者
本帖最后由 nwjjdwx 于 2017-1-19 12:41 编辑

这个问题我解决了,语句代码修改部分如下,贴出来和大家共同分享,权作抛砖引玉,如有更好方法,希望不吝赐教。void zhuanhuan()
    {
                    
                   P1ASF=0x08;                 //P1ASF为ADC功能控制寄存器,赋值0x08为P1.3口为ADC输入(电量检测)
            ADC_CONTR=0xE3;              /*电量检测端(打开电源、转换最快、完成标志置0、开关位ADC_START位关闭、
                                                           置P1.3为ADC输入*/
                       delayms(5);                   //延时2毫秒
                 ADC_CONTR=0xEB;            //电量检测开(开始检测)

      while(ADC_CONTR==0xEB);          //等待转换结束,如果ADC_CONTR==0xEB,                                                                                                                                            证明转换没有结束,继续原地循环。
                        num=ADC_RESL;         //将转换结果赋值给num
                     ADC_CONTR=0xE3;       //开关位ADC_START位关闭、完成标志置0、电源不关
                                                            //置P1.3为ADC输入
            
                                         
         
                                 
                  
                }

使用特权

评论回复
11
Ketose| | 2017-1-19 12:47 | 只看该作者
while(ADC_CONTR==0xFB)   
改为:while((ADC_CONTR & 0x10) == 0)

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
nwjjdwx + 2
12
nwjjdwx|  楼主 | 2017-1-19 17:04 | 只看该作者
本帖最后由 nwjjdwx 于 2017-1-19 17:06 编辑
Ketose 发表于 2017-1-19 12:47
while(ADC_CONTR==0xFB)   
改为:while((ADC_CONTR & 0x10) == 0)

我试过了,程序确实能够通过,感谢老师指点,不过我在这里又迷茫了,这个 0x10 是怎么来的?悟性差,看了半天没看明白,再请教,希望指点迷津

使用特权

评论回复
13
ningling_21| | 2017-1-19 17:11 | 只看该作者
nwjjdwx 发表于 2017-1-19 17:04
我试过了,程序确实能够通过,感谢老师指点,不过我在这里又迷茫了,这个 0x10 ...

这个看看芯片手册里的寄存器说明就知道了

使用特权

评论回复
14
nwjjdwx|  楼主 | 2017-1-19 18:25 | 只看该作者
本帖最后由 nwjjdwx 于 2017-1-19 18:30 编辑
ningling_21 发表于 2017-1-19 17:11
这个看看芯片手册里的寄存器说明就知道了

我看过手册,ADC_CONTR这个寄存器,选P1.3为输入口,选择转换速度为90个时钟周期,ADC电源打开,转换启动位打开,这时的二进制值是11101011=0xeb;转换结束后的二进制值是11111011=0xfb;而这个0x10=二进制的值是10000,也就是除了结束标志位为1,其它位均为0,迷茫点:没对ADC_CONTR进行其它操作,转换结束后除了结束标志位为1之外,其它位均会被自动清零?手册上只说启动位转换结束后回零,没说其它位也会回零,ketose老师给的代码语句绝对是对的,但他的实现原理是什么呢?迷茫在这了。希望版主老师不吝赐教,指点迷津

使用特权

评论回复
15
ningling_21| | 2017-1-19 19:02 | 只看该作者
nwjjdwx 发表于 2017-1-19 18:25
我看过手册,ADC_CONTR这个寄存器,选P1.3为输入口,选择转换速度为90个时钟周期,ADC电源打开,转换启动 ...

转换结束时为1,其它不相干的位不变,而不是自动清零

这样写的作用就是只判断这一个位,与其它位无关

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
nwjjdwx + 2 很给力!
16
Ketose| | 2017-1-19 22:05 | 只看该作者
0x10 就是屏蔽掉不相干的位,只判断结束标志位。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
nwjjdwx + 2
17
nwjjdwx|  楼主 | 2017-1-19 22:23 | 只看该作者
ningling_21 发表于 2017-1-19 19:02
转换结束时为1,其它不相干的位不变,而不是自动清零

这样写的作用就是只判断这一个位,与其它位无关 ...

谢谢两位老师的指导,解了我的迷茫,是我书看的太少了,老师不厌其烦使我很受益,这种写法是不是也可以用在其它类似的寄存器上,来解决其它类似的问题?

使用特权

评论回复
18
ningling_21| | 2017-1-20 08:43 | 只看该作者
nwjjdwx 发表于 2017-1-19 22:23
谢谢两位老师的指导,解了我的迷茫,是我书看的太少了,老师不厌其烦使我很受益,这种写法 ...

是的

写法可以很灵活

使用特权

评论回复
19
zhoukaiyue| | 2017-2-15 20:59 | 只看该作者
学习学习

使用特权

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

本版积分规则

7

主题

63

帖子

3

粉丝