久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1544|回復: 7
收起左側

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

[復制鏈接]
ID:1071327 發表于 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個按鍵
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;   //風扇
sbit xia=P3^3;                //噴灑

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

uchar safe=10;

uchar dis1[6];

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

}



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




           /*------------------------------------------------
                         寫入命令函數
            ------------------------------------------------*/


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

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


         /*------------------------------------------------
                         寫入字符串函數
           ------------------------------------------------*/
            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 ++;   
         
              }


        }


                /*------------------------------------------------
                         寫入慢速字符串函數
           ------------------------------------------------*/
            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);   
         
              }


        }


         /*------------------------------------------------
                        寫入字符函數

          ------------------------------------------------*/
          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);  
       }


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

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


                        LCD_Write_Com(0x0c);    /*顯示開及光標設置 */                    
                 LCD_Write_Com(0x06);    /*顯示光標移動設置 */
                        LCD_Write_Com(0x01);    /*顯示清屏 */  

                  
                  }









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




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






LCD_Write_Char(0,1,'Y');                   //液晶顯示數據
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;         //提取百位數,賦值給dis1[0]
dis1[1]=h/10%10;         //提取十位數,賦值給dis1[1]
dis1[2]=h%10;         //提取個位數,賦值給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;   //一個轉換周期開始
        CLK=0;  //為第一個脈沖作準備
        CS2=0;  //CS2置0,片選有效
        
        DIO=1;    //DIO置1,規定的起始信號  
        CLK=1;   //第一個脈沖
        CLK=0;   //第一個脈沖的下降沿,此前DIO必須是高電平
        DIO=1;   //DIO置1, 通道選擇信號  
        CLK=1;   //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0
        CLK=0;   //第二個脈沖下降沿
        DIO=flag;   //DI置0,選擇通道0
        CLK=1;    //第三個脈沖
        CLK=0;    //第三個脈沖下降沿
        DIO=1;    //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
        CLK=1;    //第四個脈沖
        for(i=0;i<8;i++)  //高位在前
        {
                CLK=1;         //第四個脈沖
                CLK=0;
                dat<<=1;       //將下面儲存的低位數據向右移
                dat|=(unsigned char)DIO;          //將輸出數據DIO通過或運算儲存在dat最低位
        }                                 
        CS2=1;          //片選無效
        return dat;         //將讀書的數據返回     
}



void main()
{

delay_ms(5);         //延時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次再檢測          (甲烷)
                         if(i>=h&&flag==0) motor=0;
                 else motor=1;

                if(d>=50) bee=0;        //報警
                else bee=1;
                 if(key5==0)  //紅外檢測不到
                 {
                 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);
                 
               





        

               
                 
}
}

回復

使用道具 舉報

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

使用道具 舉報

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

能看懂一點   但是主程序流程圖不知道該咋弄,他寫的這個沒有把模塊分離出來  我看著有點暈
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

我確實小白了   這不在看b站  學學
回復

使用道具 舉報

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

是的 打鐵 還得看自己
回復

使用道具 舉報

ID:69038 發表于 2023-4-12 22:31 | 顯示全部樓層
加菲魚 發表于 2023-4-12 22:18
我確實小白了   這不在看b站  學學

比如0832這塊,你對照0832的手冊、硬件電路的邊接方式,一行行代碼下來,真的不難。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品av | 亚洲狠狠丁香婷婷综合久久久 | 春色av | 成人高潮片免费视频欧美 | 精品国产视频在线观看 | 伊人性伊人情综合网 | 在线成人av | 亚洲福利视频一区二区 | 成人免费在线视频 | 日韩精品一区二区三区中文在线 | av天天看 | 一区视频在线播放 | 欧美99 | 欧美激情久久久 | 精品欧美乱码久久久久久1区2区 | 一区视频在线免费观看 | 国产成人一区在线 | 麻豆视频在线免费观看 | 免费观看一级毛片视频 | 天堂综合网| 日韩二区 | 国内精品久久久久久 | 欧美一区二区三区四区在线 | 欧美九九| 日韩av成人在线观看 | 91av在线影院 | 亚洲欧美在线观看 | 91久久久久 | 性大毛片视频 | 亚洲男人天堂网 | 中文字幕一区二区三区不卡 | 91视频麻豆 | 99热热| 午夜99| 永久免费av | 国产精品视频一二三区 | 久久亚洲精品国产精品紫薇 | 欧美在线视频网 | 日韩亚洲欧美综合 | 91黄色免费看 | 一区二区精品视频 |