⑴ 單片機C語言實現紅外脈沖計數計算車速
以51單片機 12MHz晶振情況下為例
#define STAYTIME 781//定時200ms 其他時間可以自己算
int tcount,p_count;
double speed;
void t0_init(void)
{
TH0=0x00;
TL0=0x00;
TMOD|=0x02;
ET0=1;
TR0=1;
IT0=1;//外部中斷下降沿觸發
EX0=1;
}
void pulse_int(void) interrupt 0
{
p_count++;
}
void t0_int(void) interrupt 1
{
tcount++;
if(tcount>STAYTIME){
tcount=0;
EX0=0;//關輸入脈沖的中斷
ET0=0;
speed=p_count/20;//單位就是 轉/秒
//下面重新開始
p_count=0;
ET0=1;
EX0=1;
}
}
}
void main()
{
t0_init();
EA=1;
while(1);
}
⑵ 求51單片機+1602實現紅外計數器的顯示c程序,附下 數碼管程序,現在要用1602顯示···
先定義一下LCD的使能埠一些設置
例如:
sbit LCD_RS = P2^6; //復位端
sbit LCD_RW = P2^5; //寫數據端
sbit LCD_EP = P2^7; //使能端
添加讀寫以及初始化LCD的代碼
/****************側忙函數************************/
BOOL lcd_bz()
{
BOOL result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80); //檢測P0最高位是否為1
LCD_EP = 0;
return result;//返回側忙結果
}
/****************寫命令函數************************/
lcd_wcmd(BYTE cmd)
{ // 寫入指令數據到LCD
while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
_nop_();
_nop_();
P0 = cmd; //將8位指令通過P0口傳給1602
_nop_();
_nop_(); //用於產生一個脈沖寬度
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
lcd_pos(BYTE pos)
{ //設定顯示位置
lcd_wcmd(pos | 0x80);
}
/****************寫數據函數************************/
lcd_wdat(BYTE dat)
{ //寫入字元顯示數據到LCD
while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat; //將8位數據通過P0口傳給1602
_nop_();
_nop_(); //用於產生一個脈沖寬度
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
lcd_init()
{ //LCD初始化設定
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
delay(1);
lcd_wcmd(0x0c); //顯示開,關游標
delay(1);
lcd_wcmd(0x06); //移動游標
delay(1);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(1);
}
添加完之後在main函數中添加初始化LCD的函數
例如
void main(void)
{
BYTE i;
lcd_init();// 初始化LCD
delay(10);
while(1)
{
lcd_wcmd(0x06);//向右移動游標
lcd_pos(0);//設置顯示位置為第一行的第1個字元
i = 0;
tt.XX.number = ??; //這邊問好表示你需要顯示的數據,這樣你應該明白怎麼做了
//將你的數據賦值給number即可,然後讓他顯示dis的數據
while(tt.dis1[ i ] != '\0')
{
lcd_wdat(dis1[ i ]);
i++;
delay(30);//控制兩字之間顯示速度
}
delay(500);//控制兩字之間顯示速度
lcd_wcmd(0x01);//清除LCD的顯示內容
}
}
//程序的定義頭文件下寫這個,主要是省去數據轉換這一環節,讓自己代碼更加快速轉換
typedef union
{
unsigned char dis1[4];
struct
{
int number;
}XX;
}TT;
idata TT tt;
不懂可繼續追問,懶得去看你之前寫的那些,就給你提供一下方法
⑶ 我想用單片機做個紅外計數器測人數,不知用什麼樣的紅
估計是買的到現成的。
你們這個現場有沒有灰塵什麼的哦,是不是計較麻煩哦
我們倒是自己做過計數器,不過我們的是數很小的東西的,電子元器件,綠豆那麼大個的吧
我們之前是買的一個振動盤那種機器,不過比較慢,一天能數幾萬個,幾個月過後還數不準了;
我們就自己做的。
你們要數這個東西太大個了。
⑷ 急求一紅外管計數器,51單片機控制的C程序
電路都沒看到就要程序?這個不難的 一個統計進來的人數 一個統計出去的人數 當人數是0的時候就給個控制信號關燈
⑸ 關於51單片機的紅外計數實驗問題,寫完程序後數碼管數值不會改變。求大神指點。。。。。。
以STC89C52RC單片機為例,部分程序如下:
void initTimer1(void) //初始化定時器1
{
AUXR |= 0x40; //定時器1工作於1T模式
TMOD |= 0x60; //設置定時器1運行模式2 (8-bit 自動裝載)
TL1 = TH1 = 0xff; //初始值
TR1 = 1; //定時器1開始運行
EA = 1; //開總中斷
ET1 = 1; //使能定時器1中斷
}
//--------------------------------------------
void T1int() interrupt 3 //中斷
{
ucCount++; //計數
flag = 1;
}
//------------------------------------------
這個表格定義一般用code:
unsigned char code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//0----9
前面聲明變數增加ucCount和flag:
unsigned char ucCount = 0;
bit flag = 0;
主程序:
viod main(viod)
{
aa=1;
bb=1;
initTimer1();
m=0;
n=0;
while(1)
{
if(flag == 1)
{
flag = 0;
if(uiCount > 99) uiCount = 0;
n = uiCount / 10;
m = uiCount % 10;
}
cc=num[m];
aa=0;
delay_nms();
aa=1;
cc=num[m];
bb=0;
delay_nms();
bb=1;
}
以上程序沒有完整整理,但思路請參考。
PS:定義變數不要用諸如「c「這樣的簡單字母,因為容易和單片機內部寄存器混淆。
⑹ 請教紅外對管計數的C語言程序
//思路主要是red1對外面的紅外計數,red2對裡面的紅外計數,通過比較
//二者大小可以知道是進人還是出人,另外要是有人站了一下又出去,
//red1就會比red2大2,可以判斷出教室里人數沒變。
#include<reg51.h>
int renshu;//教室里人數
int red1;//計數
int red2;//計數
int0()
{
red1++;
}
int1()
{
if(red1==red2+1){renshu++;}
elseif(red1==red2-1){renshu--;}
elseif(red1=red2+2){red1=red1-2;}
elseif(red1=red2-2){red2=red2-2;renshu--;}
else{;}
red2++;
}
main()
{
red1=0;red2=0;renshu=0;
while(1)//在這里你可以添加顯示程序什麼的
{
;
}
}
//程序沒調試,不過思路應該沒問題,你把格式再規范話一下,沒帶書,關於中斷的格式我忘了
⑺ 基於單片機的紅外線計數器
能1:般指示燈
能2:D12發紅外線供檢測器檢測
接電阻R13目限流D12般要超20mA,
4.7K般330歐姆或更即
換用其埠般考慮放排線便
⑻ 紅外光沒照射一次紅外接收器計數器加一在單片機上怎麼用C編寫
#include
unsigned char xs_d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
signed int time=0;
yanshi(unsigned int k)
{
unsigned int i,j;
for(i=0;i999)time=0;
}
}
xs_hs()
{
P2=0x02;
P0=xs_d[time/100];
yanshi(5);
P2=0x04;
P0=xs_d[(time/10)%10];
yanshi(5);
P2=0x08;
P0=xs_d[time%10];
yanshi(5);
P2=0x08;
}
main()
{
EA=1;
IT0=1;
EX0=1;
while(1)
{
xs_hs();
}
}