196
259
639
高级会员
使用道具 举报 送花
11
486
1368
金牌会员
#include "reg51.h" //----------------------------------------- //define baudrate const //BAUD = 65536 - FOSC/3/BAUDRATE/M (1T:M=1; 12T:M=12) //NOTE: (FOSC/3/BAUDRATE) must be greater then 98, (RECOMMEND GREATER THEN 110) //#define BAUD 0xF400 // 1200bps @ 11.0592MHz //#define BAUD 0xFA00 // 2400bps @ 11.0592MHz //#define BAUD 0xFD00 // 4800bps @ 11.0592MHz //#define BAUD 0xFE80 // 9600bps @ 11.0592MHz //#define BAUD 0xFF40 //19200bps @ 11.0592MHz #define BAUD 0xFFA0 //38400bps @ 11.0592MHz typedef unsigned char uchar; typedef unsigned int uint; sfr AUXR = 0x8E; sbit RXB = P3^0; //define UART TX/RX port sbit TXB = P3^1; uchar TBUF,RBUF; uchar TDAT,RDAT; uchar TCNT,RCNT; uchar TBIT,RBIT; bit TING,RING; bit TEND,REND; uchar t, r; uchar buf[16]; //初始UART模块 void UART_INIT() { TING = 0; RING = 0; TEND = 1; REND = 0; TCNT = 0; RCNT = 0; TMOD = 0x00; //timer0 in 16-bit auto reload mode AUXR = 0x80; //timer0 working at 1T mode TL0 = BAUD; //波特率38400 TH0 = BAUD>>8; //initial timer0 and set reload value TR0 = 1; //tiemr0 start running ET0 = 1; //enable timer0 interrupt PT0 = 1; //improve timer0 interrupt priority EA = 1; //open global interrupt switch } // void main() { // P0M0 = 0x00; // P0M1 = 0x00; // P1M0 = 0x00; // P1M1 = 0x00; // P2M0 = 0x00; // P2M1 = 0x00; // P3M0 = 0x00; // P3M1 = 0x00; UART_INIT(); while (1) { //user's function if (REND) { REND = 0; buf[r++ & 0x0f] = RBUF; } if (TEND) { if (t != r) { TEND = 0; TBUF = buf[t++ & 0x0f]; TING = 1; } } } } //----------------------------------------- //Timer interrupt routine for UART void tm0() interrupt 1 using 1 { if (RING) { if (--RCNT == 0) { RCNT = 3; //reset send baudrate counter if (--RBIT == 0) { RBUF = RDAT; //save the data to RBUF RING = 0; //stop receive REND = 1; //set receive completed flag } else { RDAT >>= 1; if (RXB) RDAT |= 0x80; //shift RX data to RX buffer } } } else if (!RXB) { RING = 1; //set start receive flag RCNT = 4; //initial receive baudrate counter RBIT = 9; //initial receive bit number (8 data bits + 1 stop bit) } if (--TCNT == 0) { TCNT = 3; //reset send baudrate counter if (TING) //judge whether sending { if (TBIT == 0) { TXB = 0; //send start bit TDAT = TBUF; //load data from TBUF to TDAT TBIT = 9; //initial send bit number (8 data bits + 1 stop bit) } else { TDAT >>= 1; //shift data to CY if (--TBIT == 0) { TXB = 1; TING = 0; //stop send TEND = 1; //set send completed flag } else { TXB = CY; //write CY to TX port } } } } } //----------------------------------------- 复制代码
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2026-11-8 20:45 , Processed in 0.066261 second(s), 42 queries .
Powered by Discuz! X3.5
© 2001-2026 Discuz! Team.