stc12c56 串口(没有用独立波特率发生器,用T1不分频。中断式接受与发送)
//烧写程序时,一定要选用外部晶振(烧写软件默认为内部晶振(5M~6M)) //烧写时,有时候写不进去,尝试断开地线,然后接上上电 #include<reg51.h> #include<intrins.h> sfr AUXR=0x8e; //sfr AUXR1=0xA2; //sfr BRT=0x9c;
unsigned char array[9]={0,2,4,6,8,10,12,14,16} ; #define RELOAD_COUNT ?? ? 0xf3; //4M晶振,smod=0,9600bps 实际波特率=4000000/(256-243)/32=9615.误差=15/9600=0.16% ?? ??? ??? ??? ??? ??? ??? ?? //具体计算看《STC12C5A60S2》第79页及其之后 void serial_port_initial(void); void send_UART(unsigned char i); void UART_Interrupt_Receive(void);
void main() { ? unsigned char i=0; ? serial_port_initial(); ?? for(i=0;i<9;i++) ??? { ? ?? ?? send_UART(array[i]);?? ? ??? } ? ?? while(1)?? ?; ?? ? }
void serial_port_initial(void)?? ?? // 使用独立波特率发生器作为波特率发生器 { ? SCON=0x50;//8位可变波特率,无奇偶校验位 ? TMOD=0X21; ? AUXR=0x40; //T1定时器不分频,1T的速度 ? TH1=RELOAD_COUNT; ? TL1=RELOAD_COUNT; ? TR1=1; ? ES=1;?? ??? ??? ? // 允许串口中断 ? EA=1;????????? // 开总中断 }
void send_UART(unsigned char i) { ? ES=0;?? ??? // 关串口中断 ? TI=0;?? ?// 清零串口发送完成中断请求标志 ? SBUF=i;?? ? ? while(TI==0);?? ? //?? 等待发送完成 ? TI=0;?? ??? ??? ?//? 清零串口发送完成中断请求标志 ? ES=1;?? ??? ?//?? ? 允许串口中断 }
void UART_Interrupt_Receive(void)? interrupt 4 { ? unsigned char k=0; ? if(RI==1) ? { ??? RI=0; ?? ?k=SBUF; ?? ?send_UART(k); ? } ? else ? { ? ?? ?TI=0; ? } }
|