找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2160|回复: 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 单片机教程网

快速回复 返回顶部 返回列表