找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1555|回復(fù): 7
收起左側(cè)

有大佬 幫幫忙解讀一下這段程序嗎(單片機(jī)智能空氣凈化系統(tǒng))

[復(fù)制鏈接]
ID:1071327 發(fā)表于 2023-4-12 19:06 | 顯示全部樓層 |閱讀模式
#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int


sbit RS = P2^0;   //定義端口 lcd1602

sbit RW = P2^1;
sbit EN = P2^2;

sbit CS2  = P1^5;        //0832接口定義
sbit CLK = P1^6;
sbit DIO = P1^7;


#define RS_CLR RS=0
#define RS_SET RS=1

#define RW_CLR RW=0
#define RW_SET RW=1

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0        





sbit led=P3^0;
sbit led1=P3^2;           
sbit led2=P3^3;         
sbit bee=P3^1;                         //蜂鳴器

sbit key1=P3^4;                        //4個(gè)按鍵
sbit key2=P3^5;
sbit key3=P3^6;                        
sbit key4=P3^7;

sbit key5=P1^0;

uchar h=75;           //初始上限值
uchar l=50;

sbit motor=P3^2;   //風(fēng)扇
sbit xia=P3^3;                //噴灑

uint i,d;         //煙霧值檢測(cè)
uint time=0;
unsigned long S;

uchar safe=10;

uchar dis1[6];

bit flag=0;                  //標(biāo)志位
uint flag1;
bit flag2=0;
uchar flag3=0;
uchar re=0;
void delay_100us()
{
uchar j;
        for(j=0;j<31;j++)
                {
                ;
                }

}



          /*------------------------------------------------
                    延時(shí)程序
                        ------------------------------------------------*/
                         void delay_ms(uint j)
                         {
                                  uint i;
                                  for(;j>0;j--)
                                     {
                                                  for(i=0;i<113;i++)
                                             {
                                                         ;
                                                 }
                                          }
                          }




           /*------------------------------------------------
                         寫(xiě)入命令函數(shù)
            ------------------------------------------------*/


        void LCD_Write_Com(uchar com)
         {  
        delay_ms(5);
        RS_CLR;
        RW_CLR;
        EN_SET;
         DataPort=com;
        _nop_();
         EN_CLR;
         }
          /*------------------------------------------------
                          寫(xiě)入數(shù)據(jù)函數(shù)
          ------------------------------------------------*/

            void LCD_Write_Data(uchar Data)
             {
        delay_ms(5);
        RS_SET;
         RW_CLR;
         EN_SET;
        DataPort= Data;
        _nop_();
       EN_CLR;
       }


         /*------------------------------------------------
                         寫(xiě)入字符串函數(shù)
           ------------------------------------------------*/
            void LCD_Write_String(uchar x,uchar y,uchar *s)
            {     
        if (y == 0)
               {     


                LCD_Write_Com(0x80 + x);     //表示第一行
               }
       else
              {      
             LCD_Write_Com(0xC0 + x);      //表示第二行         
              }
                          
                                 
       while (*s)
               {     
       LCD_Write_Data( *s);     
      s ++;   
         
              }


        }


                /*------------------------------------------------
                         寫(xiě)入慢速字符串函數(shù)
           ------------------------------------------------*/
            void LCD_Write_SlowString(uchar x,uchar y,uchar *s)
            {     
        if (y == 0)
               {     


                LCD_Write_Com(0x80 + x);     //表示第一行
               }
       else
              {      
             LCD_Write_Com(0xC0 + x);      //表示第二行         
              }
                          
                                 
       while (*s)
               {     
       LCD_Write_Data( *s);     
      s ++;
         
           delay_ms(200);   
         
              }


        }


         /*------------------------------------------------
                        寫(xiě)入字符函數(shù)

          ------------------------------------------------*/
          void LCD_Write_Char(uchar x,uchar y,uchar Data)
          {     
      if (y == 0)
              {     
               LCD_Write_Com(0x80 + x);     
               }   
        else
               {     
               LCD_Write_Com(0xC0 + x);     
              }        
      LCD_Write_Data( Data);  
       }


           /*------------------------------------------------
                         初始化函數(shù)
          ------------------------------------------------*/
           void LCD_Init(void)
           {
                  

                        delay_ms(15);
                 LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/
                           LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/
                  LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/


                        LCD_Write_Com(0x0c);    /*顯示開(kāi)及光標(biāo)設(shè)置 */                    
                 LCD_Write_Com(0x06);    /*顯示光標(biāo)移動(dòng)設(shè)置 */
                        LCD_Write_Com(0x01);    /*顯示清屏 */  

                  
                  }









