#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;
·