找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机自动浇花组合控制程序

[复制链接]
跳转到指定楼层
楼主

自动浇花的所有资料51hei提供下载:
自动浇花.zip (271.56 KB, 下载次数: 38)

单片机源程序如下:
  1. //河南理工大学电器开发部单片机应用大赛之自动浇花
  2. //创新组 李~~
  3. //C语言代码如下:
  4. #include<stc12.h>                          //WD代表与温度有关
  5. #include<math.h>                          //SD代表与湿度有关
  6. #include<stdio.h>                          //GZ代表与关照有关
  7. #include<intrins.h>                          //YJ代表与液晶有关

  8. #define uint unsigned int          //   宏定义
  9. #define uchar unsigned char
  10. #define        SlaveAddress  0x46   //定义器件在IIC总线中的从地址
  11. typedef unsigned char BYTE;

  12. BYTE BUF[8];                          //光照接收数据缓存区
  13. sbit lcdrs=P1^0;                  //数据或者命令选择端
  14. sbit    RW=P1^1;                  //数据读写选择
  15. sbit lcden=P1^2;                  //使能信hao
  16. sbit  led1=P1^4;                //喜阳模式亮
  17. sbit  led2=P1^5;                //喜阴模式亮       
  18. sbit   SCL=P2^5;            //IIC时钟引脚定义
  19. sbit   SDA=P2^6;            //IIC数据引脚定义
  20. sbit    DQ=P2^7;                  //DS18B20温度传感器的信号线
  21. sbit zhuan=P3^0;                //继电器控制
  22. sbit  beep=P3^1;                //蜂鸣器
  23. sbit  key1=P3^2;                //按键1
  24. sbit  key2=P3^3;                //按键2
  25. sbit  led=P1^7;                        //湿度指示灯

  26. uint data_GZ,data_SD,data_WD,SDH,SDL,GZ,WD,SD;                 //全局变量
  27. uchar wanGZ,qianGZ,baiGZ,shiGZ,geGZ,shiSD,geSD,baiWD,shiWD,geWD;
  28. uchar code num[]={"0123456879"};
  29. uchar code type[]={"XIYINXIYANGWDSDGZ:%'C"};

  30. //液晶,延时及判断模式的函数的声明                                          
  31. void write_com(uchar com);                   //液晶写命令
  32. void write_data(uchar date);           //液晶写数据
  33. void InitYJ();
  34. void moshi();                                       //液晶初始化
  35. void deal();                                           //判断温度。湿度,光照
  36. void delay_us(uint);                           //延时一微妙
  37. void delay_ms(uint);                           //延时一毫秒

  38. //光照部分有关函数的声明
  39. void BH1750_Start();                                                  //起始信号  
  40. void BH1750_Stop();                                                     //停止信号
  41. void BH1750_SendACK(bit ack);                                  //应答ACK
  42. bit BH1750_RecvACK();                                                  //读ACK
  43. void BH1750_SendByte(BYTE dat);                                  //IIC单个字节写
  44. BYTE BH1750_RecvByte();                                                  //IIC单个字节读
  45. void Single_Write_BH1750(uchar REG_Address);//单个写入数据
  46. void Multiple_read_BH1750(void)        ;                        //连续的读取内部寄存
  47. uint getdata_GZ();                                                        //读取光照的数据
  48. void show_GZ();                                                                //在液晶上显示光照

  49. //湿度部分有关函数的声明
  50. void initADC();                                                           //初始化AD转换
  51. uint getdata_SD();                                                   //读取湿度的数据
  52. void show_SD();                                                           //在液晶上显示湿度

  53. //温度部分有关函数的声明
  54. void Init_DS18B20();                                          //初始化DS18B20
  55. uchar ReadOneChar();                                             //读一位数据
  56. void WriteOneChar(uchar dat);                          //写入数据
  57. void show_WD();                                                          //在液晶上显示温度
  58. uint ReadTemp(void);                                          //读取温度数据

  59. void main()                                                                   //主函数
  60. {   
  61.         InitYJ();                                                          //初始化液晶
  62.         while(1)
  63.         {
  64.           moshi();                                                          //模式选择
  65.           show_GZ();                                                  //光照显示
  66.           show_WD();                                                  //温度显示
  67.           show_SD();                                                  //湿度显示
  68.           deal();                                                           //处理函数
  69.         }
  70. }
  71. //液晶的部分
  72. void write_com(uchar com)//写命令的状态
  73. {
  74.         lcdrs=0;//选择写命令模式
  75.         P0=com;        // 将要写入的命令送到数据总线上
  76.         delay_ms(5);//        稍作延时以待数据稳定
  77.         lcden=1; //
  78.         delay_ms(5);//
  79.         lcden=0; //

  80. }
  81. void write_data(uchar date)//写数据的状态
  82. {
  83.         lcdrs=1; //         写数据
  84.         P0=date;  //  p0使显示数据总线
  85.         delay_ms(5); //
  86.         lcden=1;  //
  87.         delay_ms(5); //
  88.         lcden=0;  //

  89. }
  90. void InitYJ()         //初始化的状态
  91. {  RW=0;
  92.    lcden=0;//
  93.    write_com(0x38);        //设置16*2显示,5*7点阵,8位数据接口
  94.    write_com(0x0c);        //设置开显示,不显示光标
  95.    write_com(0x06);        //写一个字符后地址自动加1
  96.    write_com(0x01);//清除所有
  97.    write_com(0x80);       
  98. }
  99. //光照的部分
  100. void BH1750_Start()                                //起始信号
  101. {
  102.     SDA = 1;                    //拉高数据线
  103.     SCL = 1;                    //拉高时钟线
  104.     delay_us(5);                 //延时
  105.     SDA = 0;                    //产生下降沿
  106.     delay_us(5);                 //延时
  107.     SCL = 0;                    //拉低时钟线
  108. }
  109. void BH1750_Stop()                                //停止信号
  110. {
  111.     SDA = 0;                    //拉低数据线
  112.     SCL = 1;                    //拉高时钟线
  113.     delay_us(5);                 //延时
  114.     SDA = 1;                    //产生上升沿
  115.     delay_us(5);                 //延时
  116. }
  117. void BH1750_SendACK(bit ack)        //发送应答信号
  118. {
  119.     SDA = ack;                  //写应答信号
  120.     SCL = 1;                    //拉高时钟线
  121.     delay_us(5);                 //延时
  122.     SCL = 0;                    //拉低时钟线
  123.     delay_us(5);                 //延时
  124. }
  125. bit BH1750_RecvACK()                        //接收应答信号
  126. {
  127.     SCL = 1;                    //拉高时钟线
  128.     delay_us(5);                 //延时
  129.     CY = SDA;                   //读应答信号
  130.     SCL = 0;                    //拉低时钟线
  131.     delay_us(5);                 //延时
  132.     return CY;
  133. }
  134. void BH1750_SendByte(BYTE dat)         //向IIC总线发送一个字节数据
  135. {
  136.     BYTE i;

  137.     for (i=0; i<8; i++)         //8位计数器
  138.     {
  139.         dat <<= 1;              //移出数据的最高位
  140.         SDA = CY;               //送数据口
  141.         SCL = 1;                //拉高时钟线
  142.         delay_us(5);             //延时
  143.         SCL = 0;                //拉低时钟线
  144.         delay_us(5);             //延时
  145.     }
  146.     BH1750_RecvACK();
  147. }
  148. BYTE BH1750_RecvByte()                        //从IIC总线接收一个字节数据
  149. {
  150.     BYTE i;
  151.     BYTE dat = 0;

  152.     SDA = 1;                    //使能内部上拉,准备读取数据,
  153.     for (i=0; i<8; i++)         //8位计数器
  154.     {
  155.         dat <<= 1;
  156.         SCL = 1;                //拉高时钟线
  157.         delay_us(5);             //延时
  158.         dat |= SDA;             //读数据               
  159.         SCL = 0;                //拉低时钟线
  160.         delay_us(5);             //延时
  161.     }
  162.     return dat;
  163. }
  164. void Single_Write_BH1750(uchar REG_Address)
  165. {
  166.     BH1750_Start();                  //起始信号
  167.     BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
  168.     BH1750_SendByte(REG_Address);    //内部寄存器地址
  169.     BH1750_Stop();                   //发送停止信号
  170. }
  171. void Multiple_read_BH1750(void)                          //连续读出BH1750内部数据
  172. {   uint i;       
  173.     BH1750_Start();                          //起始信号
  174.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  175.        
  176.          for (i=0; i<3; i++)                      //连续读取6个地址数据,存储中BUF
  177.     {
  178.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
  179.         if (i == 3)
  180.         {

  181.            BH1750_SendACK(1);                //最后一个数据需要回NOACK
  182.         }
  183.         else
  184.         {               
  185.           BH1750_SendACK(0);                //回应ACK
  186.        }
  187.    }

  188.     BH1750_Stop();                          //停止信号
  189.     delay_ms(5);
  190. }

  191. uint getdata_GZ()                                           //
  192. {         
  193.     Single_Write_BH1750(0x01);    //初始化BH1750
  194.     Single_Write_BH1750(0x01);   // 上电
  195.     Single_Write_BH1750(0x10);   // 置高
  196.     delay_ms(6000);              //延时
  197.     Multiple_read_BH1750();       //连续读出数据,存储在BUF中
  198.     data_GZ=BUF[0];
  199.     data_GZ=(data_GZ<<8)+BUF[1];//合成数据
  200.     data_GZ=(uint)data_GZ/1.2;
  201.         return         data_GZ;
  202. }
  203. void show_GZ()                                           //
  204. {        uint i;
  205.         i=getdata_GZ();;
  206.     wanGZ=i/10000;                     //计算数据的万千百十个位
  207.         qianGZ=i%10000/1000;
  208.     baiGZ=i%10000%1000/100;
  209.     shiGZ=i%10000%1000%100/10;
  210.     geGZ=i%10000%1000%100%10;
  211.         write_com(0x80+0x08);
  212.         write_data(type[15]);
  213.         write_data(type[16]);
  214.         write_data(type[17]);
  215.         write_data(num[wanGZ]);
  216.         write_data(num[qianGZ]);
  217.         write_data(num[baiGZ]);
  218.         write_data(num[shiGZ]);
  219.         write_data(num[geGZ]);

  220. }
  221. //湿度有关的部分
  222. void initADC()                                                   //
  223. {
  224.         P1ASF=0x08;
  225.         ADC_RES=0;
  226.         ADC_RESL=0;
  227.         ADC_CONTR=0x80;
  228.         delay_ms(16);
  229. }
  230. uint getdata_SD()                                         //
  231. {   
  232.         initADC();
  233.         ADC_CONTR=0x8b;                                         //代表10001011
  234.         _nop_();                                                 //等待四个NOP
  235.         _nop_();
  236.         _nop_();
  237.         _nop_();
  238.         while(!(ADC_CONTR&0x10));                //验证是否完成ADC转换
  239.         ADC_CONTR&=~0x10;                                //关闭ADC
  240.         data_SD=ADC_RES;
  241.         data_SD|=ADC_RES;                                                //转化为十进制
  242.         data_SD<<=2;
  243.         data_SD|=ADC_RESL;
  244.         data_SD=((data_SD*460)/1024);
  245.         return data_SD;
  246. }
  247. void show_SD()                                           //
  248. {  uint i,m=0,n;
  249.    for(i=0;i<100;i++)                           //取一百次平均值
  250.    {
  251.       n=getdata_SD();
  252.           m=m+n;
  253.    }
  254. //  i=getdata_SD();
  255.    i=m/100;
  256.    shiSD=i/10;
  257.    geSD=i%10;
  258.    write_com(0x80+0x40);
  259.    write_data(type[13]);
  260.    write_data(type[14]);
  261.    write_data(type[17]);
  262.    write_data(num[shiSD]);
  263.    write_data(num[geSD]);
  264.    write_data(type[18]);
  265. }

  266. // 温度部分
  267. void Init_DS18B20(void)                                //
  268. {
  269.         uchar x=0;
  270.         DQ = 1; //DQ复位
  271.         delay_us(80); //稍做延时
  272.         DQ = 0; //单片机将DQ拉低
  273.         delay_us(800); //精确延时 大于 480us
  274.         DQ = 1; //拉高总线
  275.         delay_us(140);
  276.         x=DQ; delay_us(200);
  277. }
  278. uchar ReadOneChar(void)                           //
  279. {
  280.         uchar i=0;
  281.         uchar dat = 0;
  282.         for (i=8;i>0;i--)
  283.         {
  284.           DQ = 0; // 给脉冲信号
  285.       dat>>=1;
  286.       DQ = 1; // 给脉冲信号
  287.      if(DQ)
  288.       dat|=0x80;
  289.       delay_us(40); //40
  290.         }
  291.    return(dat);
  292. }
  293. void WriteOneChar(uchar dat)         //
  294. {
  295.         uchar i=0;
  296.         for (i=8;i>0; i--)
  297.     {
  298.       DQ = 0;
  299.       DQ = dat&0x01;
  300.       delay_us(50); //50
  301.       DQ = 1;
  302.       dat>>=1;
  303.         }
  304. }
  305. uint ReadTemp(void)                        //
  306. {
  307.         uchar a=0;
  308.         uchar b=0;
  309.         uint temp_value=0;
  310.         Init_DS18B20();
  311.         WriteOneChar(0xCC);
  312.         WriteOneChar(0x44);
  313.         delay_us(1000);
  314.         Init_DS18B20();
  315.         WriteOneChar(0xCC);
  316.         WriteOneChar(0xBE);
  317.         delay_us(1000);
  318.         a=ReadOneChar(); //读取温度值低位
  319.         b=ReadOneChar(); //读取温度值高位
  320.         temp_value = b<<8;
  321.         temp_value |= a;
  322.         temp_value=temp_value*0.062;
  323.         data_WD=temp_value;
  324.         return data_WD;
  325. }
  326. void show_WD()                           //
  327. {        uint t;
  328.     t=ReadTemp();
  329.         baiWD=t/100;
  330.         shiWD=t%100/10;
  331.         geWD=t%100%10;
  332.         write_com(0x80+0x47);
  333.         write_data(type[11]);
  334.         write_data(type[12]);
  335.         write_data(type[17]);
  336.         write_data(num[baiWD]);
  337.         write_data(num[shiWD]);
  338.         write_data(num[geWD]);
  339.         write_data(type[19]);
  340.         write_data(type[20]);  
  341. ……………………

  342. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码





评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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