找回密码
 立即注册
查看: 407|回复: 0

ZXC-0168 STC8A8K64D4单片机第19讲 串口1控制继电器通断字符方式控制

[复制链接]
  • TA的每日心情
    开心
    2024-3-29 12:03
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    24

    主题

    6

    回帖

    247

    积分

    荣誉版主

    积分
    247
    发表于 2023-11-24 16:27:02 | 显示全部楼层 |阅读模式
    ZXC-0168 应用举例.jpg

    ZXC-0168 标识图.jpg

    ZXC-0168 原理图_00.jpg


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

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

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

    *********************************************************************/
    /*************  功能说明    **************
    第19讲   串口1控制继电器通断字符方式控制

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

    单片机接收PC机发送的字符表如下:

    01、全开:PC发送'Z';大写
    02、全关:PC发送'z'; 小写

    03、第一路开:PC发送'A';大写
    04、第二路开:PC发送'B';大写
    05、第三路开:PC发送'C';大写
    06、第四路开:PC发送'D';大写
    07、第五路开:PC发送'E';大写
    08、第六路开:PC发送'F';大写
    09、第七路开:PC发送'G';大写
    10、第八路开:PC发送'H';大写
    11、第九路开:PC发送'I';大写
    12、第十路开:PC发送'J';大写

    13、第一路关:PC发送'a';小写
    14、第二路关:PC发送'b';小写
    15、第三路关:PC发送'c';小写
    16、第四路关:PC发送'd';小写
    17、第五路关:PC发送'e';小写
    18、第六路关:PC发送'f';小写
    19、第七路关:PC发送'g';小写
    20、第八路关:PC发送'h';小写
    21、第九路开:PC发送'i';小写
    22、第十路开:PC发送'j';小写
    ******************************************/

    #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 UART1_dat=0;//串口数据接收变量
    //========================================================================
    // 函数声明
    void Delay10ms();                  //延时函数@11.0592MHz
    void Uart_Init(void); //串口1初始化函数9600bps@11.0592MHz
    void quan_kai();      //全开函数
    void quan_guan();     //全关函数
    //========================================================================
    /************************ 串口1初始化函数 ****************************/
    void Uart_Init(void)                //9600bps@11.0592MHz
    {
    SCON = 0x50;                //8位数据,可变波特率
    AUXR |= 0x01;                //串口1选择定时器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开始计时       
    ES = 1;                                     //使能串口中断
    EA = 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;        //运行指示灯亮
    Uart_Init(); //串口1初始化函数9600bps@11.0592MHz       
    while (1)//主函数执行循环扫描
    {
           
    if((IN1==0)&&(IN_bz1==0)){Delay10ms();if(IN1==0){SBUF='A';while(!TI);TI=0;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){SBUF='a';while(!TI);TI=0;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){SBUF='B';while(!TI);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){SBUF='b';while(!TI);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){SBUF='C';while(!TI);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){SBUF='c';while(!TI);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){SBUF='D';while(!TI);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){SBUF='d';while(!TI);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){SBUF='E';while(!TI);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){SBUF='e';while(!TI);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){SBUF='F';while(!TI);OUT1=0;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){SBUF='f';while(!TI);OUT1=1;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){SBUF='G';while(!TI);OUT1=0;OUT2=0;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){SBUF='g';while(!TI);OUT1=1;OUT2=1;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){SBUF='H';while(!TI);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){SBUF='h';while(!TI);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){SBUF='I';while(!TI);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){SBUF='i';while(!TI);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){SBUF='J';while(!TI);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){SBUF='j';while(!TI);OUT10=1;IN_bz10=0;}}// 如果IN10无信号输入和标志位IN_bz10等于1,等待10毫秒再次判断IN10是否有信号,如果无OUT10继电器断开IN_bz10标志位置0


    }
    }
    /********************************************************************
                                                    主函数结束
    *********************************************************************/
    void UART1_Isr() interrupt 4
    {
    if (RI)
    {
    RI = 0;                                 //清中断标志
    UART1_dat = SBUF; //接收数据SBUF赋与UART1_dat       
    /********************************************************************
                                接收数据判断函数
    *********************************************************************/
    switch(UART1_dat) //接收数据判断
    {
    case 'Z': quan_kai();break; //  全开
    case 'z': quan_guan();break; //  全关

    case 'A': OUT1=0;break;           //  第一路开
    case 'B': OUT2=0;break;           //  第二路开
    case 'C': OUT3=0;break;           //  第三路开
    case 'D': OUT4=0;break;           //  第四路开
    case 'E': OUT5=0;break;           //  第五路开
    case 'F': OUT6=0;break;           //  第六路开
    case 'G': OUT7=0;break;           //  第七路开
    case 'H': OUT8=0;break;           //  第八路开
    case 'I': OUT9=0;break;           //  第九路开
    case 'J': OUT10=0;break;         //  第十路开
           
    case 'a': OUT1=1;break;           //  第一路关
    case 'b': OUT2=1;break;           //  第二路关
    case 'c': OUT3=1;break;           //  第三路关
    case 'd': OUT4=1;break;           //  第四路关
    case 'e': OUT5=1;break;           //  第五路关
    case 'f': OUT6=1;break;           //  第六路关
    case 'g': OUT7=1;break;           //  第七路关
    case 'h': OUT8=1;break;           //  第八路关
    case 'i': OUT9=1;break;           //  第九路关
    case 'j': OUT10=1;break;         //  第十路关
    default:break;                                           //  跳出
    }
    }       
    if (TI)
    {
    TI = 0;                                 //清中断标志
    }
    }
    /********************************************************************
                                                    程序结束
    *********************************************************************/

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

    1.53 MB, 下载次数: 16

    第19讲 串口1控制继电器通断字符方式控制.rar

    73.26 KB, 下载次数: 22

    回复 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-20 01:58 , Processed in 0.073085 second(s), 33 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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