❶ 红外计数器原理图及程序
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 ;共阴极显示