📄 2990.c
字号:
#include<regx52.h>
#include<intrins.h>
#define NOP _nop_();_nop_();_nop_();_nop_();_nop_() //延时5us
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^5;
sbit key2=P3^0;
sbit key3=P3^1;
sbit key4=P3^4;
sbit key5=P3^3;
sbit sound=P3^7; //蜂鸣器
sbit RUN=P2^5; //电压检测
sbit SCL=P2^7;
sbit SDA=P2^6;
const start_pa[5]={0x01,0x02,0x04,0x08,0x10}; //电机启动参数
const seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管段码
const scan[6]={0x3e,0x3d,0x3b,0x37,0x2f,0x1f};//位选码
typedef struct
{
uint start_time0;
uint start_time1;
uint start_time2;
uint start_time3;
uint start_time4;
uchar motor_number;
}motor;
uint time0_tick,i=0; //计数次数
uint start_max1=0,start_max2=0,start_max3=0,start_max4=0,start_max5=0; //设置最大启动次数
uchar mode=0; //模式设置
uchar read; //读24c02标志
uchar mode_signel=0; //模式显示标志
uchar test0=0,test1=0,test2=0,test3=0,test4=0; //用于电机启动后延时一秒再检测启动成功与否
uchar signel0=0,signel1=0,signel2=0,signel3=0,signel4=0; //电机启动标志
motor dis;
/********************************************************
* 函数声明 *
********************************************************/
void key_judge(void);
void display_motor(void);
void display_scan(void);
void int1_initial(void);
void t0_initial(void);
void Start(void);
void stop(void);
void Ack(void);
uchar RdOperation(void); //读两个字节数据函数
void WrOperation(uchar Out); //写器件地址和EEPROM地址
void Wr_data(uchar DataOut);
void WrEEPROM(uchar address,uchar y);
uchar RdEEPROM(uchar address);
void read_24c02(void); //从24c02中读取值
void write_24c02(void); //将值写入24C01
void Delay10Ms(void);
//void delay1ms(void); //1ms后进行电压检测
/********************************************************
* INT1中断服务程序 *
********************************************************/
void int1_isr(void) interrupt 2 using 2
{
write_24c02(); //将值写入24C02
P0=0x00; //关闭所有的IO口
P1=0x00;
P2=0x00;
}
/*****************************************************
* 定时器0中断功能按键及显示 *
*****************************************************/
static void timer0_isr(void) interrupt 1 using 1
{
TR0=0;
TL0=0x78; //重装5毫秒中断初值
TH0=0xec;
TR0=1;
switch(dis.motor_number) //用于电机启动后延时一秒再检测启动成功与否
{
case 0 : if(signel0==1)
test0++;
break;
case 1 : if(signel1==1)
test1++;
break;
case 2 : if(signel2==1)
test2++;
break;
case 3 : if(signel3==1)
test3++;
break;
case 4 : if(signel0==1)
test4++;
break;
default : break;
}
time0_tick++;
if(time0_tick==1000)
{
time0_tick=0;
dis.motor_number++;
if(dis.motor_number==5)
{
dis.motor_number=0;
}
switch(dis.motor_number)
{
case 0 : P2=P2&0xe0;
P2=P2|start_pa[0]; //启动电机0
signel0=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]; //启动电机1
signel1=1; //启动信号
/*delay1ms(); //1ms后进行电压检测
if(RUN==0) //电压检测口,为0表示启动成功
dis.start_time1++;
else
P2=P2&0xe0; //关闭所有电机*/
break;
case 2 : P2=P2&0xe0;
P2=P2|start_pa[2]; //启动电机2
signel2=1; //启动信号
/*delay1ms(); //1ms后进行电压检测
if(RUN==0) //电压检测口,为0表示启动成功
dis.start_time2++;
else
P2=P2&0xe0; //关闭所有电机*/
break;
case 3 : P2=P2&0xe0;
P2=P2|start_pa[3]; //启动电机3
signel3=1; //启动信号
/*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
signel4=1; //启动信号
/*delay1ms(); //1ms后进行电压检测
if(RUN==0) //电压检测口,为0表示启动成功
dis.start_time4++;
else
P2=P2&0xe0; //关闭所有电机*/
break;
default : break;
}
}
key_judge(); //按键判断
display_motor(); //显示程序
display_scan(); //动态扫描
}
/*****************************************************
* 按键判断 *
*****************************************************/
void key_judge(void)
{
uchar key11=0,key22=0,key33=0,key44=0,key55=0;
if(key11!=0) //判断key1键(模式选择键)
{
key11--;
if(key11==0&key1==0)
{
while(key1==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
mode_signel=1; //模式标志(用于显示)
mode++;
if(mode==5)mode=0;
}
}
else if(key1==0)key11=1;
if(key22!=0) //判断key2键(上翻键判断)
{
key22--;
if(key22==0&key2==0)
{
while(key2==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
mode_signel=0; //显示电机号
sound=1;
dis.motor_number++;
if(dis.motor_number==5)
dis.motor_number=0;
switch(mode) //模式判断
{
case 1 : switch(dis.motor_number) //设置各电机启动参数的最大值
{
case 1 : if(key33!=0) //判断key3键(加)
{
key33--;
if(key33==0&key3==0)
{
while(key3==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
start_max1=start_max1+1000; //每次1000递增
if(start_max1==60000) //最大增到60000
start_max1=0;
}
}
else if(key3==0)key33=1;
if(key44!=0) //判断key4键(减)
{
key44--;
if(key44==0&key4==0)
{
while(key4==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
start_max1=start_max1-1000; //每次1000递减
if(start_max1<0) //减到小于0
start_max1=60000;
}
}
else if(key3==0)key33=1;
break;
case 2 : if(key33!=0) //判断key3键(加)
{
key33--;
if(key33==0&key3==0)
{
while(key3==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
start_max2=start_max2+1000; //每次1000递增
if(start_max2==60000) //最大增到60000
start_max2=0;
}
}
else if(key3==0)key33=1;
if(key44!=0) //判断key4键(减)
{
key44--;
if(key44==0&key4==0)
{
while(key4==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
start_max2=start_max2-1000; //每次1000递减
if(start_max2<0) //减到小于0
start_max2=60000;
}
}
else if(key3==0)key33=1;
break;
case 3 : if(key33!=0) //判断key3键(加)
{
key33--;
if(key33==0&key3==0)
{
while(key3==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
start_max3=start_max3+1000; //每次1000递增
if(start_max3==60000) //最大增到60000
start_max3=0;
}
}
else if(key3==0)key33=1;
if(key44!=0) //判断key4键(减)
{
key44--;
if(key44==0&key4==0)
{
while(key4==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
start_max3=start_max3-1000; //每次1000递减
if(start_max3<0) //减到小于0
start_max3=60000;
}
}
else if(key3==0)key33=1;
break;
case 4 : if(key33!=0) //判断key3键(加)
{
key33--;
if(key33==0&key3==0)
{
while(key3==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
start_max4=start_max4+1000; //每次1000递增
if(start_max4==60000) //最大增到60000
start_max4=0;
}
}
else if(key3==0)key33=1;
if(key44!=0) //判断key4键(减)
{
key44--;
if(key44==0&key4==0)
{
while(key4==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
start_max4=start_max4-1000; //每次1000递减
if(start_max4<0) //减到小于0
start_max4=60000;
}
}
else if(key3==0)key33=1;
break;
case 5 : if(key33!=0) //判断key3键(加)
{
key33--;
if(key33==0&key3==0)
{
while(key3==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
start_max5=start_max5+1000; //每次1000递增
if(start_max5==60000) //最大增到60000
start_max5=0;
}
}
else if(key3==0)key33=1;
if(key44!=0) //判断key4键(减)
{
key44--;
if(key44==0&key4==0)
{
while(key4==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
start_max5=start_max5-1000; //每次1000递减
if(start_max5<0) //减到小于0
start_max5=60000;
}
}
else if(key3==0)key33=1;
break;
default : break;
}
break;
case 2 : display_motor();
break;
case 3 : if(key44!=0) //判断key4键(确定键按下后启动)
{
key44--;
if(key44==0&key4==0)
{
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;
}
}
}
else if(key4==0)key44=1;
break;
case 4 : read_24c02(); //从24c02中读取值
break;
default : break;
}
//default : break;
}
}
else if(key2==0)key22=1;
if(key33!=0) //判断key3键(下翻)
{
key33--;
if(key33==0&key3==0)
{
while(key3==0) //等待放开
{
display_scan(); //动态扫描
sound=0; //蜂鸣指示
}
sound=1;
mode_signel=0; //显示电机号标志
dis.motor_number--;
if(dis.motor_number<0)
dis.motor_number=4;
switch(mode)
{
case 3 : if(key44!=0) //判断key4键(确定键按下后启动)
{
key44--;
if(key44==0&key4==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -