找回密码
 立即注册
查看: 1178|回复: 3

ZXC-0168 STC8A8K64D4单片机第20讲 串口2控制继电器通断十六进制方式控制

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2024-11-26 00:25:05

24

主题

7

回帖

256

积分

荣誉版主

积分
256
发表于 2023-11-27 10:27:28 | 显示全部楼层 |阅读模式
ZXC-0168 标识图.jpg

ZXC-0168 应用举例.jpg

ZXC-0168 原理图_00.jpg


/********************************************************************
实现功能:应用程序

使用芯片:STC8A8K64D4
晶振:11.0592MHZ
波特率:9600
编译环境:Keil5
淘宝店:汇诚科技 http://shop36330473.taobao.com

【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!

*********************************************************************/
/*************  功能说明    **************
第20讲   串口2控制继电器通断十六进制方式控制

通过串口2发送命令控制继电器开关 也可以通过输入发送输入状态字符
单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600 N 8 1

单片机接收PC机发送的十六进制表如下:

01、全开:PC发送0xff;十六进制
02、全关:PC发送0x00; 十六进制

03、第一路开:PC发送0x01;十六进制
04、第二路开:PC发送0x02;十六进制
05、第三路开:PC发送0x03;十六进制
06、第四路开:PC发送0x04;十六进制
07、第五路开:PC发送0x05;十六进制
08、第六路开:PC发送0x06;十六进制
09、第七路开:PC发送0x07;十六进制
10、第八路开:PC发送0x08;十六进制
11、第九路开:PC发送0x09;十六进制
12、第十路开:PC发送0x0A;十六进制

13、第一路关:PC发送0x11;十六进制
14、第二路关:PC发送0x12;十六进制
15、第三路关:PC发送0x13;十六进制
16、第四路关:PC发送0x14;十六进制
17、第五路关:PC发送0x15;十六进制
18、第六路关:PC发送0x16;十六进制
19、第七路关:PC发送0x17;十六进制
20、第八路关:PC发送0x18;十六进制
21、第九路开:PC发送0x19;十六进制
22、第十路开:PC发送0x1A;十六进制
******************************************/

#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;//输入标志位

uchar UART3_dat=0;//串口数据接收变量
//========================================================================
// 函数声明
void Delay10ms();                  //延时函数@11.0592MHz
void Uart3_Init(void); //串口1初始化函数9600bps@11.0592MHz
void quan_kai();      //全开函数
void quan_guan();     //全关函数
//========================================================================
/************************ 串口2初始化函数 ****************************/
void Uart3_Init(void)                //9600bps@11.0592MHz
{
S3CON = 0x10;                //8位数据,可变波特率
S3CON &= 0xBF;                //串口3选择定时器2为波特率发生器
AUXR |= 0x04;                //定时器时钟1T模式
T2L = 0xE0;                  //设置定时初始值//65536-11059200/9600/4=0FEE0H   波特率9600
T2H = 0xFE;                  //设置定时初始值
//T2L = 0xE8;                //设置定时初始值//65536-11059200/115200/4=0FFE8H 波特率115200
//T2H = 0xFF;                //设置定时初始值
AUXR |= 0x10;                //定时器2开始计时       
IE2 = 0x08;                                  //使能串口中断
EA = 1;
//P_SW2 = 0x00;                               // RXD3/P0.0, TXD3/P0.1
P_SW2 = 0x02;                               // RXD3_2/P5.0, TXD3_2/P5.1       
}
//========================================================================
/************************ 10ms消抖延时函数 ****************************/
void Delay10ms()                //延时函数@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 144;
j = 157;
do
{
while (--j);
} while (--i);
}
//========================================================================
/************************ 全开函数 ****************************/
void quan_kai()//全开函数
{
OUT1=0;
OUT2=0;
OUT3=0;
OUT4=0;
OUT5=0;
OUT6=0;
OUT7=0;
OUT8=0;
OUT9=0;
OUT10=0;
}
/************************ 全关函数 ****************************/
void quan_guan()//全关函数
{
OUT1=1;
OUT2=1;
OUT3=1;
OUT4=1;
OUT5=1;
OUT6=1;
OUT7=1;
OUT8=1;
OUT9=1;
OUT10=1;
}
//========================================================================
// 函数: 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;        //运行指示灯亮
Uart3_Init(); //串口2初始化函数9600bps@11.0592MHz       
while (1)//主函数执行循环扫描
{
       
if((IN1==0)&&(IN_bz1==0)){Delay10ms();if(IN1==0){S3BUF=0x01;OUT1=0;IN_bz1=1;}}// 如果IN1有信号输入和标志位IN_bz1等于0,等待10毫秒再次判断IN1是否有信号,如果有OUT1继电器吸合IN_bz1标志位置1
if((IN1==1)&&(IN_bz1==1)){Delay10ms();if(IN1==1){S3BUF=0x11;OUT1=1;IN_bz1=0;}}// 如果IN1无信号输入和标志位IN_bz1等于1,等待10毫秒再次判断IN1是否有信号,如果无OUT1继电器断开IN_bz1标志位置0

if((IN2==0)&&(IN_bz2==0)){Delay10ms();if(IN2==0){S3BUF=0x02;OUT2=0;IN_bz2=1;}}// 如果IN2有信号输入和标志位IN_bz2等于0,等待10毫秒再次判断IN2是否有信号,如果有OUT2继电器吸合IN_bz2标志位置1
if((IN2==1)&&(IN_bz2==1)){Delay10ms();if(IN2==1){S3BUF=0x12;OUT2=1;IN_bz2=0;}}// 如果IN2无信号输入和标志位IN_bz2等于1,等待10毫秒再次判断IN2是否有信号,如果无OUT2继电器断开IN_bz2标志位置0

if((IN3==0)&&(IN_bz3==0)){Delay10ms();if(IN3==0){S3BUF=0x03;OUT3=0;IN_bz3=1;}}// 如果IN3有信号输入和标志位IN_bz3等于0,等待10毫秒再次判断IN3是否有信号,如果有OUT3继电器吸合IN_bz3标志位置1
if((IN3==1)&&(IN_bz3==1)){Delay10ms();if(IN3==1){S3BUF=0x13;OUT3=1;IN_bz3=0;}}// 如果IN3无信号输入和标志位IN_bz3等于1,等待10毫秒再次判断IN3是否有信号,如果无OUT3继电器断开IN_bz3标志位置0

if((IN4==0)&&(IN_bz4==0)){Delay10ms();if(IN4==0){S3BUF=0x04;OUT4=0;IN_bz4=1;}}// 如果IN4有信号输入和标志位IN_bz4等于0,等待10毫秒再次判断IN4是否有信号,如果有OUT4继电器吸合IN_bz4标志位置1
if((IN4==1)&&(IN_bz4==1)){Delay10ms();if(IN4==1){S3BUF=0x14;OUT4=1;IN_bz4=0;}}// 如果IN4无信号输入和标志位IN_bz4等于1,等待10毫秒再次判断IN4是否有信号,如果无OUT4继电器断开IN_bz4标志位置0

if((IN5==0)&&(IN_bz5==0)){Delay10ms();if(IN5==0){S3BUF=0x05;OUT5=0;IN_bz5=1;}}// 如果IN5有信号输入和标志位IN_bz5等于0,等待10毫秒再次判断IN5是否有信号,如果有OUT5继电器吸合IN_bz5标志位置1
if((IN5==1)&&(IN_bz5==1)){Delay10ms();if(IN5==1){S3BUF=0x15;OUT5=1;IN_bz5=0;}}// 如果IN5无信号输入和标志位IN_bz5等于1,等待10毫秒再次判断IN5是否有信号,如果无OUT5继电器断开IN_bz5标志位置0

if((IN6==0)&&(IN_bz6==0)){Delay10ms();if(IN6==0){S3BUF=0x06;OUT6=0;IN_bz6=1;}}// 如果IN6有信号输入和标志位IN_bz6等于0,等待10毫秒再次判断IN6是否有信号,如果有OUT6继电器吸合IN_bz6标志位置1
if((IN6==1)&&(IN_bz6==1)){Delay10ms();if(IN6==1){S3BUF=0x16;OUT6=1;IN_bz6=0;}}// 如果IN6无信号输入和标志位IN_bz6等于1,等待10毫秒再次判断IN6是否有信号,如果无OUT6继电器断开IN_bz6标志位置0

if((IN7==0)&&(IN_bz7==0)){Delay10ms();if(IN7==0){S3BUF=0x07;OUT7=0;IN_bz7=1;}}// 如果IN7有信号输入和标志位IN_bz7等于0,等待10毫秒再次判断IN7是否有信号,如果有OUT7继电器吸合IN_bz7标志位置1
if((IN7==1)&&(IN_bz7==1)){Delay10ms();if(IN7==1){S3BUF=0x17;OUT7=1;IN_bz7=0;}}// 如果IN7无信号输入和标志位IN_bz7等于1,等待10毫秒再次判断IN7是否有信号,如果无OUT7继电器断开IN_bz7标志位置0

if((IN8==0)&&(IN_bz8==0)){Delay10ms();if(IN8==0){S3BUF=0x08;OUT8=0;IN_bz8=1;}}// 如果IN8有信号输入和标志位IN_bz8等于0,等待10毫秒再次判断IN8是否有信号,如果有OUT8继电器吸合IN_bz8标志位置1
if((IN8==1)&&(IN_bz8==1)){Delay10ms();if(IN8==1){S3BUF=0x18;OUT8=1;IN_bz8=0;}}// 如果IN8无信号输入和标志位IN_bz8等于1,等待10毫秒再次判断IN8是否有信号,如果无OUT8继电器断开IN_bz8标志位置0

if((IN9==0)&&(IN_bz9==0)){Delay10ms();if(IN9==0){S3BUF=0x09;OUT9=0;IN_bz9=1;}}// 如果IN9有信号输入和标志位IN_bz9等于0,等待10毫秒再次判断IN9是否有信号,如果有OUT9继电器吸合IN_bz9标志位置1
if((IN9==1)&&(IN_bz9==1)){Delay10ms();if(IN9==1){S3BUF=0x19;OUT9=1;IN_bz9=0;}}// 如果IN9无信号输入和标志位IN_bz9等于1,等待10毫秒再次判断IN9是否有信号,如果无OUT9继电器断开IN_bz9标志位置0

if((IN10==0)&&(IN_bz10==0)){Delay10ms();if(IN10==0){S3BUF=0x0A;OUT10=0;IN_bz10=1;}}// 如果IN10有信号输入和标志位IN_bz10等于0,等待10毫秒再次判断IN10是否有信号,如果有OUT10继电器吸合IN_bz10标志位置1
if((IN10==1)&&(IN_bz10==1)){Delay10ms();if(IN10==1){S3BUF=0x1A;OUT10=1;IN_bz10=0;}}// 如果IN10无信号输入和标志位IN_bz10等于1,等待10毫秒再次判断IN10是否有信号,如果无OUT10继电器断开IN_bz10标志位置0


}
}
/********************************************************************
                                                主函数结束
*********************************************************************/
void UART3_Isr() interrupt 17
{
if (S3CON & 0x01)
{
S3CON &= ~0x01;                                 //清中断标志
UART3_dat = S3BUF; //接收数据S3BUF赋与UART1_dat       
/********************************************************************
                            接收数据判断函数
*********************************************************************/
switch(UART3_dat) //接收数据判断
{
case 0XFF: quan_kai();break; //  全开
case 0X00: quan_guan();break; //  全关

case 0X01: OUT1=0;break;           //  第一路开
case 0X02: OUT2=0;break;           //  第二路开
case 0X03: OUT3=0;break;           //  第三路开
case 0X04: OUT4=0;break;           //  第四路开
case 0X05: OUT5=0;break;           //  第五路开
case 0X06: OUT6=0;break;           //  第六路开
case 0X07: OUT7=0;break;           //  第七路开
case 0X08: OUT8=0;break;           //  第八路开
case 0X09: OUT9=0;break;           //  第九路开
case 0X0A: OUT10=0;break;           //  第十路开
       
case 0X11: OUT1=1;break;           //  第一路关
case 0X12: OUT2=1;break;           //  第二路关
case 0X13: OUT3=1;break;           //  第三路关
case 0X14: OUT4=1;break;           //  第四路关
case 0X15: OUT5=1;break;           //  第五路关
case 0X16: OUT6=1;break;           //  第六路关
case 0X17: OUT7=1;break;           //  第七路关
case 0X18: OUT8=1;break;           //  第八路关
case 0X19: OUT9=1;break;           //  第九路关
case 0X1A: OUT10=1;break;          //  第十路关
default:break;                                             //  跳出
}
}       
if (S3CON & 0x02)
{
S3CON &= ~0x02;                         //清中断标志
}
}
/********************************************************************
                                                程序结束
*********************************************************************/

