- 打卡等级:以坛为家I
- 打卡总天数:378
- 最近打卡:2025-05-01 07:48:27
高级会员
- 积分
- 591
|
TM1640超大声闹铃20230415时间更准确修复BUG11.0592(带立创PCB源文件) stc15w408AS 204都可以
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);
}
}
}
|
|