void display()                  //顯示處理子程序
{




dis1[3]=i/100;          //提取安全值的十位數(shù),賦值給dis1[12]
dis1[4]=i/10%10;           //提取安全值的個(gè)位數(shù),賦值給dis1[13]
dis1[5]=i%10;           //提取安全值的個(gè)位數(shù),賦值給dis1[13]






LCD_Write_Char(0,1,'Y');                   //液晶顯示數(shù)據(jù)
LCD_Write_Char(1,1,':');
LCD_Write_Char(2,1,dis1[3]+0x30);
LCD_Write_Char(3,1,dis1[4]+0x30);
LCD_Write_Char(4,1,dis1[5]+0x30);



LCD_Write_Char(9,1,'J');                   //液晶顯示
LCD_Write_Char(10,1,':');
LCD_Write_Char(11,1,d/100+0x30);
LCD_Write_Char(12,1,d/10%10+0x30);
LCD_Write_Char(13,1,d%10+0x30);

dis1[0]=h/100;         //提取百位數(shù),賦值給dis1[0]
dis1[1]=h/10%10;         //提取十位數(shù),賦值給dis1[1]
dis1[2]=h%10;         //提取個(gè)位數(shù),賦值給dis1[2]
LCD_Write_Char(8,0,dis1[0]+0x30);
LCD_Write_Char(9,0,dis1[1]+0x30);
LCD_Write_Char(10,0,dis1[2]+0x30);





delay_ms(1);
}




void key_process()
{


  if(key1==0)             //按鍵1
   {
    delay_ms(10);


        if(key1==0)
         {
          while(!key1);
          h++;
          if(h>=85) h=85;

          }
   }



   if(key2==0)                 //按鍵2
   {
    delay_ms(10);
        if(key2==0)
         {
          while(!key2);
           h--;
          if(h<=65) h=65;
          }
   }



}


unsigned char  A_D(bit flag)
{
        unsigned char i,dat;
        CS2=1;   //一個(gè)轉(zhuǎn)換周期開(kāi)始
        CLK=0;  //為第一個(gè)脈沖作準(zhǔn)備
        CS2=0;  //CS2置0,片選有效
        
        DIO=1;    //DIO置1,規(guī)定的起始信號(hào)  
        CLK=1;   //第一個(gè)脈沖
        CLK=0;   //第一個(gè)脈沖的下降沿,此前DIO必須是高電平
        DIO=1;   //DIO置1, 通道選擇信號(hào)  
        CLK=1;   //第二個(gè)脈沖,第2、3個(gè)脈沖下沉之前,DI必須跟別輸入兩位數(shù)據(jù)用于選擇通道,這里選通道CH0
        CLK=0;   //第二個(gè)脈沖下降沿
        DIO=flag;   //DI置0,選擇通道0
        CLK=1;    //第三個(gè)脈沖
        CLK=0;    //第三個(gè)脈沖下降沿
        DIO=1;    //第三個(gè)脈沖下沉之后,輸入端DIO失去作用,應(yīng)置1
        CLK=1;    //第四個(gè)脈沖
        for(i=0;i<8;i++)  //高位在前
        {
                CLK=1;         //第四個(gè)脈沖
                CLK=0;
                dat<<=1;       //將下面儲(chǔ)存的低位數(shù)據(jù)向右移
                dat|=(unsigned char)DIO;          //將輸出數(shù)據(jù)DIO通過(guò)或運(yùn)算儲(chǔ)存在dat最低位
        }                                 
        CS2=1;          //片選無(wú)效
        return dat;         //將讀書(shū)的數(shù)據(jù)返回     
}



