📄 51
字号:
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define right_set XBYTE[0x0000] //右端配置区旗语锁存器
#define data_get XBYTE[0x0001] //数据区旗语锁存器
#define int_left XBYTE[0X2FFE] //左邮箱单元地址
#define LED P1 //定义数码管输出端
uchar xdata *right_addr; //右端配置地址区
uchar xdata *dat_addr; //右端采集数据区
uchar dat_in;
uchar dat_num=10;
sbit LED_l=P3^5;
sbit LED_h=P3^4;
const uchar tab[]={ /* 根据共阳极字型编码表获取0~9,A~B字型代码 */
0xc0,0xf9,0x24,0x30,//0~3
0x19,0x12,0x02,0x78,//4~7
0x00,0x18,0x08,0x03,//8~b
0x46,0x21,0x06,0x0e,//c~f
0xff//mie
};
/**************************声明函数******************************/
void init_left(void);
void init_right(void); //初始化右端单片机参数
void sem_flag(uchar *sem_apply);//申请旗语
uchar avg_dat(void); //计算采集数据的平均值
void disp(uchar dat); //显示函数
void delay(void); //延时函数
/**************************主函数******************************/
main()
{
init_left(); //初始化本机
init_right(); //初始化右端单片机相关设置
while (1)
{
disp(dat_in); //显示获得数据的平均值
}
}
/*********************初始化本机**********************/
void init_left(void)
{
EA=1; //开总中断
EX0=1; //开外部中断0
}
/*************初始化右端单片机相关设置**************/
void init_right(void) //配置右端单片机
{
sem_flag(&right_set); //申请右端设置区的使用权
right_addr=0x2000; //右端单片机参数设置区
dat_addr=0x3000; //右端单片机采集数据地址区
*right_addr=dat_num; //采集数据的个数
*(right_addr+1)=0x30; //采集数据高8位地址
*(right_addr+2)=0x00; //采集数据低8位地址
right_set=0x01;
}
/*************通过申请旗语获取某地址区域的使用权**************/
void sem_flag(uchar *sem_apply)
{
*sem_apply=0x00; //申请旗语
while((*sem_apply)!=0x00); //等待并获得旗语
}
/*************读取采集数据并取得平均值**************/
uchar avg_dat(void)
{
uchar i,average;
uint sum=0;
for (i=0;i<dat_num;i++)
{
sum+=*(dat_addr+i); //采集数据求和
}
average=sum%dat_num; //去平均值
return(average);
}
/*************延时程序**************/
void delay(void)
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<1140;j++);
}
/*************显示采集数据的平均值**************/
void disp(uchar dat)
{
uchar dat_h,dat_l;
dat_h=dat/16;
dat_l=dat%16;
LED_h=0;
LED=tab[dat_h]; //送高位数据
delay();
LED_h=1;
LED_l=0;
LED=tab[dat_l]; //送低位数据
delay();
LED_l=1;
}
/*************读取采集区数据**************/
void read_dat()interrupt 0 using 1
{
uchar ch;
sem_flag(&data_get); //获取数据区旗语
dat_in=avg_dat(); //求采集数据平均值
ch=int_left; //清除左边中断
data_get=0x01; //释放数据区旗语
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -