欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機自動售水機程序 [打印本頁]

作者: 千仞    時間: 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)

作者: sheva27    時間: 2021-12-21 00:21
樓主 我build后有一個主函數和中斷函數沖突的warning警告 實際燒錄后蜂鳴器報警是為啥




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1