×
嵌入式开发 > 详情

单片机通用模拟串口C程序

发布时间:2020-07-09 发布时间:
|
//----------------------------------------------------------------------

// UART.C

// 通用模拟串口程序

// 资源需求:一个硬件计数器,两个I/O口

// 硬件计数器的计数时间设定为三倍波特率

// 定义的两个I/O口,用于发送和接收,分别用在receive()和transmit(char)中

// 设立了专门的接收缓冲区,用于存储接收数据

// 注意:必需根据波特率来设定定时器;

// 每次通信开始必须调用初始化函数init_uart()

//----------------------------------------------------------------------------------------------------------------

//----------------------------------管脚定义、库函数声明-------------------------------------------------

#include reg51.h>

#include stdio.h>

//端口定义

sbit RXD3=P1^0;

sbit TXD3=P1^1;

//-----------------------------------------------变量声明-----------------------------------------------------

#define IN_BUF_SIZE 10 //输入缓冲区长度定义

#define TRUE 1

#define FALSE 0

static unsigned char inbuf[IN_BUF_SIZE]; //输入缓冲区

static unsigned char qin = 0;

static unsigned char qout = 0;

static char flag_rx_waiting_for_stop_bit;

static char flag_rx_off;

static char rx_mask;

static char flag_rx_ready;

static char flag_tx_ready;

static char timer_rx_ctr;

static char timer_tx_ctr;

static char bits_left_in_rx;

static char bits_left_in_tx;

static char rx_num_of_bits;

static char tx_num_of_bits;

static char internal_rx_buffer;

static char internal_tx_buffer;

static char user_tx_buffer;

//----------------------------------与硬件有关的函数声明------------------------------------------------

bit get_rx_pin_status(); //1.返回接收管脚返回的值(0或1)

void set_tx_pin_high(void); //2. 发送管脚置高,输出1

void set_tx_pin_low(); //3.发送管脚置低,输出0

void timer_set(); //4. 设置定时器的值为波特率的三倍

void set_timer_interrupt(); //5. 使能定时器中断

void idle(); //6.等待端口输入时,执行,根据具体应用进行修改

//-----------------------------------声明与硬件无关的函数-------------------------------------------

void flush_input_buffer( void ); // 清空接收缓存区

char kbhit( void ); // 判断数据是否正常接收

char get_char( void ); // 从接收缓存区读出一个数据

void turn_rx_on( void ); // 启动接收函数

void turn_rx_off( void ); // 结束接收函数

extern void put_char( char ); // 向发送端发送一个数据.

void timer_isr(void); //中断处理函数

//-------------------------------------------------------------------------------------------------------

// 函数名称:set_tx_pin_high

// 功能说明: 置串口发送端口为高,与硬件有关

//--------------------------------------------------------------------------------------------------------

void set_tx_pin_high( void)

{

TXD3=1;

}

//-------------------------------------------------------------------------------------------------------

// 函数名称: set_tx_pin_low

// 功能说明: 置串口发送端口为低,与硬件有关

//--------------------------------------------------------------------------------------------------------

void set_tx_pin_low( void)

{

TXD3=0;

}

//-------------------------------------------------------------------------------------------------------

// 函数名称:get_rx_pin_status

// 功能说明: 返回接收端口的状态,高为1,低为0,与硬件有关

//--------------------------------------------------------------------------------------------------------

bit get_rx_pin_status()

{

return(RXD3);

}

//-------------------------------------------------------------------------------------------------------

// 函数名称: timer_set

// 功能说明: 设置定时器工作状态,与硬件有关

//--------------------------------------------------------------------------------------------------------

void timer_set()

{

TMOD=0x22; //定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装)

PCON=0x00;

TR0=0; //在发送或接收才开始使用

TF0=0;

TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 执行的timer是

//104.167*11.0592/12= 96

TL0=TH0;

ET0=1;

}

//-------------------------------------------------------------------------------------------------------

// 函数名称: set_timer_interrupt

// 功能说明: 打开定时器中断允许,与硬件有关

//--------------------------------------------------------------------------------------------------------

void set_timer_interrupt()

{

EA=1;

}

//-------------------------------------------------------------------------------------------------------

// 函数名称: IntTimer0

// 功能说明: 定时器中断函数,与硬件有关,但不做处理,直接调用通用中断处理函数

//--------------------------------------------------------------------------------------------------------

void IntTimer0() interrupt 1

{

timer_isr(); //调用中断处理函数

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
智能化系统工程设计中的若干技术问题