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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2137|回復: 1
收起左側(cè)

單片機自動售水機程序

[復制鏈接]
ID:975466 發(fā)表于 2021-10-27 17:42 | 顯示全部樓層 |閱讀模式
1.按鍵控制單元
設定按鍵S7為出水控制按鍵,當S7按下后,售水機持續(xù)出水〈繼電器接通,指示燈L10點亮設定按鍵S6為停水控制按鍵,當S6按下后,停止出水〈繼電器斷開,指示燈L10熄滅X
1.數(shù)碼管顯示單元
通過4位數(shù)碼管DS1顯示費率,單位為元丨升,保留2位有效數(shù)字;
通過4位數(shù)碼管DS2顯示當前出水總量(出水時,單位為升)和總價(停止時,單 位為元按下出水按鍵S7后,清除數(shù)碼管DS2顯示數(shù)據(jù),數(shù)碼管DS2實時顯示出水 量(保留兩位有效數(shù)字〕,在出水狀態(tài)下,再次按下S7,不會影響出水狀態(tài),直到按下停 止按鍵S6為止;按下停止出水按鍵S6后,數(shù)碼管DS2顯示總價3^0轉(zhuǎn)換單元
通過光敏電阻RD1和AD轉(zhuǎn)換芯片PCF8591組成的亮度檢測電路〈亮度值轉(zhuǎn)換為PCF8591光敏電阻通道的電壓〕檢測環(huán)境亮度;當:PCF8591光敏電阻通道輸入電壓小于1.25 V時,L1點亮,大于1.25V時,L1熄滅。
4^系統(tǒng)說明
1.假定水價為0.5元/升,出水速度為100毫升/秒;
1. 一次出水總量達到99.99L時,繼電器自動斷開,數(shù)碼管顯示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};          //有小數(shù)點的段選
  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           //數(shù)碼管顯示
  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         動態(tài)顯示
  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格式文檔下載(內(nèi)容和本網(wǎng)頁上的一模一樣,方便保存):
2012_小區(qū)自動售水機_參考程序.doc (132.5 KB, 下載次數(shù): 15)
回復

使用道具 舉報

ID:995006 發(fā)表于 2021-12-21 00:21 | 顯示全部樓層
樓主 我build后有一個主函數(shù)和中斷函數(shù)沖突的warning警告 實際燒錄后蜂鳴器報警是為啥
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色电影在线免费观看 | 欧美8一10sex性hd | 国产欧美一区二区精品忘忧草 | 成人二区 | 亚洲高清一区二区三区 | 亚洲毛片一区二区 | 中文字幕视频一区二区 | 国产中文在线 | 台湾佬久久 | 免费看国产片在线观看 | 成人一区av偷拍 | 国产成人精品久久二区二区91 | 黄a在线观看 | 国产一区二区在线播放 | 成人性视频免费网站 | 免费久 | 日韩成人一区 | 天天干天天爽 | 精品国产一区二区国模嫣然 | 精品国产一级 | 免费黄网站在线观看 | 国产一区 | 在线播放国产一区二区三区 | 亚洲精品乱码 | 欧美aaaaaaaa | 国产成人精品免费视频大全最热 | 男女下面一进一出网站 | 99在线免费观看 | 国内精品久久久久 | 国产精品99久久久久久大便 | 玖玖视频| h视频免费观看 | 日韩在线91 | 一区二区不卡 | 国产1区2区在线观看 | 中文字幕一区二区在线观看 | 国产精品乱码一区二三区小蝌蚪 | 91视频入口 | 精品一区二区三区中文字幕 | 精品国产一级片 | 天天干天天玩天天操 |