找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机串口1打印程序 可以打印3个十六位的变量 波特率9600

[复制链接]
跳转到指定楼层
楼主
WQX开发板串口1打印程序.zip (7.76 MB, 下载次数: 38)
//*************************************************************************************************************************************

//使用本程序打印显示的变量,需按照1、2、3、4进行设置,不同单片机头文件不同,根据需要选择系统时钟频率

//使用STC-ISP软件的串口助手显示,波特率9600,需要自动发送一个字符。文本模式接收显示 0~65535

//如果需要软件自动复位,请根据108、109行选择。

//*************************************************************************************************************************************
typedef unsigned char         u8;
typedef unsigned short         u16;

#include <STC8.H>                                                //-串-口-打-印-第1步:选择头文件,STC8单片机                                                                                       
//#include <STC15.H>                                                //-串-口-打-印-第1步:选择头文件,STC15单片机                                                
//#include <STC89.H>                                                //-串-口-打-印-第1步:选择头文件,STC89单片机        

//#define FOSC 11059200UL                                        //-串-口-打-印-第2步:设置系统频率,11.0592M
//#define FOSC 12000000UL                                        //-串-口-打-印-第2步:设置系统频率,12M
//#define FOSC 24000000UL                                        //-串-口-打-印-第2步:设置系统频率,24M
#define FOSC 30000000UL                                        //-串-口-打-印-第2步:设置系统频率,30M
#define BRT (65536-FOSC/9600/4/12)                //确定波特率的定时器初值,STC15、STC8单片机
#define BRT89 (65536-FOSC/9600/32)                //确定波特率的定时器初值,STC89单片机

u16 xdata Uart1_Byte[3]={0,0xffff,0x55};//-串-口-打-印-第4步:需要打印的变量
bit Uart1_Flag=0;                                                //-串-口-打-印-第4步:这个标志位写1 就开始打印

//*************************************************************************************************************************************
//串口初始化,根据设计需要,选择定时器1或者定时器2做波特率发生器
//*************************************************************************************************************************************
void Uart1_Init()
{
        /*
        RCAP2L=BRT89;                                                //-串-口-打-印-第3步:STC89单片机
        RCAP2H=BRT89>>8;                                        //-串-口-打-印-第3步:STC89单片机
        T2CON=0x34;                                                        //-串-口-打-印-第3步:STC89单片机 RCLK、TCLK、TR2都置1
        //*/
        
        //以下代码的定时器1做波特率源
        AUXR &= 0xBF;                                                //-串-口-打-印-第3步:STC15、STC8单片机 定时器1时钟为Fosc/12,即12T
        AUXR &= 0xFE;                                                //-串-口-打-印-第3步:STC15、STC8单片机 串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                                                //-串-口-打-印-第3步:STC15、STC8单片机 设定定时器1为16位自动重装方式
        TL1 = BRT;                                                        //-串-口-打-印-第3步:STC15、STC8单片机 设定定时初值
        TH1 = BRT>>8;                                                //-串-口-打-印-第3步:STC15、STC8单片机 设定定时初值
        TR1 = 1;                                                        //-串-口-打-印-第3步:STC15、STC8单片机 启动定时器1
        //*/
        
        /*//以下代码的定时器2做波特率源
        AUXR |= 0x01;                                                //-串-口-打-印-第3步:STC15、STC8单片机 串口1选择定时器2为波特率发生器
        AUXR &= 0xFB;                                                //-串-口-打-印-第3步:STC15、STC8单片机 定时器2时钟为Fosc/12,即12T
        T2L = BRT;                                                        //-串-口-打-印-第3步:STC15、STC8单片机 设定定时初值
        T2H = BRT>>8;                                                //-串-口-打-印-第3步:STC15、STC8单片机 设定定时初值
        AUXR |= 0x10;                                                //-串-口-打-印-第3步:STC15、STC8单片机 启动定时器2
        //*/
        
        SCON = 0x50;                                                //8位数据,可变波特率
        ES = 1;                                                                //串口1 允许
        EA=1;
}

