導航:首頁 > 操作系統 > 基於單片機的紅外線計數器

基於單片機的紅外線計數器

發布時間: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 ;共陰極顯示

閱讀全文

與基於單片機的紅外線計數器相關的資料

熱點內容
怎麼下郵政銀行app 瀏覽:244
不背單詞app單詞怎麼學習 瀏覽:479
程序員日常操作搞笑 瀏覽:379
android檢查是否安裝 瀏覽:373
蘋果手機編輯pdf文件 瀏覽:458
android系統名字 瀏覽:969
安卓手機如何進去有求必應屋 瀏覽:432
指數除法運演算法則底數不同 瀏覽:894
90壓縮干糧09壓縮干糧 瀏覽:516
android線程池框架 瀏覽:481
手機自帶解壓能解壓哪些文件 瀏覽:804
linux安裝hba驅動 瀏覽:119
java構造函數new 瀏覽:668
怎麼查家裡電器耗電量app 瀏覽:506
原神一直顯示重新連接伺服器怎麼辦 瀏覽:826
一般用途軸流式壓縮機 瀏覽:926
沒學歷的怎麼學編程 瀏覽:901
華為的隱藏相冊無法加密 瀏覽:782
聯通套餐app怎麼設置 瀏覽:752
關於刪除鏈表的演算法描述 瀏覽:894