⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pca_uart0.c.c

📁 c8051单片机源程序
💻 C
字号:
//////////////用PCA检测UART0特波率调试程序/////////////////
/////////////pca_UART0.c//////////////////////
#include <C8051F040.h>	// Register definition file.
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
xdata uchar k;
xdata uchar t;
enum {aalen=3};
sbit p00=P0^0;
uchar testdata;//发送测试数据
void delay1ms(uint time);
void uart0_ini();
void t1_ini();
void t1_baud(uchar val);
void t2_ini();
void t2_baud(uint t2reload);
void config (void) ;
xdata ulong pcacap0[40];
void uart0_ini(){
    SFRPAGE = 0x00;
    SADEN0 = 0x00;      
	// SADEN0为UART0从机地址控制寄存器,0表示相应位地址不参加过滤,即该位地址值为0或1均为有效地址
    SADDR0 = 0x00;    
	// SADDR0为UART0从机地址设置寄存器
    SSTA0 = 0x01;      
	// SMOD0=0,UART0波特率2分频禁止
	//TX时钟源为T2,RX时钟源为T1
    SCON0 = 0x50; 
	//工作在模式1
    SCON0 &= 0xFC; 	//将TI0和RI0清零
    IE|=0x10;
    t1_ini();
	t2_ini();
 }
void t1_ini(){
    SFRPAGE = 0x00;
    CKCON = 0x10;   // T1采用系统时钟,不分频
    TMOD = 0x20;    // T1为8bit自动重载模式
    TCON = 0x40;    // TR1置1,启动定时器
}
void t1_baud(uchar val){//T1溢出率设置,溢出率为(T1时钟频率)/(val)
	SFRPAGE = 0x00;
	TH1 = ~val+1;     
	TL1 = TH1;     
}
void t2_ini(){
	SFRPAGE = 0x00;
	TMR2CF = 0x08; 
	//T2为系统时钟不分频,计数方向为增值计数
    TMR2CN = 0x04;  // TR2置1,启动定时器
}
void t2_baud(uint t2reload){//T2溢出率设置,溢出率为(T2时钟频率)/(t2reload)
	SFRPAGE = 0x00;
	RCAP2=~t2reload+1;
	TMR2=RCAP2;
}
void pca0ini(){//PCA CEX4配置为正负边沿均捕捉
	SFRPAGE=0x00;
	PCA0CPM0 = 0x31;    
 	PCA0CPL0 = 0x00;    
 	PCA0CPH0 = 0x00;    
}
void pcaini(){
	SFRPAGE=0x00;
	PCA0MD=0x09;
	PCA0CN=0x40;
	EIE1|=0x08;
}
void config(){
//看门狗禁止
	WDTCN = 0x07;	
    WDTCN = 0xDE;   
   	WDTCN = 0xAD;
	SFRPAGE = 0x0F;
//交叉开关配置,TX0=P0.0;RX0=P0.1,CEX0=P0.2,将TX0与CEX0相连
	XBR0 = 0x34;	
	XBR1 = 0x00;	
	XBR2 = 0x40;
 	XBR3 = 0x00;   
//管脚输出配置,P0口为开漏输出,其中P0.6接上拉电阻,P0为数字输入口
 	SFRPAGE = 0x0F;
 	P0MDOUT = 0x00; 
 	P1MDIN = 0xFF;  
//晶振配置,采用内部晶振8分频
	SFRPAGE = 0x0F;
 	CLKSEL = 0x00;  
	OSCXCN = 0x00;	
	OSCICN = 0x84;	
}
void main(){
	config();
	uart0_ini();
	t1_baud(0x24);
	t2_baud(100);
	pcaini();
	pca0ini();
	EA=1;
	k=0;
	t=0;
	testdata=0xaa;
	SFRPAGE=0x00;
	SBUF0=testdata;//启动发送
	while(1){
		if(k>=aalen){
			SFRPAGE=0x00;
			//TR2=0;//停止定T2时器,从而停止发送
		}
		if(t>=aalen){
			SFRPAGE=0x00;
			//TR1=0;//停止定T1时器,从而停止接收
		}
	}
}
void uart0_ISR() interrupt 4{//全双工发送接收
	uchar temp;
	SFRPAGE=0x00;
	if(SCON0&0x01){
		t++;
		temp=SBUF0;
		SCON0&=0xfe;
	}
	if(SCON0&0x02){
		k++;
		SBUF0=testdata;//从aa数组中取数据发送
		SCON0&=0xfd;
	}
}
void PCA_ISR(void) interrupt 9  {
	static xdata  uchar num1=0;
	static xdata uint tmpcnt=0;
	SFRPAGE = 0x00;
	if(CF){
		CF=0;
	}
	if(CCF0){
		pcacap0[num1]=PCA0CP0-tmpcnt;
		tmpcnt=PCA0CP0;
		if(!p00)
			pcacap0[num1]+=10000000L;//若P0.0上一检测周期为逻辑1,数据加上10000000L与逻辑0相区别
		num1++;
		if(num1>=100){
			num1=0;
		}	
		CCF0=0;
	}
  }	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -