以解决STC115F2K32S2,新手 串口打印字符串“1234”,打印“12345” 乱码,不知什么原因
本帖最后由 我会想你的 于 2020-11-12 08:55 编辑问题找到了,是我开了全局中断,注释了就可以,谢谢各位大佬帮忙
c语言小白,串口打印字符串“1234”,打印“12345” 乱码,不知什么原因?哪位大佬可以帮我看下?
我使用的单片机是STC115F2K32S2
烧写时我晶振使用的是22.1184MHz
代码如下:
#include<STC15F.h>
#include<string.h>
#define MAIN_Fosc 22118400L //主时钟,晶振频率不同的直接在这里修改频率
#define serial_one_baud_rate 115200L //波特率,只需在这里修改波特率就可以了
#define Timer1_Reload (65536UL -(MAIN_Fosc / 4 / serial_one_baud_rate)) //用定时器1做波特率发生器,计算定时器1的重装值
unsigned char Table[]="12345";
unsigned char Buff;//数据缓冲区
sbit KEY=P3^2;
//发送数据函数
void SEND_data(unsigned char *Buff)
{
unsigned char j;
unsigned char lenth=0;
lenth=strlen(Buff);//计算数据长度
for(j=0;j<lenth;j++)//发送数据
{
SBUF=Buff;
while(TI==0);
TI=0;
}
}
//延时1ms函数
void delay_1ms(unsigned int t)
{
unsigned int x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
//缓冲区初始化
void Buff_init()
{
unsigned char n; //将Table里的数据放到缓冲区里
for(n=0;n<16;n++)
{
Buff= Table;
delay_1ms(100);
}
}
//串口初始化函数
void serial_init()
{
SCON |= 0x40; //8位数据
TR1 = 0; //关闭定时器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TH1 = (u8)(Timer1_Reload >> 8);
TL1 = (u8)Timer1_Reload;
TR1= 1; //打开定时器
PS = 1; //高优先级中断
REN = 1; //允许接收
ES= 1; //允许中断
EA = 1; //允许全局中断
}
void main()
{
unsigned char i;
Buff_init();
serial_init();
while(1)
{
if(KEY==0)
{
while(!KEY);
SEND_data(Buff);
delay_1ms(1000);
}
}
} 我会想你的 发表于 2020-11-12 07:52
中断开了还没有用
是哪本教材诉你没有用的?这不误人子弟嘛。发送一个字节后会进入中断,但你没有ISR程序不得跑飞。要么就别开中断,开了就要有配套的ISR,哪怕ISR什么也不操作。 看看是不是接收到的HEX 就错了,错了单片机到接收的问题 串口中断你开启了,中断服务程序在哪呢? lenth打印看看 你的这种方式不需开启串口中断。查询法判断TI即可。
串口助手, 切换到 hex 模式看看 takashiki 发表于 2020-11-11 17:36
串口中断你开启了,中断服务程序在哪呢?
中断开了还没有用 智涅 发表于 2020-11-11 18:05
lenth打印看看
lenth 打印出来会加 1 位 我昨天重新学了下 数组 因为有 “\0” hex 和文本的差别{:loveliness:} 智涅 发表于 2020-11-11 18:05
lenth打印看看
打印出来lenth后发现第一次数据是对的 ,后面就是错的 takashiki 发表于 2020-11-12 08:08
是哪本教材诉你没有用的?这不误人子弟嘛。发送一个字节后会进入中断,但你没有ISR程序不得跑飞。要么就 ...
大佬,是我表达的不清楚,我的意思是我没有使用中断,现在我也找到问题了,是你说的,发送数据后进入中断了,总的来说是我开了全局中断,谢谢
页:
[1]