正計時狀態
正計時顯示狀態
倒計時狀態
倒計時顯示狀態
鋰電池及帶保護的充電模塊
鋰電池及帶保護的充電模塊
安裝中
安裝中1
安裝中2
電路圖
電路圖
單片機源程序如下:
- /* PIC16F630為核心的廚房定時器 注:所有的(12個)I/O口都用完
- * 功能:倒(正)計時1秒-99分59秒
- * 顯示:數碼管顯示分鐘和秒鐘;雙色LED秒閃顯示秒狀態;兩種LED分別顯示功能狀態:倒計
- 時橙色燈和正計時綠色燈顯示。
- * 提示音:1、計時結束:嘟嘟嘟連續響五次;2、正計時逢5分鐘提示一個長音:嘟;3正計時
- 逢10分鐘提示兩個半長音:嘟-嘟
- * 人機交互:五個按鍵分別是啟動/停止;正/倒計時;加十分;加1分;加1秒/暫停/繼續
- * 電源開啟:默認倒計時狀態-加分加秒-啟動
- * 計時精度依賴于PIC16F630內部振蕩器(4M)的精度和程序設計定時器初值的設定
- */
- /* 本程序已經成功制作出成品,外殼使用的是銀行點鈔機外顯示外殼
- #include<pic.h>
- __CONFIG(0x3184); //配置:禁止數據和程序的代碼保護;禁止低電壓檢測;RA3作為普通I/O口
- ;上電復位開;看門狗關閉;使用內部振蕩器。
- //輸入鍵:RA3,RC1,RC3,RC4,RC5。其余鍵均為輸出
- #define BZZP RC2 //蜂鳴器接口
- #define CLK RA5 // 74HC164時鐘輸入
- #define DAT RA4 // 74HC164數據端口
- #define WEI3 RA0 // 秒十位
- #define WEI4 RA1 // 秒個位
- #define WEI1 RA2 // 分十位
- #define WEI2 RC0 // 分個位
- #define QID RC1 //啟動/停止鍵
- #define ZDAO RC3 //正/倒計時
- #define JSHF RC4 //加十分
- #define JGOF RC5 //加個分
- #define JMIAO RA3 //加秒
- #define uchar unsigned char
- #define uint unsigned int
- uchar timecnt = 0,fs=0,fg=0,ms=0,mg=0;
- bit zhengdao,qidong,zhantin;
- //mss:秒閃爍;zdjs:正倒計時0倒1正;qdtz:啟動停止0停1動;ztjx暫停/繼續 0暫停 1繼續
- const unsigned char LED[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
- //0-9十個數值的編碼(共陰數碼管)
- void delay(uint);//延時函數
- void dududu(void);//嘟嘟嘟
- void changdu(void);//長嘟
- void dudu(void);//嘟嘟
- void smduan(uchar);//寫串行數據入164
- void keytest(void); //鍵掃描函數
- void Init(void); //初始化子函數
- void zhengjishi(void); //正計時函數
- void daojishi(void); //倒計時函數
- void interrupt ISR(void) //PIC單片機的所有中斷都是這一個入口
- {
- if(TMR1IF==1) //需要進一步判斷是否是T1中斷
- {
- TMR1H=0x0B; //重置初值
- TMR1L=0xEA; //重置初值 E9
- TMR1IF=0; //清中斷標志位,以備下次中斷
- //***此處用戶自行添加定時器T1中斷處理程序***
- timecnt++;
- if(timecnt==2)
- {timecnt=0;
- if(qidong==1)
- { if(zhengdao==1) zhengjishi();
- else daojishi();
- }
- }
- }
- }
- main()
- {
- uchar x;
- Init();
- while(1)
- {
- keytest();
- if(fs>0)
- {smduan(LED[fs]);
- WEI1=0;
- delay(3);
- WEI1=1;
- }
- if(timecnt==1) x=LED[fg]+0x80;
- else x=LED[fg];
- smduan(x);
- WEI2=0;
- delay(3);
- WEI2=1;
- if(zhengdao==0) x=LED[ms]+0x80;
- else x=LED[ms];
- smduan(x);
- WEI3=0;
- delay(3);
- WEI3=1;
- if(zhengdao==1) x=LED[mg]+0x80;//正計時燈亮
- else x=LED[mg];
- smduan(x);
- WEI4=0;
- delay(3);
- WEI4=1;
- }
- }
- void zhengjishi(void) //正計時函數
- {
- mg++;
- if(mg==10)
- { mg=0;
- ms++;
- if(ms==6)
- {
- ms=0;
- fg++;
- if(fg==5) changdu();
- if(fg==10)
- {
- fg=0;
- fs++;
- dudu();
- if(fs==10)
- fs=0;
- }
- }
- }
- }
- void delay(uint x) //延時函數
- {
- uint a,b;
- for(a=x;a>0;a--)
- for(b=100;b>0;b--);
- }
- void dududu(void) //連續三聲嘟
- {
- uchar i,j;
- for(j=5;j>0;j--)
- {for(i=3;i>0;i--)
- {
- BZZP=1;
- delay(200);
- BZZP=0;
- delay(30);
- }
- delay(300);
- }
- }
- void changdu(void) //長嘟
- {
- BZZP=1;
- delay(300);
- BZZP=0;
- }
- void dudu(void) //兩聲嘟
- {
- uchar i;
- for(i=2;i>0;i--)
- {
- BZZP=1;
- delay(200);
- BZZP=0;
- delay(20);
- }
- }
- //按鍵處理程序
- void keytest(void)
- {
- if(QID==0)
- {
- while(QID==0) //按鍵去抖
- { delay(100);}
- qidong=!qidong;
- if(qidong==0)
- {
- TMR1ON=0; //關閉定時器1
- fs=fg=ms=mg=0;
- zhengdao=0; //停止時默認倒計時
- }
- else TMR1ON=1; //啟動定時器1
- }
- ///////////////// 正倒計時轉換
- if(ZDAO==0)
- {
- while(ZDAO==0) //按鍵去抖
- { delay(100);}
- if(qidong==0) //停止狀態有效
- zhengdao=!zhengdao;
- }
- //////////////// 加分十位
- if(JSHF==0)
- {
- while(JSHF==0) //按鍵去抖
- { delay(100);}
- if(zhengdao+qidong==0) // 倒計時和停止狀態下才能運行
- {
- fs++;
- if(fs==10) fs=0;
- }
- }
- /////////////////
- if(JGOF==0)
- {
- while(JGOF==0) //按鍵去抖
- { delay(100);}
- if(zhengdao+qidong==0) // 倒計時和停止狀態下才能運行
- {
- fg++;
- if(fg==10) fg=0;
- }
- }
- ////////////////
- if(JMIAO==0)
- {
- while(JMIAO==0) //按鍵去抖
- { delay(100);}
- if(zhengdao+qidong==0) // 倒計時和停止狀態下才能運行
- {
- mg++;
- if(mg==10)
- {
- mg=0;
- ms++;
- if(ms==6) ms=0;
- }
- }
- if(qidong==1) //暫停與繼續
- {
- zhantin=!zhantin;
- if(zhantin==0)
- TMR1ON=0; //暫停:關閉定時器1
- else
- TMR1ON=1; //繼續:開啟定時器1
- }
- }
- }
- void Init(void) //主函數初始化
- {
- OPTION=0b10000000; //禁止弱上拉
- WPUA= 0x00; //關閉弱上拉
- TRISA=0B00001000; //RA3 口做輸入,且只能作為輸入
- TRISC=0B00111010; //RC5,4,3,2做輸入,RC0,2做輸出
- PORTA=0B00001000;
- PORTC=0B00111010;
- //INTCON=0; //關中斷
- CMCON=0x07; // 設置全部為普通數字IO口 關閉所有比較器
- PIE1 = 0X01; //T1溢出中斷使能位
- PIR1 = 0X00; //T1溢出標志位,每次溢出都要軟件清0
- T1CON = 0X05; //設置T1中斷參數
- //***定時器TMR1初始化***
- TMR1CS=0; //TMR1時鐘源選擇內部指令周期時鐘(Fosc/4)
- T1CKPS0=1; //1:8預分頻比,T1CKPS0=1
- T1CKPS1=1; //1:8預分頻比,T1CKPS1=1
- TMR1H=0x0B; //定時62500×8微秒,置初值為65536-62500+13
- TMR1L=0xEA; //定時62500×8微秒,置初值為65536-62500+13
- TMR1ON=0; //啟動定時器T1(暫停)
- TMR1IF=0; //清除T1的中斷標志
- TMR1IE=1; //T1中斷允許
- PEIE=1; //外設中斷允許,TMR1屬于外設中斷范圍
- //**********************
- //***開全局中斷設置****
- //定時器T1設置了中斷允許,此處要開全局中斷
- GIE=1;
- WEI1=1;
- WEI2=1;
- WEI3=1;
- WEI4=1;
- zhantin=1;
- }
- void smduan(uchar udata) //向164傳輸段碼
- {
- uchar i;
- for (i=0;i<8;i++)
- {
- if(udata&0x80)
- DAT=1;
- else
- DAT=0;
- CLK=0;
- asm("NOP");
- asm("NOP");
- CLK=1;
- udata = udata<<1;
- CLK=0;
- }
- }
- void daojishi(void) //倒計時函數
- {
- if(fs+fg+ms+mg>0)
- {
- if(mg>0) mg--;
- else
- {
- if(ms>0)
- {
- ms--;
- mg=9;
- }
- else
- {
- if(fg>0)
- {
- fg--;
- ms=5;
- mg=9;
- }
- else
- {
- if(fs>0)
- {
- fs--;
- fg=9;
- ms=5;
- mg=9;
- }
- }
- }
- }
- }
- else
- {dududu(); //倒計時}時間到,蜂鳴器工作
- zhengdao=1; //正計時開始
- }
- }
復制代碼 |