找回密码
 立即注册
查看: 133|回复: 5

TM1640超大声闹铃20230415时间更准确修复BUG11.0592(带立创PCB源文件)

[复制链接]
  • TA的每日心情
    开心
    前天 09:35
  • 签到天数: 37 天

    [LV.5]常住居民I

    10

    主题

    108

    回帖

    201

    积分

    中级会员

    积分
    201
    发表于 2024-3-19 12:33:59 | 显示全部楼层 |阅读模式
    TM1640超大声闹铃20230415时间更准确修复BUG11.0592(带立创PCB源文件)   stc15w408AS 204都可以


    153937tdpv7qhvbgdkkd1v.jpg

    PCB

    PCB




    //采用stc15w204s单片机tm1640芯片 DIN=P1^0;        15  CLK=P1^1; 16
    //CODE[7]=CODE[7] | 10000000;//显示小数点
    /*****************************************************************************
    *版权信息:深圳天微电子有限公司
    *文 件 名:TM1640-V1.0
    *当前版本:V1.0
    *MCU 型号:STC12C5608AD
    *开发环境:Keil uVision4
    *晶震频率:11.0592MHZ      
    *完成日期:2013-07-18
    *程序功能:数码管驱动:驱动8段16位LED共阴数码管显示0123456789AbCdEF;
    *免责声明:1.此程序为TM1640驱动LED数码管演示程序,仅作参考之用。
                2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任            
    ********************************************************************************/
               //头文件
    #include "intrins.h"                   //包含_nop_()指令头文件
    #include <STC15F2K60S2.H>



    /********************定义控制端口**********************/
    sbit DIN=P1^5;                                   //定义DIN数据端口 stc15w204s 15
    sbit CLK=P1^4;                                   //定义CLK数据端口 stc15w204s 16
    //需要显示的数据
    unsigned int temptime=0;//秒计算
    unsigned int xsbl;
    //需要显示的数据
    /********************定义数据*************************/
    //unsigned char code CODE[16]={0xBB,0x81,0xEA,0xE3,0xD1,0x73,0x7B,0xA1,0xFB,0xF3,0xF9,0x5B,0x3A,0xCB,0x7A,0x78,};  //共阴数码管0~F字型码,需根据硬件接法定义               
    unsigned int  CODE[16]={0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,};  //共阴数码管0~F字型码,需根据硬件接法定义               

    /********************延时函数,延时nms******************/
    void delay_nms(unsigned int n)
    {
    unsigned int i;
    while(n--)
    for(i=0;i<550;i++);
    }



    /********************读秒计算******************/
    void dumiao()
    {
            temptime=temptime+1;
            if (temptime>=10 && xsbl>0)
            {xsbl=xsbl-1;
                    temptime=0;
            }
                   

    }


    /********************Start函数*************************/
    void I2CStart()
    {
        DIN=1;
        CLK=1;
            _nop_();
            _nop_();
            DIN=1;
            _nop_();
            _nop_();
            DIN=0;
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            CLK=0;
            _nop_();
            _nop_();
    }
    /********************Stop函数*************************/
    void I2CStop()
    {
            CLK=1;
            _nop_();
            _nop_();
            DIN=0;
            _nop_();
            _nop_();
            DIN=1;
            _nop_();
            _nop_();
            CLK=0;
            DIN=0;

    }

    /***************发送8bit数据,从低位开始**************/
    void I2CWritebyte(unsigned char oneByte)
    {
      unsigned char i;
      for(i=0;i<8;i++)
      {
        CLK=0;
            if(oneByte&0x01)
              DIN=1;
            else
              DIN=0;
            _nop_();
            _nop_();
            _nop_();
            CLK=1;
            oneByte=oneByte>>1;
            }
            CLK=0;
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            DIN=0;
            _nop_();
            _nop_();
    }

    /************显示函数,数码管1~16位显示0~F************/
    void disp()
    {
    unsigned char i;

    I2CStart();
    I2CWritebyte(0x40);        //数据命令设置:普通模式,地址自动加一
    I2CStop();

    I2CStart();
    I2CWritebyte(0xc0);        //地址命令设置:初始地址00H
    for(i=0;i<16;i++)                //发送16位显示数据
    {
       I2CWritebyte(CODE);
    }
    I2CStop();

    I2CStart();
    I2CWritebyte(0x8c);        //显示控制:显示开,脉冲宽度设为11/16
    I2CStop();
    }








    void Timer0Init(void)                //1毫秒@12.000MHz
    {
            TMOD &= 0xF0;                //设置定时器模式
            TMOD |= 0x01;                //设置定时器模式
            TL0 = 0x65;                //设置定时初值
            TH0 = 0xFC;                //设置定时初值
            TF0 = 0;                //清除TF0标志
            TR0 = 1;                //定时器0开始计时
            ET0=1;//打开定时器0中断允许
            EA=1;//打开总中断
    }



    /*******************************************************************************
    * 函 数 名         : void Timer0() interrupt 1
    * 函数功能                   : 定时器0中断函数
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void Timer0() interrupt 1
    {
            static unsigned int i;
            TH0=0XFC;        //给定时器赋初值,定时1ms    因是110592  TL0=0x65这里数大中断的快//https://zhuanlan.zhihu.com/p/529743808?utm_id=0
            TL0=0X65;
            i++;
            if(i==1000)
            {
                    i=0;
                    if(xsbl>0)
                    {xsbl=xsbl-1;
                            if (xsbl == 1 )
            {
            P37=1;//打开报警
            }
                    }
                   
            }       
    }





    void main()
    {                Timer0Init();  //定时器0初始化

        P0M0 = 0x00;
        P0M1 = 0x00;
        P1M0 = 0x00;
        P1M1 = 0x00;
        P2M0 = 0x00;
        P2M1 = 0x00;
        P3M0 = 0xf0;
        P3M1 = 0x00;
            P37=0;//关闭报警
    //看门狗程序
        WDT_CONTR |= 0x20;      //启动看门狗
    //看门狗程序
           
                    xsbl=0000;
    while(1)
    {
                   
            if (P10 == 0)               
            {delay_nms(100);
                    if (P10 == 0)               
                    {xsbl=xsbl+10;}//P10按下计数器加10
            }       
            if (P11 == 0)
            {delay_nms(100);
            if (P11 == 0)
            {        xsbl=xsbl+100;}//P11按下计数器加100
            }
           
            if (P13 == 0)
            {delay_nms(500);
            if (P13 == 0)
            {                P37=1;}//光耦打开报警
            }
           
           
           
           
           
           
            if (P12 == 0)
            {xsbl=0;//P12按下计数器归0
            P37=0;//关闭报警
            }

           
           
           
           
           
            WDT_CONTR=0xfc;//喂狗(常用)

    //重新定义数码管显示的数据
            /*
                    0x3F,  //"0"
        0x06,  //"1"
        0x5B,  //"2"
        0x4F,  //"3"
        0x66,  //"4"
        0x6D,  //"5"
        0x7D,  //"6"
        0x07,  //"7"
        0x7F,  //"8"
        0x6F,  //"9"
        0x77,  //"A"
        0x7C,  //"B"
        0x39,  //"C"
        0x5E,  //"D"
        0x79,  //"E"
        0x71,  //"F"
        0x76,  //"H"
        0x38,  //"L"
        0x37,  //"n"
        0x3E,  //"u"
        0x73,  //"P"
        0x5C,  //"o"
        0x40,  //"-"
        0x00  //熄灭
    */
    //取数据
    CODE[0]=xsbl % 10000/1000;
    CODE[1]=xsbl % 1000/100;
    CODE[2]=xsbl % 100/10;
    CODE[3]=xsbl % 10;

    CODE[4]=xsbl % 10000/1000;
    CODE[5]=xsbl % 1000/100;
    CODE[6]=xsbl % 100/10;
    CODE[7]=xsbl % 10;


    //取数据
    //取数据
    //CODE[0]=7;
    //CODE[1]=7;
    //CODE[2]=9;
    //CODE[3]=9;
    //取数据
    //数据比较
    //第1位
    switch(CODE[0]){       
            case 0: CODE[0]=0x3F; break;
            case 1: CODE[0]=0x06; break;
            case 2: CODE[0]=0x5B; break;
            case 3: CODE[0]=0x4F; break;       
            case 4: CODE[0]=0x66; break;
            case 5: CODE[0]=0x6D; break;
            case 6: CODE[0]=0x7D; break;
            case 7: CODE[0]=0x07; break;
            case 8: CODE[0]=0x7F; break;
            case 9: CODE[0]=0x6F; break;       
    }
    //第1位
    //第2位
    switch(CODE[1]){       
            case 0: CODE[1]=0x3F; break;
            case 1: CODE[1]=0x06; break;
            case 2: CODE[1]=0x5B; break;
            case 3: CODE[1]=0x4F; break;       
            case 4: CODE[1]=0x66; break;
            case 5: CODE[1]=0x6D; break;
            case 6: CODE[1]=0x7D; break;
            case 7: CODE[1]=0x07; break;
            case 8: CODE[1]=0x7F; break;
            case 9: CODE[1]=0x6F; break;       
    }
    //第2位
    //第3位
    switch(CODE[2]){       
            case 0: CODE[2]=0x3F; break;
            case 1: CODE[2]=0x06; break;
            case 2: CODE[2]=0x5B; break;
            case 3: CODE[2]=0x4F; break;       
            case 4: CODE[2]=0x66; break;
            case 5: CODE[2]=0x6D; break;
            case 6: CODE[2]=0x7D; break;
            case 7: CODE[2]=0x07; break;
            case 8: CODE[2]=0x7F; break;
            case 9: CODE[2]=0x6F; break;       
    }
    //第3位
    //第4位
    switch(CODE[3]){       
            case 0: CODE[3]=0x3F; break;
            case 1: CODE[3]=0x06; break;
            case 2: CODE[3]=0x5B; break;
            case 3: CODE[3]=0x4F; break;       
            case 4: CODE[3]=0x66; break;
            case 5: CODE[3]=0x6D; break;
            case 6: CODE[3]=0x7D; break;
            case 7: CODE[3]=0x07; break;
            case 8: CODE[3]=0x7F; break;
            case 9: CODE[3]=0x6F; break;       
    }
    //第4位
    //第5位
    switch(CODE[4]){       
            case 0: CODE[4]=0x3F; break;
            case 1: CODE[4]=0x06; break;
            case 2: CODE[4]=0x5B; break;
            case 3: CODE[4]=0x4F; break;       
            case 4: CODE[4]=0x66; break;
            case 5: CODE[4]=0x6D; break;
            case 6: CODE[4]=0x7D; break;
            case 7: CODE[4]=0x07; break;
            case 8: CODE[4]=0x7F; break;
            case 9: CODE[4]=0x6F; break;       
    }
    //第5位
    //第6位
    switch(CODE[5]){       
            case 0: CODE[5]=0x3F; break;
            case 1: CODE[5]=0x06; break;
            case 2: CODE[5]=0x5B; break;
            case 3: CODE[5]=0x4F; break;       
            case 4: CODE[5]=0x66; break;
            case 5: CODE[5]=0x6D; break;
            case 6: CODE[5]=0x7D; break;
            case 7: CODE[5]=0x07; break;
            case 8: CODE[5]=0x7F; break;
            case 9: CODE[5]=0x6F; break;       
    }
    //第6位
    //第7位
    switch(CODE[6]){       
            case 0: CODE[6]=0x3F; break;
            case 1: CODE[6]=0x06; break;
            case 2: CODE[6]=0x5B; break;
            case 3: CODE[6]=0x4F; break;       
            case 4: CODE[6]=0x66; break;
            case 5: CODE[6]=0x6D; break;
            case 6: CODE[6]=0x7D; break;
            case 7: CODE[6]=0x07; break;
            case 8: CODE[6]=0x7F; break;
            case 9: CODE[6]=0x6F; break;       
    }
    //第7位
    //第8位
    switch(CODE[7]){       
            case 0: CODE[7]=0x3F; break;
            case 1: CODE[7]=0x06; break;
            case 2: CODE[7]=0x5B; break;
            case 3: CODE[7]=0x4F; break;       
            case 4: CODE[7]=0x66; break;
            case 5: CODE[7]=0x6D; break;
            case 6: CODE[7]=0x7D; break;
            case 7: CODE[7]=0x07; break;
            case 8: CODE[7]=0x7F; break;
            case 9: CODE[7]=0x6F; break;       
    }
    //第8位

    /*
    if (xsbl<10)
            CODE[2]=0x00;
    if (xsbl<100)
    CODE[1]=0x00;
    if (xsbl<1000)
            CODE[0]=0x00;
    */


    //if (xsbl>10 && xsbl<100)
    //        CODE[2]=CODE[2] | 10000000;//显示小数点
    //if (xsbl>100 && xsbl<1000)
    //CODE[1]=CODE[1] | 10000000;//显示小数点
    //if (xsbl>1000  && xsbl<10000)
    //        CODE[0]=CODE[0] | 10000000;//显示小数点
    //数据比较//

    //CODE[3]=0x6F;

    disp();                         //显示
    if (xsbl>=10000)
    {xsbl=0;
            WDT_CONTR=0x21;//喂狗(常用)
            delay_nms(1000);
    }


    }
    }


    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 84 天

    [LV.6]常住居民II

    13

    主题

    325

    回帖

    736

    积分

    荣誉版主

    热心市民

    积分
    736
    发表于 2024-3-23 17:14:35 | 显示全部楼层
    都上鸣笛喇叭了,何不来一对双音蜗牛?
    睁开眼睛做场梦~~~
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 09:35
  • 签到天数: 37 天

    [LV.5]常住居民I

    10

    主题

    108

    回帖

    201

    积分

    中级会员

    积分
    201
     楼主| 发表于 2024-3-24 13:23:06 | 显示全部楼层
    晓飛飛 发表于 2024-3-23 17:14
    都上鸣笛喇叭了,何不来一对双音蜗牛?

    这个需要4块多就可以了。便宜也不占地方。主要就是用来做闹铃。目前就用这个。有需要用哪种都可以。这个里面没有电路也是很耐用的。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 84 天

    [LV.6]常住居民II

    13

    主题

    325

    回帖

    736

    积分

    荣誉版主

    热心市民

    积分
    736
    发表于 2024-3-24 21:02:20 | 显示全部楼层
    qepuemc 发表于 2024-3-24 13:23
    这个需要4块多就可以了。便宜也不占地方。主要就是用来做闹铃。目前就用这个。有需要用哪种都可以。这个 ...

    喇叭负极回路是不是底层这一根线,感觉太细了,能扛得住一两安的电流吗?
    QQ截图20240324210049.png

    睁开眼睛做场梦~~~
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 09:35
  • 签到天数: 37 天

    [LV.5]常住居民I

    10

    主题

    108

    回帖

    201

    积分

    中级会员

    积分
    201
     楼主| 发表于 2024-3-29 16:12:38 来自手机 | 显示全部楼层
    晓飛飛 发表于 2024-3-24 21:02
    喇叭负极回路是不是底层这一根线,感觉太细了,能扛得住一两安的电流吗?



    就是这很线。还真是太细了。一般持续的时间不超过10秒。所以在用一直没问题。感谢提醒。下次做改掉这个问题
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 140 天

    [LV.7]常住居民III

    0

    主题

    392

    回帖

    517

    积分

    高级会员

    积分
    517
    发表于 2024-4-6 08:28:55 | 显示全部楼层
    感谢分享
    靡不有初,鲜克有终
    回复 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-1 11:12 , Processed in 0.066326 second(s), 52 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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