久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機智能小車紅外避障循跡程序
[打印本頁]
作者:
18930130
時間:
2020-7-10 22:04
標題:
51單片機智能小車紅外避障循跡程序
51單片機智能小車紅外避障程序以及文檔
#include"car_psb.h"
#define uint unsigned int //用uint代替無字符整形數據的名稱
#define uchar unsigned char
sbit A1 = P0^3;
sbit A2 = P0^2;//A1為L293芯片2腳(IN1),A2為L293芯片7腳(IN2),控制右電機
sbit B1 = P0^1;
sbit B2 = P0^0;
sbit key1 = P0^6;//按鈕s1
sbit key2 = P3^5;//按鈕s2
sbit key3 = P3^6;//按鈕s3
sbit key4 = P3^7;//按鈕s4
sbit u4_out1 = P1^0;//左紅外循跡
sbit u4_out2 = P1^1;//右紅外循跡
#define c_stop {A1=0;A2=0;B1=0;B2=0;}//小車停止
#define c_go {A1=1;A2=0;B1=1;B2=0;}//小車向前
#define c_bask {A1=0;A2=1;B1=0;B2=1;}//小車后退
#define c_left {A1=1;A2=0;B1=0;B2=1;}//小車向左
#define c_right {A1=0;A2=1;B1=1;B2=0;}//小車向右
uchar shu;
void delayms(uint xms);//延時xms毫秒;
bit start;
void delayms(uint xms);//延時xms毫秒;
void main(void)
{
c_init();//每次都需要先調用此函數
c_stop;//單片機上電先讓電機停止。
while(1)//進入死循環,一直循環{}里的程序
{
if(key1==0)//如果檢測到key1為0,測判斷按鍵被按下
{
delayms(5);//延時大約5ms防止按鍵振動產生影響
if(key1==0)//延時5ms后key1為0,測確定按鍵被按下,執行按鈕按下后的程序
{
c_right;//小車向右
delayms(3000) ;
c_left;//小車向左
delayms(3000) ;
c_bask;//小車向后
delayms(3000) ;
c_go;//小車向前
delayms(3000) ;
c_stop;
// while(key1==0);//等待按鈕被松開
}
}
if(key2==0)//如果檢測到key2為0,測判斷按鍵被按下
{
delayms(5);//延時大約5ms防止按鍵振動產生影響
if(key2==0)//延時5ms后key2為0,測確定按鍵被按下,執行按鈕按下后的程序
{
c_bask;
delayms(2000);//小車后退
c_stop;
while(key2==0);//等待按鈕被松開
}
}
if(key3==0)//如果檢測到key3為0,測判斷按鍵被按下
{
delayms(5);//延時大約5ms防止按鍵振動產生影響
if(key3==0)//延時5ms后key3為0,測確定按鍵被按下,執行按鈕按下后的程序
{
shu++;
if(shu==3)
shu=0;
if(shu==2)
{
start = ~start;
}
while(key3==0);//等待按鈕被松開
if(start == 0)//停止
{
c_stop;
}
else if(start == 1)//開始紅外循跡
{
while(1)
{
if((u4_out1==0)&(u4_out2==1))//當右循跡等于1時,說明小車右循跡在循跡線上,小車需左轉
{
c_left;
delayms(50);
c_go;
delayms(10);
c_stop;
delayms(50);
}
else if((u4_out1==1)&(u4_out2==0))//當左循跡等于1時,說明小車左循跡在循跡線上,小車需要右轉
{
c_right;
delayms(50);
c_go;
delayms(10);
c_stop;
delayms(50);
}
else if(((u4_out1==0)&(u4_out2==0))|((u4_out1==1)&(u4_out2==1)))//當小車左右兩邊的循跡一致時,小車直走
{
c_go;
delayms(50);
c_stop;
delayms(30);
}
}
}
}
}
}
}
復制代碼
#include"car_psb.h"
#define smg P2
sbit b = P0^4;//蜂鳴器驅動三極管B管腳
sbit u3_en = P4^4;//u3的使能管腳
sbit u4_en = P4^5;//u4芯片的使能管腳
sbit u5_en = P4^6;//u5芯片的使能管腳
sbit key1 = P0^6;//s1按鈕
sbit key2 = P3^5;//s2按鈕
sbit key3 = P3^6;//s3按鈕
sbit key4 = P3^7;//s4按鈕
sbit DQ = P0^5;//ds18b20數據線
sbit DATA=P4^7; //雙向數據線
sbit RST=P1^7; //使能線
sbit SCLK=P0^7; //時鐘線
sbit A1 = P0^3;
sbit A2 = P0^2;//A1為L293芯片2腳(IN1),A2為L293芯片7腳(IN2),控制右電機
sbit B1 = P0^1;
sbit B2 = P0^0;//B1為L293芯片10腳(IN3),B2為L293芯片15腳(IN4),控制左電機
//注意芯片使能管腳1腳(E1)和9腳(E2)已接vcc高電平,
//所以不需要單片機控制輸出高電平使能
sbit u5_out2 = P1^6;//右光敏電阻
sbit u5_out1 = P1^4;//左光敏電阻
sbit u4_out3 = P1^2;//左紅外避障
sbit u4_out4 = P1^3;//右紅外避障
sbit u4_out1 = P1^0;//右紅外循跡
sbit u4_out2 = P1^1;//左紅外循跡
sbit Echo = P3^3;//超聲波信號反饋端
sbit Tring = P3^4;//超聲波信號發送端
sbit Rt = P3^2;//紅外接收管腳,單片機中斷0管腳
unsigned char a[4];//保存紅外遙控器的四位數據
unsigned char code tab1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//數碼管位選
unsigned char code ds1302_w[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//ds1302芯片寫字節
unsigned char code ds1302_r[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//ds1302芯片寫字節
/*************************************************************/
//函數名稱:void delayms(unsigned int xms)
//函數功能:延時xms毫秒
//xms取值為0-65535
//調用:為內部調用函數
/************************************************************/
void delayms(unsigned int xms)
{
unsigned int x,y;
for(x=xms;x>0;x--)
for(y=1100;y>0;y--);
}
/*************************************************************/
//函數名稱:void c_stop(void)
//函數功能:小車停止
//調用:為內部調用函數
/************************************************************/
void c_stop(void)
{A1=0;A2=0;B1=0;B2=0;}//小車停止
/*************************************************************/
//函數名稱:void c_go(void)
//函數功能:小車向前
//調用:為內部調用函數
/************************************************************/
void c_go(void)
{A1=1;A2=0;B1=1;B2=0;}//小車向前
/*************************************************************/
//函數名稱:void c_bask(void)
//函數功能:小車后退
//調用:為內部調用函數
/************************************************************/
void c_bask(void)
{A1=0;A2=1;B1=0;B2=1;}//小車后退
/*************************************************************/
//函數名稱:void c_left(void)
//函數功能:小車向左
//調用:為內部調用函數
/************************************************************/
void c_left(void)
{A1=1;A2=0;B1=0;B2=1;}//小車向左
/*************************************************************/
//函數名稱:void c_right(void)
//函數功能:小車向右
//調用:為內部調用函數
/************************************************************/
void c_right(void)
{A1=0;A2=1;B1=1;B2=0;}//小車向右
/*************************************************************/
//函數名稱:void bell(unsigned int x,unsigned int time)
//函數功能:蜂鳴器驅動函數,讓蜂鳴器循環響停X次
// (蜂鳴器響time毫秒,停time毫秒為一次)
//x取值為0-65535,time取值為0-65535
//調用:為外部調用函數
/************************************************************/
void bell(unsigned int x,unsigned int time)
{
unsigned int i;
for(i=x;i>0;i--)
{
b = ~b;
delayms(time);
}
b = 1;
}
/*********************數碼管****************************************/
/*************************************************************/
//函數名稱:void display_init()
//函數功能:0-7位的數碼管顯示,初始化程序
//調用:為外部調用函數
/************************************************************/
void display_init(void)
{
P4SW = 0x70;
smg = 0xff;
}
/*************************************************************/
//函數名稱:void display_07(unsigned char x,unsigned char dat)
//函數功能:0-7位的數碼管顯示
//x取值為0-7,dat取值為0-0xff
//調用:為外部調用函數
//調用時如:display_07(0,0xc0);則讓0位數碼管顯示0,(0xc0是共陽數碼管“0”的編碼)
/************************************************************/
void display_07(unsigned char cmd,unsigned dat)
{
u5_en = 0;
u3_en = 0;
u4_en = 0;//先將兩個芯片不使能,數據不能改變
smg = dat;//將段選的數據賦予P2
u3_en = 1;//u3使能,數據輸入
u3_en = 0;//稍作延時后將u3不使能
smg = tab1[cmd];//將需要點亮的數碼管數據賦予P2
u4_en = 1;//u4使能,P2數據進入u4
delayms(2);//u4使能后稍作延時
smg = 0x00;
u3_en = 0;
u4_en = 0;//將兩個芯片不使能,數據不能改變結束一輪數據的輸入
u5_en = 0;
}
/*********************led驅動****************************************/
/*************************************************************/
//函數名稱:void display_led(unsigned char dat)
//函數功能:8位led的顯示
//dat取值為0-0xff
//調用:為外部調用函數
/************************************************************/
void display_led(unsigned char dat)
{
u5_en = 0;
u3_en = 0;
u4_en = 0;//先將兩個芯片不使能,數據不能改變
smg = dat;//將段選的數據賦予P2
u5_en = 1;//u5使能,數據輸入
u5_en = 0;//稍作延時后將u5不使能
}
/*********************按鈕驅動****************************************/
/*************************************************************/
//函數名稱:bit k1()
//函數功能:返回一位數據,當按鈕按下時返回1,沒有按下時返回0
//調用:為外部調用函數
/************************************************************/
bit k1(void)
{
bit dat;
if(key1==0)
{
delayms(2);
if(key1==0)
{
dat = 1;
}
}
else if(key1==1)
{
dat = 0;
}
return dat;
}
/*************************************************************/
//函數名稱:bit k2()
//函數功能:返回一位數據,當按鈕按下時返回1,沒有按下時返回0
//調用:為外部調用函數
/************************************************************/
bit k2(void)
{
bit dat;
if(key2==0)
{
delayms(2);
if(key2==0)
{
dat = 1;
}
}
else if(key2==1)
{
dat = 0;
}
return dat;
}
/*************************************************************/
//函數名稱:bit k3()
//函數功能:返回一位數據,當按鈕按下時返回1,沒有按下時返回0
//調用:為外部調用函數
/************************************************************/
bit k3(void)
{
bit dat;
if(key3==0)
{
delayms(2);
if(key3==0)
{
dat = 1;
}
}
else if(key3==1)
{
dat = 0;
}
return dat;
}
/*************************************************************/
//函數名稱:bit k4()
//函數功能:返回一位數據,當按鈕按下時返回1,沒有按下時返回0
//調用:為外部調用函數
/************************************************************/
bit k4(void)
{
bit dat;
if(key4==0)
{
delayms(2);
if(key4==0)
{
dat = 1;
}
}
else if(key4==1)
{
dat = 0;
}
return dat;
}
/*********************DS18B20溫度傳感器驅動****************************************/
/***************************************************/
//函數名稱:void delay750us(void);
//函數功能:延時7500us;
/***************************************************/
void delay750us(void)
{
unsigned char a,b;
for(b=112;b>0;b--)
for(a=17;a>0;a--);
}
/***************************************************/
//函數名稱:void delay70us(void);
//函數功能:延時70us;
/***************************************************/
void delay70us(void)
{
unsigned char a;
for(a=192;a>0;a--);
}
/***************************************************/
//函數名稱:void delay15us(void);
//函數功能:延時15us;
/***************************************************/
void delay15us(void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=38;a>0;a--);
_nop_();
}
/***************************************************/
//函數名稱:void delay45us(void);
//函數功能:延時45us;
/***************************************************/
void delay45us(void)
{
unsigned char a,b;
for(b=49;b>0;b--)
for(a=1;a>0;a--);
_nop_();
}
/***************************************************/
//函數名稱:void delay2us(void);
//函數功能:延時2us;
/***************************************************/
void delay2us(void)
{
unsigned char a;
for(a=4;a>0;a--);
}
/***************************************************/
//函數名稱:void delay4us(void);
//函數功能:延時4us;
/***************************************************/
void delay4us(void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=8;a>0;a--);
}
/***************************************************/
//函數名稱:void delay6us(void);
//函數功能:延時6us;
/***************************************************/
void delay6us(void)
{
unsigned char a;
for(a=15;a>0;a--);
}
/***************************************************/
//函數名稱:void delay30us(void);
//函數功能:延時30us;
/***************************************************/
void delay30us(void)
{
unsigned char a;
for(a=81;a>0;a--);
_nop_();
}
/***************************************************/
//函數名稱:bit ack_ds18b20(void);
//函數功能: ds18b20復位答應函數
/***************************************************/
bit ack_ds18b20(void)
{
bit flag;//返回標志位定義
DQ = 1;//先將數據總線置高電平1
delayms(2);//延時(延時時間沒有太大要求,但盡可能短比較好)
DQ = 0;//將數據總線拉低
delay750us();//延時480-960us之內的時間
DQ = 1;//將總是拉高釋放數據線
delay70us();//將總線拉高后需要等待15-60us后ds18b20會釋放一個60-240us的低電平
if(DQ==0)
flag = 1;//檢測到總是拉低則輸出1
else
flag = 0;//檢測總線是高電平則輸出0
delay750us();//從單片機拉高釋放數據線后需要延時大于480us才能結束
DQ = 1;//將數據線釋放
return flag;//返回數據
}
/***************************************************/
//函數名稱:write_ds18b20(uchar dat)
//函數功能: 向ds18b20發送一個字節的數據
/***************************************************/
void write_ds18b20(unsigned char dat)
{
unsigned char i;
DQ = 1;//先將總線拉高
delayms(1);//稍作延時,時間不定
for(i=0;i<8;i++)
{
DQ = 0;//先拉低總線
delay15us();//延時15us
DQ = dat&0x01;//按從低位到高位的順序發送數據,一次發送一位數據
delay45us();//保存數據狀態,延時45us
DQ = 1;//將總線釋放
dat>>=1;//將數據右移一位,為下一次數據發送做準備
}
DQ = 1;//8位數據發送完后釋放總線
}
/***************************************************/
//函數名稱:read_ds18b20(uchar dat)
//函數功能: 讀取一個字節的數據
/***************************************************/
unsigned char read_ds18b20(void)
{
unsigned char dat;
unsigned char i;
for(i=0;i<8;i++)
{
dat >>= 1;//右移一位
DQ = 1;//總線先拉高
delay2us();//延時2us
DQ = 0;//將總線拉低
delay6us();//延時6us
DQ = 1;//將總線拉高
delay4us();//延時4us
if(DQ == 1)//讀取總線的狀態,如果是1的,就寫進數據里,如果是0就不作處理
dat |= 0x80;
delay30us();//延時30us
}
return dat;//返回讀取到的數據
}
/*************************************************************/
//函數名稱:unsigned int Rtemp_ds18b20()
//函數功能:向ds18b20讀取溫度值,如實際溫度為36.5,返回的數據為365
//調用:為外部調用函數
/************************************************************/
unsigned int Rtemp_ds18b20()
{
bit k;
unsigned char temph,templ;//讀取的溫度高低數據保存
unsigned int temp;//計算后的溫度
k = ack_ds18b20();//先發送復位信號
if(k==1)//ds18b20如果有答應,則讀取溫度
{
write_ds18b20(0xcc);//跳過ROM匹配命令
write_ds18b20(0xbe);//發送讀取溫度命令
templ = read_ds18b20();//讀取溫度低8位
temph = read_ds18b20();//讀取溫度高8位
temp = (temph*256+templ)*0.0625*10;//將讀取的溫度數據進行計算轉換為溫度值,
} //并擴大10倍,將小數點后一位往前移動一位,方便顯示
k = ack_ds18b20();//先發送復位信號
if(k==1)//ds18b20如果有答應,則發送溫度轉換命令
{
write_ds18b20(0xcc);//跳過ROM匹配命令
write_ds18b20(0x44);//發送溫度轉換命令
}
return temp;
}
/*********************DS1302驅動****************************************/
void delaynus(unsigned char n)
{
unsigned char i;
for(i=0;i<(n*10);i++);
}
/*************************************************************/
//函數名稱:void Write1302(unsigned char dat)
//函數功能:向ds1302芯片發送一個字節的數據
//調用:為內部調用函數
/************************************************************/
void Write1302(unsigned char dat)//發送一個字節的數據
{
unsigned char i;
SCLK=0; //先將時鐘線置位
delaynus(2);
for(i=0;i<8;i++)
{
DATA=dat&0x01; //先發送低電平
delaynus(2);
SCLK=1; //拉高時鐘線,時鐘芯片在這時候讀取數據線上的電平
delaynus(2);
SCLK=0; //時鐘線復位
dat>>=1; //數據右移
}
}
/*************************************************************/
//函數名稱:unsigned char Read1302(void)
//函數功能:向ds1302芯片讀取一個字節的數據
//調用:為內部調用函數
/************************************************************/
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2);
for(i=0;i<8;i++)
{
dat>>=1;
if(DATA==1)
dat|=0x80;
SCLK=1;
delaynus(2);
SCLK=0;
delaynus(2);
}
return dat;
}
/*************************************************************/
//函數名稱:void WriteSet1302(unsigned char Cmd,unsigned char dat)
//函數功能:向ds1302芯片內部某個字節(Cmd)寫入一個數據(dat)
//參數說明:Cmd為0-6,分別代表"秒,分,時,日,月,周,年"
//調用:為外部調用函數
/************************************************************/
void WriteSet1302(unsigned char Cmd,unsigned char dat)//向時鐘寫入一個字節的數據
{
WriteSet1302(0x8E,0x00); //關閉寫保護
RST=0;
SCLK=0;
RST=1;
delaynus(2);
Write1302(ds1302_w[Cmd]);
Write1302(((dat/10)<<4)|(dat%10));
SCLK=1;
RST=0;
}
/*************************************************************/
//函數名稱:unsigned char ReadSet1302(unsigned char Cmd)
//函數功能:向ds1302芯片內部某個字節(Cmd)讀出一個數據,并將數據返回
//調用:為外部調用函數
/************************************************************/
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0;
SCLK=0;
RST=1;
Write1302(ds1302_r[Cmd]);
dat=Read1302();
SCLK=1;
RST=0;
return dat;
}
/******************************尋光模塊*******************************/
/*************************************************************/
//函數名稱:bit gm_left(void)
//函數功能:左尋光光敏電阻,當亮度大時返回1,亮度比較小時返回0
//調用:為外部調用函數
/************************************************************/
bit gm_left(void)
{
bit dat;
dat = u5_out1;
return dat;
}
/*************************************************************/
//函數名稱:bit gm_left(void)
//函數功能:右尋光光敏電阻,當亮度大時返回1,亮度比較小時返回0
//調用:為外部調用函數
/************************************************************/
bit gm_right(void)
{
bit dat;
dat = u5_out2;
return dat;
}
/******************************紅外避障模塊*******************************/
/*************************************************************/
//函數名稱:bit hbz_left(void)
//函數功能:左紅外避障,接收到反射回來的信號返回0,沒有收到信號返回1
//調用:為外部調用函數
/************************************************************/
bit hbz_left(void)
{
bit dat;
dat = u4_out3;
return dat;
}
/*************************************************************/
//函數名稱:bit hbz_right(void)
//函數功能:右紅外避障,接收到反射回來的信號返回0,沒有收到信號返回1
//調用:為外部調用函數
/************************************************************/
bit hbz_right(void)
{
bit dat;
dat = u4_out4;
return dat;
}
/******************************紅外循跡模塊*******************************/
/*************************************************************/
//函數名稱:bit hxj_left(void)
//函數功能:左紅外循跡,接收到反射回來的信號返回0,沒有收到信號返回1
//調用:為外部調用函數
/************************************************************/
bit hxj_left(void)
{
bit dat;
dat = u4_out2;
return dat;
}
/*************************************************************/
//函數名稱:bit hxj_right(void)
//函數功能:右紅外循跡,接收到反射回來的信號返回0,沒有收到信號返回1
//調用:為外部調用函數
/************************************************************/
bit hxj_right(void)
{
bit dat;
dat = u4_out1;
return dat;
}
/******************************超聲波模塊*******************************/
/***************************************************/
//函數名稱:void delay20us();
//函數功能:延時20us;
/***************************************************/
void delay20us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 24;
while (--i);
}
/***************************************************/
//函數名稱:void csb_init(void);
//函數功能: 超聲波模塊初始化程序
//使用定時器1計算時間,
/***************************************************/
void csb_init(void)
{
EA = 1; //打開中斷總開關
AUXR &= 0xBF; //定時器時鐘12T模式
TMOD &= 0x0F;
TMOD |= 0x10; //定時器1工作方式1,16位計時模式
TF1 = 0; //將定時器溢出標志復位
}
/***************************************************/
//函數名稱:unsigned int get_distance(void);
//函數功能: 獲取超聲波返回的時間,并計算距離,返回計算好的距離
//使用定時器1計算時間,
/***************************************************/
unsigned int get_distance(void)
{
unsigned int Distance; //測量到的距離
unsigned char flag_i=0; //距離測量成果標志位
TR1 = 0; //先將定時器1關閉
TH1 = 0;
TL1 = 0; //將定時器1的計數清零
Tring = 0; //信號端先置零
delayms(2); //稍微延時一下
Tring = 1;
delay20us();
Tring = 0; //信號端置位保存大約10us的時間,產生開始信號
while(Echo==0); //等待返回高電平
TR1 = 1; //啟動定時器1開始計數
while(Echo==1) //當為1時計時
{
Distance = TH1*256+TL1;
if(Distance>27110) //大約4000時間已超出出量距離,返回888
{
TR1 = 0;
flag_i = 2;
Distance = 888;
break;
}
else
flag_i = 1;
}
if(flag_i==1)
{
TR1 = 0; //關閉定時器3;
Distance = TH1*256+TL1; //讀取定時器里的時間
Distance *= 0.01844; //距離=(時間*速度)/2,時間單位秒,速度單位m/s,距離單位米
if(Distance>500) //定時器一個計時時間:12/11.0592=1.085
Distance=888; //時間=(TH1*256+TL1)*1.085,單位微秒,轉換為秒需除1000000
} //距離=(340*(TH1*256+TL1)*1.085)/2/1000000=(TH1*256+TL1)*0.0001844,單位米
//轉化為厘米顯示:0.0001844*100=0.01844,單位厘米
TR1 = 0;//關閉定時器1中斷
return Distance;//將計算出的距離返回
}
/******************************紅外遙控模塊*******************************/
/***************************************************/
//函數名稱:void hwyk_init(void);
//函數功能: 超聲波模塊初始化程序
//使用定時器1計算時間,
/***************************************************/
void hwyk_init(void)
{
EA = 1;//打開中斷總開關
ET1 = 1;//允許定時器0中斷
EX0 = 1;//允許外部中斷0中斷
IT0 = 1;//下降沿觸發外部中斷0
AUXR &= 0xBF; //定時器工作在12T模式
TMOD &= 0x0f; //將定時器工作模式設置先復位
TMOD |= 0x10; //設置定時工作在方式1中,16位計時模式
TH1 = 0;
TL1 = 0;//將定時器計時溢出清零
}
/***************************************************/
//函數名稱:unsigned char get_hwyk(void);
//函數功能: 返回接收到的紅外按鍵碼
//使用定時器1計算時間,
/***************************************************/
unsigned char get_hwyk(void)
{
unsigned char i,x;//i為計算接上多少字節的數據,x為計算每一個字節數據的第幾位
unsigned char temp;//臨時接到字節數據存儲
unsigned int Ltime,Htime;//波形的高低電平時間存儲
EX0 = 0;//先將中斷允許關閉,放在其他的電平造成干擾
TH1 = 0;
TL1 = 0;//將定時器的計算寄存器清零
TR1 = 1;//定時器開始運行計時
while(Rt==0)//計算低電平時間
{
if((TH1*256+TL1)>16000)//如果低電平時間超過16000,則實際時間是16000*1.085=17360us,是引導碼9000us的兩倍
{
Rt = 1;//將管腳釋放
IE0 = 0;//將中斷標記位清零
TR1 = 0;//定時器關閉
TF1 = 0;
EX0 = 1;//重新開啟外中斷
break;//直接退出中斷
}
}
TR1 = 0;
Ltime = TH1*256+TL1;//記錄低電平時間
TH1 = 0;
TL1 = 0;//將定時器的計算寄存器清零
TR1 = 1;//定時器開始運行計時
while(Rt==1)//計算高電平時間
{
if((TH1*256+TL1)>9000)//如果高電平時間超過9000,則實際時間是9000*1.085=9765us,是引導碼4500us的兩倍
{
Rt = 1;//將管腳釋放
IE0 = 0;//將中斷標記位清零
TR1 = 0;//定時器關閉
TF1 = 0;
EX0 = 1;//重新開啟外中斷
break;//直接退出中斷
}
}
TR1 = 0;
Htime = TH1*256+TL1;//記錄高電平時間
if((Ltime>7800)&&(Ltime<8800)&&(Htime>3800)&&(Htime<4500))//如果引導碼低電平在9000us左右,高電平在4500us左右,則符合
{
for(i=0;i<4;i++)//一共有4個字節數據
{
for(x=0;x<8;x++)//每個字節有8位數據
{
temp >>= 1;//先接上低位,在接高位,所以需要先左移一位
while(Rt==0);//跳過低電平
TH1 = 0;
TL1 = 0;
TR1 = 1;
while(Rt==1);
TR1 = 0;
Htime = TH1*256+TL1;//測量高電平時間
if((Htime>300)&&(Htime<720))//高電平符合則為0
temp &= 0x7f;
if((Htime>1300)&&(Htime<1800))//高電平符合則為1
temp |= 0x80;
}
a[i] = temp;//將每個字節都存儲到數組中
}
}
Rt = 1;
IE0 = 0;
TR1 = 0;
TF1 = 0;
EX0 = 1;//重新啟動外部中斷
return a[2];//讀取遙控編碼的第三位,第三位為按鍵碼
}
/******************************紅外遙控模塊*******************************/
/***************************************************/
//函數名稱:void c_init(void);
//函數功能: 小車初始化,每個程序都需要保護這個
/***************************************************/
void c_init(void)
{
unsigned char i=0;
unsigned char dddd;
unsigned int vvvv;
if(i==1)
{
c_stop();
c_go();
c_bask();
c_left();
c_right();
bell(1,200);
display_init();
display_07(0,0);
display_led(0xaa);
k1();
k2();
k3();
k4();
vvvv = Rtemp_ds18b20();
WriteSet1302(0x80,0x00);
dddd = ReadSet1302(0x81);
gm_left();
gm_right();
hbz_left();
hbz_right();
hxj_left();
hxj_right();
csb_init();
vvvv = get_distance();
hwyk_init();
dddd = get_hwyk();
}
}
復制代碼
新建文件夾.zip
2020-7-10 22:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
621.56 KB, 下載次數: 39, 下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
成人在线电影在线观看
|
99re热精品视频
|
久久99视频这里只有精品
|
在线观看国产视频
|
亚洲福利视频网
|
国产成人精品综合
|
午夜影院操
|
亚洲啪啪一区
|
亚洲综合在线视频
|
99精品视频免费观看
|
免费精品
|
日韩精品一区二区三区中文字幕
|
av在线免费观看不卡
|
欧美黄色免费网站
|
天天天久久久
|
国产一区二区三区在线
|
一区二区国产在线
|
国产精品一二区
|
三级在线观看
|
精品国产青草久久久久福利
|
亚洲国产自产
|
自拍偷拍中文字幕
|
精品电影
|
久久精品色欧美aⅴ一区二区
|
911影院
|
日韩成人免费
|
91在线看
|
亚洲一区
|
天堂一区
|
www国产亚洲精品久久网站
|
伊人久久综合
|
黑人精品
|
日韩av在线一区二区三区
|
凹凸日日摸日日碰夜夜
|
九九综合九九
|
午夜影院在线观看视频
|
国产精品久久久久久久久久免费看
|
亚洲91视频
|
三级免费av
|
午夜小影院
|
国产高清视频在线播放
|