📄 e_i.c
字号:
#include<W77C32.H>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define bn 5
#define RBR XBYTE[0X8010]
#define THR XBYTE[0X8010]
#define IER XBYTE[0X8011]
#define FCR XBYTE[0X8012]
#define IIR XBYTE[0X8012]
#define LCR XBYTE[0X8013]
#define MCR XBYTE[0X8014]
#define LSR XBYTE[0X8015]
#define MSR XBYTE[0X8016]
#define SCR XBYTE[0X8017]
#define DLL XBYTE[0X8010]
#define DLM XBYTE[0X8011]
sbit ExtCOM_CS=P1^7;
sbit WDI=P3^4;
uchar idata rFpcdata[5];
uchar idata rFdrivdata[17];
uchar idata tpcdata[17];
uchar idata tdrivdata[17];
uchar rFpcdata1,contr_data1;
uchar temp,infor_data0,infor_data1,count,time_count,num1;
uchar ch2[2];
uchar ch3[4];
uchar v_reg1,v_reg2,v_reg3,v_reg4,speed_temp,m_minute,m_second,m_tempmin,m_tempsec,hexdata,lowdata;
bit begin_flag,time_flag1;
bit re_flag;
bit time_flag;
bit flash_flag;
bit zhuan_flag;
uint speed,count1,num2,num3;
uchar a;
uchar control(uchar contr_data)reentrant;
uchar LRC(uchar usDataLen)reentrant;
uchar ConvertHextoChar(uchar ch)reentrant;
uchar ConvertCharHex(uchar ch)reentrant;
uchar Feedback();
void UartInit(void);
void SendC(uchar c)reentrant;
void FlashWDI();
uchar TestLine();
void main(void)
{
/*51初始化*/
TMOD=0x21;//定时器1和0的工作方式分别为2和1
TH0=0x10; TL0=0x00;
TH1=0xF6; TL1=0xF6;
EA=1;
ET0=1;
ET2=1;
TCON=0x40;/*启动定时器1*/
UartInit();//串口初始化
SCON=0x50;
while(1)
{
for(count1=0;count1<0xFFFF;count1++)
{
FlashWDI();
while(num2==num3)
{
FlashWDI();
}
num3=num2;
if (begin_flag==1)
{
begin_flag=0;
if ((num3==1)&&(contr_data1==0x01))
{TestLine();}
// re_flag=1;
switch(contr_data1)
{case 0x01: control(0x01);
TR0=1;
FlashWDI();
break;
case 0x02: control(0x02);
TR0=0;
m_minute=0x00;
m_second=0x00;
FlashWDI();
break;
case 0x05:control(0x05);
FlashWDI();
break;
case 0x06:control(0x06);
FlashWDI();
break;
case 0x07:control(0x07);
FlashWDI();
break;
default: break;
}
contr_data1=0x00;
}
if(time_flag==1)
{ time_flag=0;
Feedback();
tpcdata[2]=0x08;tpcdata[3]=m_minute;tpcdata[4]=m_second;//反馈运行时间
tpcdata[0]=0xFF;tpcdata[1]=0xFF;
for(a=0;a<5;a++)
{
SendC(tpcdata[a]);
FlashWDI();
}
}
}
}
}
/************************************串口初始化****************************************/
void UartInit(void)
{ ExtCOM_CS=0;
FCR=0x06;
LCR=0x80;
DLL=0x0C;
DLM=0x00;
LCR=0x03;
MCR=0x00;
IER=0x01;//允许接收中断
EX0=1;
ExtCOM_CS=0;
}
/************************************发送数据到pc****************************************/
void SendC(uchar c)reentrant//发送一字节
{ uchar t;
ExtCOM_CS=0;
do{t=LSR;
FlashWDI();
}while((t&0x40)==0x00);//判断TEMP位
THR=c;
//ExtCOM_CS=1;
return;
}
/************************************中断接收pc数据服务程序****************************************/
void mint0() interrupt 0 using 1
{
TR0=0;
EA=0;
ET0=0;
rFpcdata[num1]=RBR;
num1++;
if(num1==5)
{
num1=0;
if (rFpcdata[0]==0xFF)
{
if (rFpcdata[1]==0xFF)
{
contr_data1=rFpcdata[2];
if(contr_data1==7)
{infor_data0=rFpcdata[3];
infor_data1=rFpcdata[4];
}
num2++;
begin_flag=1;
}
}
TR0=1;
ET0=1;
}
EA=1;
return;
}
uchar control(uchar contr_data)reentrant
{ uchar i;
FlashWDI();
switch(contr_data)
{case 0x01:tdrivdata[0]=0x3A;//起始符 /启动
tdrivdata[1]=0x30;tdrivdata[2]=0x31;//设备地址
tdrivdata[3]=0x30;tdrivdata[4]=0x36;//功能码
tdrivdata[5]=0x30;tdrivdata[6]=0x32;//地址段
tdrivdata[7]=0x31;tdrivdata[8]=0x45;
tdrivdata[9]=0x30;tdrivdata[10]=0x30; //数据段
tdrivdata[11]=0x30;tdrivdata[12]=0x31;
tdrivdata[13]=0x44;tdrivdata[14]=0x38;//校验和
tdrivdata[15]=0x0D;tdrivdata[16]=0x0A;//结束符
for(i=0;i<17;i++)//发送到电机
{
SBUF=tdrivdata[i];
while(TI!=1);TI=0;
FlashWDI();
}
break;
case 0x02:tdrivdata[0]=0x3A;//起始符 停止
tdrivdata[1]=0x30;tdrivdata[2]=0x31;//设备地址
tdrivdata[3]=0x30;tdrivdata[4]=0x36;//功能码
tdrivdata[5]=0x30;tdrivdata[6]=0x32;//地址段
tdrivdata[7]=0x31;tdrivdata[8]=0x45;
tdrivdata[9]=0x30;tdrivdata[10]=0x30; //数据段
tdrivdata[11]=0x30;tdrivdata[12]=0x30;
tdrivdata[13]=0x44;tdrivdata[14]=0x39;//校验和
tdrivdata[15]=0x0D;tdrivdata[16]=0x0A;//结束符
for(i=0;i<17;i++)//发送到电机
{
SBUF=tdrivdata[i];
while(TI!=1);TI=0;
FlashWDI();
}
break;
case 0x05:v_reg1=0x30;v_reg2=0x31;//增速
v_reg3=0x30;v_reg4=0x39;
control(0x08);
for(i=0;i<17;i++)
{ while(RI!=1);RI=0;
rFdrivdata[i]=SBUF;
}
if(re_flag==1)
{for (i=8;i<11;i++)
{ temp=rFdrivdata[i];
rFdrivdata[i+1]=temp;
}
re_flag=0;
}
FlashWDI();
lowdata=ConvertCharHex(rFdrivdata[9]);
ch3[1]=lowdata;//高位
FlashWDI();
hexdata=ConvertCharHex(rFdrivdata[10]);
lowdata=ConvertCharHex(rFdrivdata[11]);
ch3[0]=hexdata*16+lowdata;
speed=ch3[1]*256+ch3[0];
speed=speed+150;
if (speed>3000)
{ speed=0x0BB8;
}
speed_temp=speed;
infor_data0=(uchar)(speed>>8);
infor_data1=(uchar)speed_temp;
control(0x07);
break;
case 0x06:v_reg1=0x30;v_reg2=0x31;//减速
v_reg3=0x30;v_reg4=0x39;
control(0x08);
for(i=0;i<17;i++)
{ while(RI!=1);RI=0;
rFdrivdata[i]=SBUF;
}
if(re_flag==1)
{for (i=8;i<11;i++)
{ temp=rFdrivdata[i];
rFdrivdata[i+1]=temp;
}
re_flag=0;
}
FlashWDI();
lowdata=ConvertCharHex(rFdrivdata[9]);
ch3[1]=lowdata;//高位
FlashWDI();
hexdata=ConvertCharHex(rFdrivdata[10]);
lowdata=ConvertCharHex(rFdrivdata[11]);
ch3[0]=hexdata*16+lowdata;
speed=ch3[1]*256+ch3[0];
if (speed<150)
{speed=0;}
else
{speed=speed-150;}
FlashWDI();
speed_temp=speed;
infor_data0=(uchar)(speed>>8);
infor_data1=(uchar)speed_temp;
control(0x07);
break;
case 0x07:tdrivdata[0]=0x3A;//起始符 //置速
tdrivdata[1]=0x30;tdrivdata[2]=0x31;//设备地址
tdrivdata[3]=0x30;tdrivdata[4]=0x36;//功能码
tdrivdata[5]=0x30;tdrivdata[6]=0x31;//地址段
tdrivdata[7]=0x30;tdrivdata[8]=0x39;
speed=infor_data0*256+infor_data1;
FlashWDI();
if ( speed>3000)
{
break;
}
else
{
ConvertHextoChar(infor_data0);//转换速度
tdrivdata[9]=ch2[1];tdrivdata[10]=ch2[0];//写入速度寄存器的数值
ConvertHextoChar(infor_data1);
tdrivdata[11]=ch2[1];tdrivdata[12]=ch2[0];
temp=LRC(12);//求校验和
FlashWDI();
ConvertHextoChar(temp);//转换为ASCII
tdrivdata[13]=ch2[1];tdrivdata[14]=ch2[0];
tdrivdata[15]=0x0D; tdrivdata[16]=0x0A;//结束符
for(i=0;i<17;i++)//发送到电机
{
SBUF=tdrivdata[i];
while(TI!=1);TI=0;
FlashWDI();
}
break;
}
case 0x08:tdrivdata[0]=0x3A;//查询命令
tdrivdata[1]=0x30;tdrivdata[2]=0x31;//设备地址
tdrivdata[3]=0x30;tdrivdata[4]=0x33;//功能码
tdrivdata[5]=v_reg1;tdrivdata[6]=v_reg2;//地址段
tdrivdata[7]=v_reg3;tdrivdata[8]=v_reg4;
tdrivdata[9]=0x30; tdrivdata[10]=0x30;//访问寄存器的个数
tdrivdata[11]=0x30;tdrivdata[12]=0x32;
temp=LRC(12);//求校验和
FlashWDI();
ConvertHextoChar(temp);//转换为ASCII
tdrivdata[13]=ch2[1];tdrivdata[14]=ch2[0];
tdrivdata[15]=0x0D; tdrivdata[16]=0x0A;//结束符
for(i=0;i<17;i++)//发送到电机
{
SBUF=tdrivdata[i];
while(TI!=1);TI=0;
FlashWDI();
}
break;
default: break;
}
return (1);
}
/************************************数制转换****************************************/
uchar ConvertCharHex(uchar ch)reentrant
{ FlashWDI();
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else return (-1);
FlashWDI();
}
/*16进制转ASCII*/
uchar ConvertHextoChar(uchar ch)reentrant
{
uchar ch1;
uchar ch3;
FlashWDI();
ch1=ch;
ch3=ch1&0x0F;
ch1=ch1>>4;
if ((ch1>=0x00) && (ch1<=0x09))
ch2[1]=ch1+0x30;
else
ch2[1]=ch1+0x37;
FlashWDI();
if ((ch3>=0x00) && (ch3<=0x09))
ch2[0]=ch3+0x30;
else
ch2[0]=ch3+0x37;
FlashWDI();
return 1;
}
/***********************************LRC校验模块*****************************************/
uchar LRC(uchar usDataLen)reentrant
{ uchar uchLRC=0x00;
uchar *p=tdrivdata;
p++;
while(usDataLen--)
{ uchar hexdata;
uchar lowdata;
hexdata=ConvertCharHex(*p++);
usDataLen--;
FlashWDI();
lowdata=ConvertCharHex(*p++);
uchLRC+=hexdata*16+lowdata;
FlashWDI();
}
return (-(uchLRC));
}
/************************************反馈运行时间和运行状态****************************************/
void time0() interrupt 1 using 0
{// uchar i;
EA=1;
TF0=0;
time_flag1=1;
IP=0x01;
count++;
FlashWDI();
if (count==0x32)
{
count=0;
FlashWDI();
m_second++;
if(m_second==60)
{ m_minute++;
m_second=0;
if (m_minute==60)
{m_second=0;
}
}
num2++;
time_flag=1;
FlashWDI();
}
TMOD=0x21;
TH0=0x10;
TL0=0x00;
return;
}
uchar Feedback()
{ uchar i;
/*查询电机的速度*/
FlashWDI();
v_reg1=0x30;v_reg2=0x31;
v_reg3=0x30;v_reg4=0x39;
control(0x08);
for(i=0;i<17;i++)
{ while(RI!=1);RI=0;
rFdrivdata[i]=SBUF;
}
FlashWDI();
lowdata=ConvertCharHex(rFdrivdata[9]);
ch3[2]=lowdata;//高位
hexdata=ConvertCharHex(rFdrivdata[10]);
lowdata=ConvertCharHex(rFdrivdata[11]);
ch3[3]=hexdata*16+lowdata;
tpcdata[0]=0xFF;
tpcdata[1]=0xFF;
tpcdata[2]=0x07;
tpcdata[3]=ch3[2];
tpcdata[4]=ch3[3];
for(a=0;a<5;a++)
{
SendC(tpcdata[a]);
FlashWDI();
}
FlashWDI();
return (1);
}
/************************************刷新存储器(看门狗)****************************************/
void FlashWDI()
{ WDI=0;
WDI=1;
}
uchar TestLine()
{ uchar b;
control(0x01);
infor_data0=0x00;
infor_data1=0x96;
control(0x07);
for (count1=0;count1<41;count1++)
{ TR0=1;
b++;
while(num2==num3)
{
FlashWDI();
}
num3=num2;
if (begin_flag==1)
{
FlashWDI();
begin_flag=0;
return (1);
}
if(time_flag==1)
{ time_flag=0;
Feedback();
FlashWDI();
tpcdata[2]=0x08;tpcdata[3]=m_minute;tpcdata[4]=m_second;//反馈运行时间
tpcdata[0]=0xFF;tpcdata[1]=0xFF;
for(a=0;a<5;a++)
{
SendC(tpcdata[a]);
FlashWDI();
}
}
if (b==2)
{ control(0x05);
b=0;
}
}
for (count1=0;count1<42;count1++)
{
b++;
while(num2==num3)
{
FlashWDI();
}
num3=num2;
if (begin_flag==1)
{
begin_flag=0;
return (1);
}
if(time_flag==1)
{ time_flag=0;
Feedback();
tpcdata[2]=0x08;tpcdata[3]=m_minute;tpcdata[4]=m_second;//反馈运行时间
tpcdata[0]=0xFF;tpcdata[1]=0xFF;
for(a=0;a<5;a++)
{
SendC(tpcdata[a]);
FlashWDI();
}
}
if (b==2)
{
control(0x06);
b=0;
}
}
infor_data0=0x00;
infor_data1=0x96;
control(0x07);
return (1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -