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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5068|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

用PIC16F630單片機(jī)+74HC164制作的廚房定時(shí)器

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
正計(jì)時(shí)狀態(tài)


倒計(jì)時(shí)狀態(tài)


鋰電池及帶保護(hù)的充電模塊


安裝中




電路圖


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

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

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

  23. #define QID RC1  //啟動(dòng)/停止鍵
  24. #define ZDAO RC3  //正/倒計(jì)時(shí)
  25. #define JSHF RC4  //加十分
  26. #define JGOF RC5  //加個(gè)分
  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:正倒計(jì)時(shí)0倒1正;qdtz:啟動(dòng)停止0停1動(dòng);ztjx暫停/繼續(xù) 0暫停 1繼續(xù)
  33. const unsigned char LED[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

  34. //0-9十個(gè)數(shù)值的編碼(共陰數(shù)碼管)
  35. void delay(uint);//延時(shí)函數(shù)
  36. void dududu(void);//嘟嘟嘟
  37. void changdu(void);//長(zhǎng)嘟
  38. void dudu(void);//嘟嘟
  39. void smduan(uchar);//寫(xiě)串行數(shù)據(jù)入164

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


  44. void interrupt ISR(void)   //PIC單片機(jī)的所有中斷都是這一個(gè)入口
  45. {
  46.     if(TMR1IF==1)          //需要進(jìn)一步判斷是否是T1中斷
  47.     {
  48.         TMR1H=0x0B;        //重置初值
  49.         TMR1L=0xEA;        //重置初值 E9
  50.         TMR1IF=0;          //清中斷標(biāo)志位,以備下次中斷
  51.     //***此處用戶自行添加定時(shí)器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;//正計(jì)時(shí)燈亮
  88.   else  x=LED[mg];
  89.   smduan(x);
  90.   WEI4=0;
  91.   delay(3);     
  92.   WEI4=1;  
  93. }
  94. }

  95. void zhengjishi(void)  //正計(jì)時(shí)函數(shù)
  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)  //延時(shí)函數(shù)
  118. {

  119. uint a,b;

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

  122. }
  123. void dududu(void)  //連續(xù)三聲嘟
  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)  //長(zhǎng)嘟
  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;  //關(guān)閉定時(shí)器1
  165.        fs=fg=ms=mg=0;
  166.        zhengdao=0; //停止時(shí)默認(rèn)倒計(jì)時(shí)
  167.       }
  168.       else TMR1ON=1;  //啟動(dòng)定時(shí)器1
  169.     }
  170.    ///////////////// 正倒計(jì)時(shí)轉(zhuǎn)換
  171.      if(ZDAO==0)
  172.    {   
  173.      while(ZDAO==0)    //按鍵去抖
  174.      { delay(100);}
  175.      if(qidong==0)  //停止?fàn)顟B(tài)有效
  176.       zhengdao=!zhengdao;

  177.     }
  178. ////////////////  加分十位
  179.      if(JSHF==0)
  180.    {   
  181.     while(JSHF==0)    //按鍵去抖
  182.      { delay(100);}
  183.       if(zhengdao+qidong==0)  // 倒計(jì)時(shí)和停止?fàn)顟B(tài)下才能運(yùn)行
  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)  // 倒計(jì)時(shí)和停止?fàn)顟B(tài)下才能運(yùn)行
  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)  // 倒計(jì)時(shí)和停止?fàn)顟B(tài)下才能運(yùn)行
  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)  //暫停與繼續(xù)
  216.      {
  217.       zhantin=!zhantin;
  218.        if(zhantin==0)
  219.          TMR1ON=0;  //暫停:關(guān)閉定時(shí)器1
  220.        else
  221.          TMR1ON=1;  //繼續(xù):開(kāi)啟定時(shí)器1
  222.      }
  223.    }   
  224. }
  225. void Init(void)  //主函數(shù)初始化
  226. {
  227. OPTION=0b10000000; //禁止弱上拉

  228. WPUA= 0x00; //關(guān)閉弱上拉

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

  233. //INTCON=0; //關(guān)中斷

  234. CMCON=0x07; // 設(shè)置全部為普通數(shù)字IO口 關(guān)閉所有比較器

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

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

  237. T1CON = 0X05; //設(shè)置T1中斷參數(shù)

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

  249.     //***開(kāi)全局中斷設(shè)置****
  250.     //定時(shí)器T1設(shè)置了中斷允許,此處要開(kāi)全局中斷
  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)  //倒計(jì)時(shí)函數(shù)
  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();  //倒計(jì)時(shí)}時(shí)間到,蜂鳴器工作
  310.           zhengdao=1;  //正計(jì)時(shí)開(kāi)始
  311.          }

  312. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久精品女人天堂av | 一区久久 | 免费在线色 | 一区视频| 国产精品视频久久久久 | 在线免费观看成人 | 狠狠av | 天天看夜夜 | 国产精品第2页 | 成人免费视频在线观看 | 黄色网址在线播放 | 午夜伦理影院 | 成人一区二区三区 | 高清一区二区 | 黄色片在线免费看 | 国产一区二区在线免费播放 | 欧美国产视频 | 欧美日一区| 亚洲性人人天天夜夜摸 | 成人免费视屏 | 龙珠z国语版在线观看 | 亚洲精品国产一区 | 四虎精品在线 | 国产精品美女久久久久aⅴ国产馆 | 欧美日韩高清免费 | 香蕉视频一区二区 | 99久久免费观看 | 天天澡天天操 | 天天躁日日躁狠狠躁白人 | 日韩成人影院 | 久久午夜精品福利一区二区 | 日韩在线免费看 | 精品久久久久久久久久久久久久 | 欧美日韩中文字幕 | 国产激情在线 | 91av视频在线免费观看 | 日韩看片 | 日本精品一区二区 | 亚洲美乳中文字幕 | 欧美色图另类 | 国产激情一区二区三区 |