历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2020年03月06日 | 51单片机-计时器-倒计时闹钟

2020-03-06 来源:eefocus

1.视频

bilibili视频地址:


https://www.bilibili.com/video/av91943244


51单片机-计时器-倒计时闹钟


2.文件

文件下载地址:


https://download.csdn.net/download/weixin_43130546/12194355


3.说明

注意KeyScan()函数if语句!

蜂鸣器频率问题;

想到再补充。


4.代码


#include


sbit BUZZER = P2^3;


sbit DULA = P2^6;

sbit WELA = P2^7;


sbit KEYOUT1 = P3^0;

sbit KEYOUT2 = P3^1;

sbit KEYOUT3 = P3^2;

sbit KEYOUT4 = P3^3;

sbit KEYIN1 = P3^4;

sbit KEYIN2 = P3^5;

sbit KEYIN3 = P3^6;

sbit KEYIN4 = P3^7;


unsigned char code DUTable[16] = 

{

0x3F,0x06,0x5B,0x4F,

0x66,0x6D,0x7D,0x07,

0x7F,0x6F,0x77,0x7C,

0x39,0x5E,0x79,0x71

};


unsigned char code WETable[8] = 

{

~0x80,~0x40,~0x20,~0x10,

~0x08,~0x04,~0x02,~0x01

};


unsigned char LedBuff[8] = 

{

0x3F,0x00,0x00,0X00,

0X00,0X00,0X00,0X00

};


unsigned char code KeyCode[4][4] = 

{

{0x31,0x32,0x33,0x26},    // 1 2 3 up

{0x34,0x35,0x36,0x25},    // 4 5 6 left

{0x37,0x38,0x39,0x28},    // 7 8 9 down

{0x30,0x1B,0x0D,0x27}    // 0 ESC enter right

};


unsigned char KeyStay[4][4] = 

{

{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}

};


unsigned long pdata KeyTime[4][4] = 

{

{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}

};


unsigned char T0RH,T0RL;

bit enBuzz = 0;

bit flagCount = 0;

bit flag1s = 0;

unsigned long CountNum = 0;


void ConfigTimer0(unsigned char ms);

void KeyDriver(void);

void ShowNumber(void);


void main(void)

{

ConfigTimer0(1);

while(1)

{

KeyDriver();

if(flagCount && flag1s)

{

flag1s = 0;

if(CountNum > 0)

{

CountNum--;

ShowNumber();

if(0 == CountNum)

{

enBuzz = 1;

P1 = 0x00;

flagCount = 0;

}

}

}

}

}


void ConfigTimer0(unsigned char ms)

{

unsigned long tmp;


tmp = 11059200 / 12;

tmp = tmp * ms / 1000;

tmp = 65536 - tmp;

tmp += 18;


T0RH = (unsigned char)(tmp>>8);

T0RL = (unsigned char)tmp;


TH0 = T0RH;

TL0 = T0RL;

TMOD &= 0xF0;

TMOD |= 0x01;

EA = 1;

ET0 = 1;

TF0 = 0;

TR0 = 1;

}


void ShowNumber(void)

{

char i;

unsigned long num = CountNum;

unsigned char buff[8];


for(i=0; i<8; i++)

{

buff[i] = num % 10;

num /= 10;

}

for(i=7; i>=1; i--)

{

if(0 == buff[i])

{

LedBuff[i] = 0x00;

}

else

{

break;

}

}

for(; i>=0; i--)

{

LedBuff[i] = DUTable[buff[i]];

}

}


void KeyAction(unsigned char KeyCoder)

{

if((0x26 == KeyCoder) || (0x25 == KeyCoder))

{

if(CountNum < 99999999)

{

CountNum++;

ShowNumber();

}

}

else if((0x28 == KeyCoder) || (0x27 == KeyCoder))

{

if(CountNum > 0)

{

CountNum--;

ShowNumber();

}

}

else if(0x0D == KeyCoder)

{

flagCount = 1;

}

else if(0x1B == KeyCoder)

{

enBuzz = 0;

//P1 = 0xFF;

flagCount = 0;

CountNum = 0;

ShowNumber();

}

}


void KeyDriver(void)

{

unsigned char i,j;

static unsigned char KeyBack[4][4] = 

{

{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}

};

static unsigned long pdata KeyTimer[4][4] = 

{

{1000,1000,1000,1000},{1000,1000,1000,1000},

{1000,1000,1000,1000},{1000,1000,1000,1000}

};


for(i=0; i<4; i++)

{

for(j=0; j<4; j++)

{

if(KeyStay[i][j] != KeyBack[i][j])

{

if(1 == KeyBack[i][j])

{

P1 = 0x00;

KeyAction(KeyCode[i][j]);

}

else

{

P1 = 0xFF;

}

KeyBack[i][j] = KeyStay[i][j];

}


if(KeyTime[i][j] > 0)

{

if(KeyTime[i][j] >= KeyTimer[i][j])

{

KeyTimer[i][j] += 200;

if((KeyCode[i][j] == 0x26) || (KeyCode[i][j] == 0x28))

{

enBuzz = 1;

KeyAction(KeyCode[i][j]);

enBuzz = 0;

}

}

}

else

{

KeyTimer[i][j] = 1000;

}

}

}

}


void LedScan(void)

{

static unsigned char i = 0;


P0 = 0x00;

DULA = 1;

DULA = 0;

P0 = WETable[i];

WELA = 1;

WELA = 0;

P0 = LedBuff[i];

DULA = 1;

DULA = 0;


i++;

if(i>=8)

{

i = 0;

}

}


void KeyScan(void)

{

unsigned char i;

static unsigned char KeyOut = 0;

static unsigned char KeyBuff[4][4] = 

{

{0xF,0xF,0xF,0xF},{0xF,0xF,0xF,0xF},

{0xF,0xF,0xF,0xF},{0xF,0xF,0xF,0xF}

};


KeyBuff[KeyOut][0] = (KeyBuff[KeyOut][0] << 1) | KEYIN1;

KeyBuff[KeyOut][1] = (KeyBuff[KeyOut][1] << 1) | KEYIN2;

KeyBuff[KeyOut][2] = (KeyBuff[KeyOut][2] << 1) | KEYIN3;

KeyBuff[KeyOut][3] = (KeyBuff[KeyOut][3] << 1) | KEYIN4;


for(i=0; i<4; i++)

{

if(0x00 == (KeyBuff[KeyOut][i] & 0x0F))

{

KeyStay[KeyOut][i] = 0;

KeyTime[KeyOut][i] += 4;

}

else if(0x0F == (KeyBuff[KeyOut][i] & 0x0F))

{

KeyStay[KeyOut][i] = 1;

KeyTime[KeyOut][i] = 0;

}

}


KeyOut++;

KeyOut &= 0x3;


switch(KeyOut)

{

case 0 : KEYOUT4 = 1; KEYOUT1 = 0; break;

case 1 : KEYOUT1 = 1; KEYOUT2 = 0; break;

case 2 : KEYOUT2 = 1; KEYOUT3 = 0; break;

case 3 : KEYOUT3 = 1; KEYOUT4 = 0; break;

default : break;

}

}


void BuzzScan(void)

{

if(enBuzz)

{

BUZZER = ~BUZZER;

}

else

{

BUZZER = 1;

}

}


void InterruptTimer0(void) interrupt 1

{

static unsigned int tmr1s = 0;


TH0 = T0RH;

TL0 = T0RL;


LedScan();

KeyScan();

BuzzScan();


if(flagCount)

{

tmr1s++;

if(tmr1s>=1000)

{

tmr1s = 0;

flag1s = 1;

}

}

else

{

tmr1s = 0;

}

}

推荐阅读

史海拾趣

西博臣(CYBERSEN)公司的发展小趣事

广州西博臣科技有限公司(简称西博臣)成立于2001年,从创立之初就专注于湿度传感器的研发和生产。公司是国内最早从事高分子湿度传感器研发并进行规模化生产的厂家之一,凭借其独特的技术实力和对行业的深刻理解,逐渐在市场中崭露头角。

ERA Transformers公司的发展小趣事

随着市场需求的不断增长,ERA Transformers公司面临着扩大生产规模的挑战。为了满足客户需求并保持市场竞争力,公司决定投资建设一个新的生产基地。经过精心规划和筹备,新的生产基地顺利建成并投入使用。这不仅大大提高了公司的生产能力,还进一步提升了产品质量和生产效率。新基地的建成标志着ERA Transformers公司在电子行业中的地位更加稳固。

EPCOS/TDK公司的发展小趣事

作为全球领先的电子元器件制造商之一,EPCOS在通信领域取得了显著的突破。其电容器、电感器等产品在通信系统中发挥着关键作用,为各种通信设备提供了稳定的电源和信号处理方案。EPCOS不断投入研发资源,致力于开发适应新一代通信技术需求的高性能电子元器件。这些创新产品不仅提高了通信系统的性能和可靠性,也推动了整个通信行业的进步。

以上是关于EPCOS/TDK公司发展起来的5个相关故事。这些故事不仅展示了公司在技术创新、市场拓展等方面的成就,也体现了其在电子行业中的重要地位和影响力。

EPIC公司的发展小趣事

