久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5172|回復: 0
收起左側

用PIC16F630單片機+74HC164制作的廚房定時器

[復制鏈接]
ID:215984 發表于 2018-7-28 18:47 | 顯示全部樓層 |閱讀模式
正計時狀態

正計時顯示狀態

正計時顯示狀態


倒計時狀態

倒計時顯示狀態

倒計時顯示狀態


鋰電池及帶保護的充電模塊

鋰電池及帶保護的充電模塊

鋰電池及帶保護的充電模塊


安裝中

安裝中1

安裝中1


安裝中2

安裝中2


電路圖

電路圖

電路圖


單片機源程序如下:
  1. /*  PIC16F630為核心的廚房定時器         注:所有的(12個)I/O口都用完
  2. *  功能:倒(正)計時1秒-99分59秒
  3. *  顯示:數碼管顯示分鐘和秒鐘;雙色LED秒閃顯示秒狀態;兩種LED分別顯示功能狀態:倒計  
  4.   時橙色燈和正計時綠色燈顯示。
  5. *  提示音:1、計時結束:嘟嘟嘟連續響五次;2、正計時逢5分鐘提示一個長音:嘟;3正計時  
  6.   逢10分鐘提示兩個半長音:嘟-嘟
  7. *  人機交互:五個按鍵分別是啟動/停止;正/倒計時;加十分;加1分;加1秒/暫停/繼續
  8. *  電源開啟:默認倒計時狀態-加分加秒-啟動
  9. *  計時精度依賴于PIC16F630內部振蕩器(4M)的精度和程序設計定時器初值的設定
  10. */
  11.   /*  本程序已經成功制作出成品,外殼使用的是銀行點鈔機外顯示外殼
  12. #include<pic.h>

  13. __CONFIG(0x3184); //配置:禁止數據和程序的代碼保護;禁止低電壓檢測;RA3作為普通I/O口

  14. ;上電復位開;看門狗關閉;使用內部振蕩器。
  15. //輸入鍵:RA3,RC1,RC3,RC4,RC5。其余鍵均為輸出
  16. #define BZZP RC2  //蜂鳴器接口
  17. #define CLK RA5  // 74HC164時鐘輸入
  18. #define DAT RA4  // 74HC164數據端口
  19. #define WEI3 RA0  // 秒十位
  20. #define WEI4 RA1  // 秒個位
  21. #define WEI1 RA2  // 分十位
  22. #define WEI2 RC0  // 分個位

  23. #define QID RC1  //啟動/停止鍵
  24. #define ZDAO RC3  //正/倒計時
  25. #define JSHF RC4  //加十分
  26. #define JGOF RC5  //加個分
  27. #define JMIAO RA3 //加秒

  28. #define uchar unsigned char
  29. #define uint unsigned int

  30. uchar timecnt = 0,fs=0,fg=0,ms=0,mg=0;
  31. bit zhengdao,qidong,zhantin;
  32. //mss:秒閃爍;zdjs:正倒計時0倒1正;qdtz:啟動停止0停1動;ztjx暫停/繼續 0暫停 1繼續
  33. const unsigned char LED[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

  34. //0-9十個數值的編碼(共陰數碼管)
  35. void delay(uint);//延時函數
  36. void dududu(void);//嘟嘟嘟
  37. void changdu(void);//長嘟
  38. void dudu(void);//嘟嘟
  39. void smduan(uchar);//寫串行數據入164

  40. void keytest(void);  //鍵掃描函數
  41. void Init(void); //初始化子函數
  42. void zhengjishi(void);  //正計時函數
  43. void daojishi(void);  //倒計時函數


  44. void interrupt ISR(void)   //PIC單片機的所有中斷都是這一個入口
  45. {
  46.     if(TMR1IF==1)          //需要進一步判斷是否是T1中斷
  47.     {
  48.         TMR1H=0x0B;        //重置初值
  49.         TMR1L=0xEA;        //重置初值 E9
  50.         TMR1IF=0;          //清中斷標志位,以備下次中斷
  51.     //***此處用戶自行添加定時器T1中斷處理程序***

  52.       timecnt++;
  53.       if(timecnt==2)
  54.       {timecnt=0;

  55.         if(qidong==1)
  56.          { if(zhengdao==1) zhengjishi();
  57.            else daojishi();
  58.          }
  59.        }

  60.   }
  61. }


  62. main()

  63. {
  64. uchar x;               
  65. Init();

  66. while(1)

  67. {
  68.   keytest();              
  69.   if(fs>0)              
  70.   {smduan(LED[fs]);
  71.     WEI1=0;
  72.      delay(3);     
  73.     WEI1=1;
  74.   }  

  75.   if(timecnt==1) x=LED[fg]+0x80;
  76.    else x=LED[fg];
  77.   smduan(x);
  78.    WEI2=0;
  79.    delay(3);     
  80.    WEI2=1;

  81. if(zhengdao==0) x=LED[ms]+0x80;
  82.   else  x=LED[ms];
  83.   smduan(x);
  84.   WEI3=0;
  85.   delay(3);     
  86.   WEI3=1;


  87. if(zhengdao==1) x=LED[mg]+0x80;//正計時燈亮
  88.   else  x=LED[mg];
  89.   smduan(x);
  90.   WEI4=0;
  91.   delay(3);     
  92.   WEI4=1;  
  93. }
  94. }

  95. void zhengjishi(void)  //正計時函數
  96. {
  97.       mg++;
  98.        if(mg==10)
  99.        { mg=0;
  100.          ms++;
  101.          if(ms==6)
  102.          {
  103.           ms=0;
  104.           fg++;
  105.           if(fg==5) changdu();
  106.           if(fg==10)
  107.           {
  108.            fg=0;
  109.            fs++;
  110.            dudu();
  111.            if(fs==10)
  112.            fs=0;
  113.           }
  114.          }  
  115.         }
  116. }

  117. void delay(uint x)  //延時函數
  118. {

  119. uint a,b;

  120. for(a=x;a>0;a--)
  121. for(b=100;b>0;b--);

  122. }
  123. void dududu(void)  //連續三聲嘟
  124. {
  125.   uchar i,j;
  126. for(j=5;j>0;j--)
  127.   {for(i=3;i>0;i--)
  128.   {              
  129.    BZZP=1;
  130.     delay(200);
  131.     BZZP=0;
  132.     delay(30);
  133.   }
  134.   delay(300);
  135.   }  
  136. }
  137. void changdu(void)  //長嘟
  138. {
  139.     BZZP=1;
  140.     delay(300);
  141.     BZZP=0;
  142. }
  143. void dudu(void)  //兩聲嘟
  144. {
  145.   uchar i;
  146.   for(i=2;i>0;i--)
  147.   {              
  148.    BZZP=1;
  149.     delay(200);
  150.     BZZP=0;
  151.     delay(20);
  152.   }
  153. }
  154.   //按鍵處理程序
  155. void keytest(void)
  156. {
  157.   if(QID==0)
  158.    {   
  159.      while(QID==0)    //按鍵去抖
  160.      { delay(100);}
  161.       qidong=!qidong;

  162.       if(qidong==0)
  163.       {
  164.        TMR1ON=0;  //關閉定時器1
  165.        fs=fg=ms=mg=0;
  166.        zhengdao=0; //停止時默認倒計時
  167.       }
  168.       else TMR1ON=1;  //啟動定時器1
  169.     }
  170.    ///////////////// 正倒計時轉換
  171.      if(ZDAO==0)
  172.    {   
  173.      while(ZDAO==0)    //按鍵去抖
  174.      { delay(100);}
  175.      if(qidong==0)  //停止狀態有效
  176.       zhengdao=!zhengdao;

  177.     }
  178. ////////////////  加分十位
  179.      if(JSHF==0)
  180.    {   
  181.     while(JSHF==0)    //按鍵去抖
  182.      { delay(100);}
  183.       if(zhengdao+qidong==0)  // 倒計時和停止狀態下才能運行
  184.      {
  185.        fs++;
  186.        if(fs==10) fs=0;
  187.       }
  188.     }
  189.        /////////////////
  190.      if(JGOF==0)
  191.    {   
  192.     while(JGOF==0)    //按鍵去抖
  193.      { delay(100);}
  194.       if(zhengdao+qidong==0)  // 倒計時和停止狀態下才能運行
  195.      {     
  196.        fg++;
  197.        if(fg==10) fg=0;
  198.      }

  199.     }
  200. ////////////////
  201.      if(JMIAO==0)
  202.    {   
  203.     while(JMIAO==0)    //按鍵去抖
  204.      { delay(100);}
  205.       if(zhengdao+qidong==0)  // 倒計時和停止狀態下才能運行
  206.      {
  207.        mg++;
  208.        if(mg==10)
  209.        {
  210.          mg=0;
  211.          ms++;
  212.         if(ms==6) ms=0;
  213.         }
  214.      }   

  215.      if(qidong==1)  //暫停與繼續
  216.      {
  217.       zhantin=!zhantin;
  218.        if(zhantin==0)
  219.          TMR1ON=0;  //暫停:關閉定時器1
  220.        else
  221.          TMR1ON=1;  //繼續:開啟定時器1
  222.      }
  223.    }   
  224. }
  225. void Init(void)  //主函數初始化
  226. {
  227. OPTION=0b10000000; //禁止弱上拉

  228. WPUA= 0x00; //關閉弱上拉

  229. TRISA=0B00001000; //RA3 口做輸入,且只能作為輸入
  230. TRISC=0B00111010; //RC5,4,3,2做輸入,RC0,2做輸出
  231. PORTA=0B00001000;
  232. PORTC=0B00111010;

  233. //INTCON=0; //關中斷

  234. CMCON=0x07; // 設置全部為普通數字IO口 關閉所有比較器

  235. PIE1 = 0X01; //T1溢出中斷使能位

  236. PIR1 = 0X00; //T1溢出標志位,每次溢出都要軟件清0

  237. T1CON = 0X05; //設置T1中斷參數

  238.     //***定時器TMR1初始化***
  239.     TMR1CS=0;              //TMR1時鐘源選擇內部指令周期時鐘(Fosc/4)
  240.      T1CKPS0=1;             //1:8預分頻比,T1CKPS0=1
  241.       T1CKPS1=1;             //1:8預分頻比,T1CKPS1=1
  242.        TMR1H=0x0B;            //定時62500×8微秒,置初值為65536-62500+13
  243.        TMR1L=0xEA;            //定時62500×8微秒,置初值為65536-62500+13
  244.       TMR1ON=0;              //啟動定時器T1(暫停)
  245.      TMR1IF=0;              //清除T1的中斷標志
  246.     TMR1IE=1;              //T1中斷允許
  247.         PEIE=1;                //外設中斷允許,TMR1屬于外設中斷范圍
  248.     //**********************

  249.     //***開全局中斷設置****
  250.     //定時器T1設置了中斷允許,此處要開全局中斷
  251.     GIE=1;
  252.   WEI1=1;
  253.    WEI2=1;
  254.    WEI3=1;
  255.   WEI4=1;   
  256.   zhantin=1;
  257. }

  258. void smduan(uchar udata)  //向164傳輸段碼
  259. {
  260.   uchar i;
  261.    for (i=0;i<8;i++)
  262.   {
  263.     if(udata&0x80)
  264.      DAT=1;
  265.     else
  266.      DAT=0;

  267.     CLK=0;
  268.      asm("NOP");
  269.      asm("NOP");
  270.     CLK=1;
  271.     udata = udata<<1;
  272.    CLK=0;
  273.   }
  274. }
  275. void daojishi(void)  //倒計時函數
  276. {
  277. if(fs+fg+ms+mg>0)
  278. {
  279.   if(mg>0) mg--;
  280.   else
  281.   {
  282.     if(ms>0)
  283.     {
  284.      ms--;
  285.      mg=9;
  286.     }
  287.      else
  288.      {
  289.       if(fg>0)
  290.       {
  291.        fg--;
  292.        ms=5;
  293.        mg=9;
  294.       }
  295.        else
  296.        {
  297.         if(fs>0)
  298.         {
  299.          fs--;
  300.          fg=9;
  301.          ms=5;
  302.          mg=9;
  303.         }
  304.        }

  305.        }
  306.      }
  307. }   
  308.   else
  309.          {dududu();  //倒計時}時間到,蜂鳴器工作
  310.           zhengdao=1;  //正計時開始
  311.          }

  312. }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情综合五月天 | www.久久精品| www.黄色av| 波多野吉衣一二三区乱码 | 美日韩精品 | 欧美激情一区二区 | 亚洲精品一区二区三区精华液 | 亚洲特黄 | 欧美日韩中文在线 | 五月播播 | 欧美一级一级 | 久久九九国产 | 日韩黄色av | 中文字幕在线观看亚洲 | 在线网站免费观看18 | 国产乱码精品一区二区三区忘忧草 | 久久性生活视频 | 亚洲精品一区二区三区在线观看 | 日韩欧美高清 | 日韩精品视频网站 | 国产伦精品一区二区免费 | 亚洲成人免费在线观看 | 婷婷久久五月 | 亚洲69视频| 日日干夜夜骑 | 一区二区久久 | 一区二区三区在线免费 | 亚洲 欧美 日韩 在线 | 福利看片 | 久久伊人影院 | 美女黄色免费网站 | 精品久久一区二区 | 亚洲精品一区二三区不卡 | 免费毛片在线 | 99久久久国产精品 | 国产精品123区 | 久久综合五月天 | 青青草久久 | 日本大尺度吃奶做爰久久久绯色 | 亚洲天堂免费视频 | 欧美黄色一区 |