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();
}
}
|