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

📄 main.c

📁 手把手教你单片机
💻 C
字号:
/*
 * IO 模拟 UART
 *
 * author:金沙滩--刚哥
 * date:2011.1.9
*/

#include <reg52.h>

typedef unsigned char uint8;
typedef unsigned int uint16;

sbit RXD2 = P3^0;
sbit TXD2 = P3^1;

#define MCLK		11059200UL
#define BAUD_RATE	9600UL

#define WAIT_TIME()	do{while(!TF0);TF0 = 0;}while(0)

/*
 * 定时器初始化
*/
void timer0_init(void)
{
	TMOD &= 0xF0;
	TMOD |= 0x02;                //计数器0,方式2
	TH0 = 256 - MCLK/(12*BAUD_RATE);
	TL0 = TH0;
	TF0 = 0;
	TR0 = 0;
}

/*
 * UART发送
*/
void UART_send_byte(uint8 dat)
{
	uint8 len=8;
	
	// 1. start bit
	TL0 = TH0;
	TR0 = 1;
	TXD2 = 0;
	WAIT_TIME();
	// 2. DAT_LEN bit data
	while (len--)
	{
		TXD2 = (bit)(dat & 0x01);     //先发送低位
		WAIT_TIME();
		dat = dat>>1;
	}
	// 3. stop bit
	TXD2 = 1;
	WAIT_TIME();
	TR0=0;
}

/*
 * UART接收
*/
uint8 UART_rev_byte(void)
{
    uint8 len=8, dat=0;

	while (RXD2);

	// 1. jump start bit
	TR0 = 1;
	TL0 = 256 - MCLK/(12*BAUD_RATE)/2;
    WAIT_TIME();
	WAIT_TIME();  

    // 2. receive DAT_LEN bit data
    while (len--)
    {
        dat >>= 1;
        if (RXD2) 
			dat  |= 0x80;
		WAIT_TIME();
    }

	// 3. wait stop bit
	WAIT_TIME();
	TR0 = 0; 

    return dat;
}


main()
{
	uint8 a;

	timer0_init();

	while (1)
	{

		UART_send_byte('i');
		UART_send_byte('n');
		UART_send_byte('p');
		UART_send_byte('u');
		UART_send_byte('t');
		UART_send_byte(':');

		a = UART_rev_byte();
		UART_send_byte(a);
		
		UART_send_byte('\r');
		UART_send_byte('\n');
	}
}

⌨️ 快捷键说明

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