标题: 单片机乙机程序用全局变量i,如何保证刚进入中断时的i就是0 [打印本页]

作者: Carlohy    时间: 2020-5-4 18:23
标题: 单片机乙机程序用全局变量i,如何保证刚进入中断时的i就是0
想问下链接中单片机串口双机通信的接收方程序的全局变量问题,甲机会发送9,3,2,4,5,1给乙机,发送一个数等待TI=1后才发下一个数。乙机程序用全局变量i,如何保证刚进入中断时的i就是0?如果不是0,甲机发来的9就不是存在buffer[0]了,乙机显示的顺序就会不对??而实际上显示是正常的??所以我很迷,这里特别用全局变量来做,而不是在显示函数和中断函数分别定义i,这样顺序才不会错。。
另外中断函数是会改变全局变量的值吧?



作者: Carlohy    时间: 2020-5-4 19:06
//程序:ex6_5.c
//功能:乙机接收程序,采用中断方式实现
#include<reg51.h>       //包含头文件reg51.h,定义51单片机的专用寄存器
code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
                        //定义0~9共阳极显示字型码
unsigned char buffer[]={0x00,0x00,0x00,0x00,0x00,0x00};//定义接收数据缓冲区
unsigned char i;        //定义全局变量i
//函数名:disp
//函数功能:在6个LED上显示buffer中的6个数
//入口参数:无
//出口参数:无
void disp()
{
   unsigned char w,i,j;
   w=0x01;              //位码赋初值
   for(i=0;i<6;i++)
   {
     P1=tab[buffer[i]]; // 送共阳极显示字型段码,buffer[i]作为数组分量的下标
     P2=~w;             // 送反相后的位码
     for(j=0;j<100;j++);// 显示延时
     w<<=1;                 // w左移一位
   }
}
void main()                //主函数
{       
     TMOD=0x20;         //定时器T1工作于方式2
         TL1=0xf4;      //波特率定义
         TH1=0xf4;
         TR1=1;
     SCON=0x40;         //定义串行口工作于方式1
     REN=1;                         //接收允许
      ES=1;                         //开串行口中断
      EA=1;                      //开总中断允许位        
      i=0;
while(1)disp();
}
//函数名:serial
//函数功能:串行口中断接收数据
//形式参数:无
//返回值:无
void serial()interrupt 4                //串口中断类型号为4
{  
EA=0;                                        //关中断
RI=0;                                       //软件清除中断标志位
        buffer[i]=SBUF;                 //接收数据
        i++;
    if(i==6)i=0;
EA=1;                                        //开中断允许位
}
作者: wulin    时间: 2020-5-4 21:01
验证数据头正确,否则覆盖掉。
unsigned char i=0;
bit flag=0;
void UARTInterrupt() interrupt 4
{
        RI=0;                                //接收中断请求标志位清0
        buffer[i]=SBUF;                //接收到的数据串保存在缓存数组
        if(buffer[0]=='9')        //验证数据头(起始位)
        {
                i++;
                if(i>=6)
                {
                        flag=1;                        //接收完成标志置1
                        i=0;                        //计数变量清0
                }
        }
}





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1