找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4410|回复: 2
打印 上一主题 下一主题
收起左侧

STC单片机串口发送 不需要while死等 串口接收执行软件复位

[复制链接]
跳转到指定楼层
楼主
ID:390416 发表于 2021-1-3 11:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//以下代码在WQX-15开发板上,使用STC15W4K核心板调试串口1,晶振30M,波特率9600。
bit Uart1_Flag=1;
u8 code Uart1_Up_Symbol_Buffer[30]={"\r\n温度:  遥控解码:  超声波:mm"};
u8 xdata Uart1_Up_Num_Buffer[10];
//*********************************《人人学会单片机》视频教程,祁绪电子2020-05
//串口初始化,配置定时器&波特率。STC15W,30M晶振,9600.
//*********************************《人人学会单片机》视频教程,祁绪电子2020-05
void Uart1_Init()
{
        SM0=0;
        SM1=1;
        REN=1;
        //SCON|=0x50;
        PCON&=0x3f;
        AUXR|=0x01;
        AUXR|=0X14;
        T2H=0xfc;
        T2L=0xf3;
        ES=1;
}

//*********************************《人人学会单片机》视频教程,祁绪电子2020-05
//串口发送函数。主函数调用,或者串口发送完中断后马上调用
//*********************************《人人学会单片机》视频教程,祁绪电子2020-05
void Uart1_Up_Data_Drive()
{
        static u8 xdata count=0;
        if(Uart1_Flag)                                                                                        //标志允许,发送一个字节
        {
                Uart1_Flag=0;                                                                                //标志位翻转,只允许发送一个字节
                count++;                                                                                        //字节编号增加。
                switch(count)
                {
                        case 1 : SBUF=Uart1_Up_Symbol_Buffer[0];break;        //发送汉字的ASCII
                        case 2 : SBUF=Uart1_Up_Symbol_Buffer[1];break;
                        case 3 : SBUF=Uart1_Up_Symbol_Buffer[2];break;
                        case 4 : SBUF=Uart1_Up_Symbol_Buffer[3];break;
                        case 5 : SBUF=Uart1_Up_Symbol_Buffer[4];break;
                        case 6 : SBUF=Uart1_Up_Symbol_Buffer[5];break;
                        case 7 : SBUF=Uart1_Up_Symbol_Buffer[6];break;
                        case 8 : SBUF=Uart1_Up_Num_Buffer[0];break;                //发送数值 温度
                        case 9 : SBUF=Uart1_Up_Num_Buffer[1];break;
                        case 10 :SBUF=Uart1_Up_Num_Buffer[2];break;
                        case 11 :SBUF=Uart1_Up_Num_Buffer[3];break;
                       
                        case 12 : SBUF=Uart1_Up_Symbol_Buffer[7];break;        //发送汉字的ASCII
                        case 13 : SBUF=Uart1_Up_Symbol_Buffer[8];break;
                        case 14 : SBUF=Uart1_Up_Symbol_Buffer[9];break;
                        case 15 : SBUF=Uart1_Up_Symbol_Buffer[10];break;
                        case 16 : SBUF=Uart1_Up_Symbol_Buffer[11];break;
                        case 17 : SBUF=Uart1_Up_Symbol_Buffer[12];break;
                        case 18 : SBUF=Uart1_Up_Symbol_Buffer[13];break;
                        case 19 : SBUF=Uart1_Up_Symbol_Buffer[14];break;
                        case 20 : SBUF=Uart1_Up_Symbol_Buffer[15];break;
                        case 21 : SBUF=Uart1_Up_Symbol_Buffer[16];break;
                        case 22 : SBUF=Uart1_Up_Symbol_Buffer[17];break;
                        case 23 : SBUF=Uart1_Up_Num_Buffer[5];break;        //发送数值 遥控
                        case 24 : SBUF=Uart1_Up_Num_Buffer[6];break;
                       
                        case 25 : SBUF=Uart1_Up_Symbol_Buffer[18];break;//发送汉字的ASCII
                        case 26 : SBUF=Uart1_Up_Symbol_Buffer[19];break;
                        case 27 : SBUF=Uart1_Up_Symbol_Buffer[20];break;
                        case 28 : SBUF=Uart1_Up_Symbol_Buffer[21];break;
                        case 29 : SBUF=Uart1_Up_Symbol_Buffer[22];break;
                        case 30 : SBUF=Uart1_Up_Symbol_Buffer[23];break;
                        case 31 : SBUF=Uart1_Up_Symbol_Buffer[24];break;
                        case 32 : SBUF=Uart1_Up_Symbol_Buffer[25];break;
                        case 33 : SBUF=Uart1_Up_Symbol_Buffer[26];break;
                        case 34 : SBUF=Uart1_Up_Num_Buffer[7];break;        //发送数值 超声波
                        case 35 : SBUF=Uart1_Up_Num_Buffer[8];break;
                        case 36 : SBUF=Uart1_Up_Num_Buffer[9];break;
                        case 37 : SBUF=Uart1_Up_Symbol_Buffer[27];break;//发送汉字的ASCII
                        case 38 : SBUF=Uart1_Up_Symbol_Buffer[28];break;
                        case 39 :count=0;break;//最后一步 没有发送字节,串口TI不会置1,所以不再发送
                }
        }
}
//*********************************《人人学会单片机》视频教程,祁绪电子2020-05
//串口中断,接收一个字节,马上发送N个字节,发送数组显示到电脑
//*********************************《人人学会单片机》视频教程,祁绪电子2020-05
void Uart1_Routine() interrupt 4
{
        static char Uart1_ser_n=0;                                                                //用于接收计数
        if(RI)                                                                                                        //如果接收到一个字节
        {
                RI=0;                                                                                                //标志位清除
                Uart1_Flag=1;                                                                                //串口发送允许
                if(SBUF==0x7f)//9600波特率                                                        //判断连续多个0x7f
                {
                        Uart1_ser_n++;                                                                        //判断连续多个0x7f
                        if(Uart1_ser_n>=10)                                                                //判断连续多个0x7f
                        {
                                Uart1_ser_n=0;                                                                //清0
                                IAP_CONTR|=0xe0;                                                        //执行自动软复位,可以做调试用
                        }
                }
        }
        if(TI)                                                                                                        //如果上一个字节发送完成了       
        {
                TI=0;                                                                                                //标志位清除
                Uart1_Flag=1;                                                                                //串口发送允许
                Uart1_Up_Data_Drive();                                                                //执行串口发送下一个字节
        }
}

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:878235 发表于 2021-1-16 22:10 | 只看该作者
个人觉得,如果不死等,应该有一个估计的时间等待。
回复

使用道具 举报

板凳
ID:390416 发表于 2021-1-20 17:08 | 只看该作者
zpmpok001 发表于 2021-1-16 22:10
个人觉得,如果不死等,应该有一个估计的时间等待。

用了中断了,就不需要死等了。发送完成就马上发送下一个字节。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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