找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机模拟智能灌溉系统程序

[复制链接]
ID:785561 发表于 2020-10-12 13:18 | 显示全部楼层 |阅读模式
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;        //初始,自动模式
  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)        //延时函数
  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();          //独立按键
  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)   //自动模式
  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)        //手动模式
  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; //关闭蜂鸣器和继电器
  97.   Y6;P0=0xff; //打开数码管位选
  98.   Y7;P0=0xff; //关闭数码管段选
  99.   Y4;P0=0xff; //关闭led灯
  100. }
  101. void display1(uchar yi,uchar er) //数码管显示
  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) //独立按键处理
  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. }  
复制代码
iic.c
  1. /*
  2.   程序说明: IIC总线驱动程序
  3.   软件环境: Keil uVision 4.10
  4.   硬件环境: CT107单片机综合实训平台 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;  /* 数据线 */
  15. sbit SCL = P2^0;  /* 时钟线 */


  16. //总线启动条件
  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. //应答位控制
  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. //等待应答
  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. //通过I2C总线发送数据
  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总线上接收数据
  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. }
复制代码
iic.h
  1. #ifndef _IIC_H
  2. #define _IIC_H

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

  5. //函数声明
  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
复制代码
ds1302.c
  1. /*
  2.   程序说明: DS1302驱动程序
  3.   软件环境: Keil uVision 4.10
  4.   硬件环境: CT107单片机综合实训平台 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复位                                                                                                

  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. }
复制代码
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
复制代码


回复

使用道具 举报

ID:328014 发表于 2020-10-12 22:23 | 显示全部楼层
电路图能分享一下吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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