欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)PM2.5檢測(cè)儀的PCB+原理圖+程序設(shè)計(jì)資料 [打印本頁(yè)]

作者: zhuxun631    時(shí)間: 2019-4-25 23:12
標(biāo)題: 單片機(jī)PM2.5檢測(cè)儀的PCB+原理圖+程序設(shè)計(jì)資料
很高興來到這里。
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)



元件清單:
單片機(jī)STC89C52    1片
單片機(jī)座    1個(gè)
晶振11.0592M    1個(gè)
獨(dú)石電容30pF    2個(gè)
電解電容10uF    1個(gè)
電解電容220uF    1個(gè)
電阻10K    1個(gè)
排阻10K(103)    1片
按鍵    2個(gè)
1602液晶    1個(gè)
1602液晶座    1個(gè)
電位器10K(103)    1個(gè)
PM2.5傳感器 GP2Y1051AU0F    1個(gè)
有源蜂鳴器    1個(gè)
S8550(PNP)三極管    1個(gè)
洞洞板9*15cm    1張
電源座    1個(gè)
電源開關(guān)    1個(gè)
電源線    1根


      為什么會(huì)有兩個(gè)原理圖呢?                                      
                                                                                                           
      1、兩個(gè)原理圖本質(zhì)是一樣的,只不過連接方式不同而已。                                                     
      2、原理圖1是以模塊化的形式展現(xiàn),模塊和模塊之間通過網(wǎng)絡(luò)編號(hào)                                                  
         關(guān)聯(lián)起來,這樣連接的好處是整個(gè)原理圖看起來非常簡(jiǎn)潔明了。   
                                                      
                                                                    
      3、原理圖2中,各個(gè)元件都通過導(dǎo)線連接起來,好處是看起來比較                                                         
         直觀,缺點(diǎn)是整個(gè)圖給人的感覺比較亂。                       
                                                                     
                                                                    
      4、建議,最好是采用原理圖1的連接方式,這種修改和查看都         
         都比較方便的。之所以還給了一個(gè)原理圖2,是滿足部分有強(qiáng)迫   
         癥的同學(xué),他們沒看到有導(dǎo)線相連,總覺得不對(duì)。其實(shí)原理圖1                                                         
         這種網(wǎng)絡(luò)編號(hào)連接才是規(guī)范的。                              
                                                                    
         以后出去工作接觸的項(xiàng)目,要么一個(gè)芯片上百個(gè)引腳,要么一個(gè)   
         原理圖上百個(gè)元件,要是都通過線來連接,可以想象整個(gè)原理圖   
         將是多么的亂,已經(jīng)失去了原理圖的意義了,所以還是建議采用   
         模塊化的思想來畫原理圖。


     一、程序用什么軟件查看?                                                                             
      打開程序的軟件是Keil,我們提供了相關(guān)的安裝包,放在資料包                                                                        
      《24、軟件--Keil 安裝包》里面。                              
                                                                                                                       
     二、如何復(fù)制到word?                                          
                                                                    
      1、進(jìn)入“程序(Keil版)”這個(gè)文件夾;                                                                                       
      2、找到“main.c”這個(gè)文件,程序源碼就在這個(gè)文件里面;                                                         
      3、用電腦自帶的記事本軟件可以打開這個(gè)“main.c”文件;                                                                    
      4、用記事本打開之后,自己復(fù)制到word就可以了;                                                                              
                                                                    
     三、如何下載程序到板子上?                                    
                                                                    
      我們提供了下載程序的視頻教程,放在資料包《19、如何下載                              
      單片機(jī)程序》。

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char                // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int                // 以后unsigned int 就可以用uint 代替

  5. sfr ISP_DATA  = 0xe2;                        // 數(shù)據(jù)寄存器
  6. sfr ISP_ADDRH = 0xe3;                        // 地址寄存器高八位
  7. sfr ISP_ADDRL = 0xe4;                        // 地址寄存器低八位
  8. sfr ISP_CMD   = 0xe5;                        // 命令寄存器
  9. sfr ISP_TRIG  = 0xe6;                        // 命令觸發(fā)寄存器
  10. sfr ISP_CONTR = 0xe7;                        // 命令寄存器

  11. sbit LcdRs_P  = P2^7;     // 1602液晶的RS管腳      
  12. sbit LcdRw_P  = P2^6;     // 1602液晶的RW管腳
  13. sbit LcdEn_P  = P2^5;     // 1602液晶的EN管腳
  14. sbit Key1_P   = P3^2;                        // 減按鍵
  15. sbit Key2_P   = P3^3;                        // 加按鍵
  16. sbit Buzzer_P = P1^0;                        // 蜂鳴器


  17. uint  gAlarm ;                                                // 報(bào)警值
  18. uchar gIndex=0;                                                // 串口接收索引
  19. uint  Value[20]={0};                        // 串口數(shù)據(jù)緩存區(qū)


  20. /*********************************************************/
  21. // 單片機(jī)內(nèi)部EEPROM不使能
  22. /*********************************************************/
  23. void ISP_Disable()
  24. {
  25.         ISP_CONTR = 0;
  26.         ISP_ADDRH = 0;
  27.         ISP_ADDRL = 0;
  28. }


  29. /*********************************************************/
  30. // 從單片機(jī)內(nèi)部EEPROM讀一個(gè)字節(jié),從0x2000地址開始
  31. /*********************************************************/
  32. unsigned char EEPROM_Read(unsigned int add)
  33. {
  34.         ISP_DATA  = 0x00;
  35.         ISP_CONTR = 0x83;
  36.         ISP_CMD   = 0x01;
  37.         ISP_ADDRH = (unsigned char)(add>>8);
  38.         ISP_ADDRL = (unsigned char)(add&0xff);
  39.         // 對(duì)STC89C51系列來說,每次要寫入0x46,再寫入0xB9,ISP/IAP才會(huì)生效
  40.         ISP_TRIG  = 0x46;          
  41.         ISP_TRIG  = 0xB9;
  42.         _nop_();
  43.         ISP_Disable();
  44.         return (ISP_DATA);
  45. }


  46. /*********************************************************/
  47. // 往單片機(jī)內(nèi)部EEPROM寫一個(gè)字節(jié),從0x2000地址開始
  48. /*********************************************************/
  49. void EEPROM_Write(unsigned int add,unsigned char ch)
  50. {
  51.         ISP_CONTR = 0x83;
  52.         ISP_CMD   = 0x02;
  53.         ISP_ADDRH = (unsigned char)(add>>8);
  54.         ISP_ADDRL = (unsigned char)(add&0xff);
  55.         ISP_DATA  = ch;
  56.         ISP_TRIG  = 0x46;
  57.         ISP_TRIG  = 0xB9;
  58.         _nop_();
  59.         ISP_Disable();
  60. }


  61. /*********************************************************/
  62. // 擦除單片機(jī)內(nèi)部EEPROM的一個(gè)扇區(qū)
  63. // 寫8個(gè)扇區(qū)中隨便一個(gè)的地址,便擦除該扇區(qū),寫入前要先擦除
  64. /*********************************************************/
  65. void Sector_Erase(unsigned int add)          
  66. {
  67.         ISP_CONTR = 0x83;
  68.         ISP_CMD   = 0x03;
  69.         ISP_ADDRH = (unsigned char)(add>>8);
  70.         ISP_ADDRL = (unsigned char)(add&0xff);
  71.         ISP_TRIG  = 0x46;
  72.         ISP_TRIG  = 0xB9;
  73.         _nop_();
  74.         ISP_Disable();
  75. }


  76. /*********************************************************/
  77. // 毫秒級(jí)的延時(shí)函數(shù),time是要延時(shí)的毫秒數(shù)
  78. /*********************************************************/
  79. void DelayMs(uint time)
  80. {
  81.         uint i,j;
  82.         for(i=0;i<time;i++)
  83.                 for(j=0;j<112;j++);
  84. }


  85. /*********************************************************/
  86. // 1602液晶寫命令函數(shù),cmd就是要寫入的命令
  87. /*********************************************************/
  88. void LcdWriteCmd(uchar cmd)
  89. {
  90.         LcdRs_P = 0;
  91.         LcdRw_P = 0;
  92.         LcdEn_P = 0;
  93.         P0=cmd;
  94.         DelayMs(2);
  95.         LcdEn_P = 1;   
  96.         DelayMs(2);
  97.         LcdEn_P = 0;       
  98. }


  99. /*********************************************************/
  100. // 1602液晶寫數(shù)據(jù)函數(shù),dat就是要寫入的數(shù)據(jù)
  101. /*********************************************************/
  102. void LcdWriteData(uchar dat)
  103. {
  104.         LcdRs_P = 1;
  105.         LcdRw_P = 0;
  106.         LcdEn_P = 0;
  107.         P0=dat;
  108.         DelayMs(2);
  109.         LcdEn_P = 1;   
  110.         DelayMs(2);
  111.         LcdEn_P = 0;
  112. }


  113. /*********************************************************/
  114. // 1602液晶初始化函數(shù)
  115. /*********************************************************/
  116. void LcdInit()
  117. {
  118.         LcdWriteCmd(0x38);        // 16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)口
  119.         LcdWriteCmd(0x0C);        // 開顯示,不顯示光標(biāo)
  120.         LcdWriteCmd(0x06);        // 地址加1,當(dāng)寫入數(shù)據(jù)后光標(biāo)右移
  121.         LcdWriteCmd(0x01);        // 清屏
  122. }


  123. /*********************************************************/
  124. // 液晶光標(biāo)定位函數(shù)
  125. /*********************************************************/
  126. void LcdGotoXY(uchar line,uchar column)
  127. {
  128.         // 第一行
  129.         if(line==0)        
  130.                 LcdWriteCmd(0x80+column);
  131.          // 第二行
  132.         if(line==1)        
  133.                 LcdWriteCmd(0x80+0x40+column);
  134. }


  135. /*********************************************************/
  136. // 液晶輸出數(shù)字
  137. /*********************************************************/
  138. void LcdPrintNum(uint num)
  139. {
  140.         if(num>999)
  141.         {
  142.                 LcdWriteData(num/1000+48);                        // 如果有千位,則輸出千位
  143.         }
  144.         else                                                                                                                        // 如果沒有千位,則輸出空格
  145.         {
  146.                 LcdWriteData(' ');
  147.         }
  148.         LcdWriteData(num%1000/100+48);                // 百位
  149.         LcdWriteData(num%100/10+48);                        // 十位
  150.         LcdWriteData(num%10+48);                                         // 個(gè)位
  151. }


  152. /*********************************************************/
  153. // 液晶輸出字符串函數(shù)
  154. /*********************************************************/
  155. void LcdPrintStr(uchar *str)
  156. {
  157.         while(*str!='\0')
  158.                 LcdWriteData(*str++);
  159. }


  160. /*********************************************************/
  161. // 液晶顯示內(nèi)容初始化
  162. /*********************************************************/
  163. void LcdShowInit()
  164. {
  165.         LcdGotoXY(0,0);                                // 液晶光標(biāo)定位到第0行第0列
  166.         LcdPrintStr("PM2.5:     ug/m3");
  167.         LcdGotoXY(1,0);                                // 液晶光標(biāo)定位到第1行第0列
  168.         LcdPrintStr("Alarm:     ug/m3");
  169. }



  170. /*********************************************************/
  171. // 串口初始化
  172. /*********************************************************/
  173. void UartInit()
  174. {
  175.         TMOD = 0x20;
  176.         SCON = 0x50;
  177.         TH1  = 0xf4;
  178.         TL1  = 0xf4;
  179.         TR1  = 1;
  180.         REN  = 1;
  181.         EA   = 1;
  182.         ES   = 1;
  183. }


  184. /*********************************************************/
  185. // 按鍵掃描
  186. /*********************************************************/
  187. void KeyScanf()
  188. {
  189.         /* 減按鍵被按下 */
  190.         if(Key1_P==0)               
  191.         {
  192.                 if(gAlarm>1)                                                                                                // 只有報(bào)警值大于1,才能完成減操作
  193.                 {
  194.                         gAlarm--;                                                                                                        // 報(bào)警值減1
  195.                         LcdGotoXY(1,6);                                                                                // 液晶定位到第1行第6列
  196.                         LcdPrintNum(gAlarm);                                                        // 顯示報(bào)警濃度值
  197.                         Sector_Erase(0x2000);                                                         // 存儲(chǔ)之前必須先擦除
  198.                         EEPROM_Write(0x2000,gAlarm/100);        // 存儲(chǔ)新的報(bào)警值
  199.                         EEPROM_Write(0x2001,gAlarm%100);       
  200.                 }
  201.         }
  202.        
  203.         /* 減按鍵被按下 */
  204.         if(Key2_P==0)
  205.         {
  206.                 if(gAlarm<1300)                                                                                        // 只有報(bào)警值小于1300,才能完成加操作
  207.                 {
  208.                         gAlarm++;                                                                                                        // 報(bào)警值加1
  209.                         LcdGotoXY(1,6);                                                                                // 液晶定位到第1行第6列
  210.                         LcdPrintNum(gAlarm);                                                        // 顯示報(bào)警濃度值
  211.                         Sector_Erase(0x2000);                                                         // 存儲(chǔ)之前必須先擦除
  212.                         EEPROM_Write(0x2000,gAlarm/100);        // 存儲(chǔ)新的報(bào)警值
  213.                         EEPROM_Write(0x2001,gAlarm%100);       
  214.                 }
  215.         }
  216. }


  217. /*********************************************************/
  218. // 報(bào)警判斷
  219. /*********************************************************/
  220. void AlarmJudge(uint num)
  221. {
  222.         if(num>gAlarm)       
  223.                 Buzzer_P=0;                // 開啟蜂鳴器報(bào)警
  224.         else
  225.                 Buzzer_P=1;                // 停止蜂鳴器報(bào)警
  226. }


  227. /*********************************************************/
  228. // 主函數(shù)
  229. /*********************************************************/
  230. void main(void)
  231. {
  232.         uchar i;                                // 循環(huán)變量
  233.         uint ret;                                // 保存測(cè)量結(jié)果
  234.        
  235.         gAlarm=EEPROM_Read(0x2000)*100+EEPROM_Read(0x2001);                // 上電時(shí),先讀取報(bào)警值
  236.         if((gAlarm==0)||(gAlarm>999))                                                                                                        // 如果讀取到的報(bào)警值異常,則重新賦值
  237.                 gAlarm=200;
  238.                
  239.        
  240.         LcdInit();                                            // 液晶功能初始化
  241.         LcdShowInit();                                        // 液晶顯示初始化
  242.         UartInit();                                                        // 串口初始化

  243.         LcdGotoXY(1,6);                                        // 液晶定位到第1行第6列
  244.         LcdPrintNum(gAlarm);                // 顯示報(bào)警濃度值
  245.        
  246.         while(1)
  247.         {
  248.                 ret=0;                                                                                        // 清零測(cè)量結(jié)果
  249.                 for(i=0;i<20;i++)                                                // 將最新的20個(gè)測(cè)量結(jié)果求和
  250.                 {
  251.                         ret=ret+Value[i];
  252.                 }
  253.                 ret=ret/20;                                                                        // 再除以20求得平均值
  254.                
  255.                 ret=((ret*5)/1024.0)*380;                // 將讀取到的電壓值轉(zhuǎn)換為灰塵濃度值       
  256.                
  257.                 LcdGotoXY(0,6);                                                        // 液晶定位到第0行第6列
  258.                 LcdPrintNum(ret);                                                // 顯示測(cè)量結(jié)果
  259.                
  260.                 AlarmJudge(ret);                                                // 判斷是否需要報(bào)警
  261.                
  262.                 KeyScanf();                                                                        // 進(jìn)行按鍵掃描,判斷是否有按鍵按下
  263. ……………………

  264. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


全部資料51hei下載地址:
10、元件清單.rar (2.97 KB, 下載次數(shù): 82)
07、單片機(jī)程序.rar (39.13 KB, 下載次數(shù): 117)
08、電路圖(原理圖和PCB圖).rar (514.6 KB, 下載次數(shù): 129)



作者: jemery1030    時(shí)間: 2019-7-22 22:15
感謝分享
作者: Super88    時(shí)間: 2020-2-1 18:05
感謝分享
作者: rlm    時(shí)間: 2020-2-14 16:30
怎么下載啊
作者: 15764271758    時(shí)間: 2020-2-15 19:04
感謝資料分享
作者: 空氣質(zhì)量    時(shí)間: 2020-5-1 14:32
怎末沒有仿真啊
作者: redmoon123456    時(shí)間: 2021-8-29 11:58
你的PM2.5傳感器輸出是模擬信號(hào),為何直接送給了單片機(jī)?不需要AD轉(zhuǎn)換?




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1