找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机IO口输出的数据与接收到的数据不一致

[复制链接]
跳转到指定楼层
楼主
ID:71991 发表于 2015-1-17 19:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求救,以下程序手机蓝牙串口助手往单片机发数据08   P1.0会亮与灭;正确的应该是P2.0会亮与灭的。

#include<reg51.h> //包含单片机寄存器的头文件
sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
sbit S4=P1^3;
sbit S5=P1^4;
sbit S6=P1^5;
sbit S7=P1^6;
sbit S8=P1^7;
sbit S9=P2^0;
sbit S10=P2^1;
sbit S11=P2^2;
sbit S12=P2^3;
sbit S13=P2^4;
sbit S14=P2^5;
sbit S15=P2^6;
sbit S16=P2^7;
/*****************************************************
函数功能:接收一个字节数据
***************************************************/
unsigned char keyval;
unsigned char Receive()
{
unsigned char dat ;
while(RI==0) //只要接收中断标志位RI 没有被置“1”
; //等待,直至接收完毕(RI=1)
RI=0; //为了接收下一帧数据,需将RI 清0
dat=SBUF; //将接收缓冲器中的数据存于dat
return dat;
}
/*****************************************************
函数功能:主函数
***************************************************/
void main(void)
{
TMOD=0x20; //定时器T1 工作于方式2
SCON=0x50; //SCON=0101 0000B,串口工作方式1,允许接收(REN=1)
PCON=0x00; //PCON=0000 0000B,波特率9600
TH1=0xfb; //根据规定给定时器T1 赋初值 18.432Mhz
TL1=0xfb; //根据规定给定时器T1 赋初值
TR1=1; //启动定时器T1
REN=1; //允许接收
P1=0x00;
P2=0x00;
while(1)
{
keyval=Receive(); //将接收到的数据送IO 口显示
if(keyval==0) //按键S1 被按下
S1=~S1;
if(keyval==1) //按键S2 被按下
S2=~S2;
if(keyval==2) //按键S3 被按下
S3=~S3;
if(keyval==3) //按键S4 被按下
S4=~S4;
if(keyval==4) //按键S5 被按下
S5=~S5;
if(keyval==5) //按键S6 被按下
S6=~S6;
if(keyval==6) //按键S7 被按下
S7=~S7;
if(keyval==7) //按键S8 被按下
S8=~S8;
if(keyval==8) //按键S9 被按下
S9=~S9;
if(keyval==9) //按键S10 被按下
S10=~S10;
if(keyval==10) //按键S11 被按下
S11=~S11;
if(keyval==11) //按键S12 被按下
S12=~S12;
if(keyval==13) //按键S13 被按下
S13=~S13;
if(keyval==14) //按键S14 被按下
S14=~S14;
if(keyval==15) //按键S15 被按下
S15=~S15;
if(keyval==16) //按键S16 被按下
S16=~S16;
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2015-1-18 15:51 来自手机 | 只看该作者
sbit S1=P1^0   把这句改为2.0
回复

使用道具 举报

板凳
ID:71991 发表于 2015-1-18 19:33 | 只看该作者
admin 发表于 2015-1-18 15:51
sbit S1=P1^0   把这句改为2.0

sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
sbit S4=P1^3;
sbit S5=P1^4;
sbit S6=P1^5;
sbit S7=P1^6;
sbit S8=P1^7;
sbit S9=P2^0;
sbit S10=P2^1;
sbit S11=P2^2;
sbit S12=P2^3;
sbit S13=P2^4;
sbit S14=P2^5;
sbit S15=P2^6;
sbit S16=P2^7;
IO口定意没有错,如果再改这个《sbit S1=P1^0   把这句改为2.0》P1.0口就没用了。
回复

使用道具 举报

地板
ID:237942 发表于 2017-10-24 15:23 | 只看该作者
while(RI==0) //只要接收中断标志位RI 没有被置“1”   这句有问题,应该改成while(!RI)
回复

使用道具 举报

5#
ID:212797 发表于 2017-10-24 16:14 | 只看该作者
同楼上所说,while(RI==0) 导致整个程序的逻辑乱了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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