1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

標(biāo)題: 單片機(jī)乙機(jī)程序用全局變量i,如何保證剛進(jìn)入中斷時(shí)的i就是0 [打印本頁]

作者: Carlohy    時(shí)間: 2020-5-4 18:23
標(biāo)題: 單片機(jī)乙機(jī)程序用全局變量i,如何保證剛進(jìn)入中斷時(shí)的i就是0
想問下鏈接中單片機(jī)串口雙機(jī)通信的接收方程序的全局變量問題,甲機(jī)會(huì)發(fā)送9,3,2,4,5,1給乙機(jī),發(fā)送一個(gè)數(shù)等待TI=1后才發(fā)下一個(gè)數(shù)。乙機(jī)程序用全局變量i,如何保證剛進(jìn)入中斷時(shí)的i就是0?如果不是0,甲機(jī)發(fā)來的9就不是存在buffer[0]了,乙機(jī)顯示的順序就會(huì)不對(duì)??而實(shí)際上顯示是正常的??所以我很迷,這里特別用全局變量來做,而不是在顯示函數(shù)和中斷函數(shù)分別定義i,這樣順序才不會(huì)錯(cuò)。。
另外中斷函數(shù)是會(huì)改變?nèi)肿兞康闹蛋桑?br />


作者: Carlohy    時(shí)間: 2020-5-4 19:06
//程序:ex6_5.c
//功能:乙機(jī)接收程序,采用中斷方式實(shí)現(xiàn)
#include<reg51.h>       //包含頭文件reg51.h,定義51單片機(jī)的專用寄存器
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};//定義接收數(shù)據(jù)緩沖區(qū)
unsigned char i;        //定義全局變量i
//函數(shù)名:disp
//函數(shù)功能:在6個(gè)LED上顯示buffer中的6個(gè)數(shù)
//入口參數(shù):無
//出口參數(shù):無
void disp()
{
   unsigned char w,i,j;
   w=0x01;              //位碼賦初值
   for(i=0;i<6;i++)
   {
     P1=tab[buffer[i]]; // 送共陽極顯示字型段碼,buffer[i]作為數(shù)組分量的下標(biāo)
     P2=~w;             // 送反相后的位碼
     for(j=0;j<100;j++);// 顯示延時(shí)
     w<<=1;                 // w左移一位
   }
}
void main()                //主函數(shù)
{       
     TMOD=0x20;         //定時(shí)器T1工作于方式2
         TL1=0xf4;      //波特率定義
         TH1=0xf4;
         TR1=1;
     SCON=0x40;         //定義串行口工作于方式1
     REN=1;                         //接收允許
      ES=1;                         //開串行口中斷
      EA=1;                      //開總中斷允許位        
      i=0;
while(1)disp();
}
//函數(shù)名:serial
//函數(shù)功能:串行口中斷接收數(shù)據(jù)
//形式參數(shù):無
//返回值:無
void serial()interrupt 4                //串口中斷類型號(hào)為4
{  
EA=0;                                        //關(guān)中斷
RI=0;                                       //軟件清除中斷標(biāo)志位
        buffer[i]=SBUF;                 //接收數(shù)據(jù)
        i++;
    if(i==6)i=0;
EA=1;                                        //開中斷允許位
}
作者: wulin    時(shí)間: 2020-5-4 21:01
驗(yàn)證數(shù)據(jù)頭正確,否則覆蓋掉。
unsigned char i=0;
bit flag=0;
void UARTInterrupt() interrupt 4
{
        RI=0;                                //接收中斷請(qǐng)求標(biāo)志位清0
        buffer[i]=SBUF;                //接收到的數(shù)據(jù)串保存在緩存數(shù)組
        if(buffer[0]=='9')        //驗(yàn)證數(shù)據(jù)頭(起始位)
        {
                i++;
                if(i>=6)
                {
                        flag=1;                        //接收完成標(biāo)志置1
                        i=0;                        //計(jì)數(shù)變量清0
                }
        }
}





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1