ZXC-0168 STC8A8K64D4单片机10路输入10路输出可编程工控板原理图.pdf

1.53 MB, 下载次数: 97

第20讲 串口2控制继电器通断十六进制方式控制.rar

73.32 KB, 下载次数: 102

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-02 01:28:16
已绑定手机

40

主题

371

回帖

843

积分

高级会员

积分
843
发表于 2024-1-2 16:33:19 | 显示全部楼层
主要得有PLC底层代码才有用。说到底就是做PLC。因为还要借助三菱的软件,还要了解这个软件的握手协议。
纸上得到终觉浅,绝知此事要躬行。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:432
  • 最近打卡:2025-05-02 08:53:05

8

主题

75

回帖

215

积分

中级会员

积分
215
发表于 2024-1-8 20:07:41 | 显示全部楼层
老板,我的输入电路和你的一样的,不过有个问题。会烧单片机,能帮忙分析一下原因吗?
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6153
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:519
  • 最近打卡:2025-05-02 07:55:51
已绑定手机

46

主题

1694

回帖

2544

积分

金牌会员

积分
2544
发表于 2024-4-29 08:53:19 | 显示全部楼层
请问这种电源方式不是完全隔离的,光耦的隔离作用就不大了吧?
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 19:33 , Processed in 0.112341 second(s), 75 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表