📄 adandkeyau.c
字号:
#include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#include<absacc.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define FSA_INIT 0 //初始状态
#define FSA_COMMAND 1//命令状态
extern void Delay1335(uint delx);
//==============================
sbit KEY_CS=P1^7;//键盘
sbit KEY_CLK=P1^1;
sbit KEY_DIN=P1^0;
sbit KEY_INT0=P3^2;
//==============================
sbit AD_CLK=P1^2;//AD
sbit AD_RC=P1^3;
sbit AD_CS=P1^4;
sbit AD_BUSY=P1^5;
sbit AD_DATA=P1^6;
//==============================
sbit S_DIN=P2^6;
sbit S_DOUT=P2^5;
sbit S_CLK=P2^4;
sbit CS_MAX=P2^3;
uint idata R_buf_G;
uint idata value;
uint idata set_y;
uint idata set_num;
uint idata num_rule;
uint idata auto_back;
uchar idata Key_buf_G;
uchar bdata Buf_G;
sbit D_KEY=Buf_G^7;
bdata uint checksum;
uchar idata Kset_buf_G;
uchar idata bit_buf_G;
uchar idata back_count;
uchar idata wait_back_count;
uint idata a[11]={0,0,0,0,0,0,0,0,0,0,0};
uint idata b[6] ={0,0,0,0,0,0};
uint idata f[6] ={0,0,0,0,0,0};
uint idata c[11]={0,0,0,0,0,0,0,0,0,0,0};
uint idata d[6] ={0,0,0,0,0,0};
uint idata g[6] ={0,0,0,0,0,0};
bit Key_flag_G; //有无键按下标志位
bit read_flag;
bit Res_flag_G; //工作模式标志位
bit set_flag_G; //设置状态标志位
bit work_flag_G; //电源工作标志位
bit PAMA_OK; //电源参数采样读取次数完成标志位
bit set_key; //设置键按下标志位
bit wait_back; //等待接收发送的控制指令的返回植
bit send_wait;
bit PAMA_OK1; //电源参数采样读取次数完成标志位
uchar xdata RecvState_G = FSA_INIT;//当前状态
uchar xdata RecvState_G1 = FSA_INIT;//当前状态
uchar xdata RecvChksum_G = 0; //输入数据的校验字节
uchar xdata RecvCtr_G = 0; //数据缓冲区指针
uchar xdata RecvCtr_G1 = 0; //数据缓冲区指针
uchar xdata RecvBuf_G[13] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};//输入数据缓冲区
uchar xdata Rec4Buf_G[13] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};//485输入数据缓冲区
uint xdata count3=0;
uchar xdata ERROR_SEND;
uchar xdata Recv_flag_G; //接收是否完成1->完成
uchar xdata Rec4_flag_G; //485接收是否完成1->完成
uchar xdata Rec2_flag_G; //232接收是否完成1->完成
uchar xdata TransBuf_G[13]; //输出数据缓冲区
uchar xdata TransCtr_G = 0; //输出数据指针
uchar xdata TransChksum_G = 0; //输出数据的校验字节
uchar xdata TransSize_G = 0; //输出数据字节数
uchar xdata TransState=0; //0为正常返回数据,1为下位机状态数据
//===========================
void InitZLG(void)
{
KEY_INT0 = 1;
KEY_CS = 1;
KEY_DIN = 1;
}
void DelayZLG(uchar x)
{
uchar i;
for(i = 0; i <= x; i++)
{
;
}
}
void SendZLG(void)
{
uchar i;
Buf_G = 0x15;
KEY_CS = 0;
//===
KEY_CLK = 0;
//===
DelayZLG(20);
for(i = 0; i < 8; i++)
{
KEY_DIN = D_KEY;
_nop_();
_nop_();
KEY_CLK = 1;
DelayZLG(5);
KEY_CLK = 0;
DelayZLG(5);
Buf_G = _crol_(Buf_G,1);
}
KEY_DIN = 1;
}
void ReceiveZLG(void)
{
uchar i;
DelayZLG(20);
KEY_CS = 0;
for(i = 0; i < 8; i++)
{
KEY_DIN = 1;
KEY_CLK = 1;
DelayZLG(5);
D_KEY = KEY_DIN;
Buf_G = _crol_(Buf_G,1);
KEY_CLK = 0;
DelayZLG(5);
}
Key_buf_G = Buf_G;
KEY_DIN = 1;
KEY_CS = 1;
}
void Delayus(uchar t)
{
for(; t>0; t--)
;
}
//**********************3100发送字节子程序**********************
uchar Byte3100(uchar dat) reentrant //中断里调用,可重入函数
{
uchar i;
S_DOUT = 1;
S_DIN = 1;
for(i=0; i<8; i++)
{
if(dat & 0x80) //判断最高位是否为1
S_DIN = 1; //如果最高位为1,DIN置1
else //否则DIN置0*/
S_DIN = 0;
S_CLK = 1; //时钟上升沿有效
dat <<= 1; //将数据左移一位
dat |= S_DOUT; //读数据
S_CLK = 0;
}
return dat;
}
//*************************3100发送程序**************************
//发送程序,分2个字节,你也可用uint型的,DIN写命令/数据的同时,DOUT输出数据
uchar Send3100(uchar tx1,uchar tx2) reentrant
{
CS_MAX = 0;
Byte3100(tx1);
tx1 = Byte3100(tx2);
CS_MAX = 1;
return tx1;
}
//************************3100初始化函数*************************
void Init3100(void)
{
uchar dat,i=0;
do
{
Send3100(0xc4,0x09); //写配置字0xc409, fifo使能,/IRO使能 ,19200bps
Delayus(200); //必须有延时
dat = Send3100(0x40,0x00); //读配置字
}while((dat!= 0x09)&&(++i<5)); //不成功则配置5次,确保可靠配置,应该是0x09(19200bps)
Send3100(0x80,0xaa); //写数据,配置端口方等
Delayus(200); //必需有延时
Send3100(0x82,0x00); //写数据,配置端口方等
Delayus(200);
}
//***********************按键中断处理程序***********************
void INT0_Key(void) interrupt 0
{
SendZLG();
ReceiveZLG();
KEY_CS=1;
while(KEY_INT0==0) ;//等待按键释放
Key_flag_G=1;
if(Key_buf_G==0x00)
set_key=1;
auto_back=0;
}
//********************485接收数据中断处理程序********************
void INT1_MAX3100(void) interrupt 2 //using 2
{
uchar temp;
// TF0 = 0;
ES=0;
temp = Send3100(0x00,0x00); //IRQ中断,读数据
if(wait_back==0)
{
switch(RecvState_G1)
{
case FSA_INIT :
if(temp==0x5a)
{
TR2=0;
TH2=0x7f;
TL2=0x00;
TR2=1;
RecvCtr_G1=0; //数据长度复位
Rec4Buf_G[RecvCtr_G1++]=temp;
RecvState_G1=FSA_COMMAND;//设置状态位
}
break;
case FSA_COMMAND :
if(RecvCtr_G1<12) //判断接收数据是否完毕,长度12
{
Rec4Buf_G[RecvCtr_G1++]=temp;
}
else
{
RecvCtr_G1=0; //数据长度复位
RecvState_G1=FSA_INIT; //设置状态位
if(Rec4Buf_G[3] == 0x02) //接受完一帧数据判断是否为数据返回信息
{
count3=count3+1; //接收信息次数加一
a[count3-1] = Rec4Buf_G[6]*256+Rec4Buf_G[5];//电压信息保存
c[count3-1] = Rec4Buf_G[8]*256+Rec4Buf_G[7];//电流信息保存
if (count3>=11)
{count3=0;
PAMA_OK=1; //满11次置位电源参数采样读取次数完成标志
}
}
}
break;
}
}
else
{
if(back_count<2)
back_count=back_count+1;
else
{
wait_back=0;
PAMA_OK1=0;
// TransBuf_G[0]=0x55;//发送接收正确标志
//TransBuf_G[1]=0x55;
// TransBuf_G[2]=0x55;
// TransSize_G=3;
// TransState=1;
// SBUF=TransBuf_G[0];//启动发送
/* if(temp==0x55)
{
wait_back=0;
PAMA_OK1=0;
TransBuf_G[0]=0x55;//发送接收正确标志
TransBuf_G[1]=0x55;
TransBuf_G[2]=0x55;
TransSize_G=3;
TransState=1;
SBUF=TransBuf_G[0];//启动发送
}
if(temp==0xaa)
{
Init3100(); //向电源控制部件发送控制信息
Send3100(0x80,0x5a);Send3100(0x80,0x06);Send3100(0x80,RecvBuf_G[2]);Send3100(0x80,0x01);Send3100(0x80,RecvBuf_G[4]); //写数据0x80 00, RTS在Cs上升沿时置高 ,19200bps
Send3100(0x80,RecvBuf_G[5]);Send3100(0x80,RecvBuf_G[6]);Send3100(0x80,RecvBuf_G[7]);Send3100(0x80,RecvBuf_G[8]);Send3100(0x80,RecvBuf_G[9]);
Send3100(0x80,RecvBuf_G[10]);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x86,0x00);
TransBuf_G[0]=0xFC;//发送接收正确标志
TransBuf_G[1]=0xFC;
TransBuf_G[2]=0xFC;
TransSize_G=3;
TransState=1;
SBUF=TransBuf_G[0];//启动发送
TR2=0;
TH2=0x00;
TL2=0x00;
TR2=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -