找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机乙机程序用全局变量i,如何保证刚进入中断时的i就是0

[复制链接]
跳转到指定楼层
楼主
ID:744060 发表于 2020-5-4 18:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想问下链接中单片机串口双机通信的接收方程序的全局变量问题,甲机会发送9,3,2,4,5,1给乙机,发送一个数等待TI=1后才发下一个数。乙机程序用全局变量i,如何保证刚进入中断时的i就是0?如果不是0,甲机发来的9就不是存在buffer[0]了,乙机显示的顺序就会不对??而实际上显示是正常的??所以我很迷,这里特别用全局变量来做,而不是在显示函数和中断函数分别定义i,这样顺序才不会错。。
另外中断函数是会改变全局变量的值吧?


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:744060 发表于 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;                                        //开中断允许位
}
回复

使用道具 举报

板凳
ID:213173 发表于 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
                }
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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