共2条
1/1 1 跳转至页
问
答 1:
对不起,刚才内容没有发送出去我最近在做一个单片机串口通讯的题目,我写了一个串口测试子程序,两机可以正取接收和显示,但把子程序放在总程序中就不行了;我的总程序应该也没有问题,因为我如果不调用这个串口子程序,主程序也能很好的运行。我想了一天也解决不了,还请各位热心的大虾门帮帮解决一下:
~~~~~发送测试程序
#include<reg51.h>
#include<absacc.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define pa8255 XBYTE[0xc7ff] //8255PA口
#define pb8255 XBYTE[0xcfff] //8255PB口
#define pc8255 XBYTE[0xd7ff] //8255PC口
#define com8255 XBYTE[0xdfff] //8255控制口
#define VOLTAGE 5 //采集电压为0~5V
void sendkey(uchar d) //发送一个字节的内容
{
SBUF=d;
while(TI==0);
TI=0;
}
void sendvalue(uchar d) //发送一个采样值
{
if(d%16==8)
{ SBUF=d;
while (TI==0);
TI=0;
}
else
{ SBUF=d+1;
while (TI==0);
TI=0;
}
}
void delay(uint t) //延时函数延时t*10ms
{
uint j;
for(j=0;j<t;j++)
{
TH0=-39;
TL0=-16;
TR0=1;
do {} while(TF0!=1);
TF0=0;
}
}
main()
{
uchar trdata[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//uchar redata[10];
uchar i;
TMOD=0x21;
TH1=0xE6;
TL1=0xE6;
TR1=1;
SCON=0x50;
PCON=0x00;
TCON=0xc0;
IE=0x00;
com8255=0x80;
pc8255=0xff;
while(1)
{for(i=0;i<10;i++)
{ sendvalue(trdata[i]);
// while(TI == 0 );
// TI = 0;
// while(RI == 0 );
//RI = 0;
pb8255=trdata[i];
delay(30);
}
}
}
~~~~接收子程序~~~~
main()
{uchar trdata[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar redata[10];
uchar i;
TMOD=0x21;
TH1=0xE6;
TL1=0xE6;
TR1=1;
SCON=0x50;
PCON=0x00;
TCON=0xc0;
IE=0x00;
com8255=0x80;
pc8255=0xff;
pa8255=0xff;
while(1)
{
while(RI == 0 );
RI = 0;
pa8255= SBUF-1;
delay(30);
}
}
答 2: 呵呵什么意思呀,楼主好象没有说明白 答 3: 还用8255 答 4: 表达不清,还望见谅! 谢谢 荆潇影 和 王紫豪 的指点!
我的系统是这样的:在发送端用0809采集八路电压数据,然后用单片机的串口发送给另一片单片机,并显示。 我用8255显示采样值和显示的路数。
我的问题是:我上面编写的是两片单片机的接受和发送的调试程序。
这个调试程序我可以很好的运行,并且很好的显示。但就是把上面的sendkey(uchar a)和sendvalue(uchar a)函数(前者是发送采样路数,后者是发送采样值),放到我的总程序里调用,就不能发送了,每次仿真时都是在 while(TI==0);这儿停了。也是就说数据没用经过SBUF发送出去。为什么??
我的总程序应该也没有问题,因为我要是不调用sendkey(uchar a)和sendvalue(uchar a),我的发送端的总程序可以正确显示。
不好意思了,发帖很少,表达不清,还望见谅!
答 5: 这样的等到很可能导致程序不稳定 答 6: 为什么不用中断? 答 7: 主程序中有没有对串口设置的地方?或者中断等寄存器设置冲突... 答 8: 中断用得不熟练我对中断用得不熟练,所以没有用中断。主程序我上传到这儿了,请各位看看 答 9: 啊这么多人进来了这么没有人给我留点意见啊?
期待大家的意见啊! 答 10: 近来学习帮你顶下
~~~~~发送测试程序
#include<reg51.h>
#include<absacc.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define pa8255 XBYTE[0xc7ff] //8255PA口
#define pb8255 XBYTE[0xcfff] //8255PB口
#define pc8255 XBYTE[0xd7ff] //8255PC口
#define com8255 XBYTE[0xdfff] //8255控制口
#define VOLTAGE 5 //采集电压为0~5V
void sendkey(uchar d) //发送一个字节的内容
{
SBUF=d;
while(TI==0);
TI=0;
}
void sendvalue(uchar d) //发送一个采样值
{
if(d%16==8)
{ SBUF=d;
while (TI==0);
TI=0;
}
else
{ SBUF=d+1;
while (TI==0);
TI=0;
}
}
void delay(uint t) //延时函数延时t*10ms
{
uint j;
for(j=0;j<t;j++)
{
TH0=-39;
TL0=-16;
TR0=1;
do {} while(TF0!=1);
TF0=0;
}
}
main()
{
uchar trdata[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//uchar redata[10];
uchar i;
TMOD=0x21;
TH1=0xE6;
TL1=0xE6;
TR1=1;
SCON=0x50;
PCON=0x00;
TCON=0xc0;
IE=0x00;
com8255=0x80;
pc8255=0xff;
while(1)
{for(i=0;i<10;i++)
{ sendvalue(trdata[i]);
// while(TI == 0 );
// TI = 0;
// while(RI == 0 );
//RI = 0;
pb8255=trdata[i];
delay(30);
}
}
}
~~~~接收子程序~~~~
main()
{uchar trdata[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar redata[10];
uchar i;
TMOD=0x21;
TH1=0xE6;
TL1=0xE6;
TR1=1;
SCON=0x50;
PCON=0x00;
TCON=0xc0;
IE=0x00;
com8255=0x80;
pc8255=0xff;
pa8255=0xff;
while(1)
{
while(RI == 0 );
RI = 0;
pa8255= SBUF-1;
delay(30);
}
}
答 2: 呵呵什么意思呀,楼主好象没有说明白 答 3: 还用8255 答 4: 表达不清,还望见谅! 谢谢 荆潇影 和 王紫豪 的指点!
我的系统是这样的:在发送端用0809采集八路电压数据,然后用单片机的串口发送给另一片单片机,并显示。 我用8255显示采样值和显示的路数。
我的问题是:我上面编写的是两片单片机的接受和发送的调试程序。
这个调试程序我可以很好的运行,并且很好的显示。但就是把上面的sendkey(uchar a)和sendvalue(uchar a)函数(前者是发送采样路数,后者是发送采样值),放到我的总程序里调用,就不能发送了,每次仿真时都是在 while(TI==0);这儿停了。也是就说数据没用经过SBUF发送出去。为什么??
我的总程序应该也没有问题,因为我要是不调用sendkey(uchar a)和sendvalue(uchar a),我的发送端的总程序可以正确显示。
不好意思了,发帖很少,表达不清,还望见谅!
答 5: 这样的等到很可能导致程序不稳定 答 6: 为什么不用中断? 答 7: 主程序中有没有对串口设置的地方?或者中断等寄存器设置冲突... 答 8: 中断用得不熟练我对中断用得不熟练,所以没有用中断。主程序我上传到这儿了,请各位看看 答 9: 啊这么多人进来了这么没有人给我留点意见啊?
期待大家的意见啊! 答 10: 近来学习帮你顶下
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |