|
花樣流水燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)由于紅外是無(wú)法仿真的按鍵代替的紅外遙控
0.png (23.31 KB, 下載次數(shù): 41)
下載附件
2018-6-15 03:40 上傳
0.png (50.58 KB, 下載次數(shù): 29)
下載附件
2018-6-15 03:40 上傳
單片機(jī)源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit IR=P3^2; //將IR位定義為P3.2引腳
- sbit key1=P2^0;
- sbit key2=P2^1;
- sbit key3=P2^2;
- sbit key4=P2^3;
- sbit key5=P2^4;
- sbit key6=P2^5;
- sbit key7=P2^6;
- sbit key8=P2^7;
- unsigned char a[4]; //儲(chǔ)存用戶碼、用戶反碼與鍵數(shù)據(jù)碼、鍵數(shù)據(jù)反碼
- unsigned int LowTime,HighTime; //儲(chǔ)存高、低電平的寬度
- unsigned char IrValue[6];
- unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar code Pattern_P0[]=
- {
- 0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,
- 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,
- 0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,
- 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
- 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,
- 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,
- 0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,
- 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
- 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,
- 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff
- };
- uint k=0;
- int Time=0;
- //延時(shí)
- /************************************************************
- 函數(shù)功能:對(duì)4個(gè)字節(jié)的用戶碼和鍵數(shù)據(jù)碼進(jìn)行解碼
- 說(shuō)明:解碼正確,返回1,否則返回0
- 出口參數(shù):dat
- *************************************************************/
- bit DeCode(void)
- {
-
- unsigned char i,j;
- unsigned char temp; //儲(chǔ)存解碼出的數(shù)據(jù)
- for(i=0;i<4;i++) //連續(xù)讀取4個(gè)用戶碼和鍵數(shù)據(jù)碼
- {
- for(j=0;j<8;j++) //每個(gè)碼有8位數(shù)字
- {
- temp=temp>>1; //temp中的各數(shù)據(jù)位右移一位,因?yàn)橄茸x出的是高位數(shù)據(jù)
- TH0=0; //定時(shí)器清0
- TL0=0; //定時(shí)器清0
- TR0=1; //開(kāi)啟定時(shí)器T0
- while(IR==0) //如果是低電平就等待
- ; //低電平計(jì)時(shí)
- TR0=0; //關(guān)閉定時(shí)器T0
- LowTime=TH0*256+TL0; //保存低電平寬度
- TH0=0; //定時(shí)器清0
- TL0=0; //定時(shí)器清0
- TR0=1; //開(kāi)啟定時(shí)器T0
- while(IR==1) //如果是高電平就等待
- ;
- TR0=0; //關(guān)閉定時(shí)器T0
- HighTime=TH0*256+TL0; //保存高電平寬度
- if((LowTime<370)||(LowTime>640))
- return 0; //如果低電平長(zhǎng)度不在合理范圍,則認(rèn)為出錯(cuò),停止解碼
- if((HighTime>420)&&(HighTime<620)) //如果高電平時(shí)間在560微秒左右,即計(jì)數(shù)560/1.085=516次
- temp=temp&0x7f; //(520-100=420, 520+100=620),則該位是0
- if((HighTime>1300)&&(HighTime<1800)) //如果高電平時(shí)間在1680微秒左右,即計(jì)數(shù)1680/1.085=1548次
- temp=temp|0x80; //(1550-250=1300,1550+250=1800),則該位是1
- }
- a[i]=temp; //將解碼出的字節(jié)值儲(chǔ)存在a[i]
- }
- if(a[2]=~a[3]) //驗(yàn)證鍵數(shù)據(jù)碼和其反碼是否相等,一般情況下不必驗(yàn)證用戶碼
- return 1; //解碼正確,返回1
- }
- void delay(uint t)
- {
- uint i;
- while(t--)
- for(i=0;i<120;i++);
- }
- /************************************************************
- 函數(shù)功能:執(zhí)行遙控功能
- *************************************************************/
- void Function(void)
- {
- if(a[2]==0x40)
- {
- k=k+1;
- if(k>=8)k=0;
- a[2]=0;
- } //對(duì)P1.3引腳取反,控制繼電器的吸合、釋放
-
- }
- void keyscan()
- {
- if(key1==0)
- {
- delay(1);
- if(key1==0)
- {
- k=0;
- while(!key1);
- }
- }
- if(key2==0)
- {
- delay(1);
- if(key2==0)
- {
- k=1;
- while(!key2);
- }
- }
- if(key3==0)
- {
- delay(1);
- if(key3==0)
- {
- k=2;
- while(!key3);
- }
- }
- if(key4==0)
- {
- delay(1);
- if(key4==0)
- {
- k=3;
- while(!key4);
- }
- }
- if(key5==0)
- {
- delay(1);
- if(key5==0)
- {
- k=4;
- while(!key5);
- }
- }
- if(key6==0)
- {
- delay(1);
- if(key6==0)
- {
- k=5;
- while(!key6);
- }
- }
- if(key7==0)
- {
- delay(1);
- if(key7==0)
- {
- k=6;
- while(!key7);
- }
- }
- if(key8==0)
- {
- delay(1);
- if(key8==0)
- {
- k=7;
- while(!key8);
- }
- }
- }
- //主程序
- void main()
- {
- uchar i;
- EA=1; //開(kāi)啟總中斷
- EX0=1; //開(kāi)外中斷0
- ET0=1; //定時(shí)器T0中斷允許
- IT0=1; //外中斷的下降沿觸發(fā)
- TMOD=0x01; //使用定時(shí)器T0的模式1
- TR0=0; //定時(shí)器T0關(guān)閉
- while(1)
- { //從數(shù)組中讀取數(shù)據(jù)送至P0和P2口顯示
-
- for(i=k*8;i<k*8+8;i++)
- {
- keyscan();
- P0=Pattern_P0[i];
- P1=Tab[k+1];
- delay(100);
- }
- }
- }
- /************************************************************
- 函數(shù)功能:紅外線觸發(fā)的外中斷處理函數(shù)
- *************************************************************/
- void Int0(void) interrupt 0 using 0
- {
- EX0=0; //關(guān)閉外中斷0,不再接收二次紅外信號(hào)的中斷,只解碼當(dāng)前紅外信號(hào)
- TH0=0; //定時(shí)器T0的高8位清0
- TL0=0; //定時(shí)器T0的低8位清0
- TR0=1; //開(kāi)啟定時(shí)器T0
- while(IR==0) //如果是低電平就等待,給引導(dǎo)碼低電平計(jì)時(shí)
- ;
- TR0=0; //關(guān)閉定時(shí)器T0
- LowTime=TH0*256+TL0; //保存低電平時(shí)間
- TH0=0; //定時(shí)器T0的高8位清0
- TL0=0; //定時(shí)器T0的低8位清0
- TR0=1; //開(kāi)啟定時(shí)器T0
- while(IR==1) //如果是高電平就等待,給引導(dǎo)碼高電平計(jì)時(shí)
- ;
- TR0=0; //關(guān)閉定時(shí)器T0
- HighTime=TH0*256+TL0; //保存引導(dǎo)碼的高電平長(zhǎng)度
- if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
- {
- //如果是引導(dǎo)碼,就開(kāi)始解碼,否則放棄,引導(dǎo)碼的低電平計(jì)時(shí)
- //次數(shù)=9000us/1.085=8294, 判斷區(qū)間:8300-500=7800,8300+500=8800.
- if(DeCode()==1)
- Function(); //如果滿足條件,執(zhí)行遙控功能
- }
- EX0=1; //開(kāi)啟外中斷EX0
- }
復(fù)制代碼
所有資料51hei提供下載:
花樣流水燈.zip
(73.9 KB, 下載次數(shù): 134)
2018-6-14 09:08 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|