找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1637|回复: 1
打印 上一主题 下一主题
收起左侧

单片机自动售水机程序

[复制链接]
跳转到指定楼层
楼主
ID:975466 发表于 2021-10-27 17:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.按键控制单元
设定按键S7为出水控制按键,当S7按下后,售水机持续出水〈继电器接通,指示灯L10点亮设定按键S6为停水控制按键,当S6按下后,停止出水〈继电器断开,指示灯L10熄灭X
1.数码管显示单元
通过4位数码管DS1显示费率,单位为元丨升,保留2位有效数字;
通过4位数码管DS2显示当前出水总量(出水时,单位为升)和总价(停止时,单 位为元按下出水按键S7后,清除数码管DS2显示数据,数码管DS2实时显示出水 量(保留两位有效数字〕,在出水状态下,再次按下S7,不会影响出水状态,直到按下停 止按键S6为止;按下停止出水按键S6后,数码管DS2显示总价3^0转换单元
通过光敏电阻RD1和AD转换芯片PCF8591组成的亮度检测电路〈亮度值转换为PCF8591光敏电阻通道的电压〕检测环境亮度;当:PCF8591光敏电阻通道输入电压小于1.25 V时,L1点亮,大于1.25V时,L1熄灭。
4^系统说明
1.假定水价为0.5元/升,出水速度为100毫升/秒;
1. 一次出水总量达到99.99L时,继电器自动断开,数码管显示DS2显示价格。

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "intrins.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
  6. uchar code smg_du[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  7. uchar code smg_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  8. uchar code smg_du1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f};          //有小数点的段选
  9. sbit SDA = P2^1;
  10. sbit SCL = P2^0;
  11. sbit s7=P3^0;
  12. sbit s6=P3^1;

  13. uchar tflag,dspflag,qian,bai,shi,ge,qian1,bai1,shi1,ge1,num,temp,bb;
  14. uint t,aa,date;

  15. void delayms(uint x)
  16. {
  17.         uchar t;
  18.         while(x--)for(t=0;t<120;t++);
  19. }

  20. void keyscan()
  21. {
  22.         if(s7==0)
  23.         {
  24.                 delayms(10);
  25.                 if(s7==0)
  26.                 {
  27.                         P0=0x10;P2=0xa0;P2=0;
  28.                         TR0=1;num=1;t=0;
  29.                         while(!s7);
  30.                 }
  31.         }
  32.         if(s6==0)
  33.         {
  34.                 delayms(10);
  35.                 if(s6==0)
  36.                 {
  37.                         date=t/2;TR0=0;
  38.                         P0=0;P2=0xa0;P2=0;
  39.                         num=2;
  40.                         TR0=1;
  41.                         while(!s6);
  42.                 }
  43.         }
  44. }

  45. void display(uchar we,uchar du)
  46. {
  47.           P0 = 0xFF;          
  48.         P2 |= 0xE0;
  49.         P2 &= 0x1F;

  50.         P0 = smg_du[du];
  51.         P2 |= 0xE0;
  52.         P2 &= 0x1F;
  53.         P0 =smg_we[we];
  54.         P2 |= 0xC0;
  55.         P2 &= 0x3F;

  56. }
  57. /////////////////////////////////////////////////////////////////
  58. void iic_start(void)
  59. {
  60.   SDA = 1;
  61.   _nop_();
  62.   SCL = 1;
  63.   somenop;
  64.   SDA = 0;
  65.   somenop;
  66.   SCL = 0;
  67. }

  68. void iic_stop(void)
  69. {
  70.   SDA = 0;
  71.   _nop_();
  72.   SCL = 1;
  73.   somenop;
  74.   SDA = 1;
  75. }

  76. void ack()
  77. {
  78.         unsigned char i;
  79.         SCL=1;somenop;while((SDA==1)&&(i<200))i++;SCL=0;
  80. }

  81. void iic_sendbyte(unsigned char byt)
  82. {
  83.   unsigned char i;
  84.   for(i=0;i<8;i++)
  85.   {   
  86.           if(byt&0x80)
  87.       SDA = 1;
  88.         else
  89.           SDA = 0;
  90.         somenop;
  91.         SCL = 1;
  92.         byt <<= 1;
  93.         somenop;
  94.     SCL = 0;
  95.   }
  96.   ack();
  97. }

  98. unsigned char iic_recbyte(void)
  99. {
  100.   unsigned char da;
  101.   unsigned char i;
  102.   for(i=0;i<8;i++)
  103.   {   
  104.         SCL = 1;
  105.         somenop;
  106.         da <<= 1;
  107.         if(SDA)
  108.           da |= 0x01;
  109.         SCL = 0;
  110.         somenop;
  111.   }
  112.   return da;
  113. }

  114. unsigned char adc_pcf8591(void)
  115. {
  116.         unsigned char temp;

  117.         iic_start();
  118.         iic_sendbyte(0x91);
  119.         temp = iic_recbyte();
  120.         iic_stop();
  121.        
  122.         return temp;
  123. }
  124. void init_pcf8591(void)
  125. {
  126.   iic_start();
  127.   iic_sendbyte(0x90);
  128.   iic_sendbyte(0x01);
  129.   iic_stop();
  130.   delayms(10);
  131. }
  132. ////////////////////////////////////////////////////////////////
  133. void main()
  134. {               
  135.          P0=0xff;P2=0x80;P2=0;
  136.         P0=0;P2=0xa0;P2=0;                //关蜂鸣器
  137.         TMOD = 0x22;
  138.         TH0 = 0x06;
  139.         TL0 = 0x06;
  140.         TH1 = 0x06;
  141.         TL1 = 0x06;
  142.         ET0 = 1;
  143.         EA = 1;
  144.         ET1=1;TR1=1;
  145.         init_pcf8591();
  146.           
  147.         while(1)
  148.         {
  149.                 keyscan();
  150.                 if(t==10000)
  151.                 {
  152.                           TR0=0;
  153.                         P0=0;P2=0xa0;P2=0;
  154.                         num=3;                         //超出标志
  155.                         TR0=1;
  156.                 }
  157.         }  
  158. }

  159. void isr_t0(void) interrupt 1           //数码管显示
  160. {
  161.   tflag++;
  162.   aa++;
  163.   if(aa==400)                //10ms t++
  164.   {
  165.           aa=0;
  166.           t++;
  167.         if(t==10000)
  168.         {
  169.                 P0=0;P2=0xa0;P2=0;
  170.         }
  171.         qian=t/1000;bai=t%1000/100;shi=t%100/10;ge=t%10;
  172.   }
  173.   if(num==1)                //计时标志
  174.   {
  175.           if(tflag == 4)  //1ms         动态显示
  176.           {
  177.                 tflag = 0;
  178.                 dspflag++;
  179.                 if(dspflag == 7)
  180.                   dspflag = 0;
  181.                 if(dspflag==0)
  182.                 {
  183.                         P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;
  184.                         P0=smg_du1[bai];P2 |= 0xE0;P2 &= 0x1F;
  185.                         P0 =smg_we[5];P2 |= 0xC0;P2 &= 0x3F;
  186.                 }
  187.                
  188.                 if(dspflag==1)
  189.                                 display(6,shi);
  190.                 if(dspflag==2)
  191.                                 display(7,ge);
  192.                 if(dspflag==3)
  193.                                 display(4,qian);
  194.                 if(dspflag==4)
  195.                 {
  196.                          P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;
  197.                         P0=smg_du1[0];P2 |= 0xE0;P2 &= 0x1F;
  198.                         P0 =smg_we[1];P2 |= 0xC0;P2 &= 0x3F;
  199.                 }
  200.                 if(dspflag==5)
  201.                         display(2,5);
  202.                 if(dspflag==6)
  203.                         display(3,0);
  204.           }         
  205.         }
  206.           if(num==2)                         //算费标志
  207.         {
  208.                 if(tflag == 4)  //1ms
  209.           {
  210.                 tflag = 0;dspflag++;
  211.                 if(dspflag == 7)
  212.                 {
  213.                   dspflag = 0;
  214.                    qian1=date/1000;bai1=date%1000/100;shi1=date%100/10;ge1=date%10;
  215.                 }
  216.                 if(dspflag==0)
  217.                 {
  218.                         P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;
  219.                         P0 = smg_du1[bai1];P2 |= 0xE0;P2 &= 0x1F;
  220.                         P0 =smg_we[5];P2 |= 0xC0;P2 &= 0x3F;
  221.                 }
  222.                 if(dspflag==1)
  223.                         display(6,shi1);
  224.                 if(dspflag==2)
  225.                         display(7,ge1);
  226.                 if(dspflag==3)
  227.                         display(4,qian1);
  228.                 if(dspflag==4)
  229.                 {
  230.                          P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;
  231.                          P0=smg_du1[0];P2 |= 0xE0;P2 &= 0x1F;
  232.                  P0 =smg_we[1];P2 |= 0xC0;P2 &= 0x3F;
  233.                 }
  234.                 if(dspflag==5)
  235.                         display(2,5);
  236.                 if(dspflag==6)
  237.                         display(3,0);
  238.           }         
  239.         }
  240.         if(num==3)
  241.         {
  242.             if(tflag == 4)  //100ms
  243.           {
  244.                 tflag = 0;dspflag++;
  245.                 if(dspflag == 7)
  246.                 {
  247.                   dspflag = 0;
  248.                 }
  249.                 if(dspflag==0)
  250.                 {
  251.                         P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;
  252.                         P0 = smg_du1[9];P2 |= 0xE0;        P2 &= 0x1F;
  253.                         P0 =smg_we[5];P2 |= 0xC0;P2 &= 0x3F;
  254.                 }
  255.                 if(dspflag==1)
  256.                         display(6,9);
  257.                 if(dspflag==2)
  258.                         display(7,9);
  259.                 if(dspflag==3)
  260.                         display(4,4);
  261.                 if(dspflag==4)
  262.                 {
  263.                          P0 = 0xFF;P2 |= 0xE0;P2 &= 0x1F;
  264.                         P0=smg_du1[0];P2 |= 0xE0;P2 &= 0x1F;
  265.                         P0 =smg_we[1];P2 |= 0xC0;P2 &= 0x3F;
  266.                 }
  267.                 if(dspflag==5)
  268.                         display(2,5);
  269.                 if(dspflag==6)
  270.                         display(3,0);
  271.           }       
  272.         }
  273. }

  274. void T1_timer() interrupt 3                 //LED PCF8591
  275. {
  276.         bb++;
  277.         if(bb==8)
  278.         {
  279.                 bb=0;
  280.                 temp=adc_pcf8591();
  281.                 if(temp<64)
  282.                 {
  283.                         P0=0xfe;P2=0x80;P2=0;
  284.                 }
  285.                 if(temp>64)
  286.                 {
  287.                         P0=0xff;P2=0x80;P2=0;
  288.                 }
  289.         }
  290. }
复制代码

以上图文的Word格式文档下载(内容和本网页上的一模一样,方便保存):
2012_小区自动售水机_参考程序.doc (132.5 KB, 下载次数: 15)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:995006 发表于 2021-12-21 00:21 | 只看该作者
楼主 我build后有一个主函数和中断函数冲突的warning警告 实际烧录后蜂鸣器报警是为啥
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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