大家好,我是新手,有个问题想请教大家。两个单片机U1(下图左边)和U2(下图右边),都要有收发功能,一个单片机U1根据自己接口的按键,给另一个单片机U2发送控制数据,U2根据收到的数据控制与其相连的的LED亮灭,U2也会根据与自身相连的按键,发送出数据给单片机U1,控制与U1相连数码管的字符显示。下面是代码和原理图,仿真不通过,不知道错在哪里,求高手指导一下。
这里是代码,分别是U1和U2的:
- //U1
- #include
- sbit K1=P1^0;
- sbit K2=P1^1;
- sbit K3=P1^2;
- unsigned char tb;//transmitted byte,所发送的字节
- unsigned char rb;//received byte,所接收的字节
- void delay(unsigned int i)
- {
- unsigned int m,n;
- for(m=i;m>0;m--)
- for(n=125;n>0;n--);
- }
- void main()
- {
- EA=1;//全局中断开
- ES=1;//串口中断开
- ET1=1;//计时器1中断开
- TMOD=0x20;//计时器1工作方式2
- TH1=0xfd;//波特率9600
- TL1=0xfd;
- SCON=0x50;//串口初始化方式1,REN=1,允许接收
- PCON=0x00;//SMOD=0,波特率不倍增
- TR1=1;//打开计时器1
- //tb=0x00;
- while(1)
- {
- REN=0;
- //发送
- if(K1==0)
- {
- delay(50);
- if(K1==0)
- tb=0xfe;
- }
- if(K2==0)
- {
- delay(50);
- if(K2==0)
- tb=0x7f;
- }
- if(K3==0)
- {
- delay(50);
- if(K3==0)
- tb=0xff;
- }
-
- SBUF=tb;
- while(TI==0);
- TI=0;
-
- //接收
- REN=1;
- rb=SBUF;
- while(RI==0);
- RI=0;
- P2=rb;
- REN=0;
- }
- }
复制代码这个是U2的:
- //U2
- #include
- //定义共阴极七段码管的数字0~F,以及小数点、空白、全显示
- #define SEG0 0x3f
- #define SEG1 0x06
- #define SEG2 0x5b
- #define SEG3 0x4f
- #define SEG4 0x66
- #define SEG5 0x6d
- #define SEG6 0x7d
- #define SEG7 0x07
- #define SEG8 0x7f
- #define SEG9 0x6f
- unsigned char digits[]={SEG0,SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8,SEG9};
- sbit K4=P1^0;
- unsigned char tb;
- unsigned char rb;
- void main()
- {
- EA=1;//全局中断开
- ES=1;//串口中断开
- ET1=1;//计时器1中断开
- TMOD=0x20;//计时器1工作方式2
- TH1=0xfd;//波特率9600
- TL1=0xfd;
- SCON=0x50;//串口初始化方式1,接收REN=1
- PCON=0x00;//SMOD=0,波特率不倍增
- TR1=1;//打开计时器1
- P2=0xff;
- rb=0;
- while(1)
- {
- //REN=0;
-
- //发送
-
- if(K4==0)
- {
- delay(50);
- if(K4==0)
- {
- tb=(tb+1)%10;
- tb=digits[tb];
- SBUF=tb;
- while(TI==0);
- TI=0;
- }
- }
-
- //接收
- REN=1;
- rb=SBUF;
- while(RI==0);
- RI=0;
- P2=rb;
- REN=0;
- }
- }
复制代码
[
本帖最后由 cdinten 于 2013-11-26 19:01 编辑 ]
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
主机从机都用
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define duan P1
#define dis P2
void main()
{
uchar key_in=0xff; //I/O口作输入时,检测外设状态,允许输出高电平
TMOD=0x20; //设置为定时器1方式2
TH1=0xfd; //装初值,波特率设为9600
TL1=0Xfd;
EA=1; //开总中断
ET1=1; //允许定时器1中断
TR1=1; //开启定时器1中断
SCON=0x50; //串口控制寄存器设置,方式1、开串口接收。SM0=0;SM1=1;REN=1;
ES=1; //开串口中断
while(1)
{
if(key_in != duan)
{
key_in=duan;
SBUF=key_in; //发送数据
while(!TI); //等待数据发送,由TI判断发送是否结束
TI=0;
}
}
}
void chuankou() interrupt 4 //串口中断函数
{
dis=SBUF; //接收数据
RI=0; //RI由软件清零;
}
一周热门 更多>