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

📄 dual-uart.c

📁 Silicon 8051F310双串口模拟程序源代码
💻 C
字号:


#include <c8051f310.h>

sbit BT_SND =P3^1;
sbit BT_REC =P3^2;
#define MODE_QUICK  
#define F_TM F0

sbit ACC0= ACC^0;
sbit ACC1= ACC^1;
sbit ACC2= ACC^2;
sbit ACC3= ACC^3;
sbit ACC4= ACC^4;
sbit ACC5= ACC^5;
sbit ACC6= ACC^6;
sbit ACC7= ACC^7;

void IntTimer0() interrupt 1
{
 F_TM=1;
}

///////////////////////////////////////////////////////////
//------------------发送一个字符-------------------------//
///////////////////////////////////////////////////////////
void PSendChar(unsigned char inch)
{
	
	ACC=inch;
	
	F_TM=0;
	BT_SND=0;    //start bit 
	TR0=1;       //TIMER0启动
	while(!F_TM);
	
	BT_SND=ACC0; //先送出低位
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC1;
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC2;
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC3;
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC4;
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC5;
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC6;
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC7;
	F_TM=0;
	while(!F_TM);
	
	BT_SND=1;    //将发送端置高
	F_TM=0;
	while(!F_TM);
	 
	TR0=0; //停止计数

	}
///////////////////////////////////////////////////////////////////
//------------------------接收一个字符-----------------------------
///////////////////////////////////////////////////////////////////
unsigned char PGetChar()
{

TL0=TH0;
TR0=1; 
F_TM=0;
while(!F_TM); //等过起始位
ACC0=BT_REC;

TL0=TH0;

F_TM=0;
while(!F_TM);
ACC1=BT_REC;

F_TM=0;
while(!F_TM);
ACC2=BT_REC;

F_TM=0;
while(!F_TM);
ACC3=BT_REC;

F_TM=0;
while(!F_TM);
ACC4=BT_REC;

F_TM=0;
while(!F_TM);
ACC5=BT_REC;

F_TM=0;
while(!F_TM);
ACC6=BT_REC;

F_TM=0;
while(!F_TM);
ACC7=BT_REC;

F_TM=0;
while(!F_TM)
{
if(BT_REC)
{
break;
}
}
TR0=0; //停止timer
return ACC;
}



///////////////////////////////////////////////////////////////////
//----------------------检查是不是有起始位-----------------------//
///////////////////////////////////////////////////////////////////
bit StartBitOn()
{

	while(BT_REC==1);
	return 1;
}



///////////////////////////////////////////////////////////////////
//---------------------------主函数------------------------------//
///////////////////////////////////////////////////////////////////
void main()
{
unsigned int i;
unsigned char gch;

PCA0MD &= ~0x40;                    // WDTE = 0 (clear watchdog timer enable)

OSCICN |= 0x03;                     // Configure internal oscillator for
                                       // its maximum frequency
RSTSRC = 0x04;                      // Enable missing clock detector

XBR0    = 0x01;                     // Enable UART on P0.4(RX) and P0.5(TX)                     
XBR1    = 0x40;                     // Enable crossbar and enable 
//P3MDIN =0x1B; //P3.2 in
P3MDOUT=0x02; //P3.1 out

BT_SND=1;
BT_REC=1;

TMOD=0x22;     //定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装)
PCON=00;
TR0=0;         //在发送或接收才开始使用
TF0=0;         //T/C0计数溢出时由硬件置位,当CPU响应中断时,由硬件清除
TH0=(256-220); //9600bps 就是1000000/9600=104.167微秒执行的timer是104.167*25.4/12=220
TL0=TH0;
ET0=1;         //T/C0开中断
EA=1;          //全局中断开

PSendChar(0x55);
PSendChar(0xaa);
PSendChar(0x00);
PSendChar(0xff);

//while(1);

while(1)
{
if(StartBitOn())
{
for(i=0;i<100;i++);
gch=PGetChar();
PSendChar(gch);
}

}

}

⌨️ 快捷键说明

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