这样的RS232串口通信为什么不行啊?!
电路和仿真时的图片我都附上了。
请各位大侠指正!
我在串口调试助手上输入72, 但是为什么数码管没有变化呢?
程序如下:
#include<reg52.h> //包函8051 内部资源的定义
#define uchar unsigned char
#define uint unsigned int
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
sbit shiwei=P2^6; //十位选通定义
sbit baiwei=P2^5; //百位选通定义
sbit gewei=P2^7; //百位选通定义
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,
}; //1~10
void delay(uint z) //延时程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}//end of delay
void LED() //LED显示接收到的数据(十进制)
{
gewei=0;
P0=table[dat%10];
delay(10);
gewei=1;
shiwei=0;
P0=table[dat/10];
delay(10);
shiwei=1;
baiwei=0;
P0=table[dat/100];
delay(10);
baiwei=1;
}
void init_com(void) //功能:串口初始化,波特率9600,方式1/////////
{
TMOD = 0x20;//定时器1,工作方式一
PCON = 0x00;//
SCON = 0x50;//串行工作方式1,允许串行口接收
TH1 = 0xFd;//波特率9600bit/s
TL1 = 0xFd;
TR1 = 1;//启动定时器1
EA=1;//开总中断
ES=1;//允许串行口中断
}
/////主程序功能:实现接收数据并把接收到的数据原样发送回去///////
void main()
{
init_com();//串口初始化
while(1)
{
if ( RI ) //扫描判断是否接收到数据,
{
dat = SBUF; //接收数据SBUF赋与dat
RI=0; //RI 清零。
SBUF = dat; //在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)
}
LED(); //显示接收到的数据
}//end of while
}//end of main
有哪位大侠可以指点一下啊?!
这个问题我解决了!
是proteus软件的问题,我用别的程序试了一下,不管我怎么改动P0、P2口的状态。
单片机那都没反应, 这时我才意识到问题。我再画电路图之前先备份了一个单片机的最小系统。
然后做仿真实验时,直接另存。
可能没说太清楚, 总之我重画了一个电路,就ok了!
虽然没人给我指点,但还是说一下吧!
也许有人也会遇到这样的问题,
小手一点 进步一点!
十位应该是
shiwei=0;
P0=table[dat%100/10];
程序的细节问题,请注意
大侠
有个问题想问一下
SBUF传过来的数据,如果不是十六进制过来的,就应该发的是ASC码对吧? 0的编码不是48么?
这个码是十进制的吧? 程序这样写对不对
uchar code table[]={0X3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9
dat=SBUF;
P0=table[dat-48];//这时发送一个0
这样是不是不对啊? 数码管显示的不是零
谢谢指点
不过现在有个问题
ASC码不是十进制的么?0的ASC码是48,我程序如下 只写关键的部分
uchar code table[]={0X3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9
dat=SBUF;
P0=table[dat-48];//这时如果发送的是0
但是数码管根本不显示0 是个乱码
这是怎么回事啊?
谢谢指点
不过现在有个问题
麻烦看一下给别人的回复
不知道为什么 有一个回复没显示出来
简写一个程序uchar table[]={};//0~9 在此略去 编程的时候有
dat=SBUF;
P1=(dat-48);
//数据以ASC码形式发送 为什么显示出的是乱码