(3) C 错误 代码来源:AD 转换器+PCA

#include<stdio.h>
#include<REG52.h>
#include <intrins.h>

typedef unsigned char uint8;
typedef unsigned long ulint;

//                                            7        6      5       4         3      2    1    0   Reset Value
//sfr ADC_CONTR = 0xBC; //A/D ???????        ADC_POWER  SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
//sfr ADC_RESL = 0xBE;  //A/D ?????2?                                           ADCV.1 ADCV.0    0000,0000
//sfr ADC_RES  = 0xBD;  //A/D ?????8?        ADCV.9     ADCV.8 ADCV.7 ADCV.6    ADCV.5  ADCV.4 ADCV.3 ADCV.2     0000,0000

#define FOSC 11059000
#define BAUD 115200

#define ADC_POWER   (0x01<<7)
#define ADC_SPEED0      (0x00<<5)
#define ADC_SPEED1      (0x01<<5)
#define ADC_SPEED2      (0x02<<5)
#define ADC_SPEED3      (0x03<<5)




#define ADC_FLAG    (0x01<<4)
#define ADC_START   (0x01<<3)
#define CHANNEL0     (0x00<<0)
#define CHANNEL1    (0x01<<0)
#define CHANNEL2     (0x02<<0)
#define CHANNEL3     (0x03<<0)

uint8 data Byte[5]; 

int         i=0;

void Timer0_Init();
void ADC_Init();
void Interrupt_Init();

void Timer0_Init() // ¶¨Ê±Æ÷0³õʼ»¯£¬ÒÔ16λ·½Ê½1¹¤×÷
{
    TMOD=0x01;  // ¶¨Ê±Æ÷0¹¤×÷·½Ê½1 ¼ÆÊý65535Òç³ö £»
    AUXR|=0x11;  // Ñ¡ÔñBRTΪ²¨ÌØÂÊ·¢ÉúÆ÷£»   BRTx12=1,12·ÖƵ£» 
    TCON=0;         // TF = 0;TR = 0
    TL0=0x00;       // TH0=(65536 - 10ms/(12*1/11.059M))/256
    TH0=0x01;0xDC;      // TL0=(65536 - 10ms/(12*1/11.059M))%256
}

void Baud_Init()    // ´®ÐпÚ1³õʼ»¯
{
    PCON=0;         // SMOD = 0 ²¨ÌØÂʲ»¼Ó±¶
    SCON=0x50;
    AUXR|=0x04;  
    BRT=0xFD ;  // BAUD = 115200
}

void ADC_Init()
{
    P1ASF       =   0x03;
    ADC_CONTR   =   0xE8;//                  ADC_POWER  SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 
                                                //                  1           1       1       0       1       0    0    0
    AUXR1       =   0; 
    ADC_RES     =   0;
    ADC_RESL    =   0;
        EADC    =1;
}

void Interrupt_Init()
{

    ET0     =1;         // ¿ªÆô¼ÆʱÆ÷0ÖжÏ
    IPH     =0x10;   // TIMER0= 0 0 ; UART1= 0 1
    IP      =0x20;
    EA      =1;             // ¿ªÆô×ÜÖжÏ
}

void Timer0_Interrupt () interrupt 1
{   
    TF0=0;          // Òç³ö±êÖ¾Çå³ý£¬ÖØ×°³õÖµ
    TL0=0;          // TH0=(65536 - 10ms/(12*1/11.059M))/256
    TH0=0xDC;       // TL0=(65536 - 10ms/(12*1/11.059M))%256

    ADC_Init();// ¿ªÆôADC

    _nop_();
    _nop_();
    _nop_();
    _nop_();

/*  
    i=1;
    i=2;
    i=3;
    i=0;

    while(1);
    while(1);
    while(1);
    while(1);
*/


}

void ADC_Interrupt () interrupt 5
{
        //printf("%d\r",(unsigned int)ADC_RES<<2+ADC_RESL
        ADC_CONTR&=(~ADC_FLAG);
    if (i<5)
    {
        Byte[i]= ADC_RES;

        i++;
    }
    else
    {
        EADC    =0;
        ADC_CONTR&=(~ADC_START);
        ES=0;
        TI=1;
        for (i=0;i<5;i++)
        {
            //TI=1;
        printf("a=%d\r",(unsigned int)Byte[i]);
        }
    }
}
void main()
{
     AUXR=0;
     Baud_Init();
     Timer0_Init();
     Interrupt_Init();  

     TR0=1;
     while(1);
}

1.while(1); 是死循环

2.main 中 TR0=1; 忘记启动

3.波特率BRT设置为9600,但当作115200

4.设置波特率时,即便没用串口也需要设置相关寄存器

5.寄存器初始化设置时,用 如 AUXR | = 0x04 ;更规范,不会覆盖。

6.不可位寻址的寄存器设置某位时,取反用 ~ 字节取反,仅将取的位置反,其余不变。
而 ^ 为位取反。

7.Byte [ i ] = ((int)ADC_RES<<2)+ADC_RESL; 两段数据拼接在一起,在移位之前需要先扩展数据大小。

8.·
CCAP0L=300;
CCAP0H=00;
赋值顺序写反,影响比较器使能。

void PCA_Init()
{
    CMOD=0x00;//0x04;//0x05;// CIDL   -     -     -   CPS2   CPS1  CPS0  ECF
                            //  0                       0     1     0     1
    CCON|=0x40;         //  CF    CR    -     -     -     -    CCF1  CCF0
                        //  0     1                            0     0     
    CCAPM0=0x49;            //  -    ECOM0  CAPP0  CAPN0  MAT0  TOG0  PWM0  ECCF0
                            //        1       0      0      1     0     0     1
    CCAP0L=300;
    CCAP0H=00;
    CH=CL=0;

·

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值