//*************************************************************************************************************************************
//串口发送函数。主函数调用,或者串口发送完中断后马上调用
//*************************************************************************************************************************************
void Uart1_Up_Data_Drive()
{
        static u8 xdata count=0;
        if(Uart1_Flag)                                                //标志允许,发送一个字节
        {
                Uart1_Flag=0;                                        //标志位翻转,只允许发送一个字节
                count++;                                                //字节编号增加。
                switch(count)
                {
                        case 1 : SBUF='\r';break;                                                                // 回车
                        case 2 : SBUF='\n';break;                                                                // 换行
                        case 3 : SBUF=0x30+Uart1_Byte[0]/10000;break;                        // 字节0 万位
                        case 4 : SBUF=0x30+Uart1_Byte[0]%10000/1000;break;                // 字节0 千位
                        case 5 : SBUF=0x30+Uart1_Byte[0]%10000%1000/100;break;        // 字节0 百位
                        case 6 : SBUF=0x30+Uart1_Byte[0]%10000%1000%100/10;break;//字节0 十位
                        case 7 : SBUF=0x30+Uart1_Byte[0]%10000%1000%100%10;break;//字节0 个位
                        case 8 : SBUF=' ';break;                                                                // 空格
                        case 9 : SBUF=0x30+Uart1_Byte[1]/10000;break;                        // 字节1 万位
                        case 10 :SBUF=0x30+Uart1_Byte[1]%10000/1000;break;                // 字节1 千位
                        case 11 :SBUF=0x30+Uart1_Byte[1]%10000%1000/100;break;        // 字节1 百位
                        case 12 :SBUF=0x30+Uart1_Byte[1]%10000%1000%100/10;break;//字节1 十位
                        case 13 :SBUF=0x30+Uart1_Byte[1]%10000%1000%100%10;break;//字节1 个位
                        case 14 :SBUF=' ';break;                                                                // 空格
                        case 15 :SBUF=0x30+Uart1_Byte[2]/10000;break;                        // 字节2 万位
                        case 16 :SBUF=0x30+Uart1_Byte[2]%10000/1000;break;                // 字节2 千位
                        case 17 :SBUF=0x30+Uart1_Byte[2]%10000%1000/100;break;        // 字节2 百位
                        case 18 :SBUF=0x30+Uart1_Byte[2]%10000%1000%100/10;break;//字节2 十位
                        case 19 :SBUF=0x30+Uart1_Byte[2]%10000%1000%100%10;break;//字节2 个位
                        case 20 :count=0;break;//最后一步 没有发送字节,串口TI不会置1,所以不再发送
                }
        }
}
//*************************************************************************************************************************************
//串口中断,接收一个字节,马上发送N个字节,发送数组显示到电脑
//*************************************************************************************************************************************
void Uart1_Routine() interrupt 4
{
        static char Uart1_ser_n=0;                        //用于接收计数
        if(RI)                                                                //如果接收到一个字节
        {
                RI=0;                                                        //标志位清除
                Uart1_Flag=1;                                        //串口发送允许
                if(SBUF==0x7f)                                        //最低波特率9600,最高波特率9600,判断连续多个0x7f
                {
                        Uart1_ser_n++;                                //判断连续多个0x7f
                        if(Uart1_ser_n>=10)                        //判断连续多个0x7f
                        {
                                Uart1_ser_n=0;                        //清0
                                IAP_CONTR|=0xe0;                //执行自动软复位,可以做调试用,STC12、STC15、STC8
                                //ISP_CONTR|=0xe0;                //执行自动软复位,可以做调试用,STC89
                        }
                }
        }
        if(TI)                                                                //如果上一个字节发送完成了        
        {
                TI=0;                                                        //标志位清除
                Uart1_Flag=1;                                        //串口发送允许
                Uart1_Up_Data_Drive();                        //执行串口发送下一个字节
        }
}

//*************************************************************************************************************************************

//*************************************************************************************************************************************
void main()
{
        Uart1_Init();
        while(1)
        {
                Uart1_Up_Data_Drive();
        }
}


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

使用道具 举报

沙发
ID:390416 发表于 2021-1-19 01:01 | 只看该作者
这是打印16进制的效果,我分享的程序只能打印十进制0~65535  
回复

使用道具 举报

板凳
ID:883622 发表于 2021-2-8 19:08 | 只看该作者
终于找到一份 不需要死等的串口打印程序了  谢谢分享 WQX-15
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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