📄 0cong0011.c
字号:
#include<AT89X51.H>
#include<absacc.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define BN 16
sbit ACC_0 = 0xE0;
sbit ACC_1 = 0xE1;
sbit ACC_2 = 0xE2;
sbit ACC_3 = 0xE3;
sbit ACC_4 = 0xE4;
sbit ACC_5 = 0xE5;
sbit ACC_6 = 0xE6;
sbit ACC_7 = 0xE7;
bit ck=0;
bit cj=0;
uchar idata tbuf[16];
uchar idata cd[16];
uchar addr;
//延时10ms子函数
void delay(void){
uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<100;j++)
;
}
//延时1s子函数
void delay1s(void){
uchar i,j,k;
i=100;
for(k=0;k<10;k++){
while((i--)!=0){
for(j=0;j<125;j++)
{;}
}
}
}
//数据的采集处理子函数
void chaiji(void){
while(1){
uchar i;
if(ck==0){
P3_3=1;
if(P3_3==0){
delay();
if(P3_3==0)
{ P2_1=0;
P2_2=0;
delay1s();
P2_0=0;
ck=1;
cj=0;
}
}
}
if(cj==0){
P3_3=1;
if(P3_3==1){
delay();
if(P3_3==1)
{
P2_0=1;
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
P2_2=1;
P2_1=1;
cj=1;
ck=0;
}
}
}
/*采集数据程序部分*/
for(i=0;i<16;i+=4){
P0=0xff;
while(!P0_4);
ACC=P0;
cd[i]=ACC&0x0f;
P0=0xff;
while(!P0_5);
ACC=P0;
cd[i+1]=ACC&0x0f;
P0=0xff;
while(!P0_6);
ACC=P0;
cd[i+2]=ACC&0x0f;
while(!P0_7);
ACC=P0;
cd[i+3]=ACC&0x0f;
delay();
P2_6=1;
delay();
delay();
delay();
P2_6=0;
delay();
}
delay();
P2_7=1;
delay();
delay();
delay();
P2_7=0;
delay();
tbuf[0]=0x30;tbuf[1]=0x2e;tbuf[2]=cd[1]+0x30;tbuf[3]=cd[2]+0x30;
tbuf[4]=cd[5]+0x30;tbuf[5]=cd[6]+0x30;tbuf[6]=0x2e;tbuf[7]=cd[7]+0x30;
tbuf[8]=0x32;tbuf[9]=0x34;tbuf[10]=0x2e;tbuf[11]=0x30;
ACC=0xff;ACC=ACC&cd[12];if((!ACC_0)&&(!ACC_3)) tbuf[12]=0x31; else tbuf[12]=0x30; tbuf[13]=cd[13]+0x30;tbuf[14]=0x2e;tbuf[15]=cd[14]+0x30;
}
}
//下位机向上位机发送数据子函数
void str(void) {
uchar i;
char p;
do{ p=0;P3_2=1; //发送数据及校验和(6)
for(i=0;i<BN;i++){
SBUF=tbuf[i];
p+=tbuf[i];
while(TI!=1);TI=0;
}
SBUF=p;
while(TI==0);TI=0;
P3_2=0;
while(RI==0);RI=0;
}while(SBUF!=0); //接收正确返回,否则重发(7)
SM2=1;
ES=1; }
//中断服务子函数用于和上位机的通信
void ssio(void) interrupt 4 using 1 {
uchar a;
RI=0;
ES=0;
P1=0xff;
addr=P1;
if(SBUF!=addr){ES=1;return;} //接收比较地址(1)
SM2=0;
P3_2=1;
TB8=1;
SBUF=addr; //发从机地址(2)
while(TI!=1);TI=0;
P3_2=0;
while(RI!=1);RI=0;
if(RB8==1){SM2=1;ES=1;return;}
a=SBUF; //接收命令0x02 (3)
if(a==0x02){
P3_2=1;SBUF=0x01; //发送0x01 (5)
while(TI!=1);TI=0;
TB8=0;str(); P3_2=0; }
else{ P3_2=1;SBUF=0x80; //如果命令错收发送复位信号(fu)
while(TI!=1);TI=0;
SM2=1;ES=1; P3_2=0;
}
}
void main(void){
TMOD=0x20; /*定时器T1:T1定时工作方式2*/
TL1=0xfd;TH1=0xfd; /*设定T1的初值*/
TR1=1; //启动T1定时 定时器
PCON=0x00; /*确定串口的波特率:SMOD=0*/
SCON=0xf0; /*串口工作在方式3,SM2=1,REN=1允许接收*/
ES=1; /*开串口中断*/
EA=1; /*开放CPU总中断*/
P2=0x1f;
P3_2=0;
chaiji();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -