制作出来的实物图如下:
单片机源程序如下:
- #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)
|