📄 pca_uart0.c.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 + -