欧美极品高清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