找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3744|回复: 1
收起左侧

基于51单片机的自动售水机程序

[复制链接]
ID:371387 发表于 2018-12-23 01:23 | 显示全部楼层 |阅读模式
基于51的自动售水机

单片机源程序如下:
  1. #include <reg52.h>

  2. sbit BUZZ = P1^6;
  3. sbit ADDR3 = P1^3;
  4. sbit ENLED = P1^4;

  5. extern void KeyScan();
  6. extern void LedScan();
  7. extern void KeyDriver();
  8. extern void shujuzhuanhuan(float danjia,float shui);
  9. unsigned char T0RH = 0;  //T0重载值的高字节
  10. unsigned char T0RL = 0;  //T0重载值的低字节
  11. bit setIndex=0;                //出水标志位 为1出水 为0不出水
  12. bit setIndex1=0;  //停水标志位 为1停水 为0出水
  13. unsigned int chushuishijian=0;
  14. float shuiL=0,zongjia=0;
  15. extern        unsigned char LedBuff[7];
  16. /* 配置并启动T0,ms-T0定时时间 */

  17. void ConfigTimer0(unsigned int ms)
  18. {
  19.     unsigned long tmp;  //临时变量
  20.    
  21.     tmp = 11059200 / 12;      //定时器计数频率
  22.     tmp = (tmp * ms) / 1000;  //计算所需的计数值
  23.     tmp = 65536 - tmp;        //计算定时器重载值
  24.     tmp = tmp + 18;           //补偿中断响应延时造成的误差
  25.        
  26.     T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
  27.     T0RL = (unsigned char)tmp;
  28.     TMOD &= 0xF0;   //清零T0的控制位
  29.     TMOD |= 0x01;   //配置T0为模式1
  30.     TH0 = T0RH;     //加载T0重载值
  31.     TL0 = T0RL;
  32.     ET0 = 1;        //使能T0中断
  33.     TR0 = 1;        //启动T0
  34. }
  35. void main()
  36. {
  37.                 EA = 1;            //开总中断
  38.                 ENLED = 0;
  39.                 ADDR3 = 1;
  40.     ConfigTimer0(2);  //配置T0定时1ms
  41.                 while(1)
  42.                 {
  43.                                 KeyDriver();
  44.                                 if((setIndex==1)&&(setIndex1==0))
  45.                                 {
  46.                                                 shujuzhuanhuan(0.5,shuiL);
  47.                                 }
  48.                                 if((setIndex1==1)&&(setIndex==0))
  49.                                 {
  50.                                                 shujuzhuanhuan(0.5,zongjia);
  51.                                 }
  52.                 }
  53. }


  54. /* T0中断服务函数,完成数码管、按键扫描与秒表计数 */
  55. void InterruptTimer0() interrupt 1
  56. {
  57.           static unsigned int tmr1s = 0;       
  58.     TH0 = T0RH;  //重新加载重载值
  59.     TL0 = T0RL;
  60.     LedScan();   //数码管扫描显示
  61.     KeyScan();   //按键扫描
  62.                 if(setIndex)
  63.                 {
  64.                                 tmr1s++;
  65.                                 if(tmr1s >= 500)
  66.                                 {
  67.                                         tmr1s = 0;
  68.                                         chushuishijian++;
  69.                                         shuiL=chushuishijian*0.1;
  70.                                         zongjia=shuiL*0.5;
  71.                                         BUZZ = ~BUZZ;
  72.                                         LedBuff[6]=0xfe;
  73.                                 }
  74.                 }  
  75. }


  76. /* 按键动作函数,根据键码执行相应的操作,keycode-按键键码 */
  77. void KeyAction(unsigned char keycode)
  78. {
  79.                                 if  ((keycode>='0') && (keycode<='9'))  //本例中不响应字符键
  80.                                 {                                                       
  81.                                 }
  82.                                 else if (keycode == 0x26)  //向上键,
  83.                                 {                                                       
  84.                                 }
  85.                                 else if (keycode == 0x28)  //向下键,清除
  86.                                 {
  87.                                                         shuiL=0;
  88.                                                         zongjia=0;
  89.                                                         setIndex=0;
  90.                                                         setIndex1=1;
  91.                                 }
  92.                                 else if (keycode == 0x25)  //向左键,向左切换设置位
  93.                                 {
  94.                                 }
  95.                                 else if (keycode == 0x27)  //向右键,向右切换设置位
  96.                                 {
  97.                                 }
  98.                                 else if (keycode == 0x0D)  //回车键,进入设置模式/启用当前设置值
  99.                                 {
  100.                                                         if (setIndex == 0)  //不处于出水状态时,进入设置状态
  101.                                                         {                                                                               
  102.                                                                                 setIndex=1;
  103.                                                                                 setIndex1=0;
  104.                                                         }
  105.                                                         else                //已处于出水状态时,保存时间并退出设置状态
  106.                                                         {
  107.                                                         }
  108.                                 }
  109.                                 else if (keycode == 0x1B)  //Esc键,停水
  110.                                 {
  111.                                                                                 setIndex=0;
  112.                                                                                 setIndex1=1;
  113.                                                                                 LedBuff[6]=0xff;
  114.                                 }
  115. }
复制代码

所有资料51hei提供下载:
自动售水机.zip (57.43 KB, 下载次数: 59)
回复

使用道具 举报

ID:1 发表于 2018-12-26 00:32 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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