標(biāo)題: 寫一個單片機(jī)檢測人數(shù)的程序 [打印本頁]
作者: wgb 時間: 2017-12-27 18:25
標(biāo)題: 寫一個單片機(jī)檢測人數(shù)的程序
利用兩個光電傳感器,信號線接到單片機(jī)的p2.0和p2.1,人數(shù)初始值為rs=0,當(dāng)2.0檢測到信號,然后2.1檢測到信號,此時人數(shù)加一,反之人數(shù)減一。 if(P2^0==0)
{
delay(10);
if(P2^1==0)
{ rs++; }
}
if(P2^1==0)
{
delay(10);
if(P2^0==0)
{ rs--; }
}
Write_LCD_command(0x80);
Write_LCD_command(0x80);
Write_LCD_data('r');
Write_LCD_data('s');
Write_LCD_data('=');
display(0x83,rs);
這是我自己寫的,但是光電傳感器檢測到信號后,人數(shù)并沒有改變,請教大佬,我是小白。
作者: cccc888 時間: 2017-12-27 19:30
硬件接口定義不是這樣的。
參見SBIT類型定義了一個特殊功能寄存器(SFR)內(nèi)的位。它以下列方式之一使用:sbit name = sfr-name ^ bit-position ;sbit name = sfr-address ^ bit-position ;sbit name = sbit-address ;
| name | 是位的名稱。 |
| SFR name | 是以前定義的SFR的名稱。 |
| 位位置 | 是SFR內(nèi)位的位置。 |
| SFR地址 | 是SFR的地址。 |
| SBIT地址 | 是SFR位的地址。 |
- 注意
- 存儲使用sbit訪問的對象被認(rèn)為是小端(最低位在前)。這是sfr16類型的存儲格式, 但與int,long數(shù)據(jù)類型的存儲方式相反。使用sbit 訪問標(biāo)準(zhǔn)數(shù)據(jù)類型中的位時必須小心。
任何符號名稱都可以在sbit聲明中使用。等號右邊的表達(dá)式('=')指定符號名稱的絕對位地址。
- 并不是所有的SFR都是可以位尋址的。只有那些地址可以被8整除的SFR才是可以位尋址的。SFR地址的低半字節(jié)必須是0或8.例如,0xA8和0xD0的SFR是可位尋址的,而0xC7和0xEB的SFR不是。要計(jì)算SFR位地址,請將位位置添加到SFR字節(jié)地址。因此,要訪問0xC8的SFR中的位6,SFR位地址將為0xCE(0xC8 + 6)。
- 特殊功能位表示一個獨(dú)立的聲明類,不能與其他位聲明或位域互換。
- 所述SBIT數(shù)據(jù)類型聲明可以被用來訪問與聲明的變量的各個位BDATA存儲器類型說明符。。
- sbit變量不能在函數(shù)內(nèi)聲明。它們必須在函數(shù)體外部聲明。
作者: wgb 時間: 2017-12-27 21:14
if(k3==0)
{
while(k4!=0)
{
delay(10);
}
rs++;
}
這樣還是不行
作者: zzzxxxccc 時間: 2017-12-28 14:11
你需要認(rèn)真分析一下 進(jìn)出 的檢測流程 ,有很多種情況你都要考慮 常規(guī)的 就是標(biāo)準(zhǔn) 進(jìn)出兩種,然后還有進(jìn)或者出一半然后退回去了 , 兩個檢測位置也有關(guān)系 比如很近的時候 沒人的情況就是 00 有人通過時 就會變化00--10--11--01--00 搞清楚了每個狀態(tài) 檢測就不會出錯 不管你是用上升沿或者下降沿 或者狀態(tài) 檢測 能夠達(dá)到你要的目的就OK,
注意避免同一個人進(jìn)出 出現(xiàn)處理 多加 或者 多減 的情況
作者: wgb 時間: 2017-12-28 17:52
我寫的程序還是不行,傳感器檢測到了信號,人數(shù)就是不變
作者: 刀刀見紅 時間: 2019-1-31 02:44
思路很好,同感
作者: 1114581577 時間: 2019-3-11 13:01
通過連接計(jì)數(shù)器吧,用T0和T1
作者: jinsheng7533967 時間: 2019-3-11 14:00
首先要肯定的是你思路很好,再在在基礎(chǔ)上加一把勁就很好了
作者: 隨風(fēng)飄遠(yuǎn) 時間: 2019-3-11 14:11
你這個代碼能編譯通過嗎? 位操作要加位定義指令的吧 (sbit fm=P2^3; )
作者: wooklam 時間: 2019-5-14 15:53
樓主,解決問題沒有,我也遇到相同的問題,求解
作者: ydhnhx521 時間: 2019-11-26 21:39
wgb 發(fā)表于 2017-12-27 21:14
if(k3==0)
{
while(k4!=0)
問題解決了嗎?
作者: dzbj 時間: 2019-11-27 00:04
if(P2^1==0)
{
delay(10);
if(P2^0==0)
{ rs--; }
}
你這段的意思是 P2.1觸發(fā)后 等待10ms 如果p2.0也觸發(fā) 則人數(shù)-1 問題是 你怎么知道10ms后p2.0會斷開 如果11ms呢 你的程序已經(jīng)出去了 rs不會減 不管你這個delay(10)是多少 理論上都不行吧 人又不是機(jī)器 移動哪有那么準(zhǔn)確
較為妥善的做法是p2.1觸發(fā)后標(biāo)記一下 只要p2.1狀態(tài)不變就一直等p2.0觸發(fā) 而不是用一個死延時去等
作者: huwqly 時間: 2019-11-27 04:13
12樓正解,修改如下:
另外提示一個不嚴(yán)謹(jǐn)?shù)牡胤剑ㄈ藬?shù)初始值為rs=0,當(dāng)2.0檢測到信號,然后2.1檢測到信號,此時人數(shù)加一,反之人數(shù)減一),初始值為rs=0,此時如果人數(shù)減一,你該如何處理?
bit BP20,BP21;
if(P2^0==0)BP20=1;
if(BP20==1)
{
if(P2^1==0)
{ BP20=0; rs++; }
}
if(P2^1==0)BP21=1;
if(BP21==1)
{
if(P2^0==0)
{ BP21=0; rs--; }
}
Write_LCD_command(0x80);
Write_LCD_command(0x80);
Write_LCD_data('r');
Write_LCD_data('s');
Write_LCD_data('=');
display(0x83,rs);
作者: 黃youhui 時間: 2019-11-27 08:39
我感覺你第一個傳感被觸發(fā)后燈10ms就檢測第二個有點(diǎn)趕鴨子上架的感覺,比如我一只腳邁進(jìn)店門下然后猶豫了一下,過了10ms你怎么處理。
作者: 黃youhui 時間: 2019-11-27 08:44
要是一腳進(jìn)門然后不想進(jìn)就反身走了呢?建議循環(huán)2s或者3s等待。
作者: yanfazhongxin 時間: 2019-11-27 10:41
這個不是這么簡單的吧。兩個傳感器恐怕不夠。
作者: SroneBridge 時間: 2019-11-27 18:22
給你寫了進(jìn)入的,退出的自己改一下,原理一樣的。
你的思路是對的,但是忽略了一些細(xì)節(jié)。按你的程序,如果兩個傳感器都被擋住了,你思考一下你的程序如何將如何運(yùn)行就能理解了。
if(P2^0==0)
{
while(P2^0==0 && P2^1==1); //等待退出該傳感器或人進(jìn)入下一個傳感器
if(P2^1==0) //人進(jìn)入了下一個傳感器?
{
//不考慮進(jìn)入第二個傳感器又退回去的情況
rs++; //進(jìn)入下一個傳感器,計(jì)數(shù)加1
while(P2^1==0) //等待人離開該傳感器
}
}
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |