蓝桥杯之单片机设计与开发(9)——独立按键实现计时器
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯之单片机设计与开发(9)——独立按键实现计时器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
功能:
?? ?1.按下S6,清零并停止計時
?? ?2.按下S5,暫停計時
?? ?3.按下S4,開始計時
計時時,LED為流水燈狀態,計時顯示格式為 分-秒-毫秒
main.c
/******************************************************************************* * 文件名:main.c * 描 述:1.按下S6,停止計時并清零2.按下S5,暫停計時3.按下S4,開始/繼續計時 * 作 者:小默haa * 版本號:v1.0.0 * 日 期: 2019年1月30日 * 備 注:獨立按鍵控制LED流水燈 * *******************************************************************************/ #include <STC15F2K60S2.H> #include "sys.h"u8 sec = 0, min = 0; //分 秒 u16 point = 0; //毫秒 u8 Led_dat; //led顯示狀態 u8 KeySta[4] = {1,1,1,1}; //當前按鍵狀態 u8 Key_backup[4] = {1,1,1,1}; //按鍵狀態備份,保存前一次的按鍵值 u8 flag = 0;void main(void) {u8 i;All_Init();Time0_Init();Time1_Init();Led_dat = 0x7f;EA = 1;while(1){for(i = 0;i < 4;i++){if(Key_backup[i] != KeySta[i]){if(Key_backup[i] == 0) //說明按鍵時彈起狀態Key_Drive(i);Key_backup[i] = KeySta[i];}}Show_Num();} }sys.c
#include "sys.h"/******************************************************************************* * 函數名 :All_Init * 輸入值 :無 * 返回值 :無 * 作者 :小默haa * 時間 :2019年1月15日 * 功能描述:外設初始化 * 備注 :關閉所有外設 *******************************************************************************/ void All_Init(void) {P2 = (P2 & 0x1f) | 0x80; //打開Y4C(LED)P0 = 0xff; //關閉LEDP2 = (P2 & 0x1f) | 0xe0; //打開Y7C(數碼管)P0 = 0xff; //關閉數碼管P2 = (P2 & 0x1f) | 0xa0; //打開Y5CP0 = 0x00; //關閉蜂鳴器、繼電器P2 = P2 & 0x1f; //關閉Y4C,Y5C,Y6C,Y7C }//定時器0初始化 void Time0_Init(void) {AUXR |= 0x80; //定時器時鐘1T模式TMOD &= 0xF0; //設置定時器模式TL0 = 0x9a; //設置定時初值2msTH0 = 0xa9; //設置定時初值2msTF0 = 0; //清除TF0標志ET0 = 1; //允許定時器0中斷TR0 = 1; //定時器0開始計時 }/******************************************************************************* * 函數名 :Timer0 * 輸入值 :無 * 返回值 :無 * 作者 :小默haa * 時間 :2019年1月30日 * 功能描述:定時器0中斷服務程序 * 備注 :2ms執行一次按鍵掃描和數碼管顯示 *******************************************************************************/ void Timer0(void) interrupt 1 {Key_Scan();if (flag == 1)TR1 = 1;else if (flag == 2)TR1 = 0;else if (flag == 3){TR1 = 0;min = 0;sec = 0;point = 0;}Nixie_Scan(); }//定時器1初始化 void Time1_Init(void) {AUXR |= 0x40; //定時器時鐘1T模式TMOD &= 0x0F; //設置定時器模式TL1 = 0x9a; //設置定時初值2msTH1 = 0xa9; //設置定時初值2msTF1 = 0; //清除TF0標志ET1 = 1; //允許定時器0中斷 }/******************************************************************************* * 函數名 :Timer1 * 輸入值 :無 * 返回值 :無 * 作者 :小默haa * 時間 :2019年1月30日 * 功能描述:定時器1中斷服務程序 * 備注 :實現計時功能 *******************************************************************************/ void Timer1(void) interrupt 3 {static u16 t0 = 0;t0 ++;if(t0 % 5 == 0) //10ms{point ++;if(point == 100){sec ++;if(sec == 60){min ++;if(min == 60)min = 0;sec = 0;}point = 0;}if(t0 == 50) //100ms{Led_dat = _crol_(Led_dat, 1);Led_illume(Led_dat); //點亮LEDt0 = 0;}Show_Num();} }sys.h
#ifndef _SYS_H_ #define _SYS_H_typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32;#include <stc15f2k60s2.h> #include <intrins.h>//全局變量定義 #define FOSC 11059200L //系統時鐘//外部變量 extern u8 sec, min; extern u8 Led_dat, flag; extern u8 KeySta[4],Key_backup[4]; extern u16 point;//sys.c void All_Init(void); void Time0_Init(void); void Time1_Init(void);//led.c void Led_illume(u8 dat);//key.c sbit s4 = P3^3; sbit s5 = P3^2; sbit s6 = P3^1; sbit s7 = P3^0; void Key_Scan(void); void Key_Drive(u8 key);//drive.c sbit Relay = P0^4; sbit Beep = P0^6; void Drive_ON(void); void Drive_OFF(void);//Nixie_tube.c void Nixie_Scan(void); void Nixie_Show(void); void Show_Num(void);#endifkey.c
#include "sys.h"/******************************************************************************* * 函數名 :Key_Scan * 輸入值 :無 * 返回值 :無 * 作者 :小默haa * 時間 :2019年1月20日 * 功能描述:獨立按鍵掃描 * 備注 :檢測按鍵狀態(按下/松開) *******************************************************************************/ void Key_Scan(void) {u16 i;static u8 keybuff[] = {0xff,0xff,0xff,0xff};keybuff[0] = (keybuff[0] << 1) | s4;keybuff[1] = (keybuff[1] << 1) | s5;keybuff[2] = (keybuff[2] << 1) | s6;keybuff[3] = (keybuff[3] << 1) | s7;for(i = 0;i < 4;i ++){if(keybuff[i] == 0xff) //連續掃描8次都是1,16ms內都是彈起狀態,按鍵已松開{KeySta[i] = 1;}else if(keybuff[i] == 0x00) //連續掃描8次都是0,16ms內都是按下狀態,按鍵已按下{KeySta[i] = 0;}else //其他狀態鍵值不穩定,不作處理{}} }/******************************************************************************* * 函數名 :Key_Drive * 輸入值 :有活動的按鍵 key * 返回值 :無 * 作者 :小默haa * 時間 :2019年1月30日 * 功能描述:獨立按鍵驅動 * 備注 :根據獨立按鍵轉態,執行相應操作 *******************************************************************************/ void Key_Drive(u8 key) {switch(key){case 0: flag = 1; break;case 1: flag = 2; break;case 2: flag = 3; break; // case 3: flag = 3; break;} }led.c
#include "sys.h"/******************************************************************************* * 函數名 :Led_illume * 輸入值 :led數據 * 返回值 :無 * 作者 :小默haa * 時間 :2019年1月20日 * 功能描述:LED點亮程序 * 備注 :根據傳輸進來的數據值,點亮相應LED *******************************************************************************/ void Led_illume(u8 dat) {P2 = (P2 & 0x1f) | 0x80; //打開Y4C(LED)P0 = dat; //關閉LEDP2 = P2 & 0x1f; }Nixie_tube.c
/******************************************************************************* * 文件名:Nixie_tube.c * 描 述:數碼管相關程序 * 作 者:小默haa * 版本號:v1.0 * 日 期: 2019年1月28日 * 備 注:與數碼管相關的所有函數 * *******************************************************************************/ #include "sys.h"u8 code Nixie[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共陽數碼管碼字 u8 NixieBuff[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //數碼管顯示緩沖區,初值0xff確保啟動時都不亮 u8 code Symbol[] = {0xff,0xbf}; //全滅,-u8 smg1 = 0, smg2 = 0, smg3 = 0, smg4 = 0, smg5 = 0, smg6 = 0, smg7 = 0, smg8 = 0;/******************************************************************************* * 函數名 :Nixie_Scan * 輸入值 :無 * 返回值 :無 * 作者 :小默haa * 時間 :2019年1月29日 * 功能描述:數碼管掃描函數 * 備注 :根據數碼管顯示數組,點亮數碼管 *******************************************************************************/ void Nixie_Scan(void) {static u8 index = 0;P2 = (P2 & 0x1f) | 0xe0; //數碼管消隱P0 =0xff;P2 = (P2 & 0x1f) | 0xc0; //數碼管片選P0 = 0x01 << index;P2 = (P2 & 0x1f) | 0xe0; //數碼管段選P0 = NixieBuff[index];P2 &= 0x1f;index ++;index &= 0x07; }/******************************************************************************* * 函數名 :Nixie_Show * 輸入值 :無 * 返回值 :無 * 作者 :小默haa * 時間 :2019年1月29日 * 功能描述:數碼管顯示函數 * 備注 :根據每一位的數碼管需要顯示內容,選擇相應碼子存放進數碼管顯示數組 *******************************************************************************/ void Nixie_Show(void) {NixieBuff[3] = Nixie[smg1];NixieBuff[2] = Nixie[smg2];NixieBuff[1] = Symbol[smg3];NixieBuff[0] = Nixie[smg4];NixieBuff[7] = Nixie[smg5];NixieBuff[6] = Symbol[smg6];NixieBuff[5] = Nixie[smg7];NixieBuff[4] = Nixie[smg8]; }/******************************************************************************* * 函數名 :Show_Num * 輸入值 :無 * 返回值 :無 * 作者 :小默haa * 時間 :2019年1月29日 * 功能描述:數值顯示處理 * 備注 :將數值每一位分離,存放進每一位數碼管顯示指示變量smg中 *******************************************************************************/ void Show_Num(void) {smg8 = point % 10;smg7 = point / 10;smg6 = 1;smg5 = sec % 10;smg4 = sec / 10;smg3 = 1;smg2 = min % 10;smg1 = min / 10;Nixie_Show(); }?
總結
以上是生活随笔為你收集整理的蓝桥杯之单片机设计与开发(9)——独立按键实现计时器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【虹科】如何逐跳识别网络问题
- 下一篇: 模仿百度搜索 :上下翻动、带有时间