|
;******************************* ; 主 程 序 ;******************************* MAINPG: ANL PCA0MD,#0xBF ;WDTE=0:禁止看门狗定时器 ; MOV PCA0MD,#0x89 ;选择PCA计数器的时钟源=系统时钟;允许PCA计数器/定时器溢出中断 MOV PCA0CPL2,#0xFF ;看门狗定时器:32.1x12mS ; ORL VDM0CN,#0x80 ;VDD监视器使能位 MOV RSTSRC,#0x06 ;允许时钟丢失检查;使能VDD监视器为复位源. ; RSTSRC = 0x04; // 检测到时钟丢失时允许系统复位 ; MOV OSCICN,#0x83 ;允许内部振荡器,频率=24.5MHz.不分频 osc_wait: MOV A,OSCICN ;等待内部振荡器频率有效(IFRDY=1) JNB ACC.6,osc_wait ;------------------------------- CLR A MOV REF0CN,#0x03 ;基准电压控制寄存器(1->BIASE,REFBE) ; ; MOV ADC0CF,#0x10 ;选择快速滤波器;内部VREF(2.5V) MOV ADC0CF,A ;选择SINC3滤波器;内部VREF(2.5V) ; MOV ADC0CN,#0x12 ;差分双极性方式(结果值为2的补码)GA增益=4 ; MOV ADC0CLK,#0x09 ;调制器时钟MDCLK=2.4576 MHz;(采样速率=19.2 KHz) ; MOV ADC0DECH,#0x01 ;抽取比=DECI[10:0]+1=384[0x180](必须是8的整数倍!) MOV ADC0DECL,#0x7F ;ADC0转换周期=[384*128]/2.4576MHz=20mS(50Hz) ; ; MOV ADC0BUF,A ;禁止正负通道高低输入缓冲器。 ; MOV ADC0BUF,#0xAA ;正负通道高输入缓冲器使能。 MOV ADC0BUF,#0x55 ;正负通道低输入缓冲器使能(ADin<5mVx100=0.5V)。 ; ; MOV ADC0MUX,#0x08 ;单端输入方式:0x08->0x28->0x48 MOV ADC0MUX,#0x01 ;选择正负通道:0x01->0x23->0x45 MOV ADC0MD,#0x80 ;ADC0使能;空闲方式中。 ;------------------------------- ;定时器0 计数器:每秒数波头(5KHz-15KHz) ;定时器1 波特率发生器:BaudRate=2^(SMOD0) x fT1 /32=fT1/16 ;定时器2 25mS定时,每秒采样频率一次 ;------------------------------- MOV TMOD,#0x25 ;T1:波特率发生器;T0:计数器:每秒数波头 MOV SCON0,#0x10 ;RS485:8位,接收允许;方式1:波特率可编程的8位UART MOV CKCON,A ;定时器0,1,2使用系统时钟/12(24.5MHz/12) MOV TH1,#0x96 ;波特率=9600bps MOV TL1,TH1 MOV TMR2CN,A MOV TMR2RLH,#0x38 ;25.000163265mS MOV TMR2RLL,#0x9E ; MOV P0MDIN,#0x7F ort0:0:模拟;1:数字 MOV P1MDIN,#0xFF ort1: MOV P0MDOUT,A ort0:0:漏极开路;1:推挽 MOV P1MDOUT,#0xF0 ort1: MOV P0SKIP,#0xCF ort0:1:被交叉开关跳过 MOV P1SKIP,#0xFE ort1: ; MOV XBR0,#0x01 ;使能UART:TX0,RX0->0.4.5 MOV XBR1,#0x50 ;使能弱上拉,允许XBR,T0->1.0 ; MOV FLSCL,A ;最小写入时间 MOV EMI0CN,A ;选择外部数据存储器低256位 ; MOV R0,#STACK MOV SP,#STACK ;初始化堆栈指针 RAMCLR: MOV @R0,A DJNZ R0,RAMCLR MOV R0,#BUF0 MOV R1,#BUFER MOV R0_1,#RS_OUT MOV R1_1,#RS_IN MOV CNTSEC,#40 ;40*25mS=1s:采样频率信号 MOV CNTCMP0,#7 MOV CNTCMP1,#7 MOV CNTCMP2,#7 MOV CNTCMPA,#3 MOV FCTCMP,#3 MOV CNTKEY,#8 MOV KEYDAT,#0xFF MOV AD_CNT,#11 ;每个AD通道连续采样10次 ; MOV ADC0MUX,#0x01 ;选择正负通道:0x01->0x23->0x45 ORL ADC0MD,#1 ;首先执行全内部校准(偏移和增益) NOP JB AD0CALC,$ ;=1:ADC0正在校准 CLR AD0INT ; MOV CNTSPK,#120 CLR SPEAK ; CLR SW_RS ;选择接收 SETB TR0 SETB TR1 SETB TR2 ;启动定时器2(触发ADC);定时器2外部时钟为系统时钟/12 SETB ET2 ;定时器2中断 SETB ES0 ORL EIE1,#8 ;1->EADC0 ; SETB PT2 ;定时器2中断优先 SETB EA ;开全局中断 ; MOV ADC0MD,#0x80 ;ADC0空闲 MOV ADC0MUX,#0x01 ;选择正负通道:0x01->0x23->0x45 ORL ADC0MD,#2 ;启动单次转换
|
|