找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1551|回复: 0
收起左侧

52单片机串口发送

[复制链接]
ID:373565 发表于 2018-7-18 12:22 | 显示全部楼层 |阅读模式
/*-----------------------------------------------
  名称:串口通信
  编写:LZM
  日期:2015.05
  修改:无
  内容:连接好串口波特率设置为9600,无奇偶校验
        晶振11.0592MHz
                接上串口,可以接收到自己发送的字符
------------------------------------------------*/

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义                        

/*******************************************************************
请提前计算一下所选晶振能达到的最高速度,波特率不能超过最高速度
(1) 波特率加倍(SMOD=1):  Max_Baud = FOSC/12/16
(2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32
例如:22.1184MHz晶振,波特率加倍时,最大波特率=22118400/12/16=115200
*******************************************************************/
#define FOSC        11059200                //振荡频率
#define BAUD        9600                        //波特率
#define SMOD        1                        //是否波特率加倍
#if SMOD
        #define TC_VAL        (256-FOSC/16/12/BAUD)
#else
        #define TC_VAL        (256-FOSC/32/12/BAUD)
#endif

typedef unsigned char uint8;
typedef unsigned int uint16;

code const char str1[] = "The string is 来自单片机!\r\n";
code const char str2[] = "Author: louis \r\n";
//const  限定一个变量不允许被改变。在一定程度上提高程序安全性和可靠性
//code 存储区间为 程序存储区

/***************函数声明*******************/
void InitUART(void);
void SendOneByte(uint8);
void SendrStr(const uint8 *ptr);

/****************主函数********************/
void main(void)
{
    uint8 i=0;
    InitUART();

    while(str2[i]!='\0')
    {
        SendOneByte(str2[i++]);       
    }

    SendrStr(str1);

    while(1);
}

/****************中断服务函数***************/
void UART_ISR(void) interrupt 4
{
    uint8 RX_Data;
    //只响应"接收"中断,"发送"中断来了就直接抹掉
    if(RI)
   {
     RI = 0;        //串口中断标志不能自己清除,需要手动清除
     RX_Data=SBUF;
     SendOneByte(RX_Data);
   }
   else
     TI = 0;                //串口发中断是发送完缓冲区数据之后产生
}

/****************串口初始化函数*************/
void InitUART(void)
{
    TMOD = 0x20;    //定时器1,模式2工作模式          
    SCON = 0x50;    //串口工作模式1,允许REN   /* SCON: 模式 1,  8-bit UART, 使能接收         */
    TH1 = TC_VAL;
    TL1 = TH1;
    PCON = 0x80;         //发送速率加倍
    ES = 1;
    EA = 1;
    TR1 = 1;
}
/**************串口发送字符函数*************/
void SendOneByte(uint8 c)
{
    ES = 0;                        //禁止中断,让串口安心工作啊
    SBUF = c;
    while(!TI);                //等待发送完毕
    TI = 0;                        //清TI中断
    ES = 1;                        //打开中断
}
/**************串口发送字符串函数*************/
void SendrStr(const uint8 *ptr)
{
    do
    {
        SendOneByte(*ptr);                //其实发送字符串也是在调用发送字符的函数~~
    }while(*ptr++!='\0');        //要有结束判断,否则串口发送 字符串 不知道什么时候停止
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表