导航:首页 > 操作系统 > 基于单片机的红外线计数器

基于单片机的红外线计数器

发布时间:2022-08-08 14:13:46

❶ 红外计数器原理图及程序

gfhfghfghfhfg

❷ 想做一个红外线计数器,不同方向实行不同加减,

红外线室内人数统计系统的设计方法。设计理念是有两组红外线发射和接收系统组成,将信号传递给控制单片机,由其判断两组信号的触发顺序来给出室内人数是增加还是减少,然后将结果控制LCD液晶显示模块显示。本系统基本实现了数字控制,可分为四个模块:单片机控制模块、恒流驱动电源模块、红外线发射和接收模块、LCD液晶显示模块。单片机控制模块主要以MSP430F2274单片机为核心,主要由555定时器构成的多谐振荡器给红外线发射38KHz脉冲信号,单片机通过对接收到的信号进行运算处理,将信号转为LCD显示屏显示。恒流驱动电源模块主要给整个电路提供合适的工作电压。

❸ 求红外线计数器c语言程序

#include<reg51.h>
#include<intrins.h>
#define NOP _nop_()
#define KEY_PRESS
#include "WIN24C02.H"
unsigned char code table[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71};
///////////////////////////////

#define uchar unsigned char
uchar times=0;
uchar dis_buf[4]={0};
uchar key_flag=0;
uchar key_cnt=0;
uchar exint_flag=0;
uchar buzzer_cnt=0;
uchar int_flag=0;
unsigned int int_cnt=0;
///////////////////////////////////
sbit ir_Inction=P1^0;
sbit ming=P3^7;
sbit ir_s=P3^2;
sbit iic_sda=P0^5;
sbit iic_clk=P0^4;
unsigned int ir_num=0;
sfr isp_wdt = 0xE1;
sfr isp_data = 0xE2;
sfr isp_addrh = 0xE3;
sfr isp_addrl = 0xE4;
sfr isp_cmd = 0xE5;
sfr isp_trig = 0xE6;
sfr isp_contr = 0xE7;
/*****************************************/

/***************STC89CXX_EEPROM扇区擦除程序*************************/
void STC89CXX_EEPROM_Erase(unsigned char t_addr)
{
isp_addrh = t_addr; //可以不要 扇区里任意一个字节的地址都是扇区地址,无需求首地址,单片机会自己处理
isp_addrl = 0;
// EA = 0; //关中断
isp_contr = 0x81;
isp_cmd = 3; //扇区擦除,要某字节为空,必须擦除1个扇区
isp_trig = 0x46; //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
isp_trig = 0xb9; //送完0xb9后 ISP/IAP 立即被触发启动

// EA = 1;

// 开中断
}
/***********************************************/

void STC89CXX_EEPROM_Char_Write(unsigned int Write_addr ,unsigned int Write_data)
{

isp_data = (Write_data>>8)&0xff;
isp_addrh = Write_addr/256; //送地址高位
isp_addrl = Write_addr%256; //地址低位
// EA = 0; /* 关中断 */
isp_contr = 0x81;
isp_cmd = 2; //送扇区命令
isp_trig = 0x46;
isp_trig = 0xb9;

isp_data = Write_data&0xff;
isp_addrl = (Write_addr+1)%256;
isp_contr = 0x81;
isp_cmd = 2; //送扇区命令
isp_trig = 0x46;
isp_trig = 0xb9;

// EA = 1;

/* 开中断 */

}
/**************************************************************/
unsigned int STC89CXX_EEPROM_Char_Read(unsigned int Read_addr)
{

unsigned int temp=0;
isp_addrh = Read_addr/256; //送地址高字节
isp_addrl = Read_addr%256; //送地址低字节(从0开始到num-1为止)
// EA = 0; /* 关中断 */
isp_contr = 0x81; /*20M,是0x80 orl 1 */
isp_cmd = 1; // 1表示字节读
isp_trig = 0x46; //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
isp_trig = 0xb9; //送完0xb9后 ISP/IAP 立即被触发启动
temp= (isp_data<<8);
isp_addrl = (Read_addr+1)%256;
isp_contr = 0x81; /*20M,是0x80 orl 1 */
isp_cmd = 1; // 1表示字节读
isp_trig = 0x46; //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
isp_trig = 0xb9;
temp|=isp_data;
// EA = 1; //空指令

/* 开中断 */
return(temp);

}
static void iic_start()
{
iic_sda=1;
iic_clk=1;
NOP;
iic_sda=0;
iic_clk=0;
}
static void iic_stop()
{
iic_clk=0;
iic_sda=0;
iic_clk=1;
NOP;
iic_sda=1;
}
static void iic_write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
iic_clk=0;
iic_sda=dat&0x80;
NOP;
iic_clk=1;
NOP;
dat<<=1;
}
iic_clk=0;
}
static uchar recive_ack()
{
uchar i=0;
iic_clk=0;
NOP;
//iic_sda=1;
NOP;
iic_clk=1;
NOP;
NOP;
while(iic_sda);
iic_clk=0;
// if(i==200)
// return 0 ;
//else
return 1;
}
static void send_ack()
{

uchar i=0;
iic_sda=1;
NOP;
iic_clk=0;
NOP;
iic_sda=0;
NOP;
iic_clk=1;
NOP;
iic_clk=0;
iic_sda=1;

}
void iic_write(uchar addr,uchar dat)
{
iic_start();
iic_write_byte(0xa0);
recive_ack();
iic_write_byte(addr);
recive_ack();
iic_write_byte(dat);
recive_ack();
iic_stop();
}
static uchar iic_read_byte()
{
uchar i;
uchar dat=0;
for(i=0;i<8;i++)
{
// iic_sda=0;
dat<<=1;
iic_clk=0;
NOP;
iic_clk=1;
NOP;
dat|=iic_sda;
}
iic_clk=0;
return dat;
}
uchar iic_read(uchar addr)
{
uchar dat;
iic_start();
iic_write_byte(0xa0);
recive_ack();
iic_write_byte(addr);
recive_ack();
iic_start();
iic_write_byte(0xa1);
recive_ack();
dat=iic_read_byte();
iic_stop();
return dat;
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
{
for(y=100;y>0;y--);
}

}
void iic_writes(uchar addr,void *buf,uchar num)
{
uchar i;
uchar *pt=(uchar *)buf;
for(i=0;i<num;i++)
{
iic_write(addr+i,pt[i]);
delay(10);
}
}
void iic_reads(uchar addr,void *buf,uchar num)
{
uchar i;
uchar *pt=(uchar *)buf;
for(i=0;i<num;i++)
{
pt[i]=iic_read(addr+i);
//delay(3);
}
}

sbit KEY1=P3^6;
unsigned char i_com=0x88;
//unsigned char flag=0;

void timer0_init()
{
TMOD=0x11;
TH0=0xfd;
TL0=0x80;
ET0=1;
TR0=1;
TH1=0xfd;
TL1=0x80;
ET1=1;
TR1=1;

}

void ch_value( )
{
dis_buf[0]=(ir_num/1000)%10;
dis_buf[1]=(ir_num/100)%10;
dis_buf[2]=(ir_num/10)%10;
dis_buf[3]=(ir_num)%10;
}
void timer0_isq()interrupt 1
{
TH0=0xf8;
TL0=0x84;
P2=0xff;
P0= (8>>(times));
P2=table[dis_buf[times]];
times=++times%4;
}
void display()
{
P2=0xff;
P0= (i_com>>(0));
P2=table[dis_buf[0]];
delay(3);
P2=0xff;
P0= (i_com>>(1));
P2=table[dis_buf[1]];
delay(3);
P2=0xff;
P0= (i_com>>(2));
P2=table[dis_buf[2]];
delay(3);
P2=0xff;
P0= (i_com>>(3));
P2=table[dis_buf[3]];
delay(3);

}
void int_0() interrupt 0
{

// EA=0;
//display();
exint_flag=1;
int_flag=1;
EX0=0;
ir_num++;
#ifdef KEY_PRESS
// IE0=0;

#endif

// EA=1;
}
void timer1_isq()interrupt 3
{
TH1=0xfa;
TL1=0x84;
if(key_flag&&(++key_cnt==10))
{
if(KEY1)
{
key_flag=0;
}
key_cnt=0;
}
if(int_flag&&(++int_cnt==20))
{
#ifdef KEY_PRESS
if(ir_s)
#else
if(!ir_s)
#endif
{
int_flag=0;
}
int_cnt=0;
}
if(exint_flag)
{
ming=0;
}
if(exint_flag&&(++buzzer_cnt==40))
{
ming=1;
buzzer_cnt=0;
exint_flag=0;
}
}
void main()
{

delay(500);
timer0_init();
WIN24C02_init(); //24c02初始化子程序
EX0=1;
IT0=1;
IE0=0;
EA=1;
PT0=1;
// ir_num=STC89CXX_EEPROM_Char_Read(0x2000);
iic_reads(0x10,&ir_num,2);
//ir_num=WIN24C02_read(0x00)|(WIN24C02_read(0x01)<<8);
ch_value();
while(1)
{
if(ir_s==1)
{
ir_s=0;
}
ch_value();
//display();
if(!EX0)
{
if(ir_num>=9999)
ir_num=0;
iic_writes(0x10,&ir_num,2);
while(int_flag&&KEY1);//display();
//STC89CXX_EEPROM_Erase(0x20);
//STC89CXX_EEPROM_Char_Write(0x2000,ir_num);//存数据到EEPROM

// WIN24C02_write(0x00,ir_num&0xff);
// WIN24C02_write(0x01,(ir_num>>8)&0xff);

//IE0=0;
ch_value();
#ifdef KEY_PRESS
IE0=0;
#else

IE0=0;
#endif
EX0=1;
}

if(!KEY1)
{
// display();
EX0=0;
ir_num=0;
//STC89CXX_EEPROM_Erase(0x20);
//STC89CXX_EEPROM_Char_Write(0x2000,ir_num);//存数据到EEPROM
iic_writes(0x10,&ir_num,2);
// WIN24C02_write(0x00,ir_num&0xff);
// WIN24C02_write(0x01,(ir_num>>8)&0xff);
ch_value();
// EA=1;
while(!KEY1);

IE0=0;
EX0=1;

}

}

}

