//////////////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++;
}
}
UART0.rar_C8051F040_CH372 C8051F040_c8051f040 串口_c8051f040串口_uar
版权申诉
56 浏览量
2022-09-14
16:13:33
上传
评论
收藏 14KB RAR 举报
我虽横行却不霸道
- 粉丝: 75
- 资源: 1万+
最新资源
- Panoply软件是大名鼎鼎的NASA下属的GISS研究所开发的可视化软件,该软件可以实现对地学常用数据的读取,其中包括netC
- 一些高质量的学习Ruby的资源清单.zip
- 基于STM32智能家居(智能云)
- 适合江苏地带的别墅小院子图纸D038-两层-11.04&11.94米-施工图.dwg
- 农村小别墅图纸四合院图纸D037-两层-13.20&12.90米-施工图.dwg
- 农村别墅系列图纸cad图纸D035-两层-10.20&14.70米- 施工图.dwg
- Verilog硬件仿真过程中出现的X态总结
- 中国各省份2012-2020年政府财政支出占GDP的比重
- 旅游管理系统毕业设计+计算机专业本科毕业设计+Vue+JS框架
- 农村小别墅二层小楼图纸D034-两层-11.40&14.70米- 施工图.dwg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