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

ZXC-0168 STC8A8K64D4单片机第18讲 开关信号输入控制蜂鸣器提示音

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

    [LV.2]偶尔看看I

    24

    主题

    6

    回帖

    247

    积分

    荣誉版主

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

    ZXC-0168 标识图.jpg

    ZXC-0168 原理图_00.jpg



    【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
    *********************************************************************/
    /*************  功能说明    **************
    第18讲   开关信号输入控制蜂鸣器提示音(定时器方式)

    1.通过输入端控制蜂鸣器发出不同声音。使用定时器1产生不同间隔信号。
    ******************************************/

    #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;//蜂鸣器控制脚

    uint tcnt=0;// 定时计数器
    uint sec=0;// 蜂鸣器累加值
    /*******************标志位设定*********************/

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

    uint IN_js1=0; //输入1计时变量
    uint IN_js2=0; //输入2计时变量
    uint IN_js3=0; //输入3计时变量
    uint IN_js4=0; //输入4计时变量
    uint IN_js5=0; //输入5计时变量
    uint IN_js6=0; //输入6计时变量
    uint IN_js7=0; //输入7计时变量
    uint IN_js8=0; //输入8计时变量
    uint IN_js9=0; //输入9计时变量
    uint IN_js10=0; //输入10计时变量
    uint IN_TIME=1000;//输入口消抖计时变量

    uint FMQ_TIME=10;//蜂鸣器发声时间
    bit FMQ_EN=0;//蜂鸣器使能标志
    //========================================================================
    // 函数声明
    void Timer1_Init();//定时器1初始化函数
    //========================================================================
    /************************ 定时器1初始化函数 ****************************/
    void Timer1_Init(void)                //250微秒@11.0592MHz
    {
    AUXR |= 0x40;                //定时器时钟1T模式
    TMOD &= 0x0F;                //设置定时器模式
    TL1 = 0x33;                //设置定时初始值
    TH1 = 0xF5;                //设置定时初始值
    TF1 = 0;                //清除TF1标志
    TR1 = 1;                //定时器1开始计时
    ET1=1;          //使能INT0中断
    EA = 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;        //运行指示灯亮
    Timer1_Init();//定时器1初始化函数       
    while (1)//主函数执行循环扫描
    {
    if((IN1==0)&&(IN_bz1==0)){IN_js1++;if(IN_js1>=IN_TIME){if(IN1==0){FMQ_EN=1;OUT1=0;FMQ_TIME=10;IN_bz1=1;}}}// 如果IN1有信号输入和标志位IN_bz1等于0,等待再次判断IN1是否有信号,如果有OUT1继电器吸合IN_bz1标志位置1
    if((IN1==1)&&(IN_bz1==1)){OUT1=1;FMQ=1;FMQ_EN=0;IN_js1=0;IN_bz1=0;}                                                     // 如果IN1无信号输入继电器断开,IN_js1变量值清零,IN_bz1标志位置0

    if((IN2==0)&&(IN_bz2==0)){IN_js2++;if(IN_js2>=IN_TIME){if(IN2==0){FMQ_EN=1;OUT2=0;FMQ_TIME=20;IN_bz2=1;}}}// 如果IN2有信号输入和标志位IN_bz2等于0,等待再次判断IN1是否有信号,如果有OUT2继电器吸合IN_bz2标志位置1
    if((IN2==1)&&(IN_bz2==1)){OUT2=1;FMQ=1;FMQ_EN=0;IN_js2=0;IN_bz2=0;}                                                     // 如果IN2无信号输入继电器断开,IN_js2变量值清零,IN_bz2标志位置0

    if((IN3==0)&&(IN_bz3==0)){IN_js3++;if(IN_js3>=IN_TIME){if(IN3==0){FMQ_EN=1;OUT3=0;FMQ_TIME=30;IN_bz3=1;}}}// 如果IN3有信号输入和标志位IN_bz3等于0,等待再次判断IN1是否有信号,如果有OUT3继电器吸合IN_bz3标志位置1
    if((IN3==1)&&(IN_bz3==1)){OUT3=1;FMQ=1;FMQ_EN=0;IN_js3=0;IN_bz3=0;}                                                     // 如果IN3无信号输入继电器断开,IN_js3变量值清零,IN_bz3标志位置0

    if((IN4==0)&&(IN_bz4==0)){IN_js4++;if(IN_js4>=IN_TIME){if(IN4==0){FMQ_EN=1;OUT4=0;FMQ_TIME=40;IN_bz4=1;}}}// 如果IN4有信号输入和标志位IN_bz4等于0,等待再次判断IN1是否有信号,如果有OUT4继电器吸合IN_bz4标志位置1
    if((IN4==1)&&(IN_bz4==1)){OUT4=1;FMQ=1;FMQ_EN=0;IN_js4=0;IN_bz4=0;}                                                     // 如果IN4无信号输入继电器断开,IN_js4变量值清零,IN_bz4标志位置0

    if((IN5==0)&&(IN_bz5==0)){IN_js5++;if(IN_js5>=IN_TIME){if(IN5==0){FMQ_EN=1;OUT5=0;FMQ_TIME=50;IN_bz5=1;}}}// 如果IN5有信号输入和标志位IN_bz5等于0,等待再次判断IN1是否有信号,如果有OUT5继电器吸合IN_bz5标志位置1
    if((IN5==1)&&(IN_bz5==1)){OUT5=1;FMQ=1;FMQ_EN=0;IN_js5=0;IN_bz5=0;}                                                     // 如果IN5无信号输入继电器断开,IN_js5变量值清零,IN_bz5标志位置0

    if((IN6==0)&&(IN_bz6==0)){IN_js6++;if(IN_js6>=IN_TIME){if(IN6==0){FMQ_EN=1;OUT6=0;FMQ_TIME=60;IN_bz6=1;}}}// 如果IN6有信号输入和标志位IN_bz6等于0,等待再次判断IN1是否有信号,如果有OUT6继电器吸合IN_bz6标志位置1
    if((IN6==1)&&(IN_bz6==1)){OUT6=1;FMQ=1;FMQ_EN=0;IN_js6=0;IN_bz6=0;}                                                     // 如果IN6无信号输入继电器断开,IN_js6变量值清零,IN_bz6标志位置0

    if((IN7==0)&&(IN_bz7==0)){IN_js7++;if(IN_js7>=IN_TIME){if(IN7==0){FMQ_EN=1;OUT7=0;FMQ_TIME=70;IN_bz7=1;}}}// 如果IN7有信号输入和标志位IN_bz7等于0,等待再次判断IN1是否有信号,如果有OUT7继电器吸合IN_bz7标志位置1
    if((IN7==1)&&(IN_bz7==1)){OUT7=1;FMQ=1;FMQ_EN=0;IN_js7=0;IN_bz7=0;}                                                     // 如果IN7无信号输入继电器断开,IN_js7变量值清零,IN_bz7标志位置0

    if((IN8==0)&&(IN_bz8==0)){IN_js8++;if(IN_js8>=IN_TIME){if(IN8==0){FMQ_EN=1;OUT8=0;FMQ_TIME=80;IN_bz8=1;}}}// 如果IN8有信号输入和标志位IN_bz8等于0,等待再次判断IN1是否有信号,如果有OUT8继电器吸合IN_bz8标志位置1
    if((IN8==1)&&(IN_bz8==1)){OUT8=1;FMQ=1;FMQ_EN=0;IN_js8=0;IN_bz8=0;}                                                     // 如果IN8无信号输入继电器断开,IN_js8变量值清零,IN_bz8标志位置0

    if((IN9==0)&&(IN_bz9==0)){IN_js9++;if(IN_js9>=IN_TIME){if(IN9==0){FMQ_EN=1;OUT9=0;FMQ_TIME=90;IN_bz9=1;}}}// 如果IN9有信号输入和标志位IN_bz9等于0,等待再次判断IN1是否有信号,如果有OUT9继电器吸合IN_bz9标志位置1
    if((IN9==1)&&(IN_bz9==1)){OUT9=1;FMQ=1;FMQ_EN=0;IN_js9=0;IN_bz9=0;}                                                     // 如果IN9无信号输入继电器断开,IN_js9变量值清零,IN_bz9标志位置0

    if((IN10==0)&&(IN_bz10==0)){IN_js10++;if(IN_js10>=IN_TIME){if(IN10==0){FMQ_EN=1;OUT10=0;FMQ_TIME=100;IN_bz10=1;}}}// 如果IN10有信号输入和标志位IN_bz10等于0,等待再次判断IN1是否有信号,如果有OUT10继电器吸合IN_bz10标志位置1
    if((IN10==1)&&(IN_bz10==1)){OUT10=1;FMQ=1;FMQ_EN=0;IN_js10=0;IN_bz10=0;}                                                          // 如果IN10无信号输入继电器断开,IN_js10变量值清零,IN_bz10标志位置0
    }
    }
    /********************************************************************
                                                    主程序结束
    *********************************************************************/
    /********************************************************************
                                                    定时器中断函数
    *********************************************************************/
    void Timer1_Isr() interrupt 3 //250微秒@11.0592MHz
    {
    tcnt++;//每中断一次计数值加1       
    if(tcnt==20)//如果定时器计数值等于20时,时间值是5毫秒
    {
    if(FMQ_EN==1)
    {
    sec++;//计数累加       
    if(sec>=FMQ_TIME){FMQ=!FMQ;sec=0;}//当累加值大于等于设定值时蜂鸣器发音
    }
    tcnt=0;//定时器计数值清零
    }
    }
    /********************************************************************
                                                    结束
    *********************************************************************/


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

    1.53 MB, 下载次数: 12

    第18讲 开关信号输入控制蜂鸣器提示音.rar

    70.33 KB, 下载次数: 16

    回复 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-20 02:25 , Processed in 0.055044 second(s), 32 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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