void main()
{

delay_ms(5);         //延時(shí)5ms
LCD_Init();          //液晶1602初始化
TMOD=0x01;
ET0=1;
EA=0;


LCD_Write_String(0,0,"ZNTL    ");
LCD_Write_String(6,0,"S:    ");

LCD_Write_Char(15,0,re+0x30);



while(1)
        {


         
                key_process();                //按鍵掃描

                display(); //1602液晶顯示
               
                if(flag3==0)
                {
                i=A_D(0)/2;
                d=A_D(1)/2;
                }
                flag3++;
                if(flag3>=50) flag3=0;                //自加3次再檢測(cè)          (甲烷)
                         if(i>=h&&flag==0) motor=0;
                 else motor=1;

                if(d>=50) bee=0;        //報(bào)警
                else bee=1;
                 if(key5==0)  //紅外檢測(cè)不到
                 {
                 flag=1;
                 motor=1;
                 xia=1;
                 re=1;
                 LCD_Write_Char(15,0,re+0x30);
                 while(!key5)
                 {
                 
                  display(); //1602液晶顯示
                i=A_D(0)/2;
                 }

                 }

                 if(flag==1)
                 {
                 
                  if(i>=h)
                  {
                  motor=0;
                  xia=1;
                  flag2=1;
                  }
                 
                 if(i<h&&flag2==1)

                 {
                  xia=0;
                  motor=1;

                  flag1++;
                  if(flag1>=600)
                  {
                   flag1=0;
                   flag=0;
                   xia=1;
                   flag2=0;
                   re=0;
                   LCD_Write_Char(15,0,re+0x30);
                   }


                 
                 
                 }

        
                 
                 }

                delay_ms(1);
                 
               





        

               
                 
}
}

回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2023-4-12 20:16 | 顯示全部樓層
就是個(gè)按鍵處理和LCD顯示,哪里看不懂?
回復(fù)

使用道具 舉報(bào)

ID:1071327 發(fā)表于 2023-4-12 20:45 | 顯示全部樓層
Hephaestus 發(fā)表于 2023-4-12 20:16
就是個(gè)按鍵處理和LCD顯示,哪里看不懂?

能看懂一點(diǎn)   但是主程序流程圖不知道該咋弄,他寫(xiě)的這個(gè)沒(méi)有把模塊分離出來(lái)  我看著有點(diǎn)暈
回復(fù)

使用道具 舉報(bào)

ID:291668 發(fā)表于 2023-4-12 20:52 | 顯示全部樓層
多看幾遍就有感覺(jué)了。自己練練,加油吧
回復(fù)

使用道具 舉報(bào)

ID:69038 發(fā)表于 2023-4-12 22:13 | 顯示全部樓層
個(gè)人觀點(diǎn):
拿到一套代碼,首先要知道這代碼是用來(lái)做什么的,硬件電路都用了哪些器件,這些器件的控制原理或工作時(shí)序流程要清楚。如果以上都不了解,就算有人手把手,一對(duì)一地為你解說(shuō),你也掌握不了多少,等到換一個(gè)代碼,你還是一頭霧水。。
一個(gè)產(chǎn)品的工作流程你懂得了,畫(huà)個(gè)流程圖自然不在話下,再有一份確切的代碼,學(xué)起來(lái)就快。
所以,做碼農(nóng),還需要有電路、器件的基本知識(shí)。
樓主的這個(gè)代碼都注釋得差不多了,再結(jié)合0832、1602等器件的手冊(cè)不難理解啊~
回復(fù)

使用道具 舉報(bào)

ID:1071327 發(fā)表于 2023-4-12 22:18 | 顯示全部樓層
zhuls 發(fā)表于 2023-4-12 22:13
個(gè)人觀點(diǎn):
拿到一套代碼,首先要知道這代碼是用來(lái)做什么的,硬件電路都用了哪些器件,這些器件的控制原理 ...

我確實(shí)小白了   這不在看b站  學(xué)學(xué)
回復(fù)

使用道具 舉報(bào)

ID:1071327 發(fā)表于 2023-4-12 22:28 | 顯示全部樓層
li64331218 發(fā)表于 2023-4-12 20:52
多看幾遍就有感覺(jué)了。自己練練,加油吧

是的 打鐵 還得看自己
回復(fù)

使用道具 舉報(bào)

ID:69038 發(fā)表于 2023-4-12 22:31 | 顯示全部樓層
加菲魚(yú) 發(fā)表于 2023-4-12 22:18
我確實(shí)小白了   這不在看b站  學(xué)學(xué)

比如0832這塊,你對(duì)照0832的手冊(cè)、硬件電路的邊接方式,一行行代碼下來(lái),真的不難。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表