❹ 求助,用51单片机做红外计数器出现的问题

什么问题,补充说明下

❺ 谁有企业生产线上的计数器(用红外线)的工作原理图,图。。是单片机控制的

给你提供思路,除非有人做过,不然谁也不想专门去研究一下这个计数器。
1、需要一对红外线对射接头,安放在输送皮带的两侧,也可以采用感应式的接收头。他们的共同点就是在有物体通过的时候,输出脚输出为低电平0.
2、在工业控制上,感应的红外线对射头都是12V—36V,因此在输出脚与其电源上串一个继电器,继电器的常开触点之一接单片机外部中断,另外一触点接GND
3、通过外部中断计数。
4、将计数结果通过显示模块显示
注意:需要处理物品连接问题,如企业生产线上传输的是包,那么有连包问题,这个你单片机可以设置为自动设别,提醒一点,就是时间控制问题。

❻ 基于单片机的红外线计数器

能1:般指示灯
能2:D12发红外线供检测器检测
接电阻R13目限流D12般要超20mA,
4.7K般330欧姆或更即
换用其端口般考虑放排线便

❼ 基于单片机的红外报警器

一般红外探头能输出开关信号。单片机对其计数即可,配合按键程序可实现。

❽ 我想用单片机做个红外计数器测人数,不知用什么样的红外发射和接收管,1838行吗最好能给我个电路图

一定要用单片机做吗?单片机我正在学习中,不能提供单片机方案,但可以给另一个简单可行的方法,使用你的发射电路,再配上我在网络图片搜到的接收电路,请看图,电路中KEM接收管可以用你说的1838,继电器K常开触点的两根线连接到一台普通的电子计算器的“=”按键的两根线上就行了,在使用前,先按一下计算器的“1+”,然后计算器的“=”每接通一次,数字就增加一个,可以达到你的计算要求。

❾ 基于单片机的车库车辆计数器,两个红外传感器A,B。先触发A再触发B+1,先触发B再触发A-1这功能,然后显示

把传感器电压信号转换为单片机信号范围,一般0~5V,然后送给单片机,剩下的就是程序判断了。

❿ 红外计数器 单片机程序 有两个红外探头分别控制加减的计数器

你要C的还是汇编的?[email protected]
另外,你的红外测什么东西,距离有多远,说明一下

ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT0
MAIN: SETB EA
SETB EX0
SETB IT0
DISPLY: MOV A,#00H
ADD A,R2
DA A
MOV R3,A
ANL A,0FH
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV A,R3
ANL A,#0F0H
SWAP A
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A ;静态显示,最多显示99
SJMP DISPLY

INT0: INC R2
RETI
TAB:3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH ;共阴极显示

阅读全文

与基于单片机的红外线计数器相关的资料

热点内容
90压缩干粮09压缩干粮 浏览:511
android线程池框架 浏览:480
手机自带解压能解压哪些文件 浏览:804
linux安装hba驱动 浏览:119
java构造函数new 浏览:668
怎么查家里电器耗电量app 浏览:506
原神一直显示重新连接服务器怎么办 浏览:826
一般用途轴流式压缩机 浏览:926
没学历的怎么学编程 浏览:901
华为的隐藏相册无法加密 浏览:782
联通套餐app怎么设置 浏览:752
关于删除链表的算法描述 浏览:894
标准盘和压缩盘的区别 浏览:47
银行存款验证码JAVA编程 浏览:111
word转pdf软件免费版 浏览:139
公主连结安卓台服怎么下载 浏览:550
注册江苏银行app怎么注册 浏览:800
中兴怎么下载app视频 浏览:679
服务器审计是什么 浏览:518
华为删除的app怎么彻底卸载 浏览:574