📄 serial1.c
字号:
#include <string.h>
#include "C8051f.h"
#include "intrins.h"
#include "serial1.h"
#include "Timer.h"
extern unsigned char RecCh;
extern unsigned char RecFlag;
bit CommRecDataOverflowFlag1,FlagRecComm1,SendItComm1;
unsigned char CommSendBufferHead1, CommSendBufferTail1;
unsigned char CommRecBufferHead1, CommRecBufferTail1;
unsigned char xdata CommSendBuffer1[DB_SENDMAXSIZE1];
unsigned char xdata CommRecBuffer1[DB_RECMAXSIZE1];
void ClearCommRecBuffer1(void)
{
unsigned char i;
CommRecBufferHead1=CommRecBufferTail1=0;
CommSendBufferHead1=CommSendBufferTail1=0;
FlagRecComm1=0;
for (i=0;i<DB_SENDMAXSIZE1;i++)
{
CommSendBuffer1[i]=0;
}
for (i=0;i<DB_RECMAXSIZE1;i++)
{
CommRecBuffer1[i]=0;
}
}
void init_serial1(unsigned int baudr)
{
ClearCommRecBuffer1();
OpenComm1(baudr);
}
void OpenComm1(unsigned int baudr)
{
PCON |= 0x10; // SMOD=1 (HW_UART uses Timer 1 overflow with no divide down).
TMOD |= 0x20; // Configure Timer 1 for use by UART0
CKCON |= 0x10; // Timer 1 derived from SYSCLK
// RCAP2H=(65536-(SYSCLK/BAUDRATE0/32))/256;
// RCAP2L=(65536-(SYSCLK/BAUDRATE0/32))%256;
RCAP4H=(65536-(SYSCLK/baudr/32))/256;
RCAP4L=(65536-(SYSCLK/baudr/32))%256;
TH4=RCAP4H;
TL4=RCAP4L;
// CT2=0; //T2:timer mode
T4CON |=0x34;
// TR2=1;
// TCLK = 1;
// RCLK = 1; //说明:52,对于SIO0,可选择T1(TCLK=0,RCLK=0)或T2(TCLK=1,RCLK=1)作为波特率发生器
// SIO1只能用T1作为波特率发生器
//baud=OSC/(32*(65536-[RCAP2H,RCAP2L])
CommSendBufferHead1 = CommSendBufferTail1=0; // set the head and tail to the base of the ring buffer
CommRecBufferHead1 = CommRecBufferTail1=0;
FlagRecComm1=0;
// RI0=0; // Clear HW_UART receive and transmit
// TI0=0; // complete indicators.
// SCON1 &=0xfc;
SCON1 = 0x50; // Configure UART0 for mode 1, receiver enabled.
// ES0=1; // allow the serial interrupt
EIE2 |=0x40;
SendItComm1=1;
}
void PutChar1(unsigned char Ch)
{
SBUF1 = Ch;
while((SCON1 & 0x02) == 0x0)
;
SCON1 = SCON1 & 0xfd;
}
void SendCommString1(unsigned char *base)
{
unsigned int len;
unsigned char i;
len = strlen(base);
for(i = 0; i<len; i++)
{
PutChar1(base[i]);
Delay1ms(1);
}
}
void serial_send(unsigned char *base)
{
SendCommString1(base);
}
void CommISR1(void) interrupt 20
{
if ((SCON1&0x01)==0x01)
{
SCON1 &=0xfe;
RecCh = SBUF1;
RecFlag = 0x01;
}
}
//从接收缓冲区读数据 ,无数据返回0,有数据返回1
bit GetCommChar1(unsigned char *ch)
{
if (CommRecBufferTail1 == CommRecBufferHead1)
{
return 0;
}
*ch = CommRecBuffer1[CommRecBufferHead1];
CommRecBufferHead1++;
if (CommRecBufferHead1 == DB_RECMAXSIZE1)
{
CommRecBufferHead1 = 0;
}
if (CommRecBufferTail1 == CommRecBufferHead1)
{
FlagRecComm1 = 0;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -