2021-1-16 19:14 上傳
點擊文件名下載附件
//*************************************************************************************************************************************
//使用本程序打印顯示的變量,需按照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();
}
}