找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5014|回复: 5
收起左侧

用两个人体红外传感器计数,判断屋里的人数的单片机程序

[复制链接]
ID:169944 发表于 2018-12-17 11:41 | 显示全部楼层 |阅读模式
很简单的一个程序,大一的时候写的,
今天有人加我问这个问题,就把代码翻出来了,刚好分享出来
就是用外部中断检测判断状态的先后,来判断人的进出,在main里加减

单片机程序源码如下:
  1. #include <reg52.h>
  2. #include <string.h>
  3. #define LCD1602_DB  P0
  4. sbit red   = P2^0;  //红外1
  5. sbit red1 = P2^1;   //红外2
  6. sbit ADDR0 = P1^0;
  7. sbit ADDR1 = P1^1;
  8. sbit ADDR2 = P1^2;
  9. sbit ADDR3 = P1^3;
  10. sbit ENLED = P1^4;
  11. unsigned char flag1s = 0;
  12. unsigned char flag2s = 0;
  13. unsigned char code LedChar[] = { //数码管显示字符转换表
  14. 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  15. 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  16. };
  17. unsigned char LedBuff[6] = { //数码管显示缓冲区,初值 0xFF 确保启动时都不亮
  18. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  19. };
  20. unsigned char i = 0;
  21. shu(unsigned char sec);
  22. void delay(unsigned int i)
  23. {
  24.         while (i--);
  25. }
  26. shu(unsigned char sec)
  27. {
  28. LedBuff[0] = LedChar[sec%10];
  29. LedBuff[1] = LedChar[sec/10%10];
  30. LedBuff[2] = LedChar[sec/100%10];
  31. LedBuff[3] = LedChar[sec/1000%10];
  32. LedBuff[4] = LedChar[sec/10000%10];
  33. LedBuff[5] = LedChar[sec/100000%10];
  34. }
  35. void main()
  36. {
  37.         unsigned int sec = 0,j = 0;        

  38.     red = 1;
  39.         red1 = 1;
  40.         ENLED = 0;
  41.     ADDR3 = 1;
  42.         TMOD = 0x01;
  43.         TH0 = 0xFC;
  44.         TL0 = 0x67;
  45.         TR0 = 1;
  46.         EA = 1;
  47.         ET0 = 1;
  48.         sec = 0;
  49.         shu(sec);
  50.         while(1)
  51.         {         
  52.            shu(sec);        
  53.                 if(flag1s == 1 )                  
  54.                 {
  55.                         flag1s = 0;                        
  56.                         sec++;
  57.                
  58.                 }
  59.                 if(flag2s == 1 )                  
  60.                 {
  61.                     flag2s = 0;        
  62.                         if(sec > 0)
  63.                          sec--;
  64.                 }
  65.                 shu(sec);
  66.         /*for(;sec<20;sec++)
  67.                    {itoa(sec, s);
  68.                 delay(100009);
  69.                 LcdShowStr(8, 0, s); } */
  70.                                        
  71.         }               
  72. }
  73. void InterruptTimer0() interrupt 1
  74. {
  75.     TH0 = 0xFC; //重新加载初值
  76.     TL0 = 0x67;
  77.     if (red == 0&&red1==1)  
  78.     {
  79.         delay(99);
  80.                 if(red1==0)
  81.         flag1s = 1;
  82.     }
  83.     if (red1 == 0&&red == 1)  
  84.     {
  85.         delay(99);
  86.                 if(red == 0)
  87.        flag2s = 1;
  88.     }
  89.         switch (i)
  90. {
  91. case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;
  92. case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;
  93. case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;
  94. case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;
  95. case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;
  96. case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; break;
  97. default: break;
  98. }
  99. }
复制代码


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:424598 发表于 2018-12-17 16:19 来自手机 | 显示全部楼层
多人同时进出能否判断?
回复

使用道具 举报

ID:169944 发表于 2018-12-17 19:18 | 显示全部楼层
ssk7793 发表于 2018-12-17 16:19
多人同时进出能否判断?

多人并行无法判断
回复

使用道具 举报

ID:502729 发表于 2019-4-2 10:54 来自手机 | 显示全部楼层
能否判断多人并行,还有在门边站着没有进入怎么计算
回复

使用道具 举报

ID:503257 发表于 2019-4-2 15:22 来自手机 | 显示全部楼层
有没有电路图
回复

使用道具 举报

ID:496070 发表于 2019-5-31 20:24 | 显示全部楼层
有电路图吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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