找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2593|回复: 5
收起左侧

串口中断问题

[复制链接]
ID:51482 发表于 2013-8-10 20:17 | 显示全部楼层 |阅读模式
/************************甲机*******************************
名称:甲机串口程序
说明:甲机向乙机发送控制命令字符,甲机同时还可以接收乙机发送
      的数字,所接收的数字显示在数码管上。
***********************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^0;
sbit LED2=P1^3;
sbit K1=P1^7;
uchar temp,num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint);
void put_to_serail(uchar c);
void init();
void keyscan();
//主程序
void main()
{
   init();
   while(1)
   {
      delay(10);
      keyscan();
      switch(temp)
      {
         case 0://put_to_serail('X');
                LED1=LED2=1;
                break;
         case 1://put_to_serail('A');
                LED1=0;LED2=1;
                break;
         case 2://put_to_serail('B');
                LED1=1;LED2=0;
                break;
         case 3://put_to_serail('C');
                LED1=0;LED2=0;
                break;
      }
   }
}
//初始化程序
void init()
{
   temp=0;
   LED1=LED2=1;
   P0=0x00;
   SCON=0x50;
   TMOD=0x02;
   PCON=0x00;
   TH1=0xfd;
   TL1=0xfd;
   TI=RI=0;
   TR1=1;
   EA=1;
   ES=1;
}
//延时程序
void delay(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
//键盘扫描程序
void keyscan()
{
   if(K1==0)
   {
      delay(10);
      if(K1==0)
      {
         temp++;
         if(temp==4)
            temp=0;
      }
      while(!K1);
   }
   if(K1==0)
   {
      put_to_serail('X');
   }
   if(K1==1)
   {
      put_to_serail('A');
   }
   if(K1==2)
   {
      put_to_serail('B');
   }
   if(K1==3)
   {
      put_to_serail('C');
   }
}
//串口发送程序
void put_to_serail(uchar c)
{
   SBUF=c;
   while(TI==0);
   TI=0;
}
//串口接收程序
void Serial_INIT() interrupt 4
{
   if(RI)
   {
      RI=0;
      if(SBUF>=0&&SBUF<=9)
         P0=table[SBUF];
      else
         P0=0x00;
   }
}
   



/*********************************乙机*********************************
名称:乙机程序接收甲机发送的字符并完成相应动作
说明:乙机接收到甲机发送的信号后,根据相应信号控制完成不同的LED点亮动作
**********************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^0;
sbit LED2=P1^3;
sbit K2=P1^7;
uchar num;
void delay(uint);
void init();
void keyscan();
//主程序
void main()
{
   init();
   while(1)
   {
      delay(100);
      keyscan();
      
   }
   
}
//初始化程序
void init()
{
   num=0;
   SCON=0x50;
   TMOD=0x20;
   PCON=0x00;
   TH1=0xfd;
   TL1=0xfd;
   TI=RI=0;
   TR1=1;
   EA=1;
   ES=1;
}
//延时子程序
void delay(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
//按键扫描程序
void keyscan()
{
   if(K2==0)
   {
      delay(5);
      if(K2==0)
      {
         SBUF=num;
         num++;
         if(num==10)
            num=0;
         while(TI==0);
         TI=0;
      }
   }
}
//乙机串口中断程序
void serial_0() interrupt 4
{
   if(RI==1)
   {
      RI=0;
      switch(SBUF)
      {
         case  'X':LED1=1;LED2=1;break;
         case  'A':LED1=0;LED2=1;break;
         case  'B':LED1=1;LED2=0;break;
         case  'C':LED1=0;LED2=0;break;
      }
   }
}

为什么甲机发送的字节乙机收不到,乙机发送的甲机也没收到。
1.jpg
回复

使用道具 举报

ID:76287 发表于 2015-4-10 09:11 | 显示全部楼层
虽然不懂,但还是要顶,毕竟每一位老手都是从新手蜕变而来的,赞一个。。。。。。
回复

使用道具 举报

ID:52999 发表于 2013-8-14 13:13 | 显示全部楼层
其实,不用MAX232和串口,,直接甲机的TXD连到乙机的RXD,乙机的TXD连到甲机的RXD就可以通信了,实际电路这样也可以实现的
回复

使用道具 举报

ID:52999 发表于 2013-8-14 13:10 | 显示全部楼层
你proteus仿真中,双机并没有连通吧!!串口那线被你忽略了
回复

使用道具 举报

ID:52928 发表于 2013-8-11 10:42 | 显示全部楼层
两个单片机要共地
回复

使用道具 举报

ID:7485 发表于 2013-8-11 06:51 | 显示全部楼层
甲机或乙机任何一个有不正常的地方,都会使通讯失败。

这里面牵涉的方面很多,两个单片机都要能正常工作,这是最起码的。串口部分的硬件连接、波特率设置、程序等等等等。。。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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