单片机是stc8g1k08a,程序用的是一位大佬分享的,单片机直接和电脑usb连接,isp发送一个数据到单片机,就能接收到0-65536,但是接收到的是一样的数据。频率设置成30MHz,波特率是9600。是我哪里没有设置好吗,还是硬件这样子连会有干扰呢
//使用STC-ISP软件的串口助手显示,波特率9600,需要自动发送一个字符。文本模式接收显示 0~65535
typedef unsigned char u8;
typedef unsigned short u16;
u8 code ASCII[16]={"0123456789ABCDEF"};
#include "STC8.H" //选择头文件,单片机STC8
#define FOSC 30000000UL /设置系统频率,30M
u16 xdata Uart1_Byte[3]={0x5a9b,0xFFED,0x55};/需要打印的变量
bit Uart1_Flag=0; /这个标志位写1 就开始打印
//串口初始化,根据设计需要,波特率来源选择:定时器1、定时器2、BRT独立波特率,以下配置都是12分频。
void Uart1_Init()
{
AUXR&=0xBF; //定时器T1(16位自装),STC15/STC8,定时器时钟12T模式
AUXR&=0xFE; //定时器T1(16位自装),STC15/STC8,串口1选择定时器1为波特率发生器
TMOD&=0x0F; /定时器T1(16位自装),STC15/STC8,设置定时器模式16位自动重装
TL1=(65536-FOSC/9600/4/12); //定时器T1(16位自装),STC15/STC8,设置定时初始值
TH1=(65536-FOSC/9600/4/12)>>8; //定时器T1(16位自装),STC15/STC8,设置定时初始值
ET1=0; //定时器T1(16位自装),STC15/STC8,不需要定时器1的中断
TR1=1;//*/ //定时器T1(16位自装),STC15/STC8,定时器1开始计时
//以下代码,这三行是必须的。
SCON|=0x50; //8位数据,可变波特率。
ES = 1; //串口1中断闸刀闭合,向CPU申请中断。
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='0';break; // 0
case 4 : SBUF='x';break; // x
case 5 : SBUF=ASCII[Uart1_Byte[0]/256/16];break; //字节0
case 6 : SBUF=ASCII[Uart1_Byte[0]/256%16];break; //字节0
case 7 : SBUF=ASCII[Uart1_Byte[0]%256/16];break; //字节0
case 8 : SBUF=ASCII[Uart1_Byte[0]%256%16];break; //字节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; //字节1
case 13 : SBUF=ASCII[Uart1_Byte[1]/256%16];break; //字节1
case 14 : SBUF=ASCII[Uart1_Byte[1]%256/16];break; //字节1
case 15 : SBUF=ASCII[Uart1_Byte[1]%256%16];break; //字节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; //字节2
case 20 : SBUF=ASCII[Uart1_Byte[2]/256%16];break; //字节2
case 21 : SBUF=ASCII[Uart1_Byte[2]%256/16];break; //字节2
case 22 : SBUF=ASCII[Uart1_Byte[2]%256%16];break; //字节2
case 23 :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
}
}
else
{
Uart1_ser_n=0;
}
}
if(TI) //如果上一个字节发送完成了
{
TI=0; //标志位清除
Uart1_Flag=1; //串口发送允许
Uart1_Up_Data_Drive(); //执行串口发送下一个字节
}
}
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();
}
}
|