|
手握方法.jpg (45.72 KB, 下載次數: 189)
下載附件
2017-6-28 01:44 上傳
基于單片機的搖搖棒 狀態遷移圖
013330c7772m0xmu77p9n2.png (47.89 KB, 下載次數: 192)
下載附件
2017-6-28 01:45 上傳
013401ojjstlswyyjzy1yu.png (26.94 KB, 下載次數: 214)
下載附件
2017-6-28 01:45 上傳
原理圖:
013449dffc5fcv5rr1lfcz.png (74.58 KB, 下載次數: 198)
下載附件
2017-6-28 01:45 上傳
單片機源程序如下:
- //--------------------------------------------------------
- // 項目:搖搖棒
- // 模塊:主程序
- // 說明:
- // 設計:張俊(版權所有,引用者請保留原作者姓名)
- //--------------------------------------------------------
- /*
- 版本說明:
- 2006-08-07 v01.01
- 測試版本
- ACLK = TACLK = 32768Hz, MCLK = SMCLK = default DCO
- 每2S中斷一次,對P1.0~P1.6口輸出取反
- 2006-08-07 v01.02
- 測試版本
- 改變計時器計數模式
- 2006-08-08 v01.03
- 測試版本
- 2006-08-11 v01.04
- 測試版本
- 已經可以顯示時間了,并且時間也可以運行了
- 但是時間還不可調節
- 2006-08-12 v01.05
- 增加按鍵和蜂鳴器功能(按鍵與LED口復用IO口)
- 2006-08-14 v01.06
- 增加工作模式,不同模式下顯示和按鍵內容不同
-
- 2006-08-16 v01.07
- 修改部分BUG
- 2006-08-20 v01.08
- 1.完成整點報時功能,每次整點鳴叫2聲
- 2.取消分鐘提示功能(因為程序空間不夠了)
- 3.完善秒表功能
- 4.增加一個延時自動退出功能,60秒內未按鍵,也未觸發慣性開關,則返回模式0
- 5.當無鍵計時>60秒,則禁止按鍵喚醒,必須通過慣性開關喚醒
- 經過這樣改動后,待機電流由16UA下降到了6UA.
- */
- //--------------------------------------------------------
- //插入文件包
- //--------------------------------------------------------
- #include
- //--------------------------------------------------------
- //--------------------------------------------------------
- //重新命名數據類型
- //--------------------------------------------------------
- typedef unsigned char tU08; //unsigned 8 bit definition
- typedef unsigned char tU8; //unsigned 8 bit definition
- typedef unsigned int tU16; //unsigned 16 bit definition
- typedef unsigned long tU32; //unsigned 32 bit definition
- typedef signed char tS08; //signed 8 bit definition
- typedef signed char tS8; //signed 8 bit definition
- typedef signed int tS16; //signed 16 bit definition
- typedef signed long tS32; //signed 32 bit definition
- typedef float tF32;
- typedef double tF64;
- //--------------------------------------------------------
- //顯示段碼表(A類代碼)
- //--------------------------------------------------------
- const tU08 LCD_TAB_A[]=
- { //編號 字符
- 0x3E, 0x41, 0x41, 0x41, 0x3E, //0 0
- 0x00, 0x42, 0x7F, 0x40, 0x00, //1 1
- 0x42, 0x61, 0x51, 0x49, 0x46, //2 2
- 0x21, 0x41, 0x45, 0x4B, 0x31, //3 3
- 0x18, 0x14, 0x12, 0x7F, 0x10, //4 4
- 0x27, 0x45, 0x45, 0x45, 0x39, //5 5
- 0x3C, 0x4A, 0x49, 0x49, 0x30, //6 6
- 0x01, 0x01, 0x71, 0x0D, 0x03, //7 7
- 0x36, 0x49, 0x49, 0x49, 0x36, //8 8
- 0x06, 0x49, 0x49, 0x29, 0x1E, //9 9
- 0x7C, 0x12, 0x11, 0x12, 0x7C, //10 A
- 0x7F, 0x49, 0x49, 0x49, 0x36, //11 B
- 0x3E, 0x41, 0x41, 0x41, 0x22, //12 C
- 0x7F, 0x41, 0x41, 0x22, 0x1C, //13 D
- 0x7F, 0x49, 0x49, 0x49, 0x41, //14 E
- 0x7F, 0x09, 0x09, 0x09, 0x01, //15 F
- 0x3E, 0x41, 0x49, 0x49, 0x3A, //16 G
- 0x7F, 0x08, 0x08, 0x08, 0x7F, //17 H
- 0x00, 0x41, 0x7F, 0x41, 0x00, //18 I
- 0x00, 0x21, 0x41, 0x3F, 0x01, //19 J
- 0x7F, 0x08, 0x14, 0x22, 0x41, //20 K
- 0x7F, 0x40, 0x40, 0x40, 0x40, //21 L
- 0x7F, 0x02, 0x0C, 0x02, 0x7F, //22 M
- 0x7F, 0x04, 0x08, 0x10, 0x7F, //23 N
- 0x3E, 0x41, 0x41, 0x41, 0x3E, //24 O
- 0x7F, 0x09, 0x09, 0x09, 0x06, //25 P
- 0x3E, 0x41, 0x51, 0x21, 0x5E, //26 Q
- 0x7F, 0x09, 0x19, 0x29, 0x46, //27 R
- 0x26, 0x49, 0x49, 0x49, 0x32, //28 S
- 0x01, 0x01, 0x7F, 0x01, 0x01, //29 T
- 0x3F, 0x40, 0x40, 0x40, 0x3F, //30 U
- 0x1F, 0x20, 0x40, 0x20, 0x1F, //31 V
- 0x3F, 0x40, 0x30, 0x40, 0x3F, //32 W
- 0x63, 0x14, 0x08, 0x14, 0x63, //33 X
- 0x03, 0x04, 0x78, 0x04, 0x03, //34 Y
- 0x61, 0x51, 0x49, 0x45, 0x43, //35 Z
- 0x00, 0x00, 0x00, 0x00, 0x00, //36 空格
- 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, //37 全亮▉
- 0x00, 0x00, 0x36, 0x00, 0x00, //38 冒號:
- 0x00, 0x08, 0x1C, 0x08, 0x00, //39 點.
- 0x08, 0x08, 0x08, 0x08, 0x08 //40 中劃線-
- //0x01, 0x3C, 0x42, 0x42, 0x24, //39 攝氏度符號C
- //0x40, 0x40, 0x40, 0x40, 0x40, //40 下劃線_
- //0x08, 0x08, 0x3E, 0x08, 0x08, //41 加號+
- //0x22, 0x14, 0x08, 0x14, 0x22, //43 乘號*
- //0x08, 0x08, 0x2A, 0x08, 0x08, //44 除號/
- //0x14, 0x14, 0x14, 0x14, 0x14, //45 等號=
- };
- //顯緩區
- #define disp_queue_sum 8 //待顯示字符串隊列長度
- tU08 disp_queue[disp_queue_sum]; //待顯示字符串隊列
- //時間系統
- //tU08 TIME_Y; //當前時間"年"(00~99)
- //tU08 TIME_MO; //當前時間"月"(1~12)
- //tU08 TIME_D; //當前時間"日"(1~31)
- //tU08 TIME_W; //當前時間"星期幾"(1~7)
- tU08 TIME_H; //當前時間"時"(0~23)
- tU08 TIME_M; //當前時間"分"(0~59)
- tU08 TIME_S; //當前時間"秒"(0~59)
- //無鍵計時器
- tU08 NOKEY_JSQ; //無鍵計時器(每秒+1)
- //秒表系統
- tU08 RUN_H; //秒表時間"時"(0~99)
- tU08 RUN_M; //秒表時間"分"(0~59)
- tU08 RUN_S; //秒表時間"秒"(0~59)
- tU08 RUN_MD; //秒表狀態(0=停止,1=運行)
- //定時系統
- tU08 TIMER_H; //定時時間"時"(0~23)
- tU08 TIMER_M; //定時時間"分"(0~59)
- tU08 SP_M; //蜂鳴器鳴叫時間設置值(0~99分)(說明:0=定時關閉)
- tU08 SP_RUN; //蜂鳴器鳴叫時間運行值(0~99分)(說明:0=定時關閉)
- //工作模式
- tU08 WK_MODE; //工作模式
- //溫度系統
- //tU08 TEMP; //當前溫度
- //附加功能
- tU08 FUN_ZDBS; //整點報時(0=禁止,1=使能)
- //tU08 FUN_FZTS; //分鐘提示(0=禁止,1=使能)
- /*
- //--------------------------------------------------------
- //延時程序
- //--------------------------------------------------------
- void delay()
- {
- unsigned short i;
- for(i=500; i>0; i--)
- {
- asm ("nop");
- }
- }
- */
- //--------------------------------------------------------
- //延時若干時間
- //入口: 延時時間=i*基本時間
- //--------------------------------------------------------
- void delay_n(tU16 i)
- {
- for ( ; i!=0 ; i-- )
- {
- asm ("nop");
- }
- }
- /*
- //--------------------------------------------------------
- //顯示當前時間年
- //--------------------------------------------------------
- void display_TIME_Y()
- {
- disp_queue[0] = TIME_Y / 10; //年
- disp_queue[1] = TIME_Y % 10;
- }
- //--------------------------------------------------------
- //顯示當前時間月
- //--------------------------------------------------------
- void display_TIME_MO()
- {
- disp_queue[3] = TIME_MO / 10; //月
- disp_queue[4] = TIME_MO % 10;
- }
- //--------------------------------------------------------
- //顯示當前時間日
- //--------------------------------------------------------
- void display_TIME_D()
- {
- disp_queue[6] = TIME_D / 10; //日
- disp_queue[7] = TIME_D % 10;
- }
- */
-
- //--------------------------------------------------------
- //顯示當前時間時
- //--------------------------------------------------------
- void display_TIME_H()
- {
- disp_queue[0] = TIME_H / 10; //時
- disp_queue[1] = TIME_H % 10;
- }
- //--------------------------------------------------------
- //顯示當前時間分
- //--------------------------------------------------------
- void display_TIME_M()
- {
- disp_queue[3] = TIME_M / 10; //分
- disp_queue[4] = TIME_M % 10;
- }
- //--------------------------------------------------------
- //顯示當前時間秒
- //--------------------------------------------------------
- void display_TIME_S()
- {
- disp_queue[6] = TIME_S / 10; //秒
- disp_queue[7] = TIME_S % 10;
- }
- //--------------------------------------------------------
- //顯示鬧鐘TM
- //--------------------------------------------------------
- void display_TM()
- {
- disp_queue[0] = 29; //"T"
- disp_queue[1] = 22; //"M"
- }
- //--------------------------------------------------------
- //顯示鬧鐘時
- //--------------------------------------------------------
- void display_TIMER_H()
- {
- disp_queue[3] = TIMER_H / 10; //時
- disp_queue[4] = TIMER_H % 10;
- }
- //--------------------------------------------------------
- //顯示鬧鐘分
- //--------------------------------------------------------
- void display_TIMER_M()
- {
- disp_queue[6] = TIMER_M / 10; //分
- disp_queue[7] = TIMER_M % 10;
- }
- //--------------------------------------------------------
- //顯示鬧鐘"▉▉"
- //--------------------------------------------------------
- void display_ALL1()
- {
- disp_queue[0] = 37; //"▉"
- disp_queue[1] = 37; //"▉"
- }
- //--------------------------------------------------------
- //顯示鬧鐘"▉▉"
- //--------------------------------------------------------
- void display_ALL2()
- {
- disp_queue[3] = 37; //"▉"
- disp_queue[4] = 37; //"▉"
- }
- //--------------------------------------------------------
- //顯示鬧鐘"▉▉"
- //--------------------------------------------------------
- void display_ALL3()
- {
- disp_queue[6] = 37; //"▉"
- disp_queue[7] = 37; //"▉"
- }
- //--------------------------------------------------------
- //顯示分隔符號": :"
- //--------------------------------------------------------
- void display_COL()
- {
- disp_queue[2] = 38; //":"
- disp_queue[5] = 38; //":"
- }
- //--------------------------------------------------------
- //顯示分隔符號"- -"
- //--------------------------------------------------------
- void display_LINE()
- {
- disp_queue[2] = 40; //"-"
- disp_queue[5] = 40; //"-"
- }
- //--------------------------------------------------------
- //顯示"SET -O"
- //--------------------------------------------------------
- void display_SET()
- {
- disp_queue[0] = 28; //"S"
- disp_queue[1] = 14; //"E"
- disp_queue[2] = 29; //"T"
- disp_queue[4] = 40; //"-"
- disp_queue[5] = 24; //"O"
- }
- //--------------------------------------------------------
- //刷新待顯示字符串
- //出口: disp_queue[]=待顯示字符串隊列
- //--------------------------------------------------------
- void new_display()
- {
- //====根據工作模式判斷
- switch( WK_MODE ) //根據工作模式判斷
- {
- //case 0: //顯示當前時間
- // display_TIME_H(); //時
- // display_TIME_M(); //分
- // display_TIME_S(); //秒
- // display_COL(); //": :"
- // break;
- /*
- case 1: //顯示當前日期
- display_TIME_Y(); //年
- display_TIME_MO(); //月
- display_TIME_D(); //日
- display_LINE(); //"- -"
- break;
- case 2: //顯示星期幾
- disp_queue[0] = 36; //" "
- disp_queue[1] = 32; //"W"
- disp_queue[2] = 14; //"E"
- disp_queue[3] = 14; //"E"
- disp_queue[4] = 20; //"K"
- disp_queue[5] = 36; //" "
- disp_queue[6] = TIME_W % 10; //星期幾
- disp_queue[7] = 36; //" "
- break;
- case 3: //顯示溫度
- disp_queue[0] = 29; //"T"
- disp_queue[1] = 14; //"E"
- disp_queue[2] = 22; //"M"
- disp_queue[3] = 25; //"P"
- disp_queue[4] = 36; //" "
- disp_queue[5] = TEMP / 10; //當前溫度
- disp_queue[6] = TEMP % 10;
- disp_queue[7] = 39; //"攝氏度符號C"
- break;
- */
- case 4: //顯示鬧鐘時間
- display_TM(); //"TM"
- disp_queue[2] = 36; //" "
- display_TIMER_H(); //"定時時間"時""
- disp_queue[5] = 38; //":"
- display_TIMER_M(); //定時時間"分"
- break;
- case 5: //顯示秒表時間
- disp_queue[0] = RUN_H / 10; //時
- disp_queue[1] = RUN_H % 10;
- disp_queue[2] = 39; //"."
- disp_queue[3] = RUN_M / 10; //分
- disp_queue[4] = RUN_M % 10;
- disp_queue[5] = 39; //"."
- disp_queue[6] = RUN_S / 10; //秒
- disp_queue[7] = RUN_S % 10;
- break;
- case 6: //顯示作者信息"zhangjun"
- disp_queue[0] = 35; //"Z"
- disp_queue[1] = 17; //"H"
- disp_queue[2] = 10; //"A"
- disp_queue[3] = 23; //"N"
- disp_queue[4] = 16; //"G"
- disp_queue[5] = 19; //"J"
- disp_queue[6] = 30; //"U"
- disp_queue[7] = 23; //"N"
- break;
- case 7: //顯示當前時間"時"
- display_TIME_H(); //時
- display_ALL2(); //"▉▉"
- display_ALL3(); //"▉▉"
- display_COL(); //": :"
- break;
- case 8: //顯示當前時間"分""秒"
- display_ALL1(); //"▉▉"
- display_TIME_M(); //分
- display_TIME_S(); //秒
- display_COL(); //": :"
- break;
- /*
- case 9: //顯示當前時間"年"
- display_TIME_Y(); //年
- display_ALL2(); //"▉▉"
- display_ALL3(); //"▉▉"
- display_LINE(); //"- -"
- break;
- case 10: //顯示當前時間"月"
- display_ALL1(); //"▉▉"
- display_TIME_MO(); //月
- display_ALL3(); //"▉▉"
- display_LINE(); //"- -"
- break;
- case 11: //顯示當前時間"日"
- display_ALL1(); //"▉▉"
- display_ALL2(); //"▉▉"
- display_TIME_D(); //日
- display_LINE(); //"- -"
- break;
- */
- case 12: //顯示定時時間"時"
- display_TM(); //"TM"
- disp_queue[2] = 36; //" "
- display_TIMER_H(); //"定時時間"時""
- disp_queue[5] = 38; //":"
- display_ALL3(); //"▉▉"
- break;
- case 13: //顯示定時時間"分"
- display_TM(); //"TM"
- disp_queue[2] = 36; //" "
- display_ALL2(); //"▉▉"
- disp_queue[5] = 38; //":"
- display_TIMER_M(); //定時時間"分"
- break;
- case 14: //顯示蜂鳴器鳴叫時間
- display_TM(); //"TM"
- disp_queue[2] = 36; //" "
- disp_queue[3] = 28; //"S"
- disp_queue[4] = 25; //"P"
- disp_queue[5] = 38; //":"
- disp_queue[6] = SP_M / 10; //蜂鳴器鳴叫時間
- disp_queue[7] = SP_M % 10;
- break;
- case 15: //顯示整點報時功能
- display_SET(); //"SET -O"
- disp_queue[3] = 1; //"1"
- if ( FUN_ZDBS != 0 )
- {
- disp_queue[6] = 23; //"N"
- disp_queue[7] = 36; //" "
- }
- else
- {
- disp_queue[6] = 15; //"F"
- disp_queue[7] = 15; //"F"
- }
- break;
- /*
- case 16: //顯示分鐘提示功能
- display_SET(); //"SET -O"
- disp_queue[3] = 2; //"2"
- if ( FUN_FZTS != 0 )
- {
- disp_queue[6] = 23; //"N"
- disp_queue[7] = 36; //" "
- }
- else
- {
- disp_queue[6] = 15; //"F"
- disp_queue[7] = 15; //"F"
- }
- break;
- */
- default: //以上條件都不滿足時,顯示當前時間
- display_TIME_H(); //時
- display_TIME_M(); //分
- display_TIME_S(); //秒
- display_COL(); //": :"
- break;
- }
-
- }
- //--------------------------------------------------------
- //顯示掃描程序
- //入口: disp_queue[]=待顯示字符串隊列
- //--------------------------------------------------------
- void display_cnt()
- {
- tU08 i;
- tU08 j;
- //====延時等待
- P1OUT &= 0x80; //清除顯示
- delay_n(15000);
-
- //====掃描顯示隊列中的字符
- for (i=0; i {
- //====顯示當前字符
- for (j=0; j<5; j++) //j=列號(0~4)
- {
- P1OUT |= LCD_TAB_A[ disp_queue[i] * 5 + j ]; //送顯當前字符的當前列
- delay_n(150); //列顯示延時
- P1OUT &= 0x80; //清除顯示
- delay_n(10); //列間隔延時
- }
- //====字符間隔延時
- delay_n(250);
- }
- }
- //--------------------------------------------------------
- //IO初始化程序(復用口配置給key)
- //--------------------------------------------------------
- void IO_init_key()
- {
- if (NOKEY_JSQ >= 60) //當無鍵計時>60秒,則禁止按鍵喚醒,必須通過慣性開關喚醒
- {
- P1OUT = 0x10; //P1口輸出狀態
- P1DIR = 0xEF; //P1口IO狀態(0=輸入,1=輸出)
- //P1REN = 0x00; //P1口上拉使能(0=禁止,1=使能)
-
- P1IE |= 0x10; // P14 中斷使能
-
- }
- else
- {
- P1OUT = 0x70; //P1口輸出狀態
- P1DIR = 0x8F; //P1口IO狀態(0=輸入,1=輸出)
- //P1REN = 0x00; //P1口上拉使能(0=禁止,1=使能)
-
- P1IE |= 0x70; // P16~P14 中斷使能
- }
- P1IES |= 0x00; // P1口觸發邊沿選擇 (0=上升沿有效,1=下降沿有效)
- P1IFG = 0x00; // IFG cleared
- }
- //--------------------------------------------------------
- //IO初始化程序(復用口配置給led)
- //--------------------------------------------------------
- void IO_init_led()
- {
- P1OUT = 0x00; //P1口輸出狀態
- P1DIR = 0xFF; //P1口IO狀態(0=輸入,1=輸出)
- //P1REN = 0x00; //P1口上拉使能(0=禁止,1=使能)
- //P1IE |= 0x00; // P16~P14 中斷禁止
- //P1IES |= 0x00; // P1口觸發邊沿選擇 (0=上升沿有效,1=下降沿有效)
- //P1IFG = 0x00; // IFG cleared
- }
- //--------------------------------------------------------
- //參數初始化程序
- //--------------------------------------------------------
- void parameter_init()
- {
- //TIME_Y = 6; //當前時間"年"(00~99)
- //TIME_MO =1; //當前時間"月"(1~12)
- //TIME_D =1; //當前時間"日"(1~31)
- TIME_H =12; //當前時間"時"(0~23)
- TIME_M = 0; //當前時間"分"(0~59)
- TIME_S = 0; //當前時間"秒"(0~119)
- RUN_H = 0; //秒表時間"時"(0~23)
- RUN_M = 0; //秒表時間"分"(0~59)
- RUN_S = 0; //秒表時間"秒"(0~119)
- RUN_MD = 0; //秒表狀態(0=停止,1=運行)
-
- TIMER_H = 7; //定時時間"時"(0~23)
- TIMER_M = 15; //定時時間"分"(0~59)
- SP_M = 10; //蜂鳴器鳴叫時間設置值(0~99分)(說明:0=定時關閉)
- //SP_RUN = 0; //蜂鳴器鳴叫時間運行值
-
- WK_MODE = 0; //工作模式
- FUN_ZDBS = 1; //整點報時(0=禁止,1=使能)
- //FUN_FZTS = 0; //分鐘提示(0=禁止,1=使能)
- }
- //--------------------------------------------------------
- //初始化程序
- //--------------------------------------------------------
- void init()
- {
- WDTCTL = WDTPW + WDTHOLD; //停止WDT
-
- IO_init_key(); //IO初始化程序(復用口配置給key)
- parameter_init(); //參數初始化程序
- //定時器中斷設置
- CCTL0 = CCIE; //CCR0 中斷使能
- CCR0 = 32768-1; //定時器計數上限
- TACTL = TASSEL_1 + MC_1; //ACLK, contmode
- //定時器A時鐘源選擇: 1 - ACLK
- //定時器A計數模式: 1 - Up to CCR0
- }
- //--------------------------------------------------------
- //主程序
- //--------------------------------------------------------
- void main(void)
- {
-
- init(); //====初始化
-
- _BIS_SR(LPM3_bits + GIE); //Enter LPM3 w/ interrupt
- /*
- //====循環主體
- while (1) // Loop
- {
- //asm ( "nop" ) ;
- if (0x80 & P1IN) //如果P1.7=1
- {
- P1OUT &= 0x80; //清除顯示
- }
- else //否則
- {
- new_display(); //刷新待顯示字符串
- display_cnt(); //顯示掃描程序
-
- }
- }
- */
-
- }
- //--------------------------------------------------------
- //蜂鳴器控制程序
- //--------------------------------------------------------
- void SP_CNT()
- {
- P1OUT |= 0x80; //開蜂鳴器
- delay_n(20000); //鳴叫延時
- P1OUT &= 0x7F; //關蜂鳴器
- }
- //--------------------------------------------------------
- //Timer_A3 Interrupt Vector (TAIV) handler
- //Timer_A3 中斷服務程序
- //說明: 根據TAIV寄存器判斷,執行不同的中斷響應
- //中斷頻率=32768/(32768) = 1Hz
- //--------------------------------------------------------
- // Timer A0 interrupt service routine
- #pragma vector=TIMERA0_VECTOR
- __interrupt void Timer_A (void)
- {
- //時鐘系統計時
- TIME_S ++;
- if ( TIME_S > 59 )
- {
- TIME_S = 0 ;
- //蜂鳴器鳴叫時間運行值!=0時,運行值-1
- if ( SP_RUN !=0 )
- {
- SP_RUN--;
- }
- TIME_M ++ ;
- if ( TIME_M > 59 )
- {
- TIME_M = 0 ;
-
- if ( FUN_ZDBS != 0 ) //整點報時功能
- {
- //SP_RUN = SP_RUN + 1; //鳴叫一分鐘
- SP_CNT(); //鳴叫一聲
- delay_n(60000); //鳴叫延時
- SP_CNT(); //鳴叫一聲
- }
- TIME_H ++ ;
- if ( TIME_H > 23 )
- {
- TIME_H = 0 ;
-
- /*
- TIME_D ++ ;
- if ( TIME_D > 31)
- {
- TIME_D = 1 ;
- TIME_MO ++ ;
- if ( TIME_MO > 12 )
- {
- TIME_MO = 1 ;
- TIME_Y ++ ;
- if ( TIME_Y > 99 )
- {
- TIME_Y = 0 ;
- }
- }
- }
- */
-
- }
- }
- }
- //當當前時間=定時時間時,開始鳴叫
- if (( TIME_H == TIMER_H ) && (TIME_M == TIMER_M) && ( TIME_S < 10))
- {
- SP_RUN = SP_M;
- }
- //蜂鳴器鳴叫時間運行值!=0時,鳴叫
- if ( SP_RUN != 0 )
- {
- SP_CNT(); //鳴叫一聲
- //delay_n(40000); //鳴叫延時
- //SP_CNT(); //鳴叫一聲
- }
- //秒表系統計時
- if (RUN_MD != 0 )
- {
- RUN_S ++;
- if ( RUN_S > 59 )
- {
- RUN_S = 0 ;
- RUN_M ++ ;
- if ( RUN_M > 59 )
- {
- RUN_M = 0 ;
- RUN_H ++ ;
- if ( RUN_H > 99 )
- {
- RUN_H = 0 ;
- }
- }
- }
- }
- //無鍵計時
- if (NOKEY_JSQ >= 60) //當無鍵計時>60秒,則執行
- {
- WK_MODE = 0 ; //切換工作模式
-
- }
- else
- {
- NOKEY_JSQ ++ ; //無鍵計時器(每秒+1)
- }
-
-
- //
- IO_init_key(); //IO初始化程序(復用口配置給key)
- }
- //--------------------------------------------------------
- //位置信號處理功能
- //--------------------------------------------------------
- void wz_fun()
- {
- SP_RUN = 0; //蜂鳴器鳴叫時間運行值=0,取消鳴叫
- NOKEY_JSQ = 0 ; //無鍵計時器=0
- IO_init_led(); //IO初始化程序(復用口配置給led)
- new_display(); //刷新待顯示字符串
- display_cnt(); //顯示掃描程序
- }
-
- //--------------------------------------------------------
- //按鍵A信號處理功能
- //--------------------------------------------------------
- void key_a_fun()
- {
- SP_CNT(); //鳴叫一聲
- NOKEY_JSQ = 0 ; //無鍵計時器=0
- //====根據工作模式判斷
- switch( WK_MODE ) //根據工作模式判斷
- {
- case 0: //顯示當前時間
- WK_MODE = 4 ; //切換工作模式
- break;
- /*
- case 1: //顯示當前日期
- WK_MODE = 2 ; //切換工作模式
- break;
- case 2: //顯示星期幾
- WK_MODE = 3 ; //切換工作模式
- break;
- case 3: //顯示溫度
- WK_MODE = 4 ; //切換工作模式
- break;
- case 4: //顯示鬧鐘時間
- RUN_S = 0 ; //秒表時間"秒"(0~59)
- RUN_M = 0 ; //秒表時間"分"(0~59)
- RUN_H = 0 ; //秒表時間"時"(0~23)
- WK_MODE = 5 ; //切換工作模式
- break;
- case 5: //顯示秒表時間
- WK_MODE = 6 ; //切換工作模式
- break;
- */
- case 6: //顯示作者信息
- WK_MODE = 0 ; //切換工作模式
- break;
- case 7: //顯示當前時間"時"
- if ( TIME_H < 23 ) //時+1(0~23)
- {
- TIME_H ++ ;
- }
- else
- {
- TIME_H = 0 ;
- }
- break;
- case 8: //顯示當前時間"分""秒"
- TIME_S = 0; //秒=0
- if ( TIME_M < 59 ) //分+1(0~59)
- {
- TIME_M ++ ;
- }
- else
- {
- TIME_M = 0 ;
- }
- break;
- /*
- case 9: //顯示當前時間"年"
- if ( TIME_Y < 99 ) //年+1(0~99)
- {
- TIME_Y ++ ;
- }
- else
- {
- TIME_Y = 0 ;
- }
- break;
- case 10: //顯示當前時間"月"
- if ( TIME_MO < 12 ) //月+1(1~12)
- {
- TIME_MO ++ ;
- }
- else
- {
- TIME_MO = 1 ;
- }
- break;
- case 11: //顯示當前時間"日"
- if ( TIME_D < 31 ) //日+1(1~31)
- {
- TIME_D ++ ;
- }
- else
- {
- TIME_D = 1 ;
- }
- break;
- */
- case 12: //顯示定時時間"時"
- if ( TIMER_H < 23 ) //時+1(0~23)
- {
- TIMER_H ++ ;
- }
- else
- {
- TIMER_H = 0 ;
- }
- break;
- case 13: //顯示定時時間"分"
- if ( TIMER_M < 59 ) //分+1(0~59)
- {
- TIMER_M ++ ;
- }
- else
- {
- TIMER_M = 0 ;
- }
- break;
- case 14: //顯示蜂鳴器鳴叫時間
- if ( SP_M < 99 ) //蜂鳴器鳴叫時間+1(0~59)
- {
- SP_M ++ ;
- }
- else
- {
- SP_M = 0 ;
- }
- break;
- case 15: //顯示整點報時功能
- FUN_ZDBS ^= 0x01; //整點報時功能取反
- FUN_ZDBS &= 0X01;
- break;
- /*
- case 16: //顯示分鐘提示功能
- FUN_FZTS ^= 0x01; //分鐘提示功能取反
- FUN_FZTS &= 0X01;
- break;
- */
- default: //以上條件都不滿足時,顯示當前時間
- WK_MODE ++ ; //切換工作模式
- break;
- }
- }
- //--------------------------------------------------------
- //按鍵B信號處理功能
- //--------------------------------------------------------
- void key_b_fun()
- {
- SP_CNT(); //鳴叫一聲
- NOKEY_JSQ = 0 ; //無鍵計時器=0
- //====根據工作模式判斷
- switch( WK_MODE ) //根據工作模式判斷
- {
- case 0: //顯示當前時間
- WK_MODE = 7 ; //切換工作模式
- break;
- /*
- case 1: //顯示當前日期
- WK_MODE = 9 ; //切換工作模式
- break;
- case 2: //顯示星期幾
- break;
- case 3: //顯示溫度
- TEMP ++ ; //當前溫度+1
- break;
- */
- case 4: //顯示鬧鐘時間
- WK_MODE = 12 ; //切換工作模式
- break;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
013522ym5b9yfama1bm1lm.png (42.56 KB, 下載次數: 186)
下載附件
2017-6-28 01:45 上傳
所有資料51hei提供下載:
http://www.zg4o1577.cn/bbs/dpj-88797-1.html
|
-
慣性開關實物圖.JPG
(12.45 KB, 下載次數: 258)
下載附件
2017-6-28 01:44 上傳
-
慣性開關示意圖.GIF
(4.09 KB, 下載次數: 274)
下載附件
2017-6-28 01:44 上傳
-
揮動方法.jpg
(13.24 KB, 下載次數: 239)
下載附件
2017-6-28 01:44 上傳
-
控制部分.jpg
(31.82 KB, 下載次數: 229)
下載附件
2017-6-28 01:44 上傳
-
模擬效果.gif
(166.17 KB, 下載次數: 260)
下載附件
2017-6-28 01:44 上傳
-
完整外形.jpg
(17.53 KB, 下載次數: 242)
下載附件
2017-6-28 01:44 上傳
-
顯示部分.jpg
(12.28 KB, 下載次數: 245)
下載附件
2017-6-28 01:44 上傳
-
效果1.jpg
(19.79 KB, 下載次數: 224)
下載附件
2017-6-28 01:44 上傳
-
效果2.jpg
(14.83 KB, 下載次數: 254)
下載附件
2017-6-28 01:44 上傳
-
效果3.jpg
(15.11 KB, 下載次數: 247)
下載附件
2017-6-28 01:44 上傳
|