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

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

QQ登錄

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

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

單片機(jī)自動(dòng)澆花組合控制程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

自動(dòng)澆花的所有資料51hei提供下載:
自動(dòng)澆花.zip (271.56 KB, 下載次數(shù): 38)

單片機(jī)源程序如下:
  1. //河南理工大學(xué)電器開(kāi)發(fā)部單片機(jī)應(yīng)用大賽之自動(dòng)澆花
  2. //創(chuàng)新組 李~~
  3. //C語(yǔ)言代碼如下:
  4. #include<stc12.h>                          //WD代表與溫度有關(guān)
  5. #include<math.h>                          //SD代表與濕度有關(guān)
  6. #include<stdio.h>                          //GZ代表與關(guān)照有關(guān)
  7. #include<intrins.h>                          //YJ代表與液晶有關(guān)

  8. #define uint unsigned int          //   宏定義
  9. #define uchar unsigned char
  10. #define        SlaveAddress  0x46   //定義器件在IIC總線中的從地址
  11. typedef unsigned char BYTE;

  12. BYTE BUF[8];                          //光照接收數(shù)據(jù)緩存區(qū)
  13. sbit lcdrs=P1^0;                  //數(shù)據(jù)或者命令選擇端
  14. sbit    RW=P1^1;                  //數(shù)據(jù)讀寫(xiě)選擇
  15. sbit lcden=P1^2;                  //使能信hao
  16. sbit  led1=P1^4;                //喜陽(yáng)模式亮
  17. sbit  led2=P1^5;                //喜陰模式亮       
  18. sbit   SCL=P2^5;            //IIC時(shí)鐘引腳定義
  19. sbit   SDA=P2^6;            //IIC數(shù)據(jù)引腳定義
  20. sbit    DQ=P2^7;                  //DS18B20溫度傳感器的信號(hào)線
  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. //液晶,延時(shí)及判斷模式的函數(shù)的聲明                                          
  31. void write_com(uchar com);                   //液晶寫(xiě)命令
  32. void write_data(uchar date);           //液晶寫(xiě)數(shù)據(jù)
  33. void InitYJ();
  34. void moshi();                                       //液晶初始化
  35. void deal();                                           //判斷溫度。濕度,光照
  36. void delay_us(uint);                           //延時(shí)一微妙
  37. void delay_ms(uint);                           //延時(shí)一毫秒

  38. //光照部分有關(guān)函數(shù)的聲明
  39. void BH1750_Start();                                                  //起始信號(hào)  
  40. void BH1750_Stop();                                                     //停止信號(hào)
  41. void BH1750_SendACK(bit ack);                                  //應(yīng)答ACK
  42. bit BH1750_RecvACK();                                                  //讀ACK
  43. void BH1750_SendByte(BYTE dat);                                  //IIC單個(gè)字節(jié)寫(xiě)
  44. BYTE BH1750_RecvByte();                                                  //IIC單個(gè)字節(jié)讀
  45. void Single_Write_BH1750(uchar REG_Address);//單個(gè)寫(xiě)入數(shù)據(jù)
  46. void Multiple_read_BH1750(void)        ;                        //連續(xù)的讀取內(nèi)部寄存
  47. uint getdata_GZ();                                                        //讀取光照的數(shù)據(jù)
  48. void show_GZ();                                                                //在液晶上顯示光照

  49. //濕度部分有關(guān)函數(shù)的聲明
  50. void initADC();                                                           //初始化AD轉(zhuǎn)換
  51. uint getdata_SD();                                                   //讀取濕度的數(shù)據(jù)
  52. void show_SD();                                                           //在液晶上顯示濕度

  53. //溫度部分有關(guān)函數(shù)的聲明
  54. void Init_DS18B20();                                          //初始化DS18B20
  55. uchar ReadOneChar();                                             //讀一位數(shù)據(jù)
  56. void WriteOneChar(uchar dat);                          //寫(xiě)入數(shù)據(jù)
  57. void show_WD();                                                          //在液晶上顯示溫度
  58. uint ReadTemp(void);                                          //讀取溫度數(shù)據(jù)

  59. void main()                                                                   //主函數(shù)
  60. {   
  61.         InitYJ();                                                          //初始化液晶
  62.         while(1)
  63.         {
  64.           moshi();                                                          //模式選擇
  65.           show_GZ();                                                  //光照顯示
  66.           show_WD();                                                  //溫度顯示
  67.           show_SD();                                                  //濕度顯示
  68.           deal();                                                           //處理函數(shù)
  69.         }
  70. }
  71. //液晶的部分
  72. void write_com(uchar com)//寫(xiě)命令的狀態(tài)
  73. {
  74.         lcdrs=0;//選擇寫(xiě)命令模式
  75.         P0=com;        // 將要寫(xiě)入的命令送到數(shù)據(jù)總線上
  76.         delay_ms(5);//        稍作延時(shí)以待數(shù)據(jù)穩(wěn)定
  77.         lcden=1; //
  78.         delay_ms(5);//
  79.         lcden=0; //

  80. }
  81. void write_data(uchar date)//寫(xiě)數(shù)據(jù)的狀態(tài)
  82. {
  83.         lcdrs=1; //         寫(xiě)數(shù)據(jù)
  84.         P0=date;  //  p0使顯示數(shù)據(jù)總線
  85.         delay_ms(5); //
  86.         lcden=1;  //
  87.         delay_ms(5); //
  88.         lcden=0;  //

  89. }
  90. void InitYJ()         //初始化的狀態(tài)
  91. {  RW=0;
  92.    lcden=0;//
  93.    write_com(0x38);        //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  94.    write_com(0x0c);        //設(shè)置開(kāi)顯示,不顯示光標(biāo)
  95.    write_com(0x06);        //寫(xiě)一個(gè)字符后地址自動(dòng)加1
  96.    write_com(0x01);//清除所有
  97.    write_com(0x80);       
  98. }
  99. //光照的部分
  100. void BH1750_Start()                                //起始信號(hào)
  101. {
  102.     SDA = 1;                    //拉高數(shù)據(jù)線
  103.     SCL = 1;                    //拉高時(shí)鐘線
  104.     delay_us(5);                 //延時(shí)
  105.     SDA = 0;                    //產(chǎn)生下降沿
  106.     delay_us(5);                 //延時(shí)
  107.     SCL = 0;                    //拉低時(shí)鐘線
  108. }
  109. void BH1750_Stop()                                //停止信號(hào)
  110. {
  111.     SDA = 0;                    //拉低數(shù)據(jù)線
  112.     SCL = 1;                    //拉高時(shí)鐘線
  113.     delay_us(5);                 //延時(shí)
  114.     SDA = 1;                    //產(chǎn)生上升沿
  115.     delay_us(5);                 //延時(shí)
  116. }
  117. void BH1750_SendACK(bit ack)        //發(fā)送應(yīng)答信號(hào)
  118. {
  119.     SDA = ack;                  //寫(xiě)應(yīng)答信號(hào)
  120.     SCL = 1;                    //拉高時(shí)鐘線
  121.     delay_us(5);                 //延時(shí)
  122.     SCL = 0;                    //拉低時(shí)鐘線
  123.     delay_us(5);                 //延時(shí)
  124. }
  125. bit BH1750_RecvACK()                        //接收應(yīng)答信號(hào)
  126. {
  127.     SCL = 1;                    //拉高時(shí)鐘線
  128.     delay_us(5);                 //延時(shí)
  129.     CY = SDA;                   //讀應(yīng)答信號(hào)
  130.     SCL = 0;                    //拉低時(shí)鐘線
  131.     delay_us(5);                 //延時(shí)
  132.     return CY;
  133. }
  134. void BH1750_SendByte(BYTE dat)         //向IIC總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)
  135. {
  136.     BYTE i;

  137.     for (i=0; i<8; i++)         //8位計(jì)數(shù)器
  138.     {
  139.         dat <<= 1;              //移出數(shù)據(jù)的最高位
  140.         SDA = CY;               //送數(shù)據(jù)口
  141.         SCL = 1;                //拉高時(shí)鐘線
  142.         delay_us(5);             //延時(shí)
  143.         SCL = 0;                //拉低時(shí)鐘線
  144.         delay_us(5);             //延時(shí)
  145.     }
  146.     BH1750_RecvACK();
  147. }
  148. BYTE BH1750_RecvByte()                        //從IIC總線接收一個(gè)字節(jié)數(shù)據(jù)
  149. {
  150.     BYTE i;
  151.     BYTE dat = 0;

  152.     SDA = 1;                    //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
  153.     for (i=0; i<8; i++)         //8位計(jì)數(shù)器
  154.     {
  155.         dat <<= 1;
  156.         SCL = 1;                //拉高時(shí)鐘線
  157.         delay_us(5);             //延時(shí)
  158.         dat |= SDA;             //讀數(shù)據(jù)               
  159.         SCL = 0;                //拉低時(shí)鐘線
  160.         delay_us(5);             //延時(shí)
  161.     }
  162.     return dat;
  163. }
  164. void Single_Write_BH1750(uchar REG_Address)
  165. {
  166.     BH1750_Start();                  //起始信號(hào)
  167.     BH1750_SendByte(SlaveAddress);   //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
  168.     BH1750_SendByte(REG_Address);    //內(nèi)部寄存器地址
  169.     BH1750_Stop();                   //發(fā)送停止信號(hào)
  170. }
  171. void Multiple_read_BH1750(void)                          //連續(xù)讀出BH1750內(nèi)部數(shù)據(jù)
  172. {   uint i;       
  173.     BH1750_Start();                          //起始信號(hào)
  174.     BH1750_SendByte(SlaveAddress+1);         //發(fā)送設(shè)備地址+讀信號(hào)
  175.        
  176.          for (i=0; i<3; i++)                      //連續(xù)讀取6個(gè)地址數(shù)據(jù),存儲(chǔ)中BUF
  177.     {
  178.         BUF[i] = BH1750_RecvByte();          //BUF[0]存儲(chǔ)0x32地址中的數(shù)據(jù)
  179.         if (i == 3)
  180.         {

  181.            BH1750_SendACK(1);                //最后一個(gè)數(shù)據(jù)需要回NOACK
  182.         }
  183.         else
  184.         {               
  185.           BH1750_SendACK(0);                //回應(yīng)ACK
  186.        }
  187.    }

  188.     BH1750_Stop();                          //停止信號(hào)
  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);              //延時(shí)
  197.     Multiple_read_BH1750();       //連續(xù)讀出數(shù)據(jù),存儲(chǔ)在BUF中
  198.     data_GZ=BUF[0];
  199.     data_GZ=(data_GZ<<8)+BUF[1];//合成數(shù)據(jù)
  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;                     //計(jì)算數(shù)據(jù)的萬(wàn)千百十個(gè)位
  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. //濕度有關(guān)的部分
  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_();                                                 //等待四個(gè)NOP
  235.         _nop_();
  236.         _nop_();
  237.         _nop_();
  238.         while(!(ADC_CONTR&0x10));                //驗(yàn)證是否完成ADC轉(zhuǎn)換
  239.         ADC_CONTR&=~0x10;                                //關(guān)閉ADC
  240.         data_SD=ADC_RES;
  241.         data_SD|=ADC_RES;                                                //轉(zhuǎn)化為十進(jìn)制
  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復(fù)位
  271.         delay_us(80); //稍做延時(shí)
  272.         DQ = 0; //單片機(jī)將DQ拉低
  273.         delay_us(800); //精確延時(shí) 大于 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; // 給脈沖信號(hào)
  285.       dat>>=1;
  286.       DQ = 1; // 給脈沖信號(hào)
  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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼





評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 男女在线免费观看 | 91av视频在线观看 | 巨大荫蒂视频欧美另类大 | 久久乐国产精品 | 精品久久久久久久久久久久 | 日本三级在线视频 | 国内自拍偷拍一区 | 国产视频二区 | 成人一区在线观看 | 国产精品成人在线观看 | 欧美黑人巨大videos精品 | 99国产精品久久久久久久 | 欧美女优在线观看 | 黄色在线观看网址 | 欧美精品成人一区二区三区四区 | 欧美一级欧美一级在线播放 | 黄色福利 | 天堂va在线观看 | 日本成人免费观看 | 四色永久 | 中文在线亚洲 | 91精品国产综合久久久久久丝袜 | 日韩在线中文字幕 | 免费特黄视频 | 成人免费视频观看 | 日韩av在线免费 | 久久在线免费 | 精品视频在线免费观看 | 在线看一区二区 | 日韩在线观看视频一区 | 91精品国产高清久久久久久久久 | 久久久久久久久91 | 成人在线免费av | 99精品国产一区二区三区 | www.黄网 | 高清国产午夜精品久久久久久 | 日韩在线中文字幕 | 亚洲伊人a | 久久久亚洲一区 | 夜夜久久| 国产999精品久久久影片官网 |