|
智能豆?jié){機控制系統(tǒng)設(shè)計
電路原理圖如下:
51hei.png (37.72 KB, 下載次數(shù): 35)
下載附件
2022-4-29 18:19 上傳
單片機源程序如下:
- #include<reg51.h>
- #include"lcd.h"
- #include"oled.h"
- #include"temp.h"
- sbit IRIN=P2^0;
- sbit jr=P2^7;//加熱
- sbit dj=P2^6;//
- sbit bj=P2^5;
- sbit fmq=P2^4;
- sbit aj1=P2^0;//
- sbit aj2=P2^1;//
- sbit aj3=P2^2;//
- sbit aj4=P2^3;//開始
- sbit yd=P3^5;
- sbit ed=P3^6;
- sbit sd=P3^7;
- sbit yw1=P1^1;//最低檔
- sbit yw2=P1^2;
- sbit yw3=P1^3;
- unsigned char Time;
- void DelayMs(unsigned int );
- void LcdDisplay(int);
- /*******************************************************************************
- * 函數(shù)名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- unsigned char IrValue[6]; //用來存放讀取到的紅外值
- void delay(unsigned int a)
- {
- while(a--)
- {
- if(yw3==0)
- {
- while(1)
- {
- fmq=bj=0;
- if(yw2==0||yw1==0)
- {
- fmq=bj=1;
- break;
- }
- }
- }
- if(yw1==1&&yw2==1&&yw3==1)
- {
- while(1)
- {
- fmq=bj=0;
- if(yw2==0||yw1==0)
- {
- fmq=bj=1;
- break;
- }
- }
- }
- }
- }
- void sdcx(unsigned char a)
- {
- unsigned char i;
- if(a==1)
- {
- for(i=0;i<6;i++)
- {
- dj=0;delay(25000);
- dj=1;delay(25000);
- }
- }
- else if(a==2)
- {
- for(i=0;i<6;i++)
- {
-
- dj=0;delay(12500);
- dj=1;delay(12500);
-
- dj=0;delay(12500);
- dj=1;delay(12500);
-
- }
- }
- else if(a==3)
- {
- for(i=0;i<6;i++)
- {
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
- }
- }
- }
- void main()
- {
- uchar a=0,i=0,zt,ms,mbz=27,sl,sdbz;
- uint Num=0;
- OLED_Init();//初始化OLED
- if(a==1)
- {
- uchar b[]={0,0};
- LcdInit();
- OLED_ColorTurn(0);
- OLED_Display_On();
- OLED_Display_Off();
- OLED_DisplayTurn(0);
- OLED_ShowNum(0,0,1,1,16);
- OLED_ShowString(0,0,0,16);
- OLED_DrawBMP(0,0,10,10,b);
- LcdDisplay(10);
- }
- while(1)
- {
- // OLED_ShowChinese(40,0,0,16);//豆?jié){機
- // OLED_ShowChinese(56,0,1,16);
- // OLED_ShowChinese(72,0,2,16);
-
- OLED_ShowChinese(0,2,3,16);//實時液位空
- OLED_ShowChinese(16,2,4,16);
- OLED_ShowChinese(32,2,9,16);
- OLED_ShowChinese(48,2,10,16);
- OLED_ShowChinese(64,2,16,16);
-
- OLED_ShowNum(80,2,sl,1,16);//實時液位
- OLED_ShowChinese(96,2,16,16);
- OLED_ShowNum(112,2,3,1,16);
-
- OLED_ShowChinese(0,4,7,16);//實時溫度空
- OLED_ShowChinese(16,4,8,16);
- OLED_ShowChinese(32,4,5,16);
- OLED_ShowChinese(48,4,6,16);
- OLED_ShowChinese(64,4,16,16);
- Num=Ds18b20ReadTemp();
- Num=Num/10;
- OLED_ShowNum(80,4,Num,3,16);
-
-
-
- OLED_ShowChinese(0,6,18,16);//模式
- OLED_ShowChinese(16,6,19,16);
- if(ms==1)OLED_ShowChinese(32,6,14,16);//干或這濕
- else if(ms==0)OLED_ShowChinese(32,6,15,16);
-
- OLED_ShowNum(68,6,sdbz,3,16);
-
- OLED_ShowChinese(0,0,11,16);
- OLED_ShowChinese(16,0,12,16);
- OLED_ShowChinese(32,0,13,16);
-
- OLED_ShowNum(60,0,mbz,3,16);
-
- switch(zt)
- {
- case 0:
- break;
- case 1:
- if(ms==0)
- {
- jr=0;
- dj=0;
-
- for(i=0;i<20;i++)
- {
- if(sdbz==1)
- {
- dj=0;delay(25000);
- dj=1;delay(25000);
- }
- else if(sdbz==2)
- {
- dj=0;delay(12500);
- dj=1;delay(12500);
-
- dj=0;delay(12500);
- dj=1;delay(12500);
-
- }
- else if(sdbz==3)
- {
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
- }
- }
- fmq=0;
- dj=jr=1;
- delay(30000);
- fmq=bj=1;
- }
- if(ms==1)
- {
- unsigned char i,x;
- for(i=0;i<5;i++)
- {
- dj=0;jr=1;
- sdcx(sdbz);
- dj=1;jr=0;
- delay(50000);
- delay(50000);
- delay(50000);
- delay(50000);
- }
- fmq=0;
- delay(30000);
- fmq=bj=1;
- }
- zt=2;
- break;
- case 2:
- if(Num>mbz)jr=1;
- else jr=0;
- break;
- }
- if(aj4==0)
- {
- zt=1;
- }
- if(zt==2)
- {
- if(aj1==0)
- {
- if(mbz<100)mbz++;
- while(aj1==0);
- }
- if(aj2==0)
- {
- if(mbz>0)mbz--;
- while(aj2==0);
- }
- }
- if(aj3==0)
- {
- if(ms==0)ms=1;
- else ms=0;
- while(aj3==0);
- }
- if(yd==0)sdbz=1;
- else if(ed==0)sdbz=2;
- else if(sd==0)sdbz=3;
-
-
- if(yw1==0)sl=1;
- if(yw2==0)sl=2;
- if(yw3==0)sl=3;
-
- if(yw1==1&&yw2==1&&yw3==1)sl=0;
- if(sl==3||sl==0)
- {
- while(1)
- {
- fmq=bj=0;
- if(yw2==0||yw1==0)
- {
- fmq=bj=1;
- break;
- }
- }
- }
- else fmq=bj=1;
- }
- }
- void DelayMs(unsigned int x) //0.14ms誤差 0us
- {
- unsigned char i;
- while(x--)
- {
- for (i = 0; i<13; i++)
- {}
- }
- }
- void ReadIr() interrupt 0
- {
- unsigned char j,k;
- unsigned int err;
- Time=0;
- DelayMs(70);
- if(IRIN==0) //確認是否真的接收到正確的信號
- {
- err=1000; //1000*10us=10ms,超過說明接收到錯誤的信號
- /*當(dāng)兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
- 侯,程序死在這里*/
- while((IRIN==0)&&(err>0)) //等待前面9ms的低電平過去
- {
- DelayMs(1);
- err--;
- }
- if(IRIN==1) //如果正確等到9ms低電平
- {
- err=500;
- while((IRIN==1)&&(err>0)) //等待4.5ms的起始高電平過去
- {
- DelayMs(1);
- err--;
- }
- for(k=0;k<4;k++) //共有4組數(shù)據(jù)
- {
- for(j=0;j<8;j++) //接收一組數(shù)據(jù)
- {
- err=60;
- while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
- {
- DelayMs(1);
- err--;
- }
- err=500;
- while((IRIN==1)&&(err>0)) //計算高電平的時間長度。
- {
- DelayMs(1);//0.14ms
- Time++;
- err--;
- if(Time>30)
- {
- EX0=1;
- return;
- }
- }
- IrValue[k]>>=1; //k表示第幾組數(shù)據(jù)
- if(Time>=8) //如果高電平出現(xiàn)大于565us,那么是1
- {
- IrValue[k]|=0x80;
- }
- Time=0; //用完時間要重新賦值
- }
- }
- }
- if(IrValue[2]!=~IrValue[3])
- {
- return;
- }
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : LcdDisplay()
- * 函數(shù)功能 : LCD顯示讀取到的溫度
- * 輸入 : v
- * 輸出 : 無
- *******************************************************************************/
- void LcdDisplay(int temp) //lcd顯示
- {
-
- unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
- float tp;
- if(temp< 0) //當(dāng)溫度值為負數(shù)
- {
- LcdWriteCom(0x80); //寫地址 80表示初始地址
- LcdWriteData('-'); //顯示負
- //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算由?.5,還是在小數(shù)點后面。
-
- }
- else
- {
- LcdWriteCom(0x80); //寫地址 80表示初始地址
- LcdWriteData('+'); //顯示正
- tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點后面。
- }
- datas[0] = temp / 10000;
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- datas[4] = temp % 10;
-
- LcdWriteCom(0x82); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[0]); //百位
-
- LcdWriteCom(0x83); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
- LcdWriteCom(0x84); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //個位
- LcdWriteCom(0x85); //寫地址 80表示初始地址
- LcdWriteData('.'); //顯示 ‘.’
- LcdWriteCom(0x86); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //顯示小數(shù)點
- LcdWriteCom(0x87); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //顯示小數(shù)點
- }
復(fù)制代碼
Keil代碼下載:
原理圖+程序.7z
(340.76 KB, 下載次數(shù): 23)
2022-4-29 18:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|