qepuemc 发表于 2024-3-19 12:33:59

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

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







//采用stc15w204s单片机tm1640芯片 DIN=P1^0;        15CLK=P1^1; 16
//CODE=CODE | 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={0xBB,0x81,0xEA,0xE3,0xD1,0x73,0x7B,0xA1,0xFB,0xF3,0xF9,0x5B,0x3A,0xCB,0x7A,0x78,};//共阴数码管0~F字型码,需根据硬件接法定义               
unsigned intCODE={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    因是110592TL0=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=xsbl % 10000/1000;
CODE=xsbl % 1000/100;
CODE=xsbl % 100/10;
CODE=xsbl % 10;

CODE=xsbl % 10000/1000;
CODE=xsbl % 1000/100;
CODE=xsbl % 100/10;
CODE=xsbl % 10;


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

/*
if (xsbl<10)
        CODE=0x00;
if (xsbl<100)
CODE=0x00;
if (xsbl<1000)
        CODE=0x00;
*/


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

//CODE=0x6F;

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


}
}


晓飛飛 发表于 2024-3-23 17:14:35

都上鸣笛喇叭了,何不来一对双音蜗牛?

qepuemc 发表于 2024-3-24 13:23:06

晓飛飛 发表于 2024-3-23 17:14
都上鸣笛喇叭了,何不来一对双音蜗牛?

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

晓飛飛 发表于 2024-3-24 21:02:20

qepuemc 发表于 2024-3-24 13:23
这个需要4块多就可以了。便宜也不占地方。主要就是用来做闹铃。目前就用这个。有需要用哪种都可以。这个 ...

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


qepuemc 发表于 2024-3-29 16:12:38

晓飛飛 发表于 2024-3-24 21:02
喇叭负极回路是不是底层这一根线,感觉太细了,能扛得住一两安的电流吗?




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

小涵子爸爸 发表于 2024-4-6 08:28:55

感谢分享
页: [1]
查看完整版本: TM1640超大声闹铃20230415时间更准确修复BUG11.0592(带立创PCB源文件)