ZXC-0168 STC8A8K64D4单片机 第6讲开关信号控制对应继电器输出自锁程序2
/*************功能说明 **************
开关信号控制对应继电器输出自锁程序
使用 if....Delay(消抖)...while....Delay(消抖) 实现继电器输入控制输出 (自锁程序)
******************************************/
#include "STC8A8K64D4.h" //包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义
#include "intrins.h" //一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用。
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int//宏定义无符号整型
/************* 本地常量声明 **************/
/************* 光耦隔离输入口 **************/
sbit IN1= P5^5;//光耦隔离输入口1
sbit IN2= P4^0;//光耦隔离输入口2
sbit IN3= P6^4;//光耦隔离输入口3
sbit IN4= P6^5;//光耦隔离输入口4
sbit IN5= P6^6;//光耦隔离输入口5
sbit IN6= P6^7;//光耦隔离输入口6
sbit IN7= P3^2;//光耦隔离输入口7
sbit IN8= P3^3;//光耦隔离输入口8
sbit IN9= P3^4;//光耦隔离输入口9
sbit IN10= P3^5;//光耦隔离输入口10
/************* 光耦隔离继电器输出口 **************/
sbit OUT1= P4^3;//继电器输出口1
sbit OUT2= P2^7;//继电器输出口2
sbit OUT3= P2^6;//继电器输出口3
sbit OUT4= P2^5;//继电器输出口4
sbit OUT5= P2^4;//继电器输出口5
sbit OUT6= P2^3;//继电器输出口6
sbit OUT7= P2^2;//继电器输出口7
sbit OUT8= P2^1;//继电器输出口8
sbit OUT9= P4^2;//继电器输出口9
sbit OUT10= P2^0;//继电器输出口10
sbit RUN= P4^4;//运行状态指示灯
sbit FMQ= P0^7;//蜂鸣器控制脚
/*******************标志位设定*********************/
bit IN_bz1=0; //输入标志位
bit IN_bz2=0; //输入标志位
bit IN_bz3=0; //输入标志位
bit IN_bz4=0; //输入标志位
bit IN_bz5=0; //输入标志位
bit IN_bz6=0; //输入标志位
bit IN_bz7=0; //输入标志位
bit IN_bz8=0; //输入标志位
bit IN_bz9=0; //输入标志位
bit IN_bz10=0;//输入标志位
//========================================================================
// 函数声明
void Delay10ms(); //延时函数@11.0592MHz
//========================================================================
/************************ 10ms消抖延时函数 ****************************/
void Delay10ms() //延时函数@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 144;
j = 157;
do
{
while (--j);
} while (--i);
}
//========================================================================
// 函数: void main(void)
// 描述: 主函数。
// 参数: none.
// 返回: none.
//========================================================================
void main()//主函数
{
P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
RUN=0; //运行指示灯亮
while (1)//主函数执行循环扫描
{
if((IN1==0)&&(IN_bz1==0)){Delay10ms();if(IN1==0){OUT1=!OUT1;IN_bz1=1;}}// 如果IN1有信号输入和标志位IN_bz1等于0,等待10毫秒再次判断IN1是否有信号,如果有OUT1继电器状态取反IN_bz1标志位置1
while(!IN1){Delay10ms();if(IN1==1){IN_bz1=0;}} // 等待IN1无信号输入和标志位IN_bz1等于1,等待10毫秒再次判断IN1是否有信号,如果无IN_bz1标志位置0
if((IN2==0)&&(IN_bz2==0)){Delay10ms();if(IN2==0){OUT2=!OUT2;IN_bz2=1;}}// 如果IN2有信号输入和标志位IN_bz2等于0,等待10毫秒再次判断IN2是否有信号,如果有OUT2继电器状态取反IN_bz2标志位置1
while(!IN2){Delay10ms();if(IN2==1){IN_bz2=0;}} // 等待IN2无信号输入和标志位IN_bz2等于1,等待10毫秒再次判断IN2是否有信号,如果无IN_bz2标志位置0
if((IN3==0)&&(IN_bz3==0)){Delay10ms();if(IN3==0){OUT3=!OUT3;IN_bz3=1;}}// 如果IN3有信号输入和标志位IN_bz3等于0,等待10毫秒再次判断IN3是否有信号,如果有OUT3继电器状态取反IN_bz3标志位置1
while(!IN3){Delay10ms();if(IN3==1){IN_bz3=0;}} // 等待IN3无信号输入和标志位IN_bz3等于1,等待10毫秒再次判断IN3是否有信号,如果无IN_bz3标志位置0
if((IN4==0)&&(IN_bz4==0)){Delay10ms();if(IN4==0){OUT4=!OUT4;IN_bz4=1;}}// 如果IN4有信号输入和标志位IN_bz4等于0,等待10毫秒再次判断IN4是否有信号,如果有OUT4继电器状态取反IN_bz4标志位置1
while(!IN4){Delay10ms();if(IN4==1){IN_bz4=0;}} // 等待IN4无信号输入和标志位IN_bz4等于1,等待10毫秒再次判断IN4是否有信号,如果无IN_bz4标志位置0
if((IN5==0)&&(IN_bz5==0)){Delay10ms();if(IN5==0){OUT5=!OUT5;IN_bz5=1;}}// 如果IN5有信号输入和标志位IN_bz5等于0,等待10毫秒再次判断IN5是否有信号,如果有OUT5继电器状态取反IN_bz5标志位置1
while(!IN5){Delay10ms();if(IN5==1){IN_bz5=0;}} // 等待IN5无信号输入和标志位IN_bz5等于1,等待10毫秒再次判断IN5是否有信号,如果无IN_bz5标志位置0
if((IN6==0)&&(IN_bz6==0)){Delay10ms();if(IN6==0){OUT6=!OUT6;IN_bz6=1;}}// 如果IN6有信号输入和标志位IN_bz6等于0,等待10毫秒再次判断IN6是否有信号,如果有OUT6继电器状态取反IN_bz6标志位置1
while(!IN6){Delay10ms();if(IN6==1){IN_bz6=0;}} // 等待IN6无信号输入和标志位IN_bz6等于1,等待10毫秒再次判断IN6是否有信号,如果无IN_bz6标志位置0
if((IN7==0)&&(IN_bz7==0)){Delay10ms();if(IN7==0){OUT7=!OUT7;IN_bz7=1;}}// 如果IN7有信号输入和标志位IN_bz7等于0,等待10毫秒再次判断IN7是否有信号,如果有OUT7继电器状态取反IN_bz7标志位置1
while(!IN7){Delay10ms();if(IN7==1){IN_bz7=0;}} // 等待IN7无信号输入和标志位IN_bz7等于1,等待10毫秒再次判断IN7是否有信号,如果无IN_bz7标志位置0
if((IN8==0)&&(IN_bz8==0)){Delay10ms();if(IN8==0){OUT8=!OUT8;IN_bz8=1;}}// 如果IN8有信号输入和标志位IN_bz8等于0,等待10毫秒再次判断IN8是否有信号,如果有OUT8继电器状态取反IN_bz8标志位置1
while(!IN8){Delay10ms();if(IN8==1){IN_bz8=0;}} // 等待IN8无信号输入和标志位IN_bz8等于1,等待10毫秒再次判断IN8是否有信号,如果无IN_bz8标志位置0
if((IN9==0)&&(IN_bz9==0)){Delay10ms();if(IN9==0){OUT9=!OUT9;IN_bz9=1;}}// 如果IN9有信号输入和标志位IN_bz9等于0,等待10毫秒再次判断IN9是否有信号,如果有OUT9继电器状态取反IN_bz9标志位置1
while(!IN9){Delay10ms();if(IN9==1){IN_bz9=0;}} // 等待IN9无信号输入和标志位IN_bz9等于1,等待10毫秒再次判断IN9是否有信号,如果无IN_bz9标志位置0
if((IN10==0)&&(IN_bz10==0)){Delay10ms();if(IN10==0){OUT10=!OUT10;IN_bz10=1;}}// 如果IN10有信号输入和标志位IN_bz10等于0,等待10毫秒再次判断IN10是否有信号,如果有OUT10继电器状态取反IN_bz10标志位置1
while(!IN10){Delay10ms();if(IN10==1){IN_bz10=0;}} // 等待IN10无信号输入和标志位IN_bz10等于1,等待10毫秒再次判断IN10是否有信号,如果无IN_bz10标志位置0
}
}
/********************************************************************
结束
*********************************************************************/
感谢分享 学习了,谢谢分享! 继电器输出的也要加光耦么?是否多此一举 凌伤 发表于 2025-1-5 08:59
继电器输出的也要加光耦么?是否多此一举
我以前也加,现在都去掉了。因为继电器线圈回路和控制输出回路本身就是隔离的。虽然加上更好,但感觉没有必要。特别是电路板空间比较紧张的情况下。
页:
[1]