久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4390|回復: 5
打印 上一主題 下一主題
收起左側

單片機手掃紅外反射開關問題求助

[復制鏈接]
跳轉到指定樓層
樓主
ID:140489 發表于 2018-6-14 21:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
//紅外反射開關,接收頭HS0038B,發射管用pnp三極管驅動
//第一次上電,燈亮1秒后熄滅,
//手擋一次開,再擋一次關,如此循環
//實驗板測試手擋一次開,再擋一次關 開關正常;
//但是有一個問題,如果手一直擋在前面,LED會不停的亮--滅        -- 亮--滅
//請大神們看下,這樣才能做到手擋在前面不移開,保持一種狀態
//控制部分寫在大循環里和寫在中斷里面一樣鎖不住
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit ir=P2^4;         //紅外發射
sbit ir_in=P3^2; //紅外接收
sbit led=P1^7;         //低電平LED亮
bit flag,flag2=1;
uint cont,cont1,s;
uchar clock;
//bit f1,f2;
void delay(uint z)           //ms
{
        uint x,y;
        for(x=z; x>0; x--)
                for(y=114; y>0; y--);
}


void fa_38k()          //38k 載波                         //接收頭前面有濾光片
{                                 
        ir=0;                  
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        
        ir=1;
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
//        _nop_();//_nop_();_nop_();_nop_();
}

void main()
{
        uint i=0;
        ir_in=1;
        TMOD |= 0X01;                          //T0定時器,模式1, 16位計數
        TH0 = (65536-10000)/256;  //10ms初值 @12MHz晶振
        TL0 = (65536-10000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        led=0;
        delay(1000);
        led=1;
        while(1)
        {  
                        if(flag)
                        {
                                fa_38k();  //發38K
                        }
                        else ir=1;           //停止發射

                                
//                                if(ir_in==1)         //沒有反射信號
//                                {
//                                        s=0;                 //延時變量清零
//                                        clock=0;          //自鎖標志清零
//                                //        f2=0;
//                                        flag2=1;          //恢復發射
//                                }
//                                else if(clock==0) //有反射信號
//                                {        
//                                
//                                        s++;                  //消抖
//                                        if(s>2000)          //這里值取大些,增強抗干擾
//                                        {        
//                                                
//                                                s=0;
//                                                flag2=0;  //停止發射
//
//                                                clock=1;
//                                                led=!led;                  //
//                                        //        while(!ir_in);
//                                                
//                                        //        f2=1;
//                                                delay(1000);          //延時1秒,等手移開后
//                                                
//                                        }
//                                }
                                
               
        }
}

void timer0() interrupt 1
{
        TH0 = (65536-10000)/256;  //重裝10ms初值
        TL0 = (65536-10000)%256;

        if(flag2==1)
        {
                cont++;
                if(cont==10)  
                {        
                        cont=0;
                        flag=!flag;         //發100ms 38K,停100ms
                }
        }
        
        flag2=0;  //停止發射
        if(ir_in==1)         //沒有反射信號
        {
                s=0;                 //延時變量清零
                clock=0;          //自鎖標志清零

                flag2=1;          //恢復發射
        }
        else if(clock==0 && ir_in==0) //有反射信號
        {        
        
                s++;                  //消抖  這里值取大些,增強抗干擾
                if(s>8 && ir_in==0)          //
                {        
                        
                        s=0;
                        flag2=0;  //停止發射

                        clock=1;
                        led=!led;
                        while(!ir_in);        //加不加這句,手擋在前面不移開,LED都會不停 亮--滅
                        
                        flag2=0;  //停止發射
                        
                }
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:352148 發表于 2018-6-14 21:51 | 只看該作者
這樣的問題感覺都是延遲函數的鍋。。。
回復

使用道具 舉報

板凳
ID:386216 發表于 2020-6-3 09:06 | 只看該作者
樓主問題解決了嗎,我也在學,能否發程序我學習下
回復

使用道具 舉報

地板
ID:386216 發表于 2020-6-3 09:45 | 只看該作者
感覺你定時器函數里面程序太多了,可能影響到38K載波那周期。現在調試好了嗎
回復

使用道具 舉報

5#
ID:292518 發表于 2021-9-8 10:39 | 只看該作者
樓主的程序修改好了嗎?
回復

使用道具 舉報

6#
ID:844772 發表于 2021-9-8 11:32 | 只看該作者
while(!ir_in); 前關中斷就行了。不過中斷函數怎么這么用啊?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区视频在线 | 一区二区免费 | 日日av| 亚洲一区二区精品视频 | 午夜小电影 | av黄色片在线观看 | 精品一区二区三区四区五区 | 激情欧美日韩一区二区 | 日韩在线视频一区二区三区 | 国产精品久久99 | 特级生活片 | 亚洲一区二区中文字幕 | 99精品欧美一区二区三区 | 中文字幕二区 | 亚洲三级在线观看 | 国产精品免费观看 | 中文字幕在线第一页 | 天堂一区二区三区 | 国产成人免费一区二区60岁 | 久久久在线视频 | 国产一级影片 | 黄网站涩免费蜜桃网站 | 精品少妇一区二区三区在线播放 | 91av国产在线视频 | 三级av在线 | 久久九七| 伊人热久久 | 亚洲综合一区二区三区 | 欧美中文在线 | 日本天堂视频在线观看 | 亚洲va在线va天堂va狼色在线 | 国产精品视频一区二区三区 | 别c我啊嗯国产av一毛片 | 精品日韩一区二区 | 国产久| 黄色成人免费在线观看 | 一区二区不卡 | 亚洲精品电影网在线观看 | 成人中文字幕在线观看 | 天天干天天谢 | 黑人性hd |