📄 2990.c
字号:
{
while(key4==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
switch(dis.motor_number)
{
case 0 : P2=P2&0xe0;
P2=P2|start_pa[0]; //启动电机1
/*delay1ms(); //1ms后进行电压检测
if(RUN==0) //电压检测口,为0表示启动成功
dis.start_time0++;
else
P2=P2&0xe0; //关闭所有电机*/
break;
case 1 : P2=P2&0xe0;
P2=P2|start_pa[1]; //启动电机2
/*delay1ms(); //1ms后进行电压检测
if(RUN==0) //电压检测口,为0表示启动成功
dis.start_time1++;
else
P2=P2&0xe0; //关闭所有电机*/
break;
case 2 : P2=P2&0xe0;
P2=P2|start_pa[2]; //启动电机3
/*delay1ms(); //1ms后进行电压检测
if(RUN==0) //电压检测口,为0表示启动成功
dis.start_time2++;
else
P2=P2&0xe0; //关闭所有电机*/
break;
case 3 : P2=P2&0xe0;
P2=P2|start_pa[3]; //启动电机4
/*delay1ms(); //1ms后进行电压检测
if(RUN==0) //电压检测口,为0表示启动成功
dis.start_time3++;
else
P2=P2&0xe0; //关闭所有电机*/
break;
case 4 : P2=P2&0xe0;
P2=P2|start_pa[4]; //启动电机4
/*delay1ms(); //1ms后进行电压检测
if(RUN==0) //电压检测口,为0表示启动成功
dis.start_time4++;
else
P2=P2&0xe0; //关闭所有电机*/
break;
default : break;
}
}
}
break;
case 4 : read=1; //从24c02中读取值
break;
}
}
}
else if(key4==0)key44=1;
}
/***************************************************
* 显示程序 *
***************************************************/
void display_motor(void)
{
uchar number0,number1,number2,number3,number4;
switch(i)
{
case 0 : switch(dis.motor_number) //显示个位上的数
{
case 0 : P1=seven_seg[dis.start_time0%10];
break;
case 1 : P1=seven_seg[dis.start_time1%10];
break;
case 2 : P1=seven_seg[dis.start_time2%10];
break;
case 3 : P1=seven_seg[dis.start_time3%10];
break;
case 4 : P1=seven_seg[dis.start_time4%10];
break;
default : break;
}
break;
case 1 : switch(dis.motor_number) //显示十位上的数
{
case 0 : number0=dis.start_time0/10;
P1=seven_seg[number0%10];
break;
case 1 : number1=dis.start_time1/10;
P1=seven_seg[number1%10];
break;
case 2 : number2=dis.start_time2/10;
P1=seven_seg[number2%10];
break;
case 3 : number3=dis.start_time3/10;
P1=seven_seg[number3%10];
break;
case 4 : number4=dis.start_time4/10;
P1=seven_seg[number4%10];
break;
default : break;
}
break;
case 2 : switch(dis.motor_number) //显示百位上的数
{
case 0 : number0=dis.start_time0/100;
P1=seven_seg[number0%10];
break;
case 1 : number1=dis.start_time1/100;
P1=seven_seg[number1%10];
break;
case 2 : number2=dis.start_time2/100;
P1=seven_seg[number2%10];
break;
case 3 : number3=dis.start_time3/100;
P1=seven_seg[number3%10];
break;
case 4 : number4=dis.start_time4/100;
P1=seven_seg[number4%10];
break;
default : break;
}
break;
case 3 : switch(dis.motor_number) //显示千位上的数
{
case 0 : number0=dis.start_time0/1000;
P1=seven_seg[number0%10];
break;
case 1 : number1=dis.start_time1/1000;
P1=seven_seg[number1%10];
break;
case 2 : number2=dis.start_time2/1000;
P1=seven_seg[number2%10];
break;
case 3 : number3=dis.start_time3/1000;
P1=seven_seg[number3%10];
break;
case 4 : number4=dis.start_time4/1000;
P1=seven_seg[number4%10];
break;
default : break;
}
break;
case 4 : switch(dis.motor_number) //显示万位上的数
{
case 0 : number0=dis.start_time0/10000;
P1=seven_seg[number0%10];
break;
case 1 : number1=dis.start_time1/10000;
P1=seven_seg[number1%10];
break;
case 2 : number2=dis.start_time2/10000;
P1=seven_seg[number2%10];
break;
case 3 : number3=dis.start_time3/10000;
P1=seven_seg[number3%10];
break;
case 4 : number4=dis.start_time4/10000;
P1=seven_seg[number4%10];
break;
default : break;
}
break;
case 5 : if(mode_signel==1)
{
P1=seven_seg[mode];
}
else
{
P1=seven_seg[dis.motor_number];
}
break;
default : break;
}
}
/***************************************************
* 显示扫描子程序 *
***************************************************/
void display_scan(void)
{
P0=scan[i];
i++;
if(i==6)
i=0;
}
/****************************************************
* INT1中断初始化程序(低压检测) *
****************************************************/
void int1_initial(void)
{
EA=0; //关闭所有中断
EX1=1; //允许int1中断
PX1=1; //int1中断优先
EA=1; //开启所有中断
}
/****************************************************
* t0中断初始化程序 *
****************************************************/
void t0_initial(void)
{
EA=0;
time0_tick=0;
TR0=0;
TMOD&=0xfd;
TMOD|=0x01;
TL0=0x78; //设置5毫秒中断初值
TH0=0xec;
ET0=1;
TR0=1;
EA=1;
}
/************************************************
* 24c02服务程序 *
************************************************/
//启动I2C总线,即发送I2C起始条件
void Start(void)
{
SCL=0;//低电平改变DA线
SDA=1;
SCL=1;
NOP;
SDA=0; //在SCL为高时,SDA由高变低,产生起始信号
NOP;
SCL=0; //SCL变低电平,准备发送或接收数据
}
//结束I2C总线,即发送I2C结束信号
void Stop(void)
{
SCL=0;
SDA=0;
SCL=1;
NOP;
SDA=1; //当SCL为高电平时,SDA由低变高,产生I2C总线结束信号
NOP;
SCL=0;
}
//读数据操作
uchar RdOperation(void) //读两个字节数据函数
{
uchar time;//两个字节
uint DataIn=0;//读进来的数据
for(time=0;time<16;time++)
{
SCL=0;
NOP;
SCL=1;
NOP;
DataIn=(DataIn<<1)|SDA;
}
SCL=0;
NOP;
SDA=1;
NOP;
SCL=1;
return DataIn;
}
//写器件地址和EEPROM地址
void WrOperation(uchar Out) //写器件地址和EEPROM地址
{
uchar time; //一个字节
for(time=0;time<8;time++) //从最高位开始输出
{
SCL=0;
SDA=Out&0x80;
Out<<=1;
NOP;
SCL=1;
}
SCL=0;
NOP;
SCL=1;
NOP;
while(SDA!=0);
SCL=0;
}
//写两个字节数据操作
void Wr_data(uchar DataOut)
{
uchar time;//两个字节
for(time=0;time<16;time++)//从最高位开始输出
{
SCL=0;
SDA=DataOut&0x80;
DataOut<<=1;
NOP;
SCL=1;
}
SCL=0;
NOP;
SCL=1;
NOP;
while(SDA!=0);
SCL=0;
}
//写EEPROM
void WrEEPROM(uchar address,uchar y)
{
Start();//开始
WrOperation(0xa0);//写器件地址
WrOperation(address);//写EEPROM地址
Wr_data(y);//写数据
Stop();//停止
Delay10Ms();//延时,EEPROM内部操作
}
//读EEPROM
uchar RdEEPROM(uchar address)
{
uchar x;
Start();
WrOperation(0xa0);//写器件地址
WrOperation(address);
Start();
WrOperation(0xa1);//写EEPROM地址(读)
x=RdOperation();
Stop();
return x;
}
/*****************************************************
* 延时10ms *
*****************************************************/
void Delay10Ms(void)
{
uchar i,j;
for(i=0;i<25;i++)
for(j=0;j<50;j++);
}
/*****************************************************
* 延时1ms *
*****************************************************/
/*void delay1ms(void) //1ms后进行电压检测
{
uchar i;
for(i=0;i<125;i++)
{
_nop_();
}
}*/
/*****************************************************
* 读取24C02程序 *
*****************************************************/
void read_24c02(void) //从24c02中读取值
{
dis.start_time0=RdEEPROM(0);
dis.start_time1=RdEEPROM(1);
dis.start_time2=RdEEPROM(2);
dis.start_time3=RdEEPROM(3);
dis.start_time4=RdEEPROM(4);
}
/*****************************************************
* 写24C02程序 *
*****************************************************/
void write_24c02(void) //将值写入24C01
{
WrEEPROM(0,dis.start_time0);
WrEEPROM(1,dis.start_time1);
WrEEPROM(2,dis.start_time2);
WrEEPROM(3,dis.start_time3);
WrEEPROM(4,dis.start_time4);
}
/*********************************************************
* 主函数 *
*********************************************************/
void main(void)
{
RUN=0;
dis.motor_number=0;
read=0; //首先清零读标志
int1_initial(); //外部中断1初始化
t0_initial(); //定时器0初始化
P2=0x00; //先初始化P2口
P2=P2&0xe0;
P2=P2|start_pa[0]; //启动电机0
signel0=1;
/*delay1ms(); //1ms后进行电压检测
if(RUN==0) //电压检测口,为0表示启动成功
dis.start_time1++;
else
P2=P2&0xe0; //关闭所有电机*/
do
{//uchar j=0;
switch(dis.motor_number)
{
case 0 : if(test0==200)
{
test0=0;
if(RUN==0) //电压检测口,为0表示启动成功
dis.start_time0++;
else
P2=P2&0xe0; //关闭所有电机
}
break;
case 1 : if(test1==200)
{
test1=0;
if(RUN==0) //电压检测口,为1表示启动成功
dis.start_time1++;
else
P2=P2&0xe0; //关闭所有电机
}
break;
case 2 : if(test2==200)
{
test2=0;
if(RUN==0) //电压检测口,为2表示启动成功
dis.start_time2++;
else
P2=P2&0xe0; //关闭所有电机
}
break;
case 3 : if(test3==200)
{
test3=0;
if(RUN==0) //电压检测口,为3表示启动成功
dis.start_time3++;
else
P2=P2&0xe0; //关闭所有电机
}
break;
case 4 : if(test4==200)
{
test4=0;
if(RUN==0) //电压检测口,为4表示启动成功
dis.start_time4++;
else
P2=P2&0xe0; //关闭所有电机
}
break;
default : break;
}
if(read==1)
{
read_24c02(); //从24c02中读取值
}
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -