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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2264|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)模擬智能灌溉系統(tǒng)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:785561 發(fā)表于 2020-10-12 13:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
main.c
  1. #include <STC15F2K60S2.h>
  2. #include "ds1302.h"
  3. #include "iic.h"

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. #define Y4 P2=(P2&0x1f)|0x80;
  7. #define Y5 P2=(P2&0x1f)|0xa0;
  8. #define Y6 P2=(P2&0x1f)|0xc0;
  9. #define Y7 P2=(P2&0x1f)|0xe0;

  10. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
  11. uchar yi,er,san,si,wu,liu,qi,ba;
  12. uchar num;
  13. uint shidu;
  14. bit mode;        //初始,自動(dòng)模式
  15. bit buzz_mode=1;
  16. bit open_mode;
  17. bit S6,S5,S4;
  18. bit flag;
  19. uchar size=50;
  20. uchar temp;

  21. extern uchar hour,min,s;


  22. void allinit(void);
  23. void display1(uchar yi,uchar er);
  24. void display2(uchar san,uchar si);
  25. void display3(uchar wu,uchar liu);
  26. void display4(uchar qi,uchar ba);
  27. void keyscan();
  28. void keyscan16();

  29. void delayms(int ms)        //延時(shí)函數(shù)
  30. {
  31.   int i,j;
  32.   for(i=ms;i>0;i--)
  33.     for(j=845;j>0;j--);
  34. }
  35. void main()
  36. {
  37.   allinit();
  38.   DS1302_init(0x08,0x30,0x50);
  39.   while(1)
  40.   {
  41.      shidu= pcf8591(3);
  42.          shidu=shidu*99/255;
  43.      keyscan();          //獨(dú)立按鍵
  44.          //keyscan16();          //矩陣按鍵
  45.          DS1302_read();
  46.      display1(yi,er);
  47.          display2(san,si);
  48.          display3(wu,liu);
  49.          display4(qi,ba);
  50.          yi=hour/16;er=hour%16;san=11;si=min/16;
  51.          wu=min%16;liu=10;qi=shidu/10;ba=shidu%10;
  52.          if(mode==0)   //自動(dòng)模式
  53.          {
  54.            Y4;P0=0xfe;
  55.            if(shidu < size)
  56.            {
  57.                     Y5;P0=0x10;
  58.            }
  59.            if(shidu > size)
  60.            {
  61.              Y5;P0=0x00;
  62.            }
  63.            if(S6==1)
  64.            {
  65.              yi=11;er=11;san=10;si=10;
  66.                  wu=temp/10;liu=temp%10;qi=size/10;ba=size%10;
  67.                  temp=e2prom_read(0);
  68.            }
  69.          }
  70.            if(mode==1)        //手動(dòng)模式
  71.            {
  72.              Y4;P0=0xfd;
  73.                  if(buzz_mode==1 && open_mode==1)
  74.                  {
  75.                    if(shidu < size) {Y5;P0=0x50;}
  76.                    if(shidu >= size) {Y5;P0=0x10;}
  77.                  }
  78.                  if(buzz_mode==1 && open_mode==0)
  79.                  {
  80.                    if(shidu < size) {Y5;P0=0x40;}
  81.                    if(shidu >= size) {Y5;P0=0x00;}
  82.                  }
  83.                  if(buzz_mode==0 && open_mode==1)
  84.                  {
  85.                    Y5;P0=0x10;
  86.                  }
  87.                  if(buzz_mode==0 && open_mode==0)
  88.                  {
  89.                    Y5;P0=0x00;
  90.                  }
  91.            }
  92.   }
  93. }
  94. void allinit(void)
  95. {
  96.   Y5;P0=0x00; //關(guān)閉蜂鳴器和繼電器
  97.   Y6;P0=0xff; //打開(kāi)數(shù)碼管位選
  98.   Y7;P0=0xff; //關(guān)閉數(shù)碼管段選
  99.   Y4;P0=0xff; //關(guān)閉led燈
  100. }
  101. void display1(uchar yi,uchar er) //數(shù)碼管顯示
  102. {
  103.    Y6;P0=0x01;Y7;P0=tab[yi];delayms(1);
  104.    Y6;P0=0x02;Y7;P0=tab[er];delayms(1);
  105. }
  106. void display2(uchar san,uchar si)
  107. {
  108.    Y6;P0=0x04;Y7;P0=tab[san];delayms(1);
  109.    Y6;P0=0x08;Y7;P0=tab[si];delayms(1);
  110. }
  111. void display3(uchar wu,uchar liu)
  112. {
  113.    Y6;P0=0x10;Y7;P0=tab[wu];delayms(1);
  114.    Y6;P0=0x20;Y7;P0=tab[liu];delayms(1);
  115. }
  116. void display4(uchar qi,uchar ba)
  117. {
  118.    Y6;P0=0x40;Y7;P0=tab[qi];delayms(1);
  119.    Y6;P0=0x80;Y7;P0=tab[ba];delayms(1);
  120. }
  121. void keyscan(void) //獨(dú)立按鍵處理
  122. {
  123.   if(P30==0)
  124.   {
  125.     delayms(5);
  126.         if(P30==0)
  127.         {
  128.            mode=~mode;
  129.         }while(!P30);
  130.   }
  131.   else if(P31==0)
  132.   {
  133.     delayms(5);
  134.         if(P31==0)
  135.         {
  136.             if(mode==0)
  137.                 {
  138.                    S6=~S6;
  139.                    if(S6==1)
  140.                    {e2prom_write(0,size);}
  141.                 }
  142.                 if(mode==1)
  143.                 {
  144.                  buzz_mode = ~buzz_mode;
  145.             }while(!P31);
  146.     }
  147.   }
  148.   else if(P32==0)
  149.   {
  150.     delayms(5);
  151.         if(P32==0)
  152.         {
  153.            if(mode==0) {size=size+1;}
  154.            if(mode==1) {open_mode=1;}
  155.         }while(!P32);
  156.   }
  157.   else if(P33==0)
  158.   {
  159.     delayms(5);
  160.         if(P33==0)
  161.         {
  162.            if(mode==0) {size=size-1;}
  163.            if(mode==1) {open_mode=0;}
  164.         }while(!P33);
  165.   }
  166. }
  167. void keyscan16() //矩陣按鍵
  168. {
  169.     uchar temp;
  170.         
  171.         P44=0;P42=1;P3=0X7F;
  172.         temp=P3;
  173.         temp=temp&0X0F;
  174.         if(temp!=0x0f)
  175.         {
  176.                 delayms(5);
  177.                 temp=P3;
  178.                 temp=temp&0X0F;
  179.                 if(temp!=0x0f)
  180.                 {
  181.                         temp=P3;
  182.                         switch(temp)
  183.                         {
  184.                                 case 0x7e: num=0;break;
  185.                                 case 0x7d: num=4;break;
  186.                                 case 0x7b: num=8;break;
  187.                                 case 0x77: num=12;break;        
  188.                         }
  189.                         while(temp!=0x0f)
  190.                         {
  191.                                 temp=P3;
  192.                                 temp=temp&0X0F;
  193.                         }
  194.                 }
  195.         }

  196.         P44=1;P42=0;P3=0XBF;
  197.         temp=P3;
  198.         temp=temp&0X0F;
  199.         if(temp!=0x0f)
  200.         {
  201.                 delayms(5);
  202.                 temp=P3;
  203.                 temp=temp&0X0F;
  204.                 if(temp!=0x0f)
  205.                 {
  206.                         temp=P3;
  207.                         switch(temp)
  208.                         {
  209.                                 case 0xBe: num=1;break;
  210.                                 case 0xBd: num=5;break;
  211.                                 case 0xBb: num=9;break;
  212.                                 case 0xB7: num=13;break;        
  213.                         }
  214.                         while(temp!=0x0f)
  215.                         {
  216.                                 temp=P3;
  217.                                 temp=temp&0X0F;
  218.                         }
  219.                 }
  220.         }
  221.         
  222.         P3=0XDF;P44=1;P42=1;
  223.         temp=P3;
  224.         temp=temp&0X0F;
  225.         if(temp!=0x0f)
  226.         {
  227.                 delayms(5);
  228.                 temp=P3;
  229.                 temp=temp&0X0F;
  230.                 if(temp!=0x0f)
  231.                 {
  232.                         temp=P3;
  233.                         switch(temp)
  234.                         {
  235.                                 case 0xDe: num=2;break;
  236.                                 case 0xDd: num=6;break;
  237.                                 case 0xDb: num=10;break;
  238.                                 case 0xD7: num=14;break;        
  239.                         }
  240.                         while(temp!=0x0f)
  241.                         {
  242.                                 temp=P3;
  243.                                 temp=temp&0X0F;
  244.                         }
  245.                 }
  246.         }
  247.         
  248.         P3=0XEF;P44=1;P42=1;
  249.         temp=P3;
  250.         temp=temp&0X0F;
  251.         if(temp!=0x0f)
  252.         {
  253.                 delayms(5);
  254.                 temp=P3;
  255.                 temp=temp&0X0F;
  256.                 if(temp!=0x0f)
  257.                 {
  258.                         temp=P3;
  259.                         switch(temp)
  260.                         {
  261.                                 case 0xEe: num=3;break;
  262.                                 case 0xEd: num=7;break;
  263.                                 case 0xEb: num=11;break;
  264.                                 case 0xE7: num=15;break;        
  265.                         }
  266.                         while(temp!=0x0f)
  267.                         {
  268.                                 temp=P3;
  269.                                 temp=temp&0X0F;
  270.                         }
  271.                 }
  272.         }
  273. }  
復(fù)制代碼
iic.c
  1. /*
  2.   程序說(shuō)明: IIC總線驅(qū)動(dòng)程序
  3.   軟件環(huán)境: Keil uVision 4.10
  4.   硬件環(huán)境: CT107單片機(jī)綜合實(shí)訓(xùn)平臺(tái) 8051,12MHz
  5.   日    期: 2011-8-9
  6. */

  7. #include "reg52.h"
  8. #include "intrins.h"
  9. #include "iic.h"

  10. #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}   


  11. #define SlaveAddrW 0xA0
  12. #define SlaveAddrR 0xA1

  13. //總線引腳定義
  14. sbit SDA = P2^1;  /* 數(shù)據(jù)線 */
  15. sbit SCL = P2^0;  /* 時(shí)鐘線 */


  16. //總線啟動(dòng)條件
  17. void IIC_Start(void)
  18. {
  19.         SDA = 1;
  20.         SCL = 1;
  21.         somenop;
  22.         SDA = 0;
  23.         somenop;
  24.         SCL = 0;        
  25. }

  26. //總線停止條件
  27. void IIC_Stop(void)
  28. {
  29.         SDA = 0;
  30.         SCL = 1;
  31.         somenop;
  32.         SDA = 1;
  33. }

  34. //應(yīng)答位控制
  35. void IIC_Ack(bit ackbit)
  36. {
  37.         if(ackbit)
  38.         {        
  39.                 SDA = 0;
  40.         }
  41.         else
  42.         {
  43.                 SDA = 1;
  44.         }
  45.         somenop;
  46.         SCL = 1;
  47.         somenop;
  48.         SCL = 0;
  49.         SDA = 1;
  50.         somenop;
  51. }

  52. //等待應(yīng)答
  53. bit IIC_WaitAck(void)
  54. {
  55.         SDA = 1;
  56.         somenop;
  57.         SCL = 1;
  58.         somenop;
  59.         if(SDA)   
  60.         {   
  61.                 SCL = 0;
  62.                 IIC_Stop();
  63.                 return 0;
  64.         }
  65.         else  
  66.         {
  67.                 SCL = 0;
  68.                 return 1;
  69.         }
  70. }

  71. //通過(guò)I2C總線發(fā)送數(shù)據(jù)
  72. void IIC_SendByte(unsigned char byt)
  73. {
  74.         unsigned char i;
  75.         for(i=0;i<8;i++)
  76.         {   
  77.                 if(byt&0x80)
  78.                 {        
  79.                         SDA = 1;
  80.                 }
  81.                 else
  82.                 {
  83.                         SDA = 0;
  84.                 }
  85.                 somenop;
  86.                 SCL = 1;
  87.                 byt <<= 1;
  88.                 somenop;
  89.                 SCL = 0;
  90.         }
  91. }

  92. //從I2C總線上接收數(shù)據(jù)
  93. unsigned char IIC_RecByte(void)
  94. {
  95.         unsigned char da;
  96.         unsigned char i;
  97.         
  98.         for(i=0;i<8;i++)
  99.         {   
  100.                 SCL = 1;
  101.                 somenop;
  102.                 da <<= 1;
  103.                 if(SDA)
  104.                 da |= 0x01;
  105.                 SCL = 0;
  106.                 somenop;
  107.         }
  108.         return da;
  109. }
  110. uchar pcf8591(uchar addr)
  111. {
  112.   uchar dat;
  113.   IIC_Start();
  114.   IIC_SendByte(0x90);
  115.   IIC_WaitAck();
  116.   IIC_SendByte(addr);
  117.   IIC_WaitAck();
  118.   IIC_Stop();

  119.   IIC_Start();
  120.   IIC_SendByte(0x91);
  121.   IIC_WaitAck();
  122.   dat=IIC_RecByte();
  123.   IIC_Stop();

  124.   return dat;
  125. }
  126. void e2prom_write(uchar addr,uchar dat)
  127. {
  128.      IIC_Start();
  129.          IIC_SendByte(0xa0);
  130.          IIC_WaitAck();
  131.      IIC_SendByte(addr);
  132.      IIC_WaitAck();
  133.          IIC_SendByte(dat);
  134.          IIC_WaitAck();
  135.      IIC_Stop();
  136. }
  137. uchar e2prom_read(uchar addr)
  138. {
  139.      uchar dat;
  140.      IIC_Start();
  141.      IIC_SendByte(0xa0);
  142.      IIC_WaitAck();
  143.      IIC_SendByte(addr);
  144.      IIC_WaitAck();
  145.      IIC_Stop();

  146.      IIC_Start();
  147.      IIC_SendByte(0xa1);
  148.      IIC_WaitAck();
  149.      dat=IIC_RecByte();
  150.      IIC_Stop();

  151.      return dat;
  152. }
復(fù)制代碼
iic.h
  1. #ifndef _IIC_H
  2. #define _IIC_H

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. //函數(shù)聲明
  6. void IIC_Start(void);
  7. void IIC_Stop(void);  
  8. void IIC_Ack(bit ackbit);
  9. void IIC_SendByte(unsigned char byt);
  10. bit IIC_WaitAck(void);  
  11. unsigned char IIC_RecByte(void);
  12. uchar pcf8591(uchar addr);
  13. void e2prom_write(uchar addr,uchar dat);
  14. uchar e2prom_read(uchar addr);

  15. #endif
復(fù)制代碼
ds1302.c
  1. /*
  2.   程序說(shuō)明: DS1302驅(qū)動(dòng)程序
  3.   軟件環(huán)境: Keil uVision 4.10
  4.   硬件環(huán)境: CT107單片機(jī)綜合實(shí)訓(xùn)平臺(tái) 8051,12MHz
  5.   日    期: 2011-8-9
  6. */

  7. #include <reg52.h>
  8. #include "ds1302.h"
  9. #include <intrins.h>



  10. sbit SCK=P1^7;               
  11. sbit SDA=P2^3;               
  12. sbit RST = P1^3;   // DS1302復(fù)位                                                                                                

  13. void Write_Ds1302_Byte(unsigned  char temp)
  14. {
  15.         unsigned char i;
  16.         for (i=0;i<8;i++)            
  17.         {
  18.                 SCK=0;
  19.                 SDA=temp&0x01;
  20.                 temp>>=1;
  21.                 SCK=1;
  22.         }
  23. }   

  24. void Write_Ds1302( unsigned char address,unsigned char dat )     
  25. {
  26.          RST=0;
  27.         _nop_();
  28.          SCK=0;
  29.         _nop_();
  30.          RST=1;        
  31.            _nop_();
  32.          Write_Ds1302_Byte(address);        
  33.          Write_Ds1302_Byte(dat);               
  34.          RST=0;
  35. }

  36. unsigned char Read_Ds1302 ( unsigned char address )
  37. {
  38.          unsigned char i,temp=0x00;
  39.          RST=0;
  40.         _nop_();
  41.          SCK=0;
  42.         _nop_();
  43.          RST=1;
  44.         _nop_();
  45.          Write_Ds1302_Byte(address);
  46.          for (i=0;i<8;i++)         
  47.          {               
  48.                 SCK=0;
  49.                 temp>>=1;        
  50.                  if(SDA)
  51.                  temp|=0x80;        
  52.                  SCK=1;
  53.         }
  54.          RST=0;
  55.         _nop_();
  56.          RST=0;
  57.         SCK=0;
  58.         _nop_();
  59.         SCK=1;
  60.         _nop_();
  61.         SDA=0;
  62.         _nop_();
  63.         SDA=1;
  64.         _nop_();
  65.         return (temp);                        
  66. }
  67. void DS1302_init(uchar hour,uchar min,uchar s)
  68. {
  69.           Write_Ds1302(0x84,hour);
  70.           Write_Ds1302(0x82,min);
  71.           Write_Ds1302(0x80,s);
  72. }
  73. uchar hour,min,s;
  74. void DS1302_read()
  75. {
  76.           hour=Read_Ds1302(0x85);
  77.         min= Read_Ds1302(0x83);
  78.         s= Read_Ds1302(0x81);
  79. }
