找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4382|回复: 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 单片机教程网

快速回复 返回顶部 返回列表