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

📄 mode3_master.c

📁 含20个经典例程
💻 C
字号:
//////////////UART0 模式3多机通讯主机程序/////////////////
/////////////mode3_master.c//////////////////////
#include <C8051F040.h>	
#define aalen 6
#define SLAVE_AD 0x80
typedef unsigned char uchar;
typedef unsigned int uint;
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 aa[aalen]={0x31,0x32,0x33,0x34,0x35,0x36};
xdata uchar res[aalen];
xdata uchar k;
xdata uchar t;
bit isfirstdata;
void delay1ms(uint time);
void uart0_ini();
void t1_ini();
void t1_baud(uchar t1h);
void t2_ini();
void t2_baud(uint t2reload);
void config (void) ;
void SendMesUart0(uchar adr,uchar *p);
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 = 0xd0; 
	//工作在模式3,且REN0=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 SendMesUart0(uchar adr,uchar *p){
	/*与从机一次完整的通讯采用固定长度数据,长度由宏定义aalen决定,adr为从机地址*/
	uchar i;
	SFRPAGE=0x00;
	TR2=1;
	for(i=0;i<aalen;i++){
		aa[i]=*p;
		*p++;
	}
	SCON0|=0x08;//将TB80置1,发送地址
	isfirstdata=1;
	k=0;
	SBUF0=adr;
}
void config (void) {
    WDTCN = 0x07;	//看门狗禁止
    WDTCN = 0xDE;   
    WDTCN = 0xAD;
    SFRPAGE = 0x0F;
    XBR0 = 0x04;	// 将UART0 TX0配置到P0.0口,RX0配置到P0.1口
    XBR1 = 0x00;	// 
    XBR2 = 0x40;	// Crossbar 交叉开关配置使能
    XBR3 = 0x00;    // 
    SFRPAGE = 0x0F;
    P0MDOUT = 0x00; // TX0和RX0为开漏模式,故宜加上拉电阻
    P1MDIN = 0xFF;  // Input configuration for P1
    SFRPAGE = 0x0F;
    CLKSEL = 0x00;  
    OSCXCN = 0x00;	
    OSCICN = 0x84;	
    //采用内部晶振,为24.5MHZ8分频
}   //End of config
void main(){
	xdata uchar sendd[aalen]={0xa0,0xa1,0xa2,0xa3,0xa4,0xa5};
	config();
	uart0_ini();
	t1_baud(10);//设置波特率为系统时钟320分频,3062500/320=9570,即波特率约为9600bps
	t2_baud(10);//设置波特率为系统时钟160分频,3062500/160=19140,即波特率约为19200bps
	EA=1;
	k=0;
	t=0;
	SendMesUart0(SLAVE_AD,sendd);
	while(1);
}
void uart0_ISR() interrupt 4{
	SFRPAGE=0x00;
	if(SCON0&0x01){//主机不接收数据
		SCON0&=0xfe;
	}
	if(SCON0&0x02){
		if(isfirstdata){
			SCON0&=0xf7;//发送第一个数据前须将TB80清零
			isfirstdata=0;
			}
		if(k<aalen)
			SBUF0=aa[k];//k小于数据长度时,继续发送数据
		SCON0&=0xfd;
		k++;
	}
}
	
	

⌨️ 快捷键说明

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