遥控心形流水灯
??????????????????????
??????????????????????? 畢業設計論文?
? ???????基于單片機的遙控心形流水燈設計? ????????????????
班??? 級 ????????????????????????? ??
姓??? 名 ?????????????????????????? ?????
學??? 號 ???? ????????????? ???????
指導教師 ???? ????????????? ???????????
提交日期 ????2015 年? 月 ?日?????????? ?????
言……………………………………………………………2???1.1設計任務……………………………………………………….2??
1.設計要求……………………………………………………2?
課題綜述………………………………………………………2?2.1課題的來源………………………………………………?2???2.2面對的問題……………………………………………………3??
2?系統分析………………………………………………………3
3.1?STC89C52單片機引腳圖及引腳功能介紹…………………4
4系統設計………………………………………………………4?4.1硬件設計…………………………………………………4?4.1.1硬件框圖……………………………………………………4?
4.1.2硬件詳細設計………………………………………………5
4.2軟件設計………………………………………………………6
4.3?硬件原理圖…………………………………………………7?4.4?元件清單………………………………………………………8
4.6代碼編寫………………………………………………………9
5心得體會…………………………………………………………9?
6致謝………………………………………………………………10?
參考文獻…………………………………………………………11
1?引言
單片機課程設計主要是為了讓我們增進對STC89C51單片機電路的感性認識,加深對理論方面的理解。了解軟硬件的有關知識,并掌握軟硬件設計過程、方法及實現,為以后設計和實現應用系統打下良好基礎。另外,通過簡單課題的設計練習,使我們了解必須提交的各項工程文件,達到鞏固、充實和綜合運用所學知識解決實際問題的目的。
1.1設計任務
設計一個單片機控制的心形流水燈系統
1.2設計要求
(1)可實現多種的流水燈模式
(2)可通過紅外遙控進行控制
2?課題綜述?
2.1?課題的來源
當今社會,這種由單片機芯片控制各種硬件工作的技術也日益成熟,并普及在交通、化工、機械等各個領域。而流水燈這項技術在生活中的應用更是廣泛,較為貼近生活。而流水燈控制的設計所需要的知識也正好吻合了我們本學期對于單片機這門課程的學習,所以設計流水燈控制的這個課題讓我們對知識的學習和鞏固都有了進一步的加深。
2.2?面對的問題?
這次課程設計是通過STC89C52位單片機實現。但面對的問題卻是兩方面的:一個是軟件的設計,也就是實現流水燈控制功能的程序編輯;另一個是硬件的設計,需要我們自己連接、焊接電路板。而更為嚴峻的就是設計的最后還要將軟硬件相結合。
3?系統分析
3.1?STC?89C52單片機引腳圖及引腳功能介紹
本次設計的目的在于加深STC89C52單片機的理解,首先來簡單認識一下,它的引腳如圖3-1所示:?圖3.1?STC89C52
STC89C52引腳可以分為四個部分,各個引腳功能如下:
主電源引腳(2根)???
??Vcc:電源輸入,接+5V電源?
GND:接地線?
??外接晶振引腳(2根)?
XTAL1:片振蕩電路的輸入端?
XTAL2:片振蕩電路的輸出端?
??控制引腳(4根)?
RST/PROG:復位引腳,引腳上出現2個機器周期的高電平將使單片機復位。?ALE/VPP:地址鎖存允許信號?
PESN:外部存儲器選通信號?
EA/VPP:程序存儲器的外部選通,接低電平從外部程序存儲器讀指令,如果接高電平則從部程序存儲器讀指令
??可編程輸入/輸出引腳(32根)?STC89C52單片機有4組8位的可編程I/O口,分別為P0、P1、P2、P3口,每個口有8位(8根引腳),共32根。
P0口:8位雙向I/O口線?
P1口:8位準雙向I/O口線?
P2口:8位準雙向I/O口線?
P3口:8位準雙向I/O口線
4系統設計?
4.1硬件設計?
4.1.1.硬件框圖
按照單片機系統擴展與系統配置狀況,單片機應用系統可分為最小系統、最小功耗系統及典型系統等。STC89C52單片機是本次課程設計運用的主要原件。流水燈控制設計是用一個帶有多個發光二極管的單片機最小應用系統,即為由發光二極管、晶振、復位、電源等電路和必要的軟件組成的單個單片機。從原理圖中可以看出,如果要讓接在P1、P2、P3、P0口的LED亮起來,那么只要把P2、P1、P3、P0口的電平變為低電平就可以了;因此,要實現流水燈功能,我們只要將發光二極管LED1~LED32依次點亮、熄滅,LED燈便會一亮一暗的做流水燈了。在此我們還應注意一點,由于人眼的視覺暫留效應以及單片機執行每條指令的時間很短,我們在控制二極管亮滅的時候應該延時一段時間,否則我們就看不到“流水”效果了。?
4.1.2.硬件詳細設計
(1)復位電路部分??
當要對晶體重置時,只要對此引腳電平提升至高電平并保持兩個及其周期以上的時間便能完成系統重置的各項動作,使得部特殊功能寄存器容均被設成已知狀態。
(2)晶振部分
(3)紅外接收頭部分
4.2?軟件設計
單片機的應用系統由硬件和軟件組成,在硬件原理圖搭建完成上電之后,我們還不能看到流水燈循環點亮的現象,我們還需要編寫程序控制單片機管腳電平的高低變化,來實現發光二極管的一亮一滅
紅外遙控的工作原理
系統上電初始化后,對單片機的P3.3口進行檢測,當其為高電平時,系統處于等待狀態。當其為低電平時,將啟動中斷服務程序,實現接收數據幀。需要說明的是:數據幀采用中斷方式進行接收,單片機在外中斷1方式下工作。在數據幀接收時,將對所接收數據的前3位碼的碼寬進行驗證。前3位碼的碼寬分別為4ms、2ms、4ms,若任意一位的碼寬不滿足要求,都將作為錯誤碼處理,當系統接收到的高電平脈寬大于5ms時,結束脈沖接收。然后系統會對所接收脈沖的最后兩位脈寬進行驗證,其值應分別是2ms和4ms,否則將會作為錯誤碼處理,最后系統根據累加器A中的脈沖個數,在單片機P0或P2口的某一對應引腳輸出控制信號,同時在P1口輸出相應的二進制數據。此時即完成一次數據的接收處理。HRM5700B接收8個編碼時的輸出信號波形如下圖
紅外接收頭接收8個編碼時的輸出信號波形圖
數據幀的接收處理
當紅外線接收器輸出脈沖幀數據時,第一位碼的低電平將啟動中斷程序,實時接收數據幀。在數據接收時,先對第一位(起始位)碼的碼寬進行驗證。若第一位低電平碼的脈寬小于2ms,將作為錯誤碼處理;否則認為是起始碼,累加器A加1.當間隔位的高電平大于3ms時,結束接收,然后根據累加器A中的脈沖個數,執行相應的輸出操作。圖3-14為紅外線接收器輸出的一幀遙控碼波形圖。
遙控接收控制流程圖
遙控接收中斷流程圖
中斷過程:首先判斷低電平脈寬度是否大于2ms,若脈寬不到2ms,中斷返回;若低電平大于2ms,則接收并地低電平脈沖計數,接下來看判斷高電平脈沖寬度是否大于3ms,若脈寬不到3ms,則返回上一接收計數過程;若高電平脈寬大于3ms,則按照脈沖個數至對應功能程序。此時中斷返回。
4.3?硬件原理圖
4.4?元件清單
代碼編寫
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
uint pwm=99;???????? //調節占空比變量
uint su=0;
uint vaule=0;
char moshi=0;
char lm=0;
uint sudu=60;
sbit hwx=P3^2;?????? //紅外接收數據引腳,
unsigned char ly_lhj[4];?????????????? //保存NEC的四個字節數據
bit ly_flag=0;??????????????????????????? //成功接收標志
void delay1(void){??????
??? unsigned char i=10;
??? while(i--);
}
void delay(unsigned int i)//延時函數
{
??? unsigned int a,b;
??? for(a=sudu;a>0;a--)
?????? for(b=i;b>0;b--);
}
void dis1()????????? //花樣一函數
{
??? uchar j;
??? int time=70;
??? P2=0XFE;
??? delay(time);
??? for(j=0;j<7;j++)
??? {
?????? P2=(P2<<1);
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
???
??? P3_0=0;
??? delay(time);
??? P3_1=0;
??? delay(time);
??? P3_3=0;
??? delay(time);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? P3_4=0;
??? delay(time);
??? P3_5=0;
??? delay(time);
??? P3_6=0;
??? delay(time);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? P3_7=0;
??? delay(time);
??? P0=0XFE;
??? delay(time);
??? for(j=0;j<7;j++)
??? {
?????? P0=(P0<<1);
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
???
??? P1=0XFE;
??? delay(time);
??? for(j=0;j<7;j++)
??? {
?????? P1=(P1<<1);
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
??? delay(1000);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? delay(1000);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? delay(1000);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? delay(1000);
hm:;
}
void dis2()
{
??? char j,aa;
??? int time=100;
??? aa=0x80;
??? for(j=0;j<7;j++)
??? {
?????? P1=aa;?
?????? delay(time);
?????? aa=_cror_(aa,1);
?????? aa=aa | 0x80;
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
??? P1=0XFF;
??? aa=0x80;
??? for(j=0;j<7;j++)
??? {
?????? P0=aa;?
?????? delay(time);
?????? aa=_cror_(aa,1);
?????? aa=aa | 0x80;
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
??? P0=0XFF;??
??? P3_7=1;
??? delay(time);
??? P3_6=1;
??? delay(time);
??? P3_5=1;
??? delay(time);
??? P3_4=1;
??? delay(300);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? P3_3=1;
??? delay(time);
??? P3_1=1;
??? delay(time);
??? P3_0=1;
??? delay(time);
??? if(ly_flag==1){ly_flag=0;goto hm;}
???
??? aa=0x80;
??? for(j=0;j<7;j++)
??? {
?????? P2=aa;?
?????? delay(time);
?????? aa=_cror_(aa,1);
?????? aa=aa | 0x80;
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
??? P2=0XFF;
hm:;??????
}
void dis3()
{
??? uchar j;
??? P2=0XFE;
??? delay(100);
??? for(j=0;j<7;j++)
??? {
?????? P2=(P2<<1)|0X01;
?????? delay(100);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
??? P2=0XFF;
??? P3_0=0;
??? delay(100);
??? P3_0=1;
??? P3_1=0;
??? delay(100);
??? P3_1=1;
??? P3_3=0;
??? delay(100);
??? P3_3=1;
??? P3_4=0;
??? delay(100);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? P3_4=1;
??? P3_5=0;
??? delay(100);
??? P3_5=1;
??? P3_6=0;
??? delay(100);
??? P3_6=1;
??? P3_7=0;
??? delay(100);
??? P3_7=1;
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? P0=0XFE;
??? delay(100);
??? for(j=0;j<7;j++)
??? {
?????? P0=(P0<<1)|0X01;
?????? delay(100);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
??? P0=0XFF;
???
??? P1=0XFE;
??? delay(100);
??? for(j=0;j<7;j++)
??? {
?????? P1=(P1<<1)|0X01;
?????? delay(100);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
??? P1=0XFF;
hm:;??
}
void dis4()
{
??? char j;
??? P2=0X00;
??? delay(300);??
??? P3_0=0;
??? P3_1=0;
??? P3_3=0;
??? P3_4=0;
??? P3_5=0;
??? P3_6=0;
??? P3_7=0;
??? delay(300);??
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? P0=0X00;
??? delay(300);??
??? P1=0X00;
??? delay(300);?? //
??? for(j=0;j<6;j++)
??? {
?????? P0=0XFE;
?????? P1=0XFF;
???
?????? P2=0X00;
?????? P3_0=0;
?????? P3_1=0;
?????? P3_3=0;
?????? P3_4=0;
?????? P3_5=0;
?????? P3_6=0;
?????? P3_7=0;
?????? delay(300);??
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? P0=0X01;
?????? P1=0X00;
???
?????? P2=0XFF;
?????? P3_0=1;
?????? P3_1=1;
?????? P3_3=1;
?????? P3_4=1;
?????? P3_5=1;
?????? P3_6=1;
?????? P3_7=1;
?????? delay(300);??????
??? }
hm:;
}
void dis5()
{
??? char i;
??? int time=200;
??? P0=0XFF;
??? P3=0XFF;
??? for(i=0;i<12;i++)
??? {
?????? P2=0XFD;
?????? P1=0X7F;
?????? delay(time);?
?????? P2=0XFB;
?????? P1=0XBF;?
?????? delay(time);
?????? P2=0XF7;
?????? P1=0XDF;?
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? P2=0XEF;
?????? P1=0XEF;?
?????? delay(time);
?????? P2=0XDF;
?????? P1=0XF7;?
?????? delay(time);
?????? P2=0XBF;
?????? P1=0XFB;?
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? P2=0X7F;
?????? P1=0XFD;?
?????? delay(time);
?????? P2=0XFF;
?????? P3=0XFE;
?????? P1=0XFE;?
??? ??? delay(time);//
?????? P1=0XFF;
?????? P3=0XFD;
?????? P0=0X7F;
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? P3=0XF7;?
?????? P0=0XBF;
?????? delay(time);
?????? P3=0XEF;??
?????? P0=0XDF;
?????? delay(time);
?????? P3=0XDF;
?????? P0=0XEF;
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? ??? P3=0XBF;
?????? P0=0XF7;
?????? delay(time);
?????? P3=0X7F;
?????? P0=0XFB;
?????? delay(time);
?????? P3=0XFF;
?????? P0=0XFC;
?????? delay(time);
?????? P0=0XFF;
?????? if(i<4)time=time-40;
??? }
hm:;
}
void dis6()
{
??? char j;
??? int time=200;
??? for(j=0;j<12;j++)
??? {
?????? P0=0XFC;//
?????? P2=0XFD;//P21
?????? P1=0X7F;//P17
?????? delay(time);
?????? P3=0X7F;//P37
?????? P0=0XFB;//P02
?????? P2=0XFB;//P22
?????? P1=0XBF;//P16
?????? delay(time);
?????? P3=0XBF;//P36
?????? P0=0XF7;//P03
?????? P2=0XF7;//P23
?????? P1=0XDF;//P15
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? P3=0XDF;//P35
?????? P0=0XEF;//P04
?????? P2=0XEF;//P24
?????? P1=0XEF;//P14?
?????? delay(time);
?????? P3=0XEF;//P34
?????? P0=0XDF;//P05
?????? P2=0XDF;//P25
?????? P1=0XF7;//P13? ?????
?????? delay(time);
?????? P3=0XF7;//P33?
?????? P0=0XBF;//P06
?????? P2=0XBF;//P26
?????? P1=0XFB;//P12?
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? P3=0XFD;//P31
?????? P0=0X7F;//P07
?????? P2=0X7F;//P27
?????? P1=0XFD;//P11? ??
?????? delay(time);
?????? P2=0XFF;
?????? P0=0XFF;
?????? P1=0XFE;//P10
?????? P3=0XFE;//P30
?????? delay(time);
?????? P1=0XFD;//P11
?????? P2=0X7F;//P27
?????? P0=0X7F;//P07
?????? P3=0XFD;//P31
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? P1=0XFB;//P12
?????? P2=0XBF;//P26
?????? P3=0XF7;//P33
?????? P0=0XBF;//P06
?????? delay(time);
?????? P1=0XF7;//P13
?????? P2=0XDF;//P25
?????? P3=0XEF;//P34
?????? P0=0XDF;//P05
?????? delay(time);?
?????? P1=0XEF;//P14
?????? P2=0XEF;//P24
?????? P3=0XDF;//P35
?????? P0=0XEF;//P04
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? P1=0XDF;//P15
?????? P2=0XF7;//P23
?????? P3=0XBF;//P36
?????? P0=0XF7;//P03
?????? delay(time);
?????? P1=0XBF;//P16
?????? P2=0XFB; //P22
?????? P3=0X7F;//P37
?????? P0=0XFB;//P02
?????? delay(time);
?????? P1=0X7F;//P17
?????? P2=0XFD;//P21
?????? P3=0XFF;//
?????? P0=0XFC;
?????? delay(time);
?????? P1=0XFF;//P17
?????? P2=0XFF;//P21
?????? P0=0XFF;
?????? if(j<4)time=time-40;???????????
??? }
hm:;??
}
void dis7()
{
??? char j;
??? int time=70;
??? for(j=0;j<3;j++)
??? {
?????? P0=0XFC;
?????? delay(time);
?????? P3=0X7F;
?????? P0=0XF8;
?????? delay(time);
?????? P3=0X3F;
?????? P0=0XF0;
?????? delay(time);
?????? P3=0X1F;
?????? P0=0XE0;
?????? delay(time);
?????? P3=0X0F;
?????? P0=0XC0;
?????? delay(time);
?????? P3=0X07;
?????? P0=0X80;
?????? delay(time);
?????? P3=0X05;
?????? P0=0X00;
?????? delay(time);//
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? P3=0X04;
?????? P1=0XFE;
?????? delay(time);
?????? P2=0X7F;
?????? P1=0XFC;
?????? delay(time);
?????? P2=0X3F;
?????? P1=0XF8;
?????? delay(time);
?????? P2=0X1F;
?????? P1=0XF0;
?????? delay(time);
?????? P2=0X0F;
?????? P1=0XE0;
?????? delay(time);
?????? P2=0X07;
?????? P1=0XC0;
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? P2=0X03;
?????? P1=0X80;
?????? delay(time);
?????? P2=0X01;
?????? P1=0X00;
?????? delay(time);
?????? P2=0X00;
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? delay(1000);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? delay(1000);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? delay(1000);
?????? P0=0XFF;
?????? P1=0XFF;
?????? P2=0XFF;
?????? P3=0XFF;??
??? }
hm:;
}
void dis8()
{
??? char j;
??? int time=250;
??? for(j=0;j<10;j++)
??? {
?????? P2=0XAA;
?????? P3=0X56;
?????? P0=0X55;
?????? P1=0X55;
?????? delay(time);
?????? P2=0X55;
?????? P3=0XAD;
?????? P0=0XAA;
?????? P1=0XAA;
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? if(j<3)time=time-60;
??? }
hm:;
}
void dis9()
{
??? char j;
??? for(j=0;j<4;j++)
??? {
?????? P2=0X00;
?????? P3=0X04;
?????? P0=0XFE;
?????? P1=0XFF;
?????? delay(200);??
?????? P2=0XFF;
?????? P3=0XFF;
?????? P0=0X01;
?????? P1=0X00;
?????? delay(200);??
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
hm:;
}
void dis10()
{
??? char j;
??? for(j=0;j<4;j++)
??? {
?????? P2=0X00;
?????? P1=0X00;
?????? P3=0XFE;
?????? P0=0XFF;
?????? delay(200);??
?????? P2=0XFF;
?????? P1=0XFF;
?????? P3=0X04;
?????? P0=0X00;
?????? delay(200);??
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
hm:;
}
void dis11()
{
??? char j;
??? for(j=0;j<5;j++)
??? {
?????? P2=0X00;
?????? P3=0X04;
?????? P0=0X00;
?????? P1=0X00;
?????? delay(100);
?????? P2=0XFF;
?????? P3=0XFF;
?????? P0=0XFF;
?????? P1=0XFF;
?????? delay(100);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
??? }
hm:;
}
void dis12()
{
??? char j;
??? int time=70;
??? for(j=0;j<6;j++)
??? {
?????? P2=0XFE;
?????? P3=0XFE;
?????? P0=0XFE;
?????? P1=0XFE;
?????? delay(time);
?????? P2=0XFD;
?????? P3=0XFD;
?????? P0=0XFD;
?????? P1=0XFD;
?????? delay(time);
?????? P2=0XFB;
?????? P3=0XF7;
?????? P0=0XFB;
?????? P1=0XFB;
?????? delay(time);
?????? P2=0XF7;
?????? P3=0XEF;
?????? P0=0XF7;
?????? P1=0XF7;
?????? delay(time);
?????? if(ly_flag==1){ly_flag=0;goto hm;}
?????? P2=0XEF;
?????? P3=0XDF;
?????? P0=0XEF;
?????? P1=0XEF;
?????? delay(time);
?????? P2=0XDF;
?????? P3=0XBF;
?????? P0=0XDF;
?????? P1=0XDF;
?????? delay(time);
?????? P2=0XBF;
?????? P3=0X7F;
?????? P0=0XBF;
?????? P1=0XBF;
?????? delay(time);
?????? P2=0X7F;
?????? P3=0XFF;
?????? P0=0X7F;
?????? P1=0X7F;
?????? delay(time);
??? }
hm:;??
}
void dis13()
{
??? int time=200;
??? P2=0XFE;
??? P3=0XFE;
??? P0=0XFE;
??? P1=0XFE;
??? delay(time);
??? P2=0XFC;
??? P3=0XFC;
??? P0=0XFC;
??? P1=0XFC;
??? delay(time);
??? P2=0XF8;
??? P3=0XF4;
??? P0=0XF8;
??? P1=0XF8;
??? delay(time);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? P2=0XF0;
??? P3=0XE4;
??? P0=0XF0;
??? P1=0XF0;
??? delay(time);
??? P2=0XE0;
??? P3=0XC4;
??? P0=0XE0;
??? P1=0XE0;
??? delay(time);?
??? P2=0XC0;
??? P3=0X84;
??? P0=0XC0;
??? P1=0XC0;
??? delay(time);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? P2=0X80;
??? P3=0X04;
??? P0=0X80;
??? P1=0X80;
??? delay(time);
??? P2=0X00;
??? P3=0X04;
??? P0=0X00;
??? P1=0X00;
??? delay(time);
hm:;
}
void dis14()
{
??? P0 = 0xFF;
??? P1 = 0xFF;
??? P2 = 0xFF;
??? P3 = 0xFF;
??? delay(10);
??? P0 = 0x00;
??? P1 = 0x00;
??? P2 = 0x00;
??? P3 = 0x04;
??? delay(1000);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? delay(1000);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? delay(1000);
??? P0 = 0xFF;
??? P1 = 0xFF;
??? P2 = 0xFF;
??? P3 = 0xFF;
hm:;
}
void dis15()
{
??? int time=80;
??? P3_0=0;
??? P1_0=0;
??? delay(time);
??? P2_7=0;
??? P3_1=0;
??? P1_1=0;
??? P0_7=0;
??? delay(time);
??? P3_3=0;
??? P2_6=0;
??? P1_2=0;
??? P0_6=0;
??? delay(time);
??? if(ly_flag==1){ly_flag=0;goto hm;}
???
??? P3_4=0;
??? P2_5=0;
??? P1_3=0;
??? P0_5=0;
??? delay(time);
???
??? P3_5=0;
??? P2_4=0;
??? P1_4=0;
??? P0_4=0;
??? delay(time);
???
??? P3_6=0;
??? P2_3=0;
??? P1_5=0;
??? P0_3=0;
??? delay(time);
??? if(ly_flag==1){ly_flag=0;goto hm;}
??? P1_6=0;
??? P0_2=0;???
??? P3_7=0;
??? P2_2=0;
??? delay(time);
???
??? P2_1=0;
??? P0_0=0;
??? P1_7=0;
??? P0_1=0;
??? delay(time);
??? P2_0=0;
??? delay(time);
??? P0 = 0xFF;
??? P1 = 0xFF;
??? P2 = 0xFF;
??? P3 = 0xFF;
hm:;?????????
}
void init()
{
??? P0 = 0x00;
??? P1 = 0x00;
??? P2 = 0x00;
??? P3 = 0x04;
??? delay(3000);
??? P0 = 0xFF;
??? P1 = 0xFF;
??? P2 = 0xFF;
??? P3 = 0xFF;
??? IT0=1;??????? ?????????? //設置成下降沿觸發方式
??? EX0=1;? ???????????? //開啟外部中斷 1,按鍵5
??? TMOD=0X12;?????????? //定時器1的方式1,16位計數器,用來計數時間
??? TL1=0;
??? TH1=0;?????????????? //定時/計數器1初始值
??? TH0=210;???? ????????????????????? //寫入預置初值(取值1-255,數越大PWM頻率越高)
??? TL0=210;???? ????????????????????? //寫入預置值 (取值1-255,數越大PWM頻率越高)
??? TR0=1;?????? ????????????????????? //啟動定時器
??? ET0=1;?????? ????????????????????? //允許定時器0中斷
??? EA=1;??????????????? //首先開啟總中斷
}
char zh=0,gs=0;
void main()
{
??? init();
??? while(1)
??? {
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis1();
?????????? if(zh==1)if(gs==0)dis1();
?????? }?????
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis2();
?????????? if(zh==1)if(gs==1)dis2();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis3();
?????????? if(zh==1)if(gs==2)dis3();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis4();
?????????? if(zh==1)if(gs==3)dis4();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis5();
?????????? if(zh==1)if(gs==4)dis5();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis6();
?????????? if(zh==1)if(gs==5)dis6();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis7();
?????????? if(zh==1)if(gs==6)dis7();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis8();
?????????? if(zh==1)if(gs==7)dis8();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis9();
?????????? if(zh==1)if(gs==8)dis9();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis10();
?????????? if(zh==1)if(gs==9)dis10();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis11();
?????????? if(zh==1)if(gs==10)dis11();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis12();
?????????? if(zh==1)if(gs==11)dis12();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis13();
?????????? if(zh==1)if(gs==12)dis13();
??? ??? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis14();
?????????? if(zh==1)if(gs==13)dis14();
?????? }
?????? if(moshi==0)
?????? {
?????????? if(zh==0)dis15();
?????????? if(zh==1)if(gs==14)dis15();
?????? }
?????? if(moshi==3)
?????? {
?????????? if(lm==0)
?????????? {
?????????? ??? P0 = 0x00;
?????????? ??? P1 = 0x00;
?????????? ??? P2 = 0x00;
?????????? ??? P3 = 0x04;??????????
?????????? }
?????????? if(lm==1)
?????????? {
?????????? ??? P0 = 0xFF;
?????????? ??? P1 = 0xFF;
?????????? ??? P2 = 0xFF;
?????????? ??? P3 = 0xFF;??????????
?????????? }
?????? }?????
??? }
}
/***********外中斷1入口函數,P32引腳,紅外線接收IC數據腳**************************/
void hongwai(void)?? interrupt 0
{
??? unsigned char i,ia;
??? /**************開始判斷是否為NEC波形引導碼的前9MS和后4.5MS******************************/
??? TL1=0;
??? TH1=0;??????????? //定時/計數器1初始值
??? TR1=1;??????????? //定時器以12M晶振12分頻計數,即1us計數
??? while(!hwx);
??? TR1=0;??????????? //信號翻轉停止計數
??? if(TH1<30||TH1>40)?? //NEC引導碼前9MS,計數約9000,TH1約等于35,給個誤差值,用30-40之間來判斷
?????? return;
??? TH1=0;??????????? //定時/計數器1初始值
??? TR1=1;
??? while(hwx){
?????? delay1();
?????? if(TH1>22)??? //NEC引導碼引導碼的后4。5MS,計數約4500,TH1約等于17
?????????? return;??????
??? }
??? TR1=0;
??? if(TH1<12)??????? //NEC引導碼引導碼的后4。5MS,計數約4500,TH1約等于17
?????? return;
??? /***********開始接收四個字節內容**************************************/??
??? for(i=0;i<4;i++){
?????? for(ia=0;ia<8;ia++){???????????
?????????? while(!hwx);? //低電平開始,不處理只等待高電平
??????????
?????????? TH1=0;
?????????? TR1=1;??????? //高電平開始,啟動計數
?????????? while(hwx){
????????????? delay1();
????????????? if(TH1>15)???
????????????????? return;??????
?????????? }
?????????? TR1=0;
?????????? //高電平結束,判斷數據1或0向變量移入
?????????? ly_lhj[i]>>=1;?????????? //數據由高位移入低位
?????????? if(TH1>4)??????????? //時間量TH1高于4,即高于1MS判斷為1
????????????? ly_lhj[i]|=0x80;
?????? }
??? }
??? if(moshi==2)//小夜燈亮度調節
??? {
?????? if(ly_lhj[2]==0x07)//加
?????? {
?????????? pwm=pwm+10;
?????????? if(pwm>99)pwm=99;
?????? }
???
?????? if(ly_lhj[2]==0x09)//減
?????? {
?????????? pwm=pwm-10;
?????????? if(pwm<10)pwm=10;
?????? }
??? }
??? if(moshi==0)//動畫模式速度調節
??? {
?????? if(ly_lhj[2]==0x40)//速度加
?????? {
?????????? sudu=sudu-10;
?????????? if(sudu<10)sudu=10;?
?????? }
???
?????? if(ly_lhj[2]==0x19)//速度減
?????? {
?????????? sudu=sudu+10;
?????????? if(sudu>100)sudu=100;?????????????
?????? }
??? }
??? if(ly_lhj[2]==0x43)//自動動畫模式
??? {
?????? moshi=0;
?????? zh=0;
??? }
??? if(ly_lhj[2]==0x44)//呼吸燈模式
??? {
?????? moshi=1;
?????? ly_flag=1; //接收成功
??? }
??? if(ly_lhj[2]==0x15)//小夜燈模式
??? {
?????? moshi=2;
?????? ly_flag=1; //接收成功
??? }
??? if(ly_lhj[2]==0x45)//全滅
??? {
?????? moshi=3;
?????? lm=1;
??? ??? P0 = 0xFF;
??? ??? P1 = 0xFF;
??? ??? P2 = 0xFF;
??? ??? P3 = 0xFF;
?????? ly_flag=1; //接收成功???
??? }
??? if(ly_lhj[2]==0x47)//全亮
??? {
?????? moshi=3;
?????? lm=0;
??? ??? P0 = 0x00;
??? ??? P1 = 0x00;
??? ??? P2 = 0x00;
??? ??? P3 = 0x04;
?????? ly_flag=1; //接收成功
??? }
??? if(ly_lhj[2]==0x42)//手動動畫選擇
??? {
?????? moshi=0;
?????? zh=1;
??? }
??? if(ly_lhj[2]==0x52)//手動動畫選擇
??? {
?????? gs++;
?????? if(gs>14)gs=0;
??? }
??? if(ly_lhj[2]==0x4A)//手動動畫選擇
??? {
?????? gs--;
?????? if(gs<0)gs=14;
??? }
??? TF1=0;
}
//定時器一中斷函數,產生波形
void timer_init0(void) interrupt 1 using 2?
{
??? static? uchar?? t ;?? ?? //PWM計數
??? if(moshi==1 || moshi==2)
??? {
?????? t++;??? ???????????? //每次定時器溢出加1
???
?????? if(t == 100)?? ????????? //PWM周期 100個單位
?????? {
?????????? t=0;? ??????????? //使t=0,開始新的PWM周期
?????? ??? P0 = 0xFF;
?????? ??? P1 = 0xFF;
?????? ??? P2 = 0xFF;
?????? ??? P3 = 0xFF;??????
?????? }???????????? ??
??????
?????? if(pwm == t)? ?????? //按照當前占空比切換輸出為高電平
?????? {?
?????? ??? P0 = 0x00;
?????? ??? P1 = 0x00;
?????? ??? P2 = 0x00;
?????? ??? P3 = 0x04;???
?????? }??
??? }
??? if(moshi==1)
??? {
?????? su++;
?????? if(su==6){su=0;vaule++;}
??????
?????? if(vaule==100)pwm=25;
?????? if(vaule==200)pwm=30;
?????? if(vaule==300)pwm=35;
?????? if(vaule==400)pwm=40;
?????? if(vaule==500)pwm=45;
?????? if(vaule==600)pwm=50;
?????? if(vaule==700)pwm=55;
?????? if(vaule==800)pwm=60;
?????? if(vaule==900)pwm=65;
?????? if(vaule==1000)pwm=70;
?????? if(vaule==1100)pwm=75;
?????? if(vaule==1200)pwm=80;
?????? if(vaule==1300)pwm=85;
?????? if(vaule==1400)pwm=90;
?????? if(vaule==1500)pwm=95;
?????? if(vaule==1600)pwm=99;
?????? if(vaule==2000)pwm=95;
?????? if(vaule==2100)pwm=90;
?????? if(vaule==2200)pwm=85;
?????? if(vaule==2300)pwm=80;
?????? if(vaule==2400)pwm=75;
?????? if(vaule==2500)pwm=70;
?????? if(vaule==2600)pwm=65;
?????? if(vaule==2700)pwm=60;
?????? if(vaule==2800)pwm=55;
?????? if(vaule==2900)pwm=50;
?????? if(vaule==3000)pwm=45;
?????? if(vaule==3100)pwm=40;
?????? if(vaule==3200)pwm=35;
?????? if(vaule==3300)pwm=30;
?????? if(vaule==3400){pwm=25;vaule=0;}
??? }
}
5.心得體會
由于本次課程設計含括了軟件和硬件知識,所以在完成課程設計的同時也讓我們了解到了我們在軟硬件設計和制作方面的不足。在這次的設計過程中我所擔任的工作是對電路板各元器件的連接和焊接工作,雖然看似簡單,但做起來卻是一個細致的工作,尤其是對于一些引腳的焊接工作,更是要細中再細,因為這些元器件的引腳距離都是比較近的,一旦將不該連接的引腳焊接到了一起,該元器件就會失它原來的工作效果,還很有可能將整個電路短路。
通過這次課程設計,我知道了團隊的力量,只有互相團結,才能把事情做好,組員分工合作,每個人根據自己的能力圍負責不同的工作,達到事半功倍的效果。而在這次的設計過程中讓我深深的了解了我在軟件、硬件方面的許多不足之處,對于今后的學習和工作都有了一次很好的借鑒經驗
6.致謝
首先我要感的是機電工程學院醫工系,機電工程學院醫工系能夠給我提供如此好的實踐機會。更要感指導老師,在我們的學習過程中他給了很大的幫助,幫助我們理解不懂的地方,使我們最終能夠完成這個課程設計。我還要感參考文獻的原作者。
在此對給予我幫助的老師表示深深地感!同時對給予我幫助的同學表示深深地感。我想說的是,在指導老師和同學們的幫助下我學到了很多東西,也發現了自己的很多不足之處,促使我在以后的學習中更加努力的學習。我們回顧這過去時間,我們會發現自己收獲了很多,也成長了很多,懂得了如何去學習以前未曾學過的新思維新方法,懂得了如何去多方位地查找資料,完善和創新一些舊的思維方式,懂得了如何同老師和同學交流和協作,相信這次課程設計的體驗將成為今后我們更多更廣學習中的奠基石。課程設計的過程,是學習的過程,也是鍛煉的過程,更是教會我們同學之間相互幫助,共同克服困難的過程,這將是人生中一筆寶貴的財富,使我受用不盡的同時,我一定將之好好珍惜。
參考文獻
[1]康華光,大欽.?電子技術基礎—模擬部分(第五版)[M].?:高等教育,2005
[2]志海、艷雷、松?.單片機的C語言程序設計與應用——基于Proteus仿真
[3]毅剛,喜元。?單片機原理與應用設計 電子工業?
[4]?黃尊熹.單片機原理接口與應用[M].西北工業大學出版社,2000.147-150.??[5]?樓然苗,李光飛.51系列單片機設計實例[M].北京:北京航空航天大學出版社,2003,103-120.?
[6]?李必紅,王忠魁.基于單片機控制的機床數控改造[J].山西工學院學報,2004,20(1):70-79.?
[7]?余永權.Flash單片機原理及應用[M].?北京:電子工業出版社,1997.?
[8]?何立民.單片機應用系統設計[M]北京:北京航空航天大學出版社,1990.?[9]?李洪明.漫談紅外遙控[J].?電子世界,?2000,?(1):53.?
[10]?高建榮.基于單片機控制紅外線遙控的編碼實現[J].計算機工程與設計,2004,25(11):2105.2107?
[11]?劉曉明,安敏,王軍.兩種紅外解碼技術的探討[J].測控技術,
[12]?肖圣兵,仲興榮,徐清源.一種紅外遙控信號的解碼方法[J].蘇州大學學報(自然科學),2002,18(2):104.105.?
[13]?付家才.單片機控制工程實踐技術[M].北京:北京化學工業出版社,2004?[14]?姚凱學,孟傳良.單片機原理及應用[M].重慶:重慶大學出版社,1998.?[15]?周立功.增強型80C51單片機速成與實戰[M].北京:北京航空航天大學出版社,2003.?
[16]?嚴天峰.單片機應用系統設計與仿真調試[M].北京:北京航空航天大學出版社,2005.?
[17]?馮建華.單片機應用系統設計與產品開發[M].北京:人民郵電出版社,2004.?[18]?裴彥純.基于單片機系統的紅外遙控器應用[M].北京:現代電子技術
總結
- 上一篇: 用友 SQL笔试题
- 下一篇: python第三方库-基础