📄 main.c
字号:
///////////////////////////////////////////////////////////////////////////////
//文件描述 main.c
//描述: 7 blockers control system of test
///////////////////////////////////////////////////////////////////////////////
#include "SPCE061V004.h"
unsigned int switch1;
main()
{
//unsigned int KeyCode,KeyNumber,codesign; //获得键值,键值序号
unsigned int handswitch;
unsigned int doorswitch;
unsigned int j,k,l;
unsigned long int i;
unsigned int dirction;
unsigned int speed;
unsigned int step;
unsigned int failure;
unsigned int solveflow;
unsigned int result;
i=0;
do
{
handswitch=0;
doorswitch=0;
failure=1;
//========================================================================================
//凌阳I/O口的初始化------(((***IOA0--3可能要预留给步进电机 4-5给电动推杆;6,7给内外摆电机 8,9为输入口; 10为高电平输出***)))
//(((***IOB2为中断(常高电平) IOA8-14控制数码管.IOB8-15为控制数码管的显示。使用动态显示)))
//IOA0--3-->高电平输出-->控制把手步进电机,IOA4,5-->高电平输出-->控制电动推杆正反转,IOA6内摆电机,IOA7外摆电机
//IOA15-->高电平输出-->LED灯和solenoid电磁铁(0x8000)
//IOB0-->输入口-->把手电机的接近开关,IOB1-->输入口-->柜门的接近开关
//IOB2为特殊功能-->设为输入口
//========================================================================================
*P_SystemClock = 0x0080;//系统频率设置为49.152MHz,强振模式
*P_IOA_Dir=0xffff;//全是高电平输出
*P_IOA_Attrib=0xffff;
*P_IOA_Data=0xffff;
__asm("INT OFF"); //保护中断不受外部干扰
*P_IOB_Dir=0xfff0; //IOB2~3是输入口,带下拉电阻的输入脚,为引脚第二功能
*P_IOB_Attrib=0xfff0; //其余IOB脚为高电平输出引脚
*P_IOB_Data=0xfff0; //开外中断1,2
*P_INT_Ctrl=C_IRQ3_EXT1;
*P_INT_Ctrl=C_IRQ3_EXT2;
//========================================================================================
//判断外摆臂是否关闭柜门
//========================================================================================
__asm("INT IRQ"); //允许IRQ中断,关闭FIQ中断
*P_IOA_Data=0x0080; //启动外门摆臂电机
switch1=1;
//for(;switch1==1;)
// {
// while(switch1==0) //当柜门的微动开关被触动后,触发单片机的外部中断
// {
// *P_IOA_Data=0x0000; //关闭外门摆臂电机
// switch1=2;//jump out of the circle
// }
// *P_Watchdog_Clear=C_WDTCLR;//clear watchdog清狗
// }
//========================================================================================
//气动电机正转前进
//========================================================================================
__asm("INT OFF"); //保护中断不受外部干扰
*P_IOA_Data=0x0010;//气动电机正转前进
DELAY(10);
// do
// {
// handswitch=*P_IOB_Data;
// handswitch&=0x0001;//判断接近开关是否为高电平,即接通。
// *P_Watchdog_Clear=C_WDTCLR;
// }while(!handswitch);//当handswitch是0时,接近开关断开,while即为真,则循环执行
//========================================================================================
//把手电机接近开关亮之后,停止气动电机,启动把手电机锁门(步进)
//========================================================================================
*P_IOB_Data=0x0000;
Delayus(10);
DriveMoto(1,2,6);//步进电机锁门程序
//========================================================================================
//启动把手电机(步进),门锁上后,柜门接近开关应该接通,如不接通,则测试结束
//========================================================================================
DELAY(1);//这里可能在后来需要调整,因为延时是要保证A口数据读入的正确,在稳定的前提下可以适当的减少
doorswitch=*P_IOB_Data;
doorswitch&=0x0002;//判断柜门接近开关是否为高电平,即接通
if(doorswitch==0x0002)
{
for(k=0;(doorswitch==0x0002)&(k<1);k++)
{
Delayus(10);
DriveMoto(0,2,6);//步进电机锁门程序//反转步进电机,开门
doorswitch=*P_IOB_Data;
doorswitch&=0x0002;//判断接近开关有无故障产生
}
if(doorswitch==0x0002)
{
failure=0;
}
}
//========================================================================================
//失败后的操作
//========================================================================================
if(failure)
{
//i=64432;
//for(;i>=50000;)
//{
// solveflow++;
// i=i-50000;//soveflow为偶数时和奇数时不同
// }
//Apart(i,solveflow);//接近开关没有反应则测试结束
// *P_IOA_Data=0x0000;
goto end;
}
else
{
*P_IOA_Data=0x0000;//所有电机停机,//IOA15-->高电平输出-->LED灯和solenoid电磁铁,IOA6内摆电机,IOA7外摆电机
Delayus(10);//us级延时,写间隙,清零IOA数据寄存器,保证新数据写入的正确
*P_IOA_Data=0x8000;//置位IOA15,IOA15输出高电平,启动电磁铁和LED灯
DELAY(1);//
DriveMoto(0,2,6);//步进电机锁门程序//反转步进电机,开门
//========================================================================================
//IOA4,5-->高电平输出-->控制电动推杆正反转,IOA0-3-->高电平输出-->控制把手电机正反转
//========================================================================================
*P_IOA_Data=0x0000;//所有电机停机 IOA6内摆电机,IOA7外摆电机
Delayus(10);//us级延时,写间隙,清零IOA数据寄存器,保证新数据写入的正确
*P_IOA_Data=0x0020;//控制电动推杆反转退回
DELAY(10);
*P_IOA_Data=0x0000;//电机停机
Delayus(10);//us级延时,写间隙,清零IOA数据寄存器,保证新数据写入的正确
*P_IOA_Data=0x0040;//启动内门摆臂电机
DELAY(5);
*P_IOA_Data=0x0000;//电机停机
i++;
// for(;i>=50000;)
// {
// solveflow++;
// i=i-50000;//soveflow为偶数时和奇数时不同
// }
}
Apart(i,solveflow);
}while(!failure);//判断错误标志位;
end: while(1)
{
Apart(i,solveflow);
*P_Watchdog_Clear=C_WDTCLR;//clear watchdog清狗
}
//可以设置按键,在此等待按键,复位重新测试。
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -