📄 51
字号:
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define right_set XBYTE[0x0000] //右端配置区旗语锁存器
#define dat_get XBYTE[0x0001] //数据区旗语锁存器
#define int_left XBYTE[0X2FFE] //左邮箱单元地址
uchar xdata *right_addr; //右端配置地址区
uchar xdata *dat_addr; //右端采集数据区
uchar dat_num,n=0;
uchar buffer[100]; //接收数据缓冲区
/*******************声明函数********************/
void init_right(void); //初始化右端单片机
void init_serial(void); //初始化串口
void sem_flag(uchar *sem_apply);//旗语申请函数
void save_dat(void); //保存采集数据
/********************主函数********************/
main()
{
init_right(); //初始化右端单片机
init_serial(); //初始化串口
while(1)
{
if(n=dat_num) //采集完规定量数据
{
n=0; //数据采集个数清零
save_dat(); //保存数据
}
}
}
/****************初始化右端单片机****************/
void init_right(void)
{
sem_flag(&right_set); //获得配置区旗语
dat_num=*right_addr; //读出采集数据个数
dat_addr=(*(right_addr+1))|(*(right_addr+2));//读出数据存储区起始地址
right_set=1; //释放旗语
}
/****************初始化串行中断****************/
void init_serial(void)
{
SCON = 0x50; //8位串行口模式1,允许接收,REN=1
TMOD|= 0x20; //定时器1工作在模式2
TH1 = 0xfd; //波特率为9600,晶振频率为11.0592MHz
TL1 = 0xfd;
ES = 1; //使能串行口中断
EA = 1; //使能全局中断
TR1 = 1; //启动定时器1
}
/****************串口中断服务程序****************/
void serial_IT(void) interrupt 4
{
if(RI==1)
{
RI=0;
buffer[n++]=SBUF; //将串口接收数据送入接收数据缓冲区
}
}
/****************数据采集接收程序****************/
void save_dat(void)
{
uchar i;
sem_flag(&dat_get); //获得采集数据区旗语
for(i=0;i<dat_num;i++)
{
(*(dat_addr+i))=buffer[i];//将缓冲区数据送入采集数据存储区
}
int_left=0xff; //触发左端单片机外部中断
dat_get=1; //释放采集数据区旗语
}
/*************通过申请旗语获取某地址区域的使用权**************/
void sem_flag(uchar *sem_apply)
{
*sem_apply=0x00; //申请旗语
while((*sem_apply)!=0x00); //等待并获得旗语
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -