51单片机PM2.5+温湿度(程序+原理图+Protel仿真)

  • 一、功能
  • 二、模块
  • 三、代码程序
  • 四、PCB原理图

一、功能

本系统以STC89C52单片机为核心,主要包括传感器温湿度采集,传感器PM2.5采集,LCD液晶显示,声光报警和按键设置等部分。系统通过搭建的传感器元件采集家居中温度、湿度和PM2.5浓度,并实时显示上述采集数据。

二、模块

2.1、PM 2.5模块
模块引脚说明:
采集数据对照:

2.2、DHT11温湿度传感器:

模块接口说明

DHT11数据格式:一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据
+8bit湿度小数数据
+8bi温度整数数据
+8bit温度小数数据
+8bit校验和
数据传送正确时校验和数据等于**“ 8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”** 所得结果的末8位。

三、代码程序

#include <reg52.h>
#include <intrins.h>#define uchar unsigned char       // 以后unsigned char就可以用uchar代替
#define uint  unsigned int      // 以后unsigned int 就可以用uint 代替sfr ISP_DATA  = 0xe2;         // 数据寄存器
sfr ISP_ADDRH = 0xe3;          // 地址寄存器高八位
sfr ISP_ADDRL = 0xe4;          // 地址寄存器低八位
sfr ISP_CMD   = 0xe5;          // 命令寄存器
sfr ISP_TRIG  = 0xe6;          // 命令触发寄存器
sfr ISP_CONTR = 0xe7;          // 命令寄存器sbit LcdRs_P   = P1^2;    // 1602液晶的RS管脚
sbit LcdRw_P   = P1^3;    // 1602液晶的RW管脚
sbit LcdEn_P   = P1^4;    // 1602液晶的EN管脚
sbit KeySet_P  = P3^2;     // “设置”按键的管脚
sbit KeyDown_P = P3^3;     // “减”按键的管脚
sbit KeyUp_P   = P3^4;     // “加”按键的管脚
sbit Buzzer_P  = P1^5;     // 蜂鸣器
sbit DHT11_P   = P1^1;     // 温湿度传感器DHT11数据接入
sbit LedTH_P   = P2^0;     // 温度过高报警指示灯
sbit LedTL_P   = P2^1;     // 温度过低报警指示灯
sbit LedHH_P   = P2^2;     // 湿度过高报警指示灯
sbit LedHL_P   = P2^3;     // 湿度过低报警指示灯
sbit LedPM_P   = P2^4;     // PM2.5过高报警指示灯uchar temp;                              // 保存温度
uchar humi;                             // 保存湿度
uint  pm;                                   // 保存PM2.5uchar gIndex=0;                      // 串口接收索引
uint  Value[20]={0};           // 串口数据缓存区uchar AlarmTL;                        // 温度下限报警值
uchar AlarmTH;                      // 温度上限报警值
uchar AlarmHL;                      // 湿度下限报警值
uchar AlarmHH;                      // 湿度上限报警值
uint  AlarmPM;                      // PM2.5报警值/*********************************************************/
// 单片机内部EEPROM不使能
/*********************************************************/
void ISP_Disable()
{ISP_CONTR = 0;ISP_ADDRH = 0;ISP_ADDRL = 0;
}/*********************************************************/
// 从单片机内部EEPROM读一个字节,从0x2000地址开始
/*********************************************************/
unsigned char EEPROM_Read(unsigned int add)
{ISP_DATA  = 0x00;ISP_CONTR = 0x83;ISP_CMD   = 0x01;ISP_ADDRH = (unsigned char)(add>>8);ISP_ADDRL = (unsigned char)(add&0xff);// 对STC89C51系列来说,每次要写入0x46,再写入0xB9,ISP/IAP才会生效ISP_TRIG  = 0x46;    ISP_TRIG  = 0xB9;_nop_();ISP_Disable();return (ISP_DATA);
}/*********************************************************/
// 往单片机内部EEPROM写一个字节,从0x2000地址开始
/*********************************************************/
void EEPROM_Write(unsigned int add,unsigned char ch)
{ISP_CONTR = 0x83;ISP_CMD   = 0x02;ISP_ADDRH = (unsigned char)(add>>8);ISP_ADDRL = (unsigned char)(add&0xff);ISP_DATA  = ch;ISP_TRIG  = 0x46;ISP_TRIG  = 0xB9;_nop_();ISP_Disable();
}/*********************************************************/
// 擦除单片机内部EEPROM的一个扇区
// 写8个扇区中随便一个的地址,便擦除该扇区,写入前要先擦除
/*********************************************************/
void Sector_Erase(unsigned int add)
{ISP_CONTR = 0x83;ISP_CMD   = 0x03;ISP_ADDRH = (unsigned char)(add>>8);ISP_ADDRL = (unsigned char)(add&0xff);ISP_TRIG  = 0x46;ISP_TRIG  = 0xB9;_nop_();ISP_Disable();
}/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{uint i,j;for(i=0;i<time;i++)for(j=0;j<112;j++);
}/*********************************************************/
// 10us级延时程序
/*********************************************************/
void Delay10us()
{_nop_();   // 执行一条指令,延时1微秒_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}/*********************************************************/
// 读取DHT11单总线上的一个字节
/*********************************************************/
uchar DhtReadByte(void)
{   bit bit_i; uchar j;uchar dat=0;for(j=0;j<8;j++)    {while(!DHT11_P); // 等待低电平结束  Delay10us();            // 延时Delay10us();Delay10us();if(DHT11_P==1)       // 判断数据线是高电平还是低电平{bit_i=1; while(DHT11_P);} else{bit_i=0;}dat<<=1;             // 将该位移位保存到dat变量中dat|=bit_i;    }return(dat);
}/*********************************************************/
// 读取DHT11的一帧数据,湿高、湿低(0)、温高、温低(0)、校验码
/*********************************************************/
void ReadDhtData()
{        uchar HumiHig;     // 湿度高检测值uchar HumiLow;     // 湿度低检测值 uchar TemHig;         // 温度高检测值uchar TemLow;          // 温度低检测值uchar check;           // 校验字节 DHT11_P=0;             // 主机拉低DelayMs(20);         // 保持20毫秒DHT11_P=1;                // DATA总线由上拉电阻拉高Delay10us();            // 延时等待30usDelay10us();Delay10us();while(!DHT11_P); // 等待DHT的低电平结束while(DHT11_P);       // 等待DHT的高电平结束//进入数据接收状态HumiHig = DhtReadByte();   // 湿度高8位HumiLow = DhtReadByte();   // 湿度低8为,总为0TemHig  = DhtReadByte();    // 温度高8位 TemLow  = DhtReadByte();  // 温度低8为,总为0 check   = DhtReadByte();   // 8位校验码,其值等于读出的四个字节相加之和的低8位DHT11_P=1;              // 拉高总线if(check==HumiHig + HumiLow + TemHig + TemLow)      // 如果收到的数据无误{temp=TemHig;          // 将温度的检测结果赋值给全局变量temphumi=HumiHig;            // 将湿度的检测结果赋值给全局变量humi}
}/*********************************************************/
// 1602液晶写命令函数,cmd就是要写入的命令
/*********************************************************/
void LcdWriteCmd(uchar cmd)
{ LcdRs_P = 0;LcdRw_P = 0;LcdEn_P = 0;P0=cmd;DelayMs(2);LcdEn_P = 1;    DelayMs(2);LcdEn_P = 0;
}/*********************************************************/
// 1602液晶写数据函数,dat就是要写入的数据
/*********************************************************/
void LcdWriteData(uchar dat)
{LcdRs_P = 1; LcdRw_P = 0;LcdEn_P = 0;P0=dat;DelayMs(2);LcdEn_P = 1;    DelayMs(2);LcdEn_P = 0;
}/*********************************************************/
// 1602液晶初始化函数
/*********************************************************/
void LcdInit()
{LcdWriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口LcdWriteCmd(0x0C);        // 开显示,不显示光标LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移LcdWriteCmd(0x01);        // 清屏
}/*********************************************************/
// 液晶光标定位函数
/*********************************************************/
void LcdGotoXY(uchar line,uchar column)
{// 第一行if(line==0)        LcdWriteCmd(0x80+column); // 第二行if(line==1)        LcdWriteCmd(0x80+0x40+column);
}/*********************************************************/
// 液晶输出数字(PM2.5的)
/*********************************************************/
void LcdPrintNum1(uint num)
{LcdWriteData(num/100+48);                 // 百位LcdWriteData(num%100/10+48);          // 十位LcdWriteData(num%10+48);                  // 个位
}/*********************************************************/
// 液晶输出数字(温湿度的)
/*********************************************************/
void LcdPrintNum2(uchar num)
{LcdWriteData(num/10+48);                  // 十位LcdWriteData(num%10+48);                  // 个位
}/*********************************************************/
// 液晶输出字符串函数
/*********************************************************/
void LcdPrintStr(uchar *str)
{while(*str!='\0')LcdWriteData(*str++);
}/*********************************************************/
// 液晶显示内容初始化
/*********************************************************/
void LcdShowInit()
{LcdGotoXY(0,0);                                        // 液晶光标定位到第0行第0列LcdPrintStr(" PM2.5:   ug/m3 ");  // 显示内容LcdGotoXY(1,0);                                      // 液晶光标定位到第1行第0列LcdPrintStr("T:   C   H:  %RH");  // 显示内容LcdGotoXY(1,4);                                      // 温度单位摄氏度上面的圆圈符号LcdWriteData(0xdf);
}/*********************************************************/
// 串口初始化
/*********************************************************/
void UartInit()
{SCON = 0x50;      // 配置串口寄存器TMOD = 0x20;     // 配置定时器寄存器TH1  = 0xf4;        // 计算波特率的值为2400TL1  = 0xf4;        // 计算波特率的值为2400EA   = 1;               // 打开总中断ES   = 1;              // 打开串口中断TR1  = 1;             // 启动定时器
}/*********************************************************/
// 按键扫描
/*********************************************************/
void KeyScanf()
{if(KeySet_P==0)      // 判断设置按键是否被按下{EA=0;/*将液晶显示改为设置温度的页面****************************************************/LcdWriteCmd(0x01);                    LcdGotoXY(0,0);LcdPrintStr("Temperature Set ");LcdGotoXY(1,0);LcdPrintStr("      -    C    ");LcdGotoXY(1,10);                      LcdWriteData(0xdf);         LcdGotoXY(1,4);                     // 在液晶上填充温度的下限值 LcdPrintNum2(AlarmTL);  LcdGotoXY(1,7);                     // 在液晶上填充温度的上限值LcdPrintNum2(AlarmTH);LcdGotoXY(1,5);                        // 光标定位到第1行第5列LcdWriteCmd(0x0f);                // 光标闪烁DelayMs(10);                     // 去除按键按下的抖动while(!KeySet_P);                   // 等待按键释放DelayMs(10);                       // 去除按键松开的抖动/*设置温度的下限值****************************************************************/while(KeySet_P)                      // “设置键”没有被按下,则一直处于温度下限的设置{if(KeyDown_P==0)                // 判断 “减按键“ 是否被按下       {if(AlarmTL>0)                   // 只有当温度下限值大于0时,才能减1AlarmTL--;LcdGotoXY(1,4);                // 重新刷新显示更改后的温度下限值  LcdPrintNum2(AlarmTL);          LcdGotoXY(1,5);             // 重新定位闪烁的光标位置DelayMs(350);                 // 延时}if(KeyUp_P==0)              // 判断 “加按键“ 是否被按下{if(AlarmTL<99)         // 只有当温度下限值小于99时,才能加1AlarmTL++;LcdGotoXY(1,4);             // 重新刷新显示更改后的温度下限值LcdPrintNum2(AlarmTL);LcdGotoXY(1,5);             // 重新定位闪烁的光标位置DelayMs(350);                 // 延时}  }LcdGotoXY(1,8);DelayMs(10);                        // 去除按键按下的抖动while(!KeySet_P);                   // 等待按键释放DelayMs(10);                       // 去除按键松开的抖动/*设置温度的上限值****************************************************************/ while(KeySet_P)                 // “设置键”没有被按下,则一直处于温度上限的设置{if(KeyDown_P==0)                // 判断 “减按键“ 是否被按下{if(AlarmTH>0)                  // 只有当温度上限值大于0时,才能减1         AlarmTH--;LcdGotoXY(1,7);           // 重新刷新显示更改后的温度上限值LcdPrintNum2(AlarmTH);LcdGotoXY(1,8);             // 重新定位闪烁的光标位置DelayMs(350);                 // 延时}if(KeyUp_P==0)              // 判断 “加按键“ 是否被按下{if(AlarmTH<99)             // 只有当温度上限值小于99时,才能加1AlarmTH++;LcdGotoXY(1,7);             // 重新刷新显示更改后的温度上限值  LcdPrintNum2(AlarmTH);LcdGotoXY(1,8);               // 重新定位闪烁的光标位置DelayMs(350);                 // 延时}                               }/*将液晶显示改为设置湿度的页面****************************************************/LcdWriteCmd(0x01);                   LcdGotoXY(0,0);LcdPrintStr("  Humidity Set  ");LcdGotoXY(1,0);LcdPrintStr("      -   %RH   ");      LcdGotoXY(1,4);                     // 在液晶上填充湿度的下限值 LcdPrintNum2(AlarmHL);  LcdGotoXY(1,7);                     // 在液晶上填充湿度的上限值LcdPrintNum2(AlarmHH);LcdGotoXY(1,5);                        // 光标定位到第1行第5列DelayMs(10);                      // 去除按键按下的抖动while(!KeySet_P);                   // 等待按键释放DelayMs(10);/*设置湿度的下限值****************************************************************/while(KeySet_P)                     // “设置键”没有被按下,则一直处于湿度下限的设置{if(KeyDown_P==0)                // 判断 “减按键“ 是否被按下{if(AlarmHL>0)                  // 只有当湿度下限值大于0时,才能减1AlarmHL--;LcdGotoXY(1,4);                // 重新刷新显示更改后的湿度下限值  LcdPrintNum2(AlarmHL);LcdGotoXY(1,5);               // 重新定位闪烁的光标位置DelayMs(350);}if(KeyUp_P==0)                // 判断 “加按键“ 是否被按下{if(AlarmHL<99)         // 只有当湿度下限值小于99时,才能加1AlarmHL++;LcdGotoXY(1,4);             // 重新刷新显示更改后的湿度下限值LcdPrintNum2(AlarmHL);LcdGotoXY(1,5);         // 重新定位闪烁的光标位置DelayMs(350);                 // 延时}  }LcdGotoXY(1,8);DelayMs(10);                        // 去除按键按下的抖动while(!KeySet_P);                   // 等待按键释放DelayMs(10);                       // 去除按键松开的抖动/*设置湿度的上限值****************************************************************/while(KeySet_P)                  // “设置键”没有被按下,则一直处于湿度上限的设置{if(KeyDown_P==0)                // 判断 “减按键“ 是否被按下{if(AlarmHH>0)              // 只有当湿度上限值大于0时,才能减1AlarmHH--;LcdGotoXY(1,7);                // 重新刷新显示更改后的湿度上限值LcdPrintNum2(AlarmHH);LcdGotoXY(1,8);         // 重新定位闪烁的光标位置DelayMs(350);}if(KeyUp_P==0)                    // 判断 “加按键“ 是否被按下{if(AlarmHH<99)             // 只有当湿度上限值小于99时,才能加1AlarmHH++;LcdGotoXY(1,7);             // 重新刷新显示更改后的湿度上限值  LcdPrintNum2(AlarmHH);LcdGotoXY(1,8);               // 重新定位闪烁的光标位置DelayMs(350);                 // 延时}  }/*将液晶显示改为设置PM2.5的页面****************************************************/LcdWriteCmd(0x01);                 // 设置界面的显示框架LcdGotoXY(0,0);LcdPrintStr("   PM2.5 Set    ");LcdGotoXY(1,0);LcdPrintStr("        ug/m3   ");LcdGotoXY(1,4);                               // 显示当前的报警值LcdPrintNum1(AlarmPM);               LcdGotoXY(1,6);                             // 光标定位到第1行第6列DelayMs(10);                              // 去除按键按下的抖动while(!KeySet_P);                           // 等待按键释放DelayMs(10);while(KeySet_P)                                // “设置键”没有被按下,则一直处于光强下限的设置{if(KeyDown_P==0)                        // 判断 “减按键“ 是否被按下{if(AlarmPM>1)                          // 只有gAlarmPM大于1才能减1                                AlarmPM--;              LcdGotoXY(1,4);                     // 液晶光标定位LcdPrintNum1(AlarmPM);     // 刷新改变后的报警值LcdGotoXY(1,6);DelayMs(200);                            // 延时一下}if(KeyUp_P==0)                        // 判断 “加按键“ 是否被按下{if(AlarmPM<999)                            // 只有gAlarmPM小于999才能加1AlarmPM++;              LcdGotoXY(1,4);                     // 液晶光标定位LcdPrintNum1(AlarmPM);     // 刷新改变后的报警值LcdGotoXY(1,6);DelayMs(200);                            // 延时一下}    }/*完成设置,退出前的处理**********************************************************/LcdWriteCmd(0x0C);                          // 取消光标闪烁LcdShowInit();                                     // 液晶显示为检测界面的DelayMs(10);                                       // 去除按键按下的抖动while(!KeySet_P);                                   // 等待按键释放DelayMs(10);                                       // 去除按键松开的抖动Sector_Erase(0x2000);                           // 存储之前必须先擦除EEPROM_Write(0x2000,AlarmTL);           // 把温度下限存入到EEPROM的0x2000这个地址EEPROM_Write(0x2001,AlarmTH);           // 把温度上限存入到EEPROM的0x2001这个地址EEPROM_Write(0x2002,AlarmHL);           // 把湿度下限存入到EEPROM的0x2002这个地址EEPROM_Write(0x2003,AlarmHH);           // 把湿度上限存入到EEPROM的0x2003这个地址EEPROM_Write(0x2004,AlarmPM/100);   // 把PM2.5存入到EEPROM的0x2004和0x2005这两个地址EEPROM_Write(0x2005,AlarmPM%100);EA=1;}
}/*********************************************************/
// 报警判断
/*********************************************************/
void AlarmJudge(void)
{/*温度*/if(temp>AlarmTH)              // 温度是否过高{LedTH_P=0;LedTL_P=1;}else if(temp<AlarmTL)       // 温度是否过低{LedTL_P=0;LedTH_P=1;}else                                       // 温度正常{LedTH_P=1;LedTL_P=1;}/*湿度*/if(humi>AlarmHH)            // 湿度是否过高{LedHH_P=0;LedHL_P=1;}else if(humi<AlarmHL)       // 湿度是否过低{LedHL_P=0;LedHH_P=1;}else                                   // 湿度正常{LedHH_P=1;LedHL_P=1;}/*PM2.5*/if(pm>AlarmPM)LedPM_P=0;elseLedPM_P=1;/*蜂鸣器*/if((LedHH_P==0)||(LedHL_P==0)||(LedTH_P==0)||(LedTL_P==0)||(LedPM_P==0))    // 蜂鸣器判断,只要至少1个报警灯亮,蜂鸣器就报警Buzzer_P=0;else    Buzzer_P=1;
}/*********************************************************/
// 报警值初始化
/*********************************************************/
void AlarmInit(void)
{AlarmTL=EEPROM_Read(0x2000);  // 从EEPROM的0x2000这个地址读取温度的报警下限AlarmTH=EEPROM_Read(0x2001); // 从EEPROM的0x2001这个地址读取温度的报警上限AlarmHL=EEPROM_Read(0x2002); // 从EEPROM的0x2002这个地址读取湿度的报警下限  AlarmHH=EEPROM_Read(0x2003);   // 从EEPROM的0x2003这个地址读取湿度的报警上限AlarmPM=EEPROM_Read(0x2004)*100+EEPROM_Read(0x2005);        // 读取PM2.5报警值if((AlarmTL==0)||(AlarmTL>100))   // 如果温度下限报警值读出来异常(等于0或大于100),则重新赋值AlarmTL=20;if((AlarmTH==0)||(AlarmTH>100)) // 如果温度上限报警值读出来异常(等于0或大于100),则重新赋值AlarmTH=35;if((AlarmHL==0)||(AlarmHL>100)) // 如果温度下限报警值读出来异常(等于0或大于100),则重新赋值AlarmHL=40;if((AlarmHH==0)||(AlarmHH>100)) // 如果温度上限报警值读出来异常(等于0或大于100),则重新赋值AlarmHH=85;if((AlarmPM==0)||(AlarmPM>1300))    // 如果读取到的报警值异常,则重新赋值AlarmPM=200;
}/*********************************************************/
// 主函数
/*********************************************************/
void main(void)
{uchar i;               // 循环变量uint ret;                // 保存PM2.5测量结果LcdInit();                        // 液晶功能初始化LcdShowInit();                    // 液晶显示初始化UartInit();                           // 串口初始化AlarmInit();                        // 报警值初始化while(1){/*PM2.5的读取*/ret=0;                                           // 清零测量结果for(i=0;i<10;i++)                        // 将最新的20个测量结果求和{ret=ret+Value[i];}ret=ret/10;                                   // 再除以20求得平均值pm=((ret*5)/1024.0)*180;      // 将读取到的电压值转换为灰尘浓度值 LcdGotoXY(0,7);                         // 液晶定位到第0行第6列LcdPrintNum1(pm);                     // 显示测量结果/*温湿度读取*/EA=0;ReadDhtData();                          // 检测温湿度数据;EA=1;LcdGotoXY(1,2);                            // 定位到要显示温度的地方LcdPrintNum2(temp);                   // 显示温度值LcdGotoXY(1,11);                        // 定位到要显示湿度的地方LcdPrintNum2(humi);                   // 显示湿度值// 报警判断AlarmJudge();                        /*按键扫描和延时*/for(i=0;i<30;i++){KeyScanf();                              // 按键判断DelayMs(10);}}
}/*********************************************************/
// 串口中断服务程序
/*********************************************************/
void UartInt(void) interrupt 4
{uchar VoutH,VoutL;if(RI==1){RI=0;if(SBUF==0xAA)       // 起始位{while(!RI);VoutH=SBUF;          // Vout(H)RI=0;while(!RI);VoutL=SBUF;         // Vout(L)RI=0;while(!RI);         // Vref(H)RI=0;while(!RI);         // Vref(L)RI=0;while(!RI);         // 校验位RI=0;while(!RI);         // 停止位RI=0;Value[gIndex]=VoutH*256+VoutL;gIndex++;if(gIndex==20)gIndex=0;}}
} 

四、PCB原理图

项目的仿真和程序代码工程和原理图已经放在下面公众号里面,可以关注公众号:Kevin的学习站,输入关键字:“51单片机PM2.5+温湿度”,就可以免费获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!

课设-51单片机+PM2.5+温湿度(程序+原理图+Protel仿真)相关推荐

  1. 51单片机测量脉冲频率C程序及protues仿真结果精确

    测定脉冲频率,附带部分PROTUES仿真结果和完整C语言程序,对于初学者或着急使用的电子爱好者来说,软件硬件结合,十分方便移植.仿真结果十分精确,实际应用中可能会存在少许误差,通过相应的电路处理,可以 ...

  2. 【制作】基于金沙滩51单片机的电子密码锁程序

    基于金沙滩51单片机的电子密码锁程序 很久之前做的一个课设,在B站发了效果视频,发现忘记分享代码了,现在整理分享一下. 零.设计报告 1.设计要求 这部分是讲的整个系统实现了什么功能. 1.1.密码的 ...

  3. 基于51单片机的SHT11温湿度检测调节系统(LCD12864显示)

    目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现(protues8.7) 程序(Keil5) 全部资料(压缩文件) 具体实现功能 (1)实时检测温湿度值,LCD12864分别显示温度值 ...

  4. 基于51单片机的智能加湿器设计。 有仿真,程序,原理图,原文

    基于51单片机的智能加湿器设计. 有仿真,程序,原理图,原文. 可做实物. 通过DHT11实时监测环境温湿度,按键设定温湿度阈值,超限加湿器工作. 有水位检测电路,水位不足时候,报警提醒,防止干烧. ...

  5. 基于51单片机PM2.5浓度检测超限报警Proteus仿真

    资料编号:159   下面是相关功能视频演示: 159-基于51单片机PM2.5浓度检测超限报警Proteus仿真(源码+仿真+全套资料) 功能介绍: 采用51单片机作为CPU,ADC0832作为AD ...

  6. 单片机c语言的按键程序,51单片机按键扫描C程序

    原标题:51单片机按键扫描C程序 大二上学期做过80 的按键程序,当时项目要求实现按键控制 屏显示并且接收GPRS传来的数据.当时为了节省成本,就去大西电子市场买来8*8的LED块,然后自己一点一点的 ...

  7. pid控制器c51语言编程,51单片机电机pid控制系统程序

    51单片机电机pid控制系统程序 本程序来源网上,小编进行了简单修改,还未验证. /************************* 应用背景:直流电机的额定功率12V,额定转速3000rpm,光码 ...

  8. c语言学生成绩查询课设报告,C语言课设报告(学生考试成绩查询程序)【荐】.doc...

    C语言课设报告(学生考试成绩查询程序)[荐].doc 学生考试成绩查询程序 学号:******** 姓名:***** 完成日期:****年月 通过键盘输入学生的考试信息,包括:学号.姓名.课程名称.学 ...

  9. pt100+51单片机的温控系统程序+仿真图 还带压力显示的

    pt100+51单片机的温控系统程序+仿真图 还带压力显示的 使用pt100测温度,经过放大器放大后的电压值乘以236就是实际的温度值0.42V对应100度,0V对应0度,经过ad运算显示出来,其他滤 ...

最新文章

  1. 机器人学的几何基础pdf
  2. java 调试 gdb_android gdb 调试实例演示(有源代码篇)
  3. Vue 是如何用 Rollup 打包的?
  4. 线性系统的基本理论与运算
  5. 吴恩达《机器学习》学习笔记十一——应用机器学习的建议
  6. java 放行文件_springmvc中关于静态资源的放行
  7. strchr和strstr函数
  8. 一个八卦的AI,嗅到了你和TA之间基情满满
  9. 高级恶意软件技术新挑战——突破主动防御
  10. mvp+dagger2_Android MVP + Dagger2 +改造+ RxJava
  11. 图片加载框架之Fresco
  12. 开启协程_一篇文章搞懂Python协程
  13. win10删除微软拼音
  14. PTA 7-28猴子选大王(约瑟夫问题)
  15. 运算符和强制类型转换
  16. 京东注册页面简单html代码,(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看...
  17. 基于4G工业路由器的智慧厕所管理方案
  18. 171230 编程-井字棋(逆)的先手必胜策略
  19. Android rom开发:自定义序列号ro.serialno
  20. 手写模拟spring扫描底层实现

热门文章

  1. 红包 java_利用java发红包(1)之红包分配方法
  2. 传智播客成都Java培训中心
  3. 经典励志文章:一碗阳春面
  4. Windows 8应用商店应用如何与Android和iPad对抗?
  5. 苹果x电池容量_苹果iPhone X电池老化严重:越来越多用户收到性能劣化影响
  6. 希腊罗马神话和《圣经》中的英语典故
  7. 五大影响记忆力的日常习惯
  8. 极客领航 C/C++|MCU|软件|物联网|嵌入式|Linux|辅助设计|飞行器
  9. Linux系统简介(简单粗暴)
  10. 【重磅整理】提前看287篇ICLR-2021 深度强化学习领域论文得分汇总列表