制作出來的實物圖如下:
51hei圖片_20230414225155.jpg (2.87 MB, 下載次數: 69)
下載附件
2023-4-14 23:14 上傳
51hei圖片_20230414225348.jpg (3.15 MB, 下載次數: 70)
下載附件
2023-4-14 23:14 上傳
單片機源程序如下:
- #define _MAIN_C_
- //============================
- #include "includeFile.h"
- //============================
- sbit output1=P4^0;
- sbit output=P2^4;
- //sbit ds=P3^2;
- //sbit ledred=P1^6;
- //sbit ledgreen=P1^7;
- sbit key0=P2^0;//按鍵引腳
- sbit key1=P2^1;
- u8 n,num;
- unsigned int TTemp = 95.33,HHumi = 99.99; //溫度和濕度unsigned int Temp = 99,Humi = 99;
- unsigned int set_temper=30,temper,temp,ceshiwendu; //溫度變量定義
- unsigned int s;
- float f_temp;//轉換后的溫度
- u8 tvalue;
- unsigned int tvaluenum1;
- unsigned int tvaluenum2,tvaluenum3,tvaluenum4,tvaluenum5;
- u8 tflag;//溫度正負標志
- //void Dsplay_OLED(void);
- void delay11(i)//延時函數
- {
- u16 j;
- for(i;i>0;i--)
- for(j=110;j>0;j--);
- }
- /*********************************
- OLED顯示
- ****************************/
- void Dsplay_OLED(void)//顯示
- {
- AHT10_Read_Data(&TTemp,&HHumi);
- Delay1ms(100); //快速測量可能會引起傳感器升溫,此處降低測量速率
- //循環顯示溫濕度
- // OLED_ShowNum(0,0,Temp,5,16);//顯示溫度值
- // OLED_ShowNum(64,0,Humi,5,16);//顯示濕度值
- OLED_ShowNum(0,4,set_temper,4,16);
- OLED_ShowNum(32,4,high_time,4,16);
- OLED_ShowNum(64,4,low_time,4,16);
- // OLED_ShowString(16,4,temper);
- OLED_ShowNum(0,2,TTemp/100 ,2,16);
- OLED_ShowString(16,2,".");
- OLED_ShowNum(20,2,TTemp%100/10,1,8);
- OLED_ShowNum(28,2,TTemp%10,1,8);
- OLED_ShowCHinese(40,2,1);
- // RegBuf_Input[0] = Temp;
- Delay1ms(200);
- OLED_ShowNum(60,2,HHumi/1000,2,16);
- OLED_ShowString(76,2,".");
- OLED_ShowNum(80,2,HHumi%1000/100,1,8);
- OLED_ShowNum(88,2,HHumi%100/10,1,8);
- // RegBuf_Input[1] = Humi;
- // OLED_ShowNum(36,4,Humi%10,1,8); //濕度小數點后第3位
- OLED_ShowString(96,2,"%");
- // Delay1ms(100);
- OLED_ShowNum(0,6,count,2,16);
- OLED_ShowNum(90,6,set_temper+1,2,16);
- OLED_ShowNum(32,6,tvaluenum2,4,16);
- }
- /****************************
- //獲取溫度
- ****************************/
- u16 get_temper()
- {
- tvalue=TTemp;//;ceshiwendu
- if(tvalue<0x0fff)
- tflag=0;
- // OLED_Clear(); //清屏
- // OLED_ShowString(40,0,"err");
- else {tvalue=~tvalue+1;tflag=1;}
- tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數tvalue
- temp=tvalue;
- return temp;
- }
- /*******************
- void keyscan()//鍵盤掃描
- {
- if(key0==0)
- {
- delay11(1);
- if(key0==0)
- {
- while(!key0);
- delay11(1);
- while(!key0);
- set_temper++;
- }
- // OLED_ShowNum(0,4,set_temper,4,16);
- delay11(1);
- }
- if(key1==0)
- {
- delay11(3);//延時去抖
- if(key1==0)
- {
- while(!key1);
- delay11(3);
- while(!key1);
- set_temper--;//溫度減
- if(set_temper==0)
- {set_temper=0;}
- }
- // OLED_ShowNum(0,4,set_temper,2,16);
- }
- }
- **********************/
- /***********************************************************
- 溫度比較處理子程序
- ***********************************************************/
- void compare_temper(void)
- {
- unsigned char i;
- tvaluenum2 = TTemp/100;
- // AHT10_Read_Data(&TTemp,&HHumi);
- if(set_temper>tvaluenum2) //設置溫度大于當前溫度 ceshiwendu
- {
- // ledred=0;
- output1=1;
- // ledgreen=1;
- if(set_temper-tvaluenum2>1) //溫度相差1度以上 ceshiwendu TTemp
- {
- high_time=100;
- low_time=0;
- }
- else //設置溫度與當前溫度差距很小時開啟PID調整
- {
- for(i=0;i<10;i++)
- {
- get_temper();
- rin = s; // Read Input
- rout = PIDCalc ( &spid,rin ); // Perform PID Interation
- }
- if (high_time<=100) high_time=(unsigned char)(rout/800);
- else high_time=100;
- low_time= (100-high_time);
- output1=0; //增加PWM
- }
- }
- /*********************************************************
- ****************************************/
- else if(set_temper<=tvaluenum2) //設置溫度不大于當前溫度
- {
- // ledred=1;
- output1=0;
- // ledgreen=0;
- if(tvaluenum2-set_temper>0) //溫度相差0度以上
- {
- high_time=0;
- low_time=100;
- }
- else
- {
- for(i=0;i<10;i++)
- {
- get_temper();
- rin = s; // Read Input
- rout = PIDCalc ( &spid,rin ); // Perform PID Interation
- }
- if (high_time<100) high_time=(unsigned char)(rout/10000);
- else high_time=0;
- low_time= (100-high_time);
- }
- }
- }
- /*****************************************************
- T0中斷服務子程序,用于控制電平的翻轉 ,40us*100=4ms周期
- ******************************************************/
- void Timer0_Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0xCD; //設置定時初始值
- TH0 = 0xD4; //設置定時初始值
- EA=1;
- ET0=1;
- TR0=1;
- }
- void serve_T0() interrupt 1 using 1
- {
- if(++count<=(high_time))
- output=0;
- else if(count<=100)
- {
- output=1;
- }
- else count=0;
- TL0 = 0xCD; //設置定時初始值
- TH0 = 0xD4; //設置定時初始值
- }
- /********************
- 初始化參數void compare_temper(void)
- *******************/
- void AInit(void)
- {
- // unsigned char i;
- Timer0_Init(); //Timer0_Init(void)
- OLED_Init(); //LCD初始化
- OLED_Clear(); //清屏
- OLED_Display_On();//開顯示
- AHT10_Init(); //AHT10初始化
- OLED_Clear();//OLED
- OLED_ShowCHinese(0,0,0);//
- OLED_ShowCHinese(18,0,1);//
- OLED_ShowString(40,0,"Modbus");
- output1=0;
- output=0;
- high_time=50; //高溫變量
- low_time=50; //低溫變量
- // ceshiwendu=30; //測試用變量
- PIDInit ( &spid ); // Initialize Structure
- spid.Proportion= 10; // P值Set PID Coefficients
- spid.Integral = 8; // I值
- spid.Derivative =6; // D值
- spid.SetPoint =100; // PID目標點Set PID Setpoint
- }
- /***********主函數**********/
- void main(void)
- {
- AInit();
- while(1)
- {
- // compare_temper();
- Dsplay_OLED();
- compare_temper(); //比較溫度
- // serve_stat();
- // keyscan(); //按鍵掃描
- /******************************************************/
- //for(i=0;i<10;i++) //循環10次
- // {
- // OLED_ShowNum(32,6,set_temper,4,16); //顯示溫度值
- // if((key0==0)||(key1==0)) break; //如果有按鍵退出顯示循環
- // }
- // if((key0!=0)&&(key1!=0))
- }
- }
復制代碼 PCB原理圖開源:oshwhub.com/lbhsl/stc12c5a60s2-ce-shi-ban
視頻:b23.tv/rOfdOIm
Keil代碼下載:
程序.7z
(231.91 KB, 下載次數: 112)
2023-4-14 23:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|