找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3234|回复: 6
打印 上一主题 下一主题
收起左侧

求助:51单片机向串口发送的问题

[复制链接]
跳转到指定楼层
楼主
写了一个程序,用定时器控制led灯,当led灯亮时,发送一次数据到串口,当led灯灭时,发送一次数据到串口,现在遇到的问题是,当led灯亮时,会发送多次数据到串口,当灯灭时,又会发送多次数据到串口,
求助:怎么才能保证led灯亮和灭时各只发送一次数据到串口,下面是程序,求大神帮忙看下,程序哪些地方有问题,请帮忙指出,万分感谢,


//程序目标:led0灯每秒钟亮灭一次,led0亮时x=0x01,并把x值发送到串口,led0灭时y=0x02,并把y值发送到串口

/*现在遇到的问题:程序启动后,led0亮时,会发送多次x值到串口(程序目标是led0亮时只发送一次x值到串口)led0亮时,会发送多次x值到串口(程序目标是led0亮时只发送一次y值到串口)*/

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led0=P1^0;     //LED灯

uchar x,y;   //设置变量,当led0=0时,x=0x01,当led0=1时,y=0x02,
uint count;

void delay(uint xms)   //延时
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void init()     //定时器及串口初始化程序
{
TMOD=0x21;
TH1=0XFD;
TL1=0XFD;
TH0=0x4C;
TL0=0x00;
SM0=0;
SM1=1;
REN=1;
EA=1;

ET0=1;
TR0=1;

TR1=1;
ES=1;
}   
void main()
{
init();
while(1)
{
  if(count==10)
  {
   count=0;
   led0=~led0;
   }
  if(led0==0)      //当led0=0时,把x值发送到串口
  {
   x=0x01;
   ES=0;
   SBUF=x;
   while(!TI);
   TI=0;
   ES=1;
  }

  if(led0==1)       //当led0=1时,把y值发送到串口
  {
   y=0x02;
   ES=0;
   SBUF=y;
   while(!TI);
   TI=0;
   ES=1;
   
  }
}
}
void timer0() interrupt 1       //计数器中断(每秒钟led0亮灭各一次)
{
TH0=0x4C;
TL0=0x00;
count++;
}
void timer5() interrupt 4     //串口中断
{
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2017-3-13 13:00 | 只看该作者
做串行通讯,收发双方要事先协议一下。
回复

使用道具 举报

板凳
ID:111634 发表于 2017-3-13 22:15 | 只看该作者
本帖最后由 zl2168 于 2017-3-13 22:17 编辑

双机串行通信方式1
Proteus仿真一下,确认有效。
实例77 双机通信方式1.rar (40.4 KB, 下载次数: 6)

以上摘自张志良编著80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

地板
ID:111634 发表于 2017-3-13 22:18 | 只看该作者
双机串行通信方式2
Proteus仿真一下,确认有效。
实例78 双机通信方式2.rar (46.57 KB, 下载次数: 2)

以上摘自张志良编著80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

5#
ID:111634 发表于 2017-3-13 22:19 | 只看该作者
双机串行通信方式3
Proteus仿真一下,确认有效。
实例79 双机通信方式3.rar (45.3 KB, 下载次数: 2)

以上摘自张志良编著80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

6#
ID:170468 发表于 2017-3-14 01:48 | 只看该作者
在定时器中断里发,将定时器设置成1秒钟中断一次,然后中断程序写

if(led0==0)
{ led0 = 1;SBUF=1;}
else
{ led0 = 0;SBUF=2;}

void main()
{
init();
while(1);
  }
这样就够了
回复

使用道具 举报

7#
ID:140906 发表于 2017-3-14 09:06 来自手机 | 只看该作者
你也可以在你原来的程序上定义一个变量,用来标志已经发送几次数据,每次发完判断是不是到你想要的次数了然后再停止,再把变量归零,等待下一次的发送
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表