1998年,Epic Games发布了一款名为“虚幻”的3D第一人称射击游戏。这款游戏不仅游戏内容新颖,更引人注目的是它背后完全自主开发的3D游戏引擎。这个引擎后来被称为“虚幻引擎”,并成为了Epic Games的核心技术之一。随着游戏的成功,虚幻引擎也逐渐受到了业界的关注。许多其他游戏开发商开始采用这款引擎来开发自己的游戏,从而使得Epic Games在游戏引擎领域取得了显著的商业成功。

芯茂微电子公司的发展小趣事

随着市场竞争的日益激烈和技术创新的加速推进,芯茂微电子也面临着越来越多的挑战和机遇。面对这些挑战,公司始终坚持不懈地推进技术创新和产品研发,不断提升自身的核心竞争力和市场地位。同时,公司也积极寻求新的市场机遇和合作伙伴,不断拓展业务领域和市场空间。正是这种对挑战和机遇的积极应对和坚持不懈的努力,让芯茂微电子在电子行业中不断发展壮大。

Furukawa Electric Co Ltd公司的发展小趣事

芯茂微电子始终坚持以创新驱动发展,不断投入研发资源,推动技术创新和产品升级。同时,公司积极寻求与国内外知名企业和研究机构的合作,共同开展技术研发和市场拓展。通过与合作伙伴的紧密合作,芯茂微电子在集成电路设计、制造工艺、封装测试等方面取得了重要进展,进一步提升了公司的核心竞争力和市场地位。

问答坊 | AI 解惑

意外的惊喜!考研+就业!

考研就业专刊 考研流程+考研经验+人才招聘会+薪资洽谈+面试攻略+健康贴士+时间表…… 妹妹大餐都在这里面! 尤其适合自动化相关专业,特别版!一路陪伴从准备到结束!!! 为了节省大家的芯币 本人最新编辑了一下 把所有的东西打 ...…

查看全部问答>

request_dma()函数中第一个参数是怎么得到?

int request_dma(unsigned int dmanr, const char * device_id) 参数dmanr是从0~3、5~7里面的随便挑一个就行了么? 还是需要怎么做来得到啊…

查看全部问答>

大家给我出出主意

几个问题 1.嵌入式的前景不错嘛?酬薪怎样? 2.嵌入式工程师没有35岁瓶颈吗? 3.我是个学生,想问下培训费用大概多少钱? 4.对于现在的情况,大学生是不是很需要培训,培训的目的和作用是什么? 我是个新手,希望大家好好指导我下。谢谢。大二 ...…

查看全部问答>

ARM7中断疑惑?请哪个大虾帮忙看看。小弟不胜感激!

在ARM7下写了一个定时器中断程序。下面代码是进入IRQ中断后然后为了可重入中断,就切换到系统模式下。但是在切换的时候出现问题?如何直接MSR CPSR_C,#SYS32_MODE(1)就出现SIGBUS错误。切换代码改成MSR CPSR_C,#(SYS32_MODE|NO_INT)(2)就行了 ...…

查看全部问答>

Tornado2.2(arm)的USB2.0问题

我的Tornado2.2里为什么没有EHCI和EHCI Init组件 但是别人好像有这个组件啊,是不是序列号的问题? 而且,我在pudn上下了安装,貌似就是t22-cp1-arm.tar那个东西,但是里面还是没有啊?请问高手怎么回事情啊? http://www.pudn.com/downloads148 ...…

查看全部问答>

WinCE5.0的模拟器

在VS2005下怎么没有wince5.0的模拟器,到哪有的下载? 注意: 是\"wince5.0的模拟器\", 不是\"pocket pc的模拟器\",也不是\"smart phone的模拟器\"…

查看全部问答>

uCOS-II内部机制

附件中的文件非常简洁的讲述了uCOS-II的内部机制,是不错的学习OS的资料…

查看全部问答>

EZ430——Rf2500学习小感

最近刚刚入手430,原来只接触过51,不过由于430的程序大都用C写得,所以学习起来还是比较方便的。前几天一直在学习uart的输出,具体做了一个有关uart的小程序,刚开始有例程可以看,不过不知道问什么,所有的例程都无法用串口助手加以显示输出,当 ...…

查看全部问答>

中断嵌套学习一些心得

中断嵌套,优先级430总中断的控制位是状态寄存器内的GIE位(该位在SR寄存器内),该位在复位状态下,所有的可屏蔽中断都不会发生响应。可屏蔽中断又分为单中断源和多中断源的。单中断源的一般响应了中断服务程序中断标志位就自动清零,而多中断源的 ...…

查看全部问答>

求助:可以给单片机外接晶体振荡器求出该晶振频率吗?

已知一个石英晶体的谐振频率为5MHz左右(大概偏差几十Hz),想要较为准确测试出其谐振频率,可以把它作为一个晶振,接到单片机的两个晶振输入端,然后算出这个石英晶体的谐振频率么?如果可以的话,具体怎么接怎么求算?精度如何?对应的程序怎么写 ...…

查看全部问答>