Arduino開發(fā)從入門到實(shí)戰(zhàn)程序源代碼_第1頁(yè)
Arduino開發(fā)從入門到實(shí)戰(zhàn)程序源代碼_第2頁(yè)
Arduino開發(fā)從入門到實(shí)戰(zhàn)程序源代碼_第3頁(yè)
Arduino開發(fā)從入門到實(shí)戰(zhàn)程序源代碼_第4頁(yè)
Arduino開發(fā)從入門到實(shí)戰(zhàn)程序源代碼_第5頁(yè)
已閱讀5頁(yè),還剩106頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

程序源碼第五章炫酷LED燈5.4.2程序源碼//項(xiàng)目一——LED閃爍燈intLEDPin=13;voidsetup(){pinMode(LEDPin,OUTPUT);//13腳設(shè)置為輸出}voidloop(){digitalWrite(LEDPin,HIGH);//設(shè)定PIN13腳為HIGH=5V左右delay(1000);//設(shè)定延時(shí)時(shí)間,1000=1sdigitalWrite(LEDPin,LOW);//設(shè)定PIN13腳為L(zhǎng)OW=0Vdelay(1000);//設(shè)定延時(shí)時(shí)間,1000=1s}5.7拓展實(shí)驗(yàn)廣告燈拓展實(shí)驗(yàn)參考程序?yàn)椋?/設(shè)置控制LED的數(shù)字I/O腳intLED1=1;intLED2=2;intLED3=3;intLED4=4;intLED5=5;intLED6=6;//LED燈花樣顯示樣式1子程序voidstyle_1(void){unsignedcharj;for(j=1;j=6;j++)//每隔200ms依次點(diǎn)亮1~6引腳相連的LED燈{digitalWrite(j,HIGH);//點(diǎn)亮與j引腳相連的LED燈delay(200);//延時(shí)200ms}for(j=6;j=1;j--)//每隔200ms依次熄滅與6~1引腳相連的LED燈{digitalWrite(j,LOW);//熄滅與j引腳相連的LED燈delay(200);//延時(shí)200ms}}//燈閃爍子程序voidflash(void){unsignedcharj,k;for(k=0;k=1;k++)//閃爍兩次{for(j=1;j=6;j++)//點(diǎn)亮與1~6引腳相連的LED燈digitalWrite(j,HIGH);//點(diǎn)亮與j引腳相連的LED燈delay(200);//延時(shí)200msfor(j=1;j=6;j++)//熄滅與1~6引腳相連的LED燈digitalWrite(j,LOW);//熄滅與j引腳相連的LED燈delay(200);//延時(shí)200ms}}//LED燈花樣顯示樣式2子程序voidstyle_2(void){unsignedcharj,k;k=1;//設(shè)置k的初值為1for(j=3;j=1;j--){digitalWrite(j,HIGH);//點(diǎn)亮燈digitalWrite(j+k,HIGH);//點(diǎn)亮燈delay(400);//延時(shí)400msk+=2;//k值加2}k=5;//設(shè)置k值為5for(j=1;j=3;j++){digitalWrite(j,LOW);//熄滅燈digitalWrite(j+k,LOW);//熄滅燈delay(400);//延時(shí)400msk-=2;//k值減2}}//LED燈花樣顯示樣式3子程序voidstyle_3(void){unsignedcharj,k;//LED燈花樣顯示樣式3子程序k=5;//設(shè)置k值為5for(j=1;j=3;j++){digitalWrite(j,HIGH);//點(diǎn)亮燈digitalWrite(j+k,HIGH);//點(diǎn)亮燈delay(400);//延時(shí)400msdigitalWrite(j,LOW);//熄滅燈digitalWrite(j+k,LOW);//熄滅燈k-=2;//k值減2}k=3;//設(shè)置k值為3for(j=2;j=1;j--){digitalWrite(j,HIGH);//點(diǎn)亮燈digitalWrite(j+k,HIGH);//點(diǎn)亮燈delay(400);//延時(shí)400msdigitalWrite(j,LOW);//熄滅燈digitalWrite(j+k,LOW);//熄滅燈k+=2;//k值加2}}voidsetup(){unsignedchari;for(i=1;i=6;i++)//依次設(shè)置1~6個(gè)數(shù)字引腳為輸出模式pinMode(i,OUTPUT);//設(shè)置第i個(gè)引腳為輸出模式}voidloop(){style_1();//樣式1flash();//閃爍style_2();//樣式2flash();//閃爍style_3();//樣式3flash();//閃爍

第六章按鍵開關(guān)輸入6.4.2程序源碼intLED=13;//設(shè)置控制LED的數(shù)字I/O腳voidsetup(){pinMode(LED,OUTPUT);//設(shè)置數(shù)字I/O引腳為輸出模式}voidloop(){inti;while(1){i=analogRead(A0);//讀取模擬0口電壓值if(i>1000)//如果電壓值大于1000(即4.88V)digitalWrite(LED,HIGH);//設(shè)置第13引腳為高電平,點(diǎn)亮LED燈elsedigitalWrite(LED,LOW);//設(shè)置第13引腳為低電平,熄滅LED燈}}6.6拓展實(shí)驗(yàn)#defineLED13#definesw7intval=0;intold_val=0;intstate=0;//定義狀態(tài)位voidsetup(){pinMode(LED,OUTPUT);pinMode(sw,INPUT);}voidloop(){val=digitalRead(sw);if((val==HIGH)&&(old_val==LOW)){state=1-state;//狀態(tài)位取反delay(10);}old_val=val;if(state==1){digitalWrite(LED,HIGH);}else{digitalWrite(LED,LOW);}}

第七章觸摸開關(guān)7.4.2程序源碼#defineLED13//設(shè)置控制LED的數(shù)字I/O腳voidsetup(){pinMode(LED,OUTPUT);//設(shè)置數(shù)字I/O引腳為輸出模式}voidloop(){inti;while(1){i=digitalRead(10);//讀取電壓值if(i==LOW)//如果為低電平digitalWrite(LED,HIGH);//設(shè)置第13引腳為高電平,點(diǎn)亮LED燈elsedigitalWrite(LED,LOW);//設(shè)置第13引腳為低電平,熄滅LED燈}}7.6拓展實(shí)驗(yàn)#defineLED13//設(shè)置控制LED的數(shù)字I/O腳voidsetup(){pinMode(LED,OUTPUT);//設(shè)置數(shù)字I/O引腳為輸出模式}voidloop(){inti;digitalWrite(LED,LOW);i=digitalRead(10);//讀取電壓值if(i==LOW){//如果為低電平while(1){digitalWrite(LED,HIGH);//設(shè)置第13引腳為高電平,點(diǎn)亮LED燈delay(10000);break;}}}

第8章溫度與濕度監(jiān)測(cè)8.4.2程序源碼#defineDHT11_PIN0byteread_dht11_dat()//讀取DHT11數(shù)據(jù)(每次獲取8位){bytei=0;byteresult=0;for(i=0;i<8;i++){while(!(PINC&_BV(DHT11_PIN)));delayMicroseconds(30);if(PINC&_BV(DHT11_PIN))result|=(1<<(7-i));while((PINC&_BV(DHT11_PIN)));}returnresult;//返回獲取的結(jié)果}voidsetup(){DDRC|=_BV(DHT11_PIN);PORTC|=_BV(DHT11_PIN);Serial.begin(19200);Serial.println("Ready");//串口輸出提示信息}voidloop(){bytedht11_dat[5];bytedht11_in;bytei;PORTC&=~_BV(DHT11_PIN);delay(18);PORTC|=_BV(DHT11_PIN);delayMicroseconds(40);DDRC&=~_BV(DHT11_PIN);delayMicroseconds(40);dht11_in=PINC&_BV(DHT11_PIN);if(dht11_in){Serial.println("dht11startcondition1notmet");return;}delayMicroseconds(80);dht11_in=PINC&_BV(DHT11_PIN);if(!dht11_in){Serial.println("dht11startcondition2notmet");return;}delayMicroseconds(80);for(i=0;i<5;i++)dht11_dat[i]=read_dht11_dat();//獲取40位溫度與濕度數(shù)據(jù)DDRC|=_BV(DHT11_PIN);PORTC|=_BV(DHT11_PIN);bytedht11_check_sum=dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];if(dht11_dat[4]!=dht11_check_sum)//校驗(yàn){Serial.println("DHT11checksumerror");}Serial.print("Currenthumdity=");Serial.print(dht11_dat[0],DEC);//顯示濕度整數(shù)部分Serial.print(".");Serial.print(dht11_dat[1],DEC);//顯示濕度小數(shù)部分Serial.print("%");Serial.print("temperature=");Serial.print(dht11_dat[2],DEC);//顯示溫度整數(shù)部分Serial.print(".");Serial.print(dht11_dat[3],DEC);//顯示溫度小數(shù)部分Serial.println("C");}8.6拓展實(shí)驗(yàn)#defineDHT11_PIN0intLED=8;intBuzzer=7;byteread_dht11_dat(){bytei=0;byteresult=0;for(i=0;i<8;i++){while(!(PINC&_BV(DHT11_PIN)));delayMicroseconds(30);if(PINC&_BV(DHT11_PIN))result|=(1<<(7-i));while((PINC&_BV(DHT11_PIN)));}returnresult;}voidsetup(){DDRC|=_BV(DHT11_PIN);PORTC|=_BV(DHT11_PIN);pinMode(LED,OUTPUT);pinMode(Buzzer,OUTPUT);Serial.begin(19200);Serial.println("Ready");}voidloop(){bytedht11_dat[5];bytedht11_in;bytei;PORTC&=~_BV(DHT11_PIN);delay(18);PORTC|=_BV(DHT11_PIN);delayMicroseconds(40);DDRC&=~_BV(DHT11_PIN);delayMicroseconds(40);dht11_in=PINC&_BV(DHT11_PIN);if(dht11_in){Serial.println("dht11startcondition1notmet");return;}delayMicroseconds(80);dht11_in=PINC&_BV(DHT11_PIN);if(!dht11_in){Serial.println("dht11startcondition2notmet");return;}delayMicroseconds(80);for(i=0;i<5;i++)//獲取40位溫度與濕度數(shù)據(jù)dht11_dat[i]=read_dht11_dat();DDRC|=_BV(DHT11_PIN);PORTC|=_BV(DHT11_PIN);bytedht11_check_sum=dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];if(dht11_dat[4]!=dht11_check_sum)//校驗(yàn){Serial.println("DHT11checksumerror");}Serial.print("Currenthumdity=");Serial.print(dht11_dat[0],DEC);//顯示濕度整數(shù)部分Serial.print(".");Serial.print(dht11_dat[1],DEC);//顯示濕度小數(shù)部分Serial.print("%");Serial.print("temperature=");Serial.print(dht11_dat[2],DEC);//顯示溫度整數(shù)部分Serial.print(".");Serial.print(dht11_dat[3],DEC);//顯示溫度小數(shù)部分Serial.println("C");if(dht11_dat[0]==25)digitalWrite(LED,HIGH);elsedigitalWrite(LED,LOW);if(dht11_dat[2]==28)digitalWrite(Buzzer,HIGH);elsedigitalWrite(Buzzer,LOW);delay(2000);}

第9章氣體監(jiān)測(cè)9.4.2程序源碼voidsetup(){Serial.begin(9600);}voidloop(){intval;val=analogRead(0);//獲取當(dāng)前氣體濃度Serial.println(val,DEC);//十進(jìn)制串口輸出delay(1000);}

第十章LCD顯示10.4程序設(shè)計(jì)2)實(shí)驗(yàn)程序LCD顯示實(shí)驗(yàn)參考程序源代碼為:intDI=12;intRW=11;intDB[]={3,4,5,6,7,8,9,10};//使用數(shù)組來(lái)定義總線需要的引腳intEnable=2;voidLcdCommandWrite(intvalue){//定義所有引腳inti=0;for(i=DB[0];i<=DI;i++)//總線賦值{digitalWrite(i,value&01);//因?yàn)?602液晶信號(hào)識(shí)別是D7~D0(不是D0~D7),這里是//用來(lái)反轉(zhuǎn)信號(hào)value>>=1;}digitalWrite(Enable,LOW);delayMicroseconds(1);digitalWrite(Enable,HIGH);delayMicroseconds(1);//延時(shí)1msdigitalWrite(Enable,LOW);delayMicroseconds(1);//延時(shí)1ms} voidLcdDataWrite(intvalue){//定義所有引腳inti=0;digitalWrite(DI,HIGH);digitalWrite(RW,LOW);for(i=DB[0];i<=DB[7];i++){digitalWrite(i,value&01);value>>=1;}digitalWrite(Enable,LOW);delayMicroseconds(1);digitalWrite(Enable,HIGH);delayMicroseconds(1);digitalWrite(Enable,LOW);delayMicroseconds(1);//延時(shí)1ms}voidsetup(void){inti=0;for(i=Enable;i<=DI;i++){pinMode(i,OUTPUT);}delay(100);//短暫的停頓后初始化LCD用于LCD控制需要LcdCommandWrite(0x38);//設(shè)置為8位接口,2行顯示,5×7文字大小delay(64);LcdCommandWrite(0x38);//設(shè)置為8位接口,2行顯示,5×7文字大小delay(50);LcdCommandWrite(0x38);//設(shè)置為8位接口,2行顯示,5×7文字大小delay(20);LcdCommandWrite(0x06);//輸入方式設(shè)定//自動(dòng)增量,沒有顯示移位delay(20);LcdCommandWrite(0x0E);//顯示設(shè)置//開啟顯示屏,光標(biāo)顯示,無(wú)閃爍delay(20);LcdCommandWrite(0x01);//屏幕清空,光標(biāo)位置歸零delay(100);LcdCommandWrite(0x80);//顯示設(shè)置//開啟顯示屏,光標(biāo)顯示,無(wú)閃爍delay(20);}voidloop(void){LcdCommandWrite(0x01);//屏幕清空,光標(biāo)位置歸零delay(10);LcdCommandWrite(0x80+4);delay(10);//寫入歡迎信息LcdDataWrite('W');LcdDataWrite('e');LcdDataWrite('l');LcdDataWrite('c');LcdDataWrite('o');LcdDataWrite('m');LcdDataWrite('e');LcdDataWrite('!');delay(10);LcdCommandWrite(0xc0);//定義光標(biāo)位置為第2行第1個(gè)位置delay(10);LcdDataWrite('I');LcdDataWrite('');LcdDataWrite('L');LcdDataWrite('o');LcdDataWrite('v');LcdDataWrite('e');LcdDataWrite('');LcdDataWrite('A');LcdDataWrite('r');LcdDataWrite('d');LcdDataWrite('u');LcdDataWrite('i');LcdDataWrite('n');LcdDataWrite('o');LcdDataWrite('!');delay(5000);}

第11章電機(jī)控制11.42)步進(jìn)電機(jī)實(shí)驗(yàn)程序#include<Stepper.h>//這里設(shè)置步進(jìn)電機(jī)旋轉(zhuǎn)一圈是多少步#defineSTEPS100//attachedto設(shè)置步進(jìn)電機(jī)的步數(shù)和引腳Stepperstepper(STEPS,8,9,10,11);//定義變量用來(lái)存儲(chǔ)歷史讀數(shù)intprevious=0;voidsetup(){//設(shè)置電機(jī)每分鐘的轉(zhuǎn)速為90步stepper.setSpeed(90);}voidloop(){intval=analogRead(0);//移動(dòng)步數(shù)為當(dāng)前讀數(shù)減去歷史讀數(shù)stepper.step(val-previous);//保存歷史讀數(shù)previous=val;}11.6voidsetup(){//初始化數(shù)字的引腳為輸出pinMode(13,OUTPUT);pinMode(12,OUTPUT);}voidloop(){digitalWrite(13,HIGH);digitalWrite(12,HIGH);delay(50);digitalWrite(13,LOW);digitalWrite(12,LOW);delay(200);}

第12章藍(lán)牙通信12.4程序設(shè)計(jì)voidsetup(){Serial.begin(9600);}voidloop(){while(Serial.available()){charc=Serial.read();if(c=='A'){Serial.println("HelloIamamarino");}}}

第13章Wi-Fi無(wú)線數(shù)據(jù)傳輸13.4程序設(shè)計(jì)voidsetup(){Serial.begin(9600);}voidloop(){Serial.println("HelloWorld!");delay(1000); }

第14章ZigBee無(wú)線數(shù)據(jù)傳輸14.4程序設(shè)計(jì)ZigBee無(wú)線通信實(shí)驗(yàn)參考程序源代碼分為主機(jī)程序和從機(jī)程序兩部分。1)主機(jī)程序intbutton_open=4;//開燈按鈕連在數(shù)字端口4intbutton_close=5;//關(guān)燈按鈕連在數(shù)字端口5charflag;//定義"向從機(jī)發(fā)送LED燈亮滅標(biāo)志"的變量voidsetup(){pinMode(button_open,INPUT);//設(shè)置按鈕為輸入模式pinMode(button_close,INPUT);Serial.begin(115200);//啟動(dòng)串口通信,波特率為115200bps}voidloop(){//如果亮燈按鈕按下,同時(shí)關(guān)燈按鈕松開if(digitalRead(button_open)==LOW&&digitalRead(button_close)==HIGH){flag='a';Serial.print(flag);//向從機(jī)發(fā)送燈亮標(biāo)志}//如果關(guān)燈按鈕按下,同時(shí)亮燈按鈕松開if(digitalRead(button_close)==LOW&&digitalRead(button_open)==HIGH){flag='b';Serial.print(flag);//向從機(jī)發(fā)送燈滅標(biāo)志}delay(20);//延時(shí),等待數(shù)據(jù)發(fā)送成功}2)從機(jī)程序intLEDpin=9;//LED燈連在數(shù)字端口9intval;//定義"接受主機(jī)發(fā)來(lái)的LED燈亮滅標(biāo)志"的變量voidsetup(){pinMode(LEDpin,OUTPUT);//設(shè)置LED燈為輸出模式digitalWrite(LEDpin,HIGH);//初始化使LED燈熄滅Serial.begin(115200);//啟動(dòng)串口通信,波特率為115200bps}voidloop(){if(Serial.available()>0)//查詢串口有無(wú)數(shù)據(jù){val=Serial.read();//讀取主機(jī)發(fā)送的數(shù)據(jù)if(val=='a')//如果主機(jī)發(fā)送字符'a',則點(diǎn)亮LED{digitalWrite(LEDpin,LOW);//LED燈點(diǎn)亮}if(val=='b')//如果主機(jī)發(fā)送字符'b',則熄滅LED{digitalWrite(LEDpin,HIGH);//LED燈熄滅}}}

第15章基于Arduino的智慧農(nóng)業(yè)大棚1.STC90C5A16S2單片機(jī)程序 32(1)main.c 32(2)lcd12864.c 47(3)lcd12864.h 522.Arduino主接收模塊 533.光照強(qiáng)度模塊 554.二氧化碳濃度模塊 575.空氣溫濕度模塊 586.土壤溫濕度模塊 597.pc端上位機(jī) 618.Android手機(jī)客戶端 75(1)MainActivity.java 75(2)SecondActivity.java 86(3)activity_main.xml 92(4)second_main.xml 103(5)AndroidManifest.xml 1111.STC90C5A16S2單片機(jī)程序(1)main.c//*****************************************************************************************************************////功能:串口1接收來(lái)自主arduino的串口信息,并送LCD12864顯示,控制卷簾,澆水,照明燈等外設(shè) // 串口1發(fā)送數(shù)據(jù)送PC顯示,串口2接收PC發(fā)送的指令控制外設(shè)和閾值 (bps=9600)//*****************************************************************************************************************////STC12C5A60S2單片機(jī)資源使用://// LCD12864_DATAPORTP0; 電機(jī): 噴水:P1^7// LCD12864_RS=P2^6; PH1=P1^0; 照明:P2^1// LCD12864_RW=P2^5; PH2=P1^1;// LCD12864_EN=P2^7; I01=P1^6;// LCD12864_PSB=P3^2; I11=P1^3;// LCD12864_RST=P3^4; I02=P1^4;// 串口1:RXD:P3^0; I12=P1^5;// TXD:P3^1;// 串口2:RXD:P1^2;(接收PC端信息) ArduinoTX-->P3^0J-TXD蓋跳帽左端J-RXD的USB-->P1^2//*****************************************************************************************************************////S2接收來(lái)自arduino串口信息的格式:0x8e(開始)模塊名數(shù)據(jù)字節(jié)數(shù)數(shù)據(jù)校驗(yàn)碼//2015年8月12日,現(xiàn)在改為0x8e(開始)模塊名數(shù)據(jù)(2字節(jié))!!//S1發(fā)送給PC的信息格式:0x9e(開始)模塊名數(shù)據(jù)字節(jié)數(shù)數(shù)據(jù)校驗(yàn)碼//2015年8月12日,現(xiàn)在改為 0x9e(開始)模塊名 數(shù)據(jù)//其中各模塊的名稱為:土壤濕度模塊0x00;光照強(qiáng)度模塊0x01;空氣溫濕度0x02; CO2濃度模塊0x03//各模塊存儲(chǔ)數(shù)據(jù)的位置:土壤濕度模塊dat[0];光照強(qiáng)度模塊dat[1];空氣溫濕度dat[2]; CO2濃度模塊dat[2];//計(jì)算方法:土壤濕度模塊:TU=(1-(dat[0]*256+dat[1])/1023.0)/*1000; 百分?jǐn)?shù)// 光照強(qiáng)度模塊:LIGHT=(dat[0]*256+dat[1])/1.2;//空氣溫濕度模塊: dat[0]溫度dat[1]濕度//CO2濃度模塊: dat[0]高位 dat[1]低位////*****************************************************************************************************************//#include<reg51.h>#include"lcd12864.h"#ifndef uchar#defineucharunsignedchar#endif#definexbee_sum4 //一共3個(gè)傳感器模塊//#definespeed1 //電機(jī)周期間隔(30度一周期)//*****************************************************************************************************************////STC12C5A60S2的相應(yīng)寄存器定義sfrAUXR=0X8E; //輔助寄存器,AXUR.4=BRTR(獨(dú)立bps發(fā)生器運(yùn)行使能);AXUR.3=S2SMOD(bps加倍); sfrS2CON=0X9A; //同SCON,不能位尋址sfrS2BUF=0X9B; //S2數(shù)據(jù)緩沖器sfrBRT=0X9C; //bps獨(dú)立發(fā)生器設(shè)置初值sfrIE2=0XAF; //S2中斷使能//*****************************************************************************************************************//sbitPH1=P1^0; sbitPH2=P1^1;sbitI01=P1^6;sbitI11=P1^3;sbitI02=P1^4;sbitI12=P1^5; //電機(jī)相應(yīng)引腳sbitpin_light=P2^1; //照明引腳sbitpin_water=P1^7; //澆水引腳voidserial_init(void); //串口初始化函數(shù)voids1_sentByte(uchardat); //S1發(fā)送一個(gè)字節(jié)函數(shù)uchars1_getByte(void); //S1接收一個(gè)字節(jié)函數(shù)voidpc_sent(void); //發(fā)送數(shù)據(jù)給PCvoidlcd_display(void); //lcd顯示固定字voidlcd_value(void); //lcd顯示各項(xiàng)數(shù)值//voidmotor(ucharturn); //電機(jī)驅(qū)動(dòng)voiddelay10ms(ucharc); //延時(shí)10msuchardat[xbee_sum][2]; //存放接收的數(shù)據(jù)ucharpc[4]; //存放發(fā)送給PC的數(shù)據(jù)ucharname; //接收的:模塊名unsignedintcount; //中間計(jì)算:循環(huán)變量intppm=0;intTU=0;intLIGHT=0; //LCD顯示處理的數(shù)據(jù)ucharflag_motor=0; //電機(jī)標(biāo)志ucharflag_water=0; //澆水標(biāo)志ucharflag_light=0; //照明標(biāo)志ucharwork_mode=0; //0為手動(dòng)模式(默認(rèn)),1為自動(dòng)模式uchartu_h=0xff,tu_l=0x00; //土壤上下閾值,影響澆水ucharlight_h=0xff,light_l=0x00; //光照上下閾值 ,影響卷簾 影響照明ucharco2_h=0xff,co2_l=0x00; //C02上下閾值 ucharwen_h=0xff,wen_l=0x00; //溫度上下閾值 ucharshi_h=0xff,shi_l=0x00; //濕度上下閾值ucharlcd0[9]="土壤濕度:";ucharlcd1[9]="光照強(qiáng)度:";ucharlcd2[11]="空氣溫濕度:";ucharlcd3[5]="濃度:";ucharmotor_step[]={0x03,0x1c,0x27,0x38}; //{0,0,PH1,I01,I11,PH2,I02,I12}ucharmotor_count=0;//***************************************************************************************************************////主函數(shù)////**************************************************************************************************************//voidmain(){ serial_init(); //初始串口 LCD12864_Init(); //初始LCD12864 lcd_display(); //lcd顯示固定字 while(1) { //lcd_display(); //不能加,顯示出錯(cuò)/***************************************接收arduino消息,發(fā)送給PC、藍(lán)牙消息**************************************/ if(s1_getByte()==0x8e) //判斷是否接受到起始信號(hào) { name=s1_getByte(); //接收名字 dat[name][0]=s1_getByte(); dat[name][1]=s1_getByte(); lcd_value(); //顯示各項(xiàng)目數(shù)值 pc_sent(); //發(fā)送數(shù)據(jù)給PC }/**************************************************控制外設(shè)*********************************************/ if(work_mode==0) //手動(dòng)模式 { pin_light=(flag_light==1)?0:1; pin_water=(flag_water==1)?0:1; if(flag_motor==1) { TR0=1; } else { TR0=0; TH0=(65536-30000)/256; //3ms定時(shí) TL0=(65536-30000)%256; } } else //自動(dòng)模式 { pin_light=(LIGHT/1000<light_l)?0:1; pin_water=(TU/100<tu_l)?0:1; TR0=(LIGHT/1000>light_h)?1:0; } } }//**********************************************************************************************************************////函數(shù):串口S1和S2初始化、定時(shí)器初始化////***********************************************************************************************************************//voidserial_init(void){ EA=1; //開總中斷 //ES=1; //開S1串口中斷 REN=1; //S1允許接收 SM0=0; SM1=1; SM2=0; //方式1,8N1形式,bps可調(diào) PCON=0X80; //bps加倍 TMOD=0X21; //T1方式2,可重裝初值 T0方式3(當(dāng)成TH0,TL0兩個(gè)計(jì)數(shù)器), TH1=0XFa; TL1=0XFa; //9600bps TR1=1; //開定時(shí)器T1 ,當(dāng)T0在方式3,T1自動(dòng)啟動(dòng),TR1成為TH0計(jì)數(shù)器的開關(guān) TH0=(65536-30000)/256; //10ms定時(shí) TL0=(65536-30000)%256; ET0=1; IE2=0x01; //S2開中斷 S2CON=0X50;//S2方式一,S2REN=1 BRT=0XFd;//波特率發(fā)生器初值,9600bps AUXR=0X10;//波特率發(fā)生器開始計(jì)數(shù),bps不加倍}//***********************************************************************************************************************////函數(shù):串口2中斷函數(shù)////***********************************************************************************************************************////卷簾:開0xf0關(guān)0xf1//噴灌:開0xf2關(guān)0xf3//照明:開0xf4關(guān)0xf5//***********************************************************************************************************************////土壤(0%~90%):上限0x00--0x09;下限0x10--0x19//光照(0Lx~900Lx):上限0x20--0x29;下限0x30--0x39//CO2(0%~90%):上限0x40--0x49;下限0x50--0x59//溫度(0℃~70℃):上限0x60--0x67;下限0x70--0x77//濕度(0%~70%):上限0x80--0x87;下限0x90--0x97// 手動(dòng)控制方式:0xa0//自動(dòng)控制模式:0xb0//***********************************************************************************************************************//voidinter_s2()interrupt8using1{ uchara;// EA=1; if(S2CON&0X01==1) // RI=1 { S2CON=S2CON&(~0x01); //RI=0; a=S2BUF; //接收數(shù)據(jù)// S2BUF=a; // while(S2CON&0X02==0);// S2CON=S2CON&(~0x02); //發(fā)回接收的數(shù)據(jù) switch(a>>4) { case0x0f: //外設(shè)控制 { switch(a) { case0xf0: flag_motor=1;break; //電機(jī)開關(guān) case0xf1: flag_motor=0;break; case0xf2: flag_water=1;break; //澆水開關(guān) case0xf3: { flag_water=0; break; } case0xf4: flag_light=1;break; //燈開關(guān) case0xf5: { flag_light=0; break; } } } case0x00: tu_h=a&0x0f;break; //閾值賦值 case0x01: tu_l=a&0x0f;break; case0x02: light_h=a&0x0f;break; case0x03: light_l=a&0x0f;break; case0x04: co2_h=a&0x0f;break; case0x05: co2_l=a&0x0f;break; case0x06: wen_h=a&0x0f;break; case0x07: wen_l=a&0x0f;break; case0x08: shi_h=a&0x0f;break; case0x09: shi_l=a&0x0f;break; case0x0a: { //手動(dòng)控制時(shí),把閾值上限設(shè)置為最大,下限為最小 flag_light=0; flag_water=0; flag_motor=0; TR0=0; pin_light=1; pin_water=1; work_mode=0; break; } case0x0b: //自動(dòng)模式 { flag_light=0; flag_water=0; flag_motor=0; TR0=0; pin_light=1; pin_water=1; work_mode=1; break; } } } // EA=1;}//***********************************************************************************************************************////函數(shù):串口1發(fā)送一個(gè)字節(jié)////***********************************************************************************************************************//voids1_sentByte(uchardat){ inti=30000; SBUF=dat; while(TI==0) //等待數(shù)據(jù)發(fā)送,如果數(shù)據(jù)沒有發(fā)送且超時(shí),退出 { i--; if(i==0) { break; } } TI=0; }//***********************************************************************************************************************////函數(shù):串口1接收一個(gè)字節(jié)////***********************************************************************************************************************//uchars1_getByte(void){ uchara; inti=30000; while(RI==0) //等待數(shù)據(jù)接收,如果沒有數(shù)據(jù)接收且超時(shí),返回-1 { i--; if(i==0) { return-1; } } a=SBUF; //有數(shù)據(jù)接收,跳出循環(huán) RI=0; //返回?cái)?shù)據(jù),接收一個(gè)字節(jié) returna;}//***********************************************************************************************************************////函數(shù):lcd顯示固定字////***********************************************************************************************************************//voidlcd_display(void){ //LCD12864_SetWindow(0,0); //顯示土壤濕度 LCD12864_WriteCmd(0x80); for(count=0;count<9;count++) { LCD12864_WriteData(lcd0[count]); } //LCD12864_SetWindow(1,0); //顯示光照強(qiáng)度 LCD12864_WriteCmd(0x90); for(count=0;count<9;count++) { LCD12864_WriteData(lcd1[count]); } //LCD12864_SetWindow(2,0); //顯示空氣溫濕度 LCD12864_WriteCmd(0x88); for(count=0;count<11;count++) { LCD12864_WriteData(lcd2[count]); } //LCD12864_SetWindow(3,0); //顯示CO2濃度 LCD12864_WriteCmd(0x98); LCD12864_WriteData('C'); LCD12864_WriteData('O'); LCD12864_WriteData('2'); //LCD12864_SetWindow(3,2); //顯示漢字和顯示英文分開賦值,否則出錯(cuò)! LCD12864_WriteCmd(0x98+2); for(count=0;count<5;count++) { LCD12864_WriteData(lcd3[count]); } }//***********************************************************************************************************************////函數(shù):lcd顯示各項(xiàng)目數(shù)值////***********************************************************************************************************************//voidlcd_value(void){ TU=(1-(dat[0][0]*256+dat[0][1])/1023.0)*1000; //土壤濕度:計(jì)算數(shù)值(百分?jǐn)?shù),有效位3位,小數(shù)1位) //LCD12864_SetWindow(0,4); //顯示位置 LCD12864_WriteCmd(0x84); LCD12864_WriteData(':'); LCD12864_WriteData(TU/100+'0'); //十位 LCD12864_WriteData(TU%100/10+'0'); //個(gè)位 LCD12864_WriteData('.'); //"." LCD12864_WriteData(TU%10+'0'); //小數(shù)位 LCD12864_WriteData('%'); //"%" LIGHT=(dat[1][0]*256+dat[1][1])/1.2; //光照強(qiáng)度:計(jì)算數(shù)值(有效位4位,沒有小數(shù)位) //LCD12864_SetWindow(1,4); //顯示位置 LCD12864_WriteCmd(0x94); LCD12864_WriteData(':'); LCD12864_WriteData(LIGHT/1000+'0'); //千位 LCD12864_WriteData(LIGHT%1000/100+'0'); //百位 LCD12864_WriteData(LIGHT%100/10+'0'); //十位 LCD12864_WriteData(LIGHT%10+'0'); //個(gè)位 LCD12864_WriteData('L'); //"L" LCD12864_WriteData('x'); //"x" //LCD12864_SetWindow(2,5); //空氣溫濕度顯示(都為2位整數(shù)) LCD12864_WriteCmd(0x88+5); LCD12864_WriteData(':'); LCD12864_WriteData(dat[2][0]/10+'0'); //溫度十位 LCD12864_WriteData(dat[2][0]%10+'0'); //溫度個(gè)位 LCD12864_WriteData('/'); //"/" LCD12864_WriteData(dat[2][1]/10+'0'); //濕度十位 LCD12864_WriteData(dat[2][1]%10+'0'); //溫度個(gè)位 ppm=dat[3][0]*256+dat[3][1]; //二氧化碳 LCD12864_WriteCmd(0x98+4); LCD12864_WriteData(':'); LCD12864_WriteData(ppm/1000+'0'); //千位 LCD12864_WriteData(ppm%1000/100+'0'); //百 LCD12864_WriteData(ppm%1000%100/10+'0'); //十 LCD12864_WriteData(ppm%10+'0'); //個(gè) LCD12864_WriteData('p'); LCD12864_WriteData('p'); LCD12864_WriteData('m');}//***********************************************************************************************************************////函數(shù):步進(jìn)電機(jī)驅(qū)動(dòng)(一周期30度)////***********************************************************************************************************************//// 正轉(zhuǎn):A/BAB/ * UDN2916電流控制真值表: //// 反轉(zhuǎn):B/ABA/ * I0I1輸出電流 //// * L L 最大 //// * H L 最大*2/3 //// * L H 最大*1/3 //// * HH0 ////***********************************************************************************************************************///*voidmotor(ucharturn) //turn為1時(shí)正轉(zhuǎn),為0時(shí)反轉(zhuǎn){ if(turn==1) { //!A PH1=0; //A線圈為反向電流 I01=0; I11=0; //A最大電流輸出 PH2=0; //B輸出0 I02=1; I12=1; delay10ms(speed); //B PH1=0; //A輸出0 I01=1; I11=1; PH2=1; //B線圈為正電流 I02=0; I12=0; //B最大電流輸出 delay10ms(speed); //A PH1=1; //A線圈為正向電流 I01=0; I11=0; //A最大電流輸出 PH2=1

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論