赞
踩
#include <reg52.h> #include <intrins.h> #include <stdio.h>//printf串口输出头文件 #define uchar unsigned char #define ushort unsigned int #define uint unsigned long #include "lcd1602.h" #include "uart_trx.h" #include "eeprom52.h" #define RATIO 800 //系数,建议选择800-1000 sbit key1 = P1^0;//加键 sbit key2 = P1^1;//减键 sbit beep = P2^0;//蜂鸣器 sbit Fan = P1^3;//风扇 unsigned char pmBuf[7] = 0;//数据接收数组 uint PM25_Value = 0; //PM = ((pmBuf[1]<<8)+pmBuf[2])/1024*8*ratio uint PM25_ValueMax = 200; //上限初始值 void EEPROM_WRITE()//EEPROM写入 { SectorErase(0x2000);//擦除扇区 byte_write(0x2001, (PM25_ValueMax>>8)&0xFF);//存储高8位 byte_write(0x2002, (PM25_ValueMax>>0)&0xFF);//存储低8位 byte_write(0x2009, 111);//存储校验值 } void EEPROM_READ()//EEPROM读出 { if(byte_read(0x2009)!=111)//开机检测单片机是不是第一次使用,如果不是第一次使用,则先把数据存储一遍,再读取,数据就不会乱码 { EEPROM_WRITE();//存储 delay_ms(100); } PM25_ValueMax = byte_read(0x2001)<<8 | byte_read(0x2002);//读取上限值 } void Get_PM(void)//读取PM2.5值,具体的数据帧意思,请自行查阅芯片手册 { char i = 0; char j = 0; char k = 0; COM.RX_Cnt = 0; if(COM.B_RX_OK == 1)//串口数据接收完成 { for(i = 0; i<8; i++) { if((RX_Buffer[i] == 0xAA)&&(RX_Buffer[i+6]==0xFF))//判断接收的数据是否正确 { goto find2; } } goto end2; find2: for(j = 0; j<7; j++) { pmBuf[j] = RX_Buffer[i+j];//数据获取 } PM25_Value = (unsigned int)((pmBuf[1]*256)+pmBuf[2])*5/2048.0*RATIO;//计算PM2.5值 COM.B_RX_OK = 0; } end2: return; } void main(void) { unsigned int test; EEPROM_READ();//开机读取存储值 LCD_init();//1602初始化 Uart_Init(2400);//串口初始化波特率2400 LCD_write_string(0,0,"Pm2.5: ug/m3 "); LCD_write_string(0,1,"PmMax: ug/m3 "); //显示上限值 LCD_write_char(7, 1, PM25_ValueMax % 1000 / 100 + 0x30); LCD_write_char(8, 1, PM25_ValueMax % 100 / 10 + 0x30); LCD_write_char(9, 1, PM25_ValueMax % 10 + 0x30); while(1) { if (test ++ > 250)//大约250ms读取一次 { test = 0 ; Get_PM();//获取PM2.5 if(PM25_Value > 999)//限值,最大999 PM25_Value = 999; //显示PM2.5 LCD_write_char(7, 0, PM25_Value % 1000 / 100 + 0x30); LCD_write_char(8, 0, PM25_Value % 100 / 10 + 0x30); LCD_write_char(9, 0, PM25_Value % 10 + 0x30); if(PM25_Value >= PM25_ValueMax)//超过上限,蜂鸣器报警 { beep = ~beep; Fan = 0; delay_ms(100); } else { beep = 1; Fan = 1; } } if(key1 == 0)//加键按下 { delay_ms(10);//消抖 if(key1 == 0) { beep = 0; delay_ms(100); beep = 1; while(key1 == 0); if(PM25_ValueMax<999)PM25_ValueMax+=10;//上限最大到999,每次加10 //显示 LCD_write_char(7, 1, PM25_ValueMax % 1000 / 100 + 0x30); LCD_write_char(8, 1, PM25_ValueMax % 100 / 10 + 0x30); LCD_write_char(9, 1, PM25_ValueMax % 10 + 0x30); EEPROM_WRITE();//保存 } } if(key2 == 0)//减键按下 { delay_ms(10); if(key2 == 0) { beep = 0; delay_ms(100); beep = 1; while(key2 == 0); if(PM25_ValueMax>=10)PM25_ValueMax-=10;//上限最小到0,每减10 //显示 LCD_write_char(7, 1, PM25_ValueMax % 1000 / 100 + 0x30); LCD_write_char(8, 1, PM25_ValueMax % 100 / 10 + 0x30); LCD_write_char(9, 1, PM25_ValueMax % 10 + 0x30); EEPROM_WRITE();//保存 } } delay_ms(1); } }
基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类的设计与实现 |
名称 |
单片机 |
IC座 |
万能板 |
晶振 |
电解电容 |
电解电容 |
瓷片电容 |
电阻 |
电阻 |
电阻 |
LED红 |
LED绿 |
蜂鸣器 |
三极管 |
按键 |
显示屏 |
排针 |
排母 |
人体红外模块 |
排母 |
温度传感器 |
烟雾传感器 |
模数转换器 |
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 |
深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)
资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!
! (备注:嵌入式)**
资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。