标题:
单片机乙机程序用全局变量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