永发信息网

单片机接收外部脉冲并计数,把计数得到的数据通过串口发送给电脑,大神快来看看我的程序哪里有问题

答案:3  悬赏:10  手机版
解决时间 2021-03-03 06:31
  • 提问者网友:浪荡绅士
  • 2021-03-02 08:46
单片机接收外部脉冲并计数,把计数得到的数据通过串口发送给电脑,大神快来看看我的程序哪里有问题
最佳答案
  • 五星知识达人网友:孤老序
  • 2021-03-02 10:04
试试看:
void send(uchar i)
{
SBUF = i / 1000 + 0x30;
i = i % 1000;
while (TI==0);
TI = 0;
SBUF = i / 100 + 0x30;
i = i % 100;
while (TI==0);
TI = 0;
SBUF = i / 10 + 0x30;
i = i % 10;
while (TI==0);
TI = 0;
SBUF = i + 0x30;
while (TI==0);
TI = 0;
SBUF = ','; //发送一个逗号
while (TI==0);
TI = 0;
}

void main()
{
init();
while(1) {
show(Count);
send();
}
}

显示一次、发送一次,试试看。

也可能发送的太频繁。
那就显示100次,发送一次,试试看。追问不行啊,还是很快的显示,我觉得是那个显示是动态显示,把send()跟它放一块按我写的那个应该没有问题的,但是不知道怎么回事就是显示很快。
另外一个问题显示的不是对应的十六进制有解决办法吗?追答void main()
{
uint nnn;
init();
while(1) {
show(Count);
if(nnn != Count) { send(); nnn = Count;}
//仅当Count发生变化时,发送一次。
}
}追问嗯,明天试试,先谢谢啦
全部回答
  • 1楼网友:像个废品
  • 2021-03-02 10:35
首先确定你的串口设置是否正确:让你的串口发一个固定数字,甚至可以写一个0~0xff轮训着发的函数,看串口调试助手是否是程序中发的数据,如果不是则说明你的串口使用不对(配置,或者串口调试助手与其的波特率没设置正确),如果数据对则说明串口没问题,是整个中有BUG,这个查找就麻烦了。
你这程序有问题,“void show(uchar i)”其中形参i是uchar型(8位),而在这个函数里面你却有“i/1000”这样的操作,我相信你的编译器肯定会给这条语句报警的。追问编译没有错误,就连警告都没有……我试试
  • 2楼网友:胯下狙击手
  • 2021-03-02 10:12
void send()
{
SBUF=Count;
while(TI==0);
TI=0;
}
可能是这个函数有问题追问这是什么地方?追答串口发送是需要时间的,所以你要等发送完一个后在发送下一个,
一旦发送数据就很快的发送不停的发,这是必定的,while(1)不停循环,自然是不停的send,所以串口助手是一直在接收数据。实现计一次数串口发送一次数据,解决的办法就是在中断里发送
while(1) {
show(Count);
}
void Counter0() interrupt 0
{
EX0=0;
Count++;
send();
EX0=1;
}
发送的还不是十六进制对应的数,这是因为发送的本来就不是十六进制,而是8位二进制数,你说的可能是串口助手里以十六进制数显式还是以字符格式显示追问嗯,明天试试,我也知道那个while是不停的循环,所以加了个for,先谢谢了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