欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機乙機程序用全局變量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://m.raoushi.com/bbs/) Powered by Discuz! X3.1