復(fù)制代碼
ds1302.h
  1. #ifndef __DS1302_H
  2. #define __DS1302_H

  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. void Write_Ds1302_Byte(unsigned  char temp);
  6. void Write_Ds1302( unsigned char address,unsigned char dat );
  7. unsigned char Read_Ds1302 ( unsigned char address );
  8. void DS1302_read();
  9. void DS1302_init(uchar hour,uchar min,uchar s);

  10. #endif
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:328014 發(fā)表于 2020-10-12 22:23 | 只看該作者
電路圖能分享一下嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91麻豆产精品久久久久久 | 色偷偷噜噜噜亚洲男人 | 龙珠z在线观看 | 日韩在线播放一区 | 丝袜 亚洲 欧美 日韩 综合 | 国产视频h | 91久久综合亚洲鲁鲁五月天 | 全部免费毛片在线播放网站 | 中文字幕乱码一区二区三区 | 91婷婷韩国欧美一区二区 | 亚洲一级黄色 | 日韩中文在线观看 | 国产日韩欧美一区二区在线播放 | 操人网| 国产精品国产a | 黄色大片网站 | 免费性视频 | 免费久久99精品国产婷婷六月 | 天天干天天操天天爽 | 男人的天堂avav | 成人精品一区二区三区中文字幕 | 久久久久91| 99精品免费久久久久久日本 | 国产91久久久久久久免费 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 午夜小电影 | 91文字幕巨乱亚洲香蕉 | 国产在线播放av | 久久精品欧美视频 | 国产乱人伦精品一区二区 | 中国美女撒尿txxxxx视频 | 国产视频中文字幕 | 黑人久久久 | av片在线观看网站 | 成人h动漫亚洲一区二区 | 99精品在线 | 久久99成人 | 99久久久久| 99久久99 | 免费一级片 | 日韩精品一区二区三区免费观看 |