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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2578|回復: 0
打印 上一主題 下一主題
收起左側

1602計數程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:301160 發表于 2018-4-4 16:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

  • #include <reg52.h>                     //調用單片機頭文件
  • #define uchar unsigned char  //無符號字符型     宏定義        變量范圍0~255
  • #define uint  unsigned int             //無符號整型 宏定義        變量范圍0~65535
  • #include <intrins.h>


  • bit flag_500ms;
  • sbit beep = P1^4; //蜂鳴器IO口定義

  • sbit hw_jin = P2^0;   //紅外傳感器IO口定義
  • sbit hw_chu = P2^1;   //紅外傳感器IO口定義
  • uchar a_a;
  • uchar menu_1;                       //設置參數用

  • uint num;  //計的數
  • uint jin,chu;
  • uchar set_num = 80; // 設置倒計時數的啟始值


  • /***********************1ms延時函數*****************************/
  • void delay_1ms(uint q)
  • {
  •         uint i,j;
  •         for(i=0;i<q;i++)
  •                     for(j=0;j<120;j++);
  • }

  • /*************定時器0初始化程序***************/
  • void time_init()         
  • {
  •         EA   = 1;                       //開總中斷
  •         TMOD = 0X01;              //定時器0、工作方式1
  •         ET0  = 1;                      //開定時器0中斷
  •         TR0  = 1;                      //允許定時器0定時
  • }

  • sbit rs=P1^0;         //寄存器選擇信號 H:數據寄存器              L:指令寄存器
  • sbit rw=P1^1;         //寄存器選擇信號 H:數據寄存器              L:指令寄存器
  • sbit e =P1^2;         //片選信號   下降沿觸發

  • /********************************************************************
  • * 名稱 :     delay_uint()
  • * 功能 : 小延時。
  • * 輸入 :
  • * 輸出 :
  • ***********************************************************************/
  • void delay_uint(uint q)
  • {
  •         while(q--);
  • }

  • /********************************************************************
  • * 名稱 :     write_com(uchar com)
  • * 功能 : 1602命令函數
  • * 輸入 : 輸入的命令值
  • * 輸出 :
  • ***********************************************************************/
  • void write_com(uchar com)
  • {
  •         e=0;
  •         rs=0;
  •         rw=0;
  •         P0=com;
  •         delay_uint(25);
  •         e=1;
  •         delay_uint(100);
  •         e=0;
  • }

  • /********************************************************************
  • * 名稱 :     write_data(uchar dat)
  • * 功能 : 1602寫數據函數
  • * 輸入 : 需要寫入1602的數據
  • * 輸出 :
  • ***********************************************************************/
  • void write_data(uchar dat)
  • {
  •         e=0;
  •         rs=1;
  •         rw=0;
  •         P0=dat;
  •         delay_uint(25);
  •         e=1;
  •         delay_uint(100);
  •         e=0;            
  • }


  • /***********************lcd1602上顯示兩位十進制數************************/
  • void write_sfm4(uchar hang,uchar add,uint date)
  • {
  •         if(hang==1)   
  •                     write_com(0x80+add);
  •         else
  •                     write_com(0x80+0x40+add);
  •             write_data(0x30+date/1000%10);
  •         write_data(0x30+date/100%10);
  •             write_data(0x30+date/10%10);
  •             write_data(0x30+date%10);            
  • }

  • /***********************lcd1602上顯示這字符函數************************/
  • void write_string(uchar hang,uchar add,uchar *p)
  • {
  •         if(hang==1)   
  •                     write_com(0x80+add);
  •         else
  •                     write_com(0x80+0x40+add);
  •                     while(1)                                                                                                                                             
  •                     {
  •                             if(*p ==     '\0')  break;
  •                             write_data(*p);
  •                             p++;
  •                     }        
  • }

  • /***********************lcd1602初始化設置************************/
  • void init_1602()        //lcd1602初始化
  • {
  •         write_com(0x38);            
  •         write_com(0x0c);
  •         write_com(0x06);
  •         delay_uint(1000);
  •             write_string(1,0,"         Z:0000       ");            
  •         write_string(2,0,"     J:0000  C:0000   ");            
  •             write_sfm4(2,1,jin);  //顯示人數
  •             write_sfm4(1,6,num);  //顯示人數
  •             write_sfm4(2,11,chu);  //顯示人數
  • }


  • /********************獨立按鍵程序*****************/
  • uchar key_can;         //按鍵值

  • void key()                 //獨立按鍵程序
  • {
  •         static uchar key_new;
  •         key_can = 20;                   //按鍵值還原
  •         P3 |= 0xf0;
  •         if((P3 & 0xf0) !=     0xf0)                //按鍵按下
  •         {
  •                     delay_1ms(1);                         //按鍵消抖動
  •                     if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
  •                     {                                                            //確認是按鍵按下
  •                             key_new = 0;
  •                             switch(P3 & 0xf0)
  •                             {
  •                                         case 0xd0: key_can = 1; break;               //得到k1鍵值
  •                                         case 0xb0: key_can = 2; break;               //得到K2鍵值
  •                                         case 0x70: key_can = 3; break;               //得到k3鍵值
  •                             }
  •                     }                           
  •         }
  •         else
  •                     key_new = 1;        
  • }

  • /****************按鍵處理數碼管顯示函數***************/
  • void key_with()
  • {
  •         if(key_can == 1)            //設置鍵
  •         {
  •                     menu_1 ++;
  •                     if(menu_1 >= 2)
  •                     {
  •                             menu_1 = 0;
  •                                 init_1602();  //lcd1602初始化                           
  •                     }
  •                     if(menu_1 == 1)                                         //初始化顯示
  •                     {
  •                                 write_string(1,0,"  SET Z Alarm    ");
  •                             write_string(2,0,"                         ");
  •                                 write_sfm4(2,6,set_num);  //顯示人數
  •                     }
  •         }
  •         if(menu_1 == 0)                                   //倒計時器按鍵操作開始     暫停
  •         {                     
  •                     if(key_can == 2)  //清零
  •                     {
  •                             num = 0;
  •                             jin = 0;
  •                             chu = 0;
  •                                 write_sfm4(2,3,jin);  //顯示人數
  •                                 write_sfm4(1,7,num);  //顯示人數
  •                                 write_sfm4(2,11,chu);  //顯示人數
  •                     }
  •                     
  •         }
  •         if(menu_1 == 1)                                        //設置倒計時器開始數
  •         {
  •                     if(key_can == 2)
  •                     {
  •                             set_num ++ ;                    // 設置數加
  •                             if(set_num > 9999)
  •                                         set_num = 9999;        //最大加到99        
  •                     }
  •                     if(key_can == 3)
  •                     {
  •                             set_num -- ;                    // 設置數減
  •                             if(set_num <= 1)
  •                                         set_num = 1;        //最大減到1
  •                     }
  •                     write_sfm4(2,6,set_num);  //顯示人數
  •                     write_com(0x80+0x40+6);                 //將光標移動到秒個位
  •                     write_com(0x0f);                        //顯示光標并且閃爍        
  •         }
  •         beep = 0;              //打開蜂鳴器
  •         delay_1ms(50);
  •         beep = 1;              //關閉蜂鳴器
  •         
  • }  

  • /******************紅外計數**********************/               
  • void hw_jin_dis()        //紅外計數
  • {
  •         if(hw_jin == 0)                    //計數
  •         {
  •                     delay_1ms(1);                         //消抖動
  •                     if(hw_jin == 0)
  •                     {                                                            //確認
  •                             jin ++;
  •                             if(jin >= 9999)
  •                                         jin = 9999;
  •                             num  = jin -     chu;          //計算總人數
  •                             if(menu_1 == 0)
  •                             {
  •                                         write_sfm4(2,3,jin);  //顯示人數
  •                                         write_sfm4(1,7,num);  //顯示人數
  •                             }
  •                     }                           
  •         }
  • }

  • /******************紅外計數**********************/               
  • void hw_chu_dis()        //紅外計數
  • {
  •         if(hw_chu == 0)                    //計數
  •         {
  •                     delay_1ms(1);                         //消抖動
  •                     if(hw_chu == 0)
  •                     {                                                            //確認
  •                             if(jin > chu)
  •                             chu ++;
  •                             if(chu >= 9999)
  •                                         chu = 9999;
  •                             num  = jin -     chu;          //計算總人數
  •                             if(menu_1 == 0)
  •                             {
  •                                         write_sfm4(2,11,chu);  //顯示人數
  •                                         write_sfm4(1,7,num);  //顯示人數
  •                             }
  •                     }                           
  •         }
  • }


  • /******************主程序**********************/               
  • void main()
  • {
  •         beep = 0;                                                //開機蜂鳴器叫一聲
  •         delay_1ms(100);
  •         P0 = P1 = P2 = P3 =     0xff;   //初始化IO
  •         time_init();
  •         init_1602();            //lcd1602初始化
  •         while(1)
  •         {
  •                     key();                               //按鍵掃描函數
  •                     if(key_can < 10)
  •                     {
  •                             key_with();    //按鍵執行函數
  •                     }        
  •                     hw_jin_dis();        //紅外計數        
  •                     hw_chu_dis();        //紅外計數        
  •                     if(menu_1 == 0)         //掃描顯示倒計時數
  •                     {         
  •                             if(flag_500ms == 1)
  •                             {
  •                                         flag_500ms = 0;
  •                                         if(num >= set_num)
  •                                                 beep = ~beep;        //報警
  •                                         else
  •                                         {
  •                                                 beep = 1;
  •                                         }
  •                             }
  •                     }
  •         }
  • }

  • /*************定時器0中斷服務程序***************/
  • void time0_int() interrupt 1
  • {        
  •         static uint value;



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜不卡一区二区 | 久久亚洲一区二区三区四区 | 国产精品久久久久久久久免费 | 精品国产精品 | 日韩精品视频在线 | 国产精品毛片久久久久久 | 国产精品久久一区二区三区 | 麻豆hd| 三级成人在线观看 | 日韩欧美在线观看视频 | 久久综合一区二区 | 日韩精品一区二区三区视频播放 | 中文字幕日韩一区 | 精品国产一区二区国模嫣然 | 精品亚洲一区二区三区 | 国产欧美精品一区二区色综合朱莉 | 久久蜜桃精品 | 日韩视频三区 | 精品久久久久久久久久 | av中文字幕在线 | 欧美日韩亚洲视频 | 成人午夜网 | 97在线超碰 | 亚洲国产日韩一区 | 男人天堂久久 | 精品少妇一区二区三区在线播放 | 一区二区三区精品 | 蜜桃视频在线观看免费视频网站www | 成人乱人乱一区二区三区软件 | 伊人精品久久久久77777 | 99re视频在线观看 | 午夜精品一区 | 欧美成人免费 | 97色伦网| 婷婷综合网 | 欧美一区二区三区久久精品 | 国产一区二区视频免费在线观看 | 黄色毛片免费看 | 国产综合精品一区二区三区 | 黄色一级大片在线免费看产 | 在线成人免费观看 |