STC12C5204AD接收不到串口的数据,如何解决?
unsigned char digtal1[10]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0123456789
#define uchar unsigned char
uchar ch;
void delay1ms(x) //0.5ms
{
int y,z;
for(y=x;y>0;y--)
for(z=60;z>0;z--);
}
void init_uart()
{
TMOD=0X20; //定时器/计算器工作模式寄存器
TH1=0XFD; //timer high 1
TL1=0XFD; //timer low 1
TR1=1; //定时器T1的运行控制位
SCON=0X50; //串行控制寄存器
EA=1; //CPU的总中断允许控制位
ES=1; //串行口中断允许位
}
void main()
{
init_uart();
while(1)
{
P3=ch;
P2=digtal1[8];
delay1ms(1000);
}
}
void UART_interrupt() interrupt 4
{
if(RI)
{
RI=0; //接收中断请求标志位
ch=SBUF;
}
}
用串口助手可以正确收发数据,LED显示也正常,可能是你的显示程序有问题。
#include<reg52.h>
#define uchar unsigned char
unsigned char digtal1[10]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0123456789
uchar ch;
uchar flag; //接收完成标志,
/*
void delay1ms(x) //0.5ms
{
int y,z;
for(y=x;y>0;y--)
for(z=60;z>0;z--);
}
*/
void init_uart()
{
TMOD=0X20; //定时器/计算器工作模式寄存器
TH1=0XFD; //timer high 1
TL1=0XFD; //timer low 1
TR1=1; //定时器T1的运行控制位
SCON=0X50; //串行控制寄存器
EA=1; //CPU的总中断允许控制位
ES=1; //串行口中断允许位
}
void main()
{
init_uart();
while(1)
{
if(flag==1) //接收完成标志为1
{
ES=0; //关串口中断
flag=0; //接收完成标志清0
SBUF=ch; //发送数据
while(!TI); //等待发送中断请求标志位为1
TI=0; //发送中断请求标志位清0
ES=1; //开串口中断
}
P1=~ch; //LED显示收到的数据
// P2=digtal1[8];
// delay1ms(1000);
}
}
void UART_interrupt() interrupt 4
{
RI=0; //接收中断请求标志位
ch=SBUF; //获取SBUF接收到的数据
flag=1; //接收完成标志置1
}
虽然不懂,也要来帮顶顶。哈哈
期待大神们来解决
大神呀,我搞了一天,被你一下就搞定了,谢谢,真心谢谢!
大神呀,我搞了一天,被你一下就搞定了,谢谢,真心谢谢!
大神,请问为什么这里P3=~ch;要取反呢
大神,请问为什么这里P3=~ch;要取反呢
大神,请问为什么这里P3=~ch;要取反呢
大神,请问为什么这里P3=~ch;要取反呢
大神,请问为什么这里P3=~ch;要取反呢
因为我的实验板P1接LED,低电平LED亮,取反后就能正确显示2进制数。
原来如此,另外我还想问一下为什么非要那个接收完成标志呢?
你好,我有个问题不懂,如果串口发a8 单片机接受到的也是a8吗?
这是演示程序,因为是把接收到的数据返还给上位机(PC),以判断串口收发是否正确,所以必须等接收完成后才能转发。
那我的为什么发送的和接受的不一样的
串口收发分文本模式和HEX模式,文本模式发送a8返回的还是a8。HEX模式发送a8返回的是A8,发送a返回的是0A,发送8返回的是08,就是16进制表示的8位2进制数据。
能不能再帮我看一下,最后五行红色部分,串口送过来的数据放在p3就可以,放到p2就不可以了,这怎么解决。
void delay1ms(x) //0.5ms
{
int y,z;
for(y=x;y>0;y--)
for(z=60;z>0;z--);
}void init_uart()
{
TMOD=0x20; //定时器/计算器工作模式寄存器
TH1=0xFD; //timer high 1
TL1=0xFD; //timer low 1
TR1=1; //定时器T1的运行控制位
SCON=0x50; //串行控制寄存器
EA=1; //CPU的总中断允许控制位
ES=1; //串行口中断允许位
}
void UART_R() interrupt 4
{
RI=0;
Serial_digtal[ch++]=SBUF;
if(ch==N) //获取SBUF接收到的数据
flag=1;
}
void main()
{
init_uart();
while(1)
{
if(flag==1) //接收完成标志为1
{
ES=0; //关串口中断
for(ch=0;ch<N;ch++)
{
SBUF=Serial_digtal[ch]; //发送数据
while(!TI); //等待发送中断请求标志位为1
TI=0;
} //发送中断请求标志位清0
ES=1; //开串口中断
ch=0;
flag=0; //接收完成标志清0
}
// P2=~Serial_digtal[0];
// P3=digtalW[2];
P3=~Serial_digtal[0];
P2=digtal1[6];
delay1ms(10);
}
}
虽然不懂,也要来帮顶顶
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//unsigned char digtal1[10]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0123456789
sbit dula=P2^6; //段锁存
sbit wela=P2^7; //位锁存
uchar code table[]={ //共阴数码管
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar swan,wan,qian,bai,shi,ge;
uchar ch;
uchar flag; //接收完成标志,
uchar count=0; //计数变量
void display1();//显示程序声明
void init_uart()
{
TMOD=0X20; //定时器/计算器工作模式寄存器
TH1=0XFD; //timer high 1
TL1=0XFD; //timer low 1
TR1=1; //定时器T1的运行控制位
SCON=0X50; //串行控制寄存器
EA=1; //CPU的总中断允许控制位
ES=1; //串行口中断允许位
}
void main()
{
init_uart();
while(1)
{
if(flag==1) //接收完成标志为1
{
ES=0; //关串口中断
flag=0; //接收完成标志清0
SBUF=ch; //发送数据
while(!TI); //等待发送中断请求标志位为1
TI=0; //发送中断请求标志位清0
ES=1; //开串口中断
}
P1=~ch; //P1接8位LED显示收到的数据
/*************数据分解***************/
swan = ch/100000; // 十万位
wan = (ch%100000)/10000; // 万位
qian = (ch%10000)/1000; // 千位
bai = (ch%1000)/100; // 百位
shi = (ch%100)/10; // 十位
ge = ch%10; // 个位
display1(); //6位数码管显示程序
}
}
void UART_interrupt() interrupt 4
{
RI=0; //接收中断请求标志位
ch=SBUF; //获取SBUF接收到的数据
flag=1; //接收完成标志置1
}
void display1()//显示程序
{
count++;
if(count>=6)
count=0;
switch(count)
{
case 0:
dula=0;
P0=table[swan]; //显示十万位
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
break;
case 1:
dula=0;
P0=table[wan]; //显示万位
dula=1;
dula=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
break;
case 2:
P0=table[qian]; //显示千位
dula=1;
dula=0;
P0=0x7b;
wela=1;
wela=0;
break;
case 3:
P0=table[bai]; //显示百位
dula=1;
dula=0;
P0=0x77;
wela=1;
wela=0;
break;
case 4:
P0=table[shi]; //显示十位
dula=1;
dula=0;
P0=0xef;
wela=1;
wela=0;
break;
case 5:
P0=table[ge]; //显示个位
dula=1;
dula=0;
P0=0xdf;
wela=1;
wela=0;
break;
}
}