历史上的今天
今天是: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; } }
上一篇:51单片机-串口-串口发送显示
下一篇:51单片机-交通灯-红绿灯
史海拾趣
|
考研就业专刊 考研流程+考研经验+人才招聘会+薪资洽谈+面试攻略+健康贴士+时间表…… 妹妹大餐都在这里面! 尤其适合自动化相关专业,特别版!一路陪伴从准备到结束!!! 为了节省大家的芯币 本人最新编辑了一下 把所有的东西打 ...… 查看全部问答> |
|
int request_dma(unsigned int dmanr, const char * device_id) 参数dmanr是从0~3、5~7里面的随便挑一个就行了么? 还是需要怎么做来得到啊… 查看全部问答> |
|
在ARM7下写了一个定时器中断程序。下面代码是进入IRQ中断后然后为了可重入中断,就切换到系统模式下。但是在切换的时候出现问题?如何直接MSR CPSR_C,#SYS32_MODE(1)就出现SIGBUS错误。切换代码改成MSR CPSR_C,#(SYS32_MODE|NO_INT)(2)就行了 ...… 查看全部问答> |
|
我的Tornado2.2里为什么没有EHCI和EHCI Init组件 但是别人好像有这个组件啊,是不是序列号的问题? 而且,我在pudn上下了安装,貌似就是t22-cp1-arm.tar那个东西,但是里面还是没有啊?请问高手怎么回事情啊? http://www.pudn.com/downloads148 ...… 查看全部问答> |
|
在VS2005下怎么没有wince5.0的模拟器,到哪有的下载? 注意: 是\"wince5.0的模拟器\", 不是\"pocket pc的模拟器\",也不是\"smart phone的模拟器\"… 查看全部问答> |
|
最近刚刚入手430,原来只接触过51,不过由于430的程序大都用C写得,所以学习起来还是比较方便的。前几天一直在学习uart的输出,具体做了一个有关uart的小程序,刚开始有例程可以看,不过不知道问什么,所有的例程都无法用串口助手加以显示输出,当 ...… 查看全部问答> |
|
中断嵌套,优先级430总中断的控制位是状态寄存器内的GIE位(该位在SR寄存器内),该位在复位状态下,所有的可屏蔽中断都不会发生响应。可屏蔽中断又分为单中断源和多中断源的。单中断源的一般响应了中断服务程序中断标志位就自动清零,而多中断源的 ...… 查看全部问答> |
|
已知一个石英晶体的谐振频率为5MHz左右(大概偏差几十Hz),想要较为准确测试出其谐振频率,可以把它作为一个晶振,接到单片机的两个晶振输入端,然后算出这个石英晶体的谐振频率么?如果可以的话,具体怎么接怎么求算?精度如何?对应的程序怎么写 ...… 查看全部问答> |




