|
單片機(jī)是stc8g1k08a,程序用的是一位大佬分享的,單片機(jī)直接和電腦usb連接,isp發(fā)送一個(gè)數(shù)據(jù)到單片機(jī),就能接收到0-65536,但是接收到的是一樣的數(shù)據(jù)。頻率設(shè)置成30MHz,波特率是9600。是我哪里沒有設(shè)置好嗎,還是硬件這樣子連會有干擾呢
c85c220942cb60cf3b6d18c0cd4c065.jpg (277.58 KB, 下載次數(shù): 0)
下載附件
2025-4-16 10:39 上傳
1dc88c2e6bca18114960530e64d1a7d.png (123.81 KB, 下載次數(shù): 0)
下載附件
2025-4-16 11:16 上傳
//使用STC-ISP軟件的串口助手顯示,波特率9600,需要自動發(fā)送一個(gè)字符。文本模式接收顯示 0~65535
typedef unsigned char u8;
typedef unsigned short u16;
u8 code ASCII[16]={"0123456789ABCDEF"};
#include "STC8.H" //選擇頭文件,單片機(jī)STC8
#define FOSC 30000000UL /設(shè)置系統(tǒng)頻率,30M
u16 xdata Uart1_Byte[3]={0x5a9b,0xFFED,0x55};/需要打印的變量
bit Uart1_Flag=0; /這個(gè)標(biāo)志位寫1 就開始打印
//串口初始化,根據(jù)設(shè)計(jì)需要,波特率來源選擇:定時(shí)器1、定時(shí)器2、BRT獨(dú)立波特率,以下配置都是12分頻。
void Uart1_Init()
{
AUXR&=0xBF; //定時(shí)器T1(16位自裝),STC15/STC8,定時(shí)器時(shí)鐘12T模式
AUXR&=0xFE; //定時(shí)器T1(16位自裝),STC15/STC8,串口1選擇定時(shí)器1為波特率發(fā)生器
TMOD&=0x0F; /定時(shí)器T1(16位自裝),STC15/STC8,設(shè)置定時(shí)器模式16位自動重裝
TL1=(65536-FOSC/9600/4/12); //定時(shí)器T1(16位自裝),STC15/STC8,設(shè)置定時(shí)初始值
TH1=(65536-FOSC/9600/4/12)>>8; //定時(shí)器T1(16位自裝),STC15/STC8,設(shè)置定時(shí)初始值
ET1=0; //定時(shí)器T1(16位自裝),STC15/STC8,不需要定時(shí)器1的中斷
TR1=1;//*/ //定時(shí)器T1(16位自裝),STC15/STC8,定時(shí)器1開始計(jì)時(shí)
//以下代碼,這三行是必須的。
SCON|=0x50; //8位數(shù)據(jù),可變波特率。
ES = 1; //串口1中斷閘刀閉合,向CPU申請中斷。
EA=1; //總中斷閘刀閉合導(dǎo)通。
}
//串口發(fā)送函數(shù)。主函數(shù)調(diào)用,或者串口發(fā)送完中斷后馬上調(diào)用
void Uart1_Up_Data_Drive()
{
static u8 xdata count=0;
if(Uart1_Flag) //標(biāo)志允許,發(fā)送一個(gè)字節(jié)
{
Uart1_Flag=0; //標(biāo)志位翻轉(zhuǎn),只允許發(fā)送一個(gè)字節(jié)
count++; //字節(jié)編號增加。
switch(count) //打印成十六進(jìn)制顯示
{
case 1 : SBUF='\r';break; // 回車
case 2 : SBUF='\n';break; // 換行
case 3 : SBUF='0';break; // 0
case 4 : SBUF='x';break; // x
case 5 : SBUF=ASCII[Uart1_Byte[0]/256/16];break; //字節(jié)0
case 6 : SBUF=ASCII[Uart1_Byte[0]/256%16];break; //字節(jié)0
case 7 : SBUF=ASCII[Uart1_Byte[0]%256/16];break; //字節(jié)0
case 8 : SBUF=ASCII[Uart1_Byte[0]%256%16];break; //字節(jié)0
case 9 : SBUF=' ';break; // 空格
case 10 : SBUF='0';break; // 0
case 11 : SBUF='x';break; // x
case 12 : SBUF=ASCII[Uart1_Byte[1]/256/16];break; //字節(jié)1
case 13 : SBUF=ASCII[Uart1_Byte[1]/256%16];break; //字節(jié)1
case 14 : SBUF=ASCII[Uart1_Byte[1]%256/16];break; //字節(jié)1
case 15 : SBUF=ASCII[Uart1_Byte[1]%256%16];break; //字節(jié)1
case 16 : SBUF=' ';break; // 空格
case 17 : SBUF='0';break; // 0
case 18 : SBUF='x';break; // x
case 19 : SBUF=ASCII[Uart1_Byte[2]/256/16];break; //字節(jié)2
case 20 : SBUF=ASCII[Uart1_Byte[2]/256%16];break; //字節(jié)2
case 21 : SBUF=ASCII[Uart1_Byte[2]%256/16];break; //字節(jié)2
case 22 : SBUF=ASCII[Uart1_Byte[2]%256%16];break; //字節(jié)2
case 23 :count=0;break;//最后一步 沒有發(fā)送字節(jié),串口TI不會置1,所以不再發(fā)送
}
}
}
//串口中斷,接收一個(gè)字節(jié),馬上發(fā)送N個(gè)字節(jié),發(fā)送數(shù)組顯示到電腦
void Uart1_Routine() interrupt 4
{
static char Uart1_ser_n=0; //用于接收計(jì)數(shù)
if(RI) //如果接收到一個(gè)字節(jié)
{
RI=0; //標(biāo)志位清除
Uart1_Flag=1; //串口發(fā)送允許
if(SBUF==0x7f) //最低波特率9600,最高波特率9600,判斷連續(xù)多個(gè)0x7f
{
Uart1_ser_n++; //判斷連續(xù)多個(gè)0x7f
if(Uart1_ser_n>=10) //判斷連續(xù)多個(gè)0x7f
{
Uart1_ser_n=0; //清0
IAP_CONTR|=0xe0; //執(zhí)行自動軟復(fù)位,可以做調(diào)試用,STC12、STC15、STC8
//ISP_CONTR|=0xe0; //執(zhí)行自動軟復(fù)位,可以做調(diào)試用,STC89
}
}
else
{
Uart1_ser_n=0;
}
}
if(TI) //如果上一個(gè)字節(jié)發(fā)送完成了
{
TI=0; //標(biāo)志位清除
Uart1_Flag=1; //串口發(fā)送允許
Uart1_Up_Data_Drive(); //執(zhí)行串口發(fā)送下一個(gè)字節(jié)
}
}
void Uart1_Allot()
{
static u16 idata count;
count++;
if(count>50000)
{
count=0;
Uart1_Flag=1;
}
}
void main()
{
Uart1_Init();
while(1)
{
Uart1_Up_Data_Drive();
Uart1_Allot();
}
}
|
|