基于51單片機(jī)的紅外控制LCD1602顯示系統(tǒng)
摘要:該設(shè)計(jì)由硬件和軟件共同組成。首先是硬件部分,該系統(tǒng)的最終實(shí)現(xiàn)選用的單片處理器(AT89S52)、21鍵遙控器、LCD1602 顯示、單片機(jī)的串行接口電路。因此應(yīng)充分了解單片機(jī),包括存儲(chǔ)空間,并行口,串行口,串行通信,定時(shí)器等,21鍵遙控器鍵值編碼和LCD1602 的顯示,本系統(tǒng)是以單片機(jī)為控制器的核心,本系統(tǒng)主要由紅外接收電路、接收紅外信號(hào)處理電路、單片機(jī)系統(tǒng)及控制電路組成。工作時(shí),可以將21鍵遙控器上按鍵出來的鍵值編碼等信息送到單片機(jī),單片機(jī)根據(jù)這些信息通過控制電路把要顯示的內(nèi)容由LCD1602顯示屏顯示出21鍵每個(gè)鍵對(duì)應(yīng)的內(nèi)容,從而實(shí)現(xiàn)紅外控制LCD1602顯示。
一、 設(shè)計(jì)目的
課程名稱:《單片機(jī)原理及應(yīng)用——c51編程+proteus仿真》 張毅剛 著, 學(xué)后感:熟悉單片機(jī)的人都知道,要學(xué)好單片機(jī)可不是一件容易的事,倒不是因?yàn)閱纹瑱C(jī)很難學(xué),而是很難找到一本專為單片機(jī)入門者而編寫的教材。翻一下身邊的單片機(jī)教材,都好像是為已經(jīng)懂單片機(jī)的人而寫的,一般先介紹單片機(jī)的硬件結(jié)構(gòu)和指令系統(tǒng),再是系統(tǒng)擴(kuò)展和外圍器件,順便講一些應(yīng)用設(shè)計(jì)(隨便說一下,很多書中的電路設(shè)計(jì)已經(jīng)過時(shí),并且有些程序還是錯(cuò)誤的)。如果按照此種學(xué)習(xí)方法,想進(jìn)行產(chǎn)品開發(fā),就必須先把所有的知識(shí)全部掌握了才可以進(jìn)行實(shí)際應(yīng)用。學(xué)習(xí)使用單片機(jī)只能靠循序漸進(jìn)的積累,下面就本人學(xué)習(xí)單片機(jī)的過程和經(jīng)驗(yàn)做簡要介紹。
編程環(huán)境和仿真環(huán)境
編程環(huán)境:keil 4
仿真環(huán)境:proteus 8
二、 設(shè)計(jì)要求
根據(jù)仿真圖搭建硬件電路,硬件主要由AT89S52單片機(jī)最小系統(tǒng)一個(gè),LCD1602顯示屏一個(gè),21鍵紅外遙控器一個(gè),HS0038紅外接收頭一個(gè),470歐姆電阻一個(gè),電源線一根,母對(duì)母杜邦線若干,排阻一個(gè),11.0592晶振一個(gè),貼片電容兩個(gè),47μ電容一個(gè)。根據(jù)proteus仿真上能夠?qū)崿F(xiàn)的電路搭建硬件電路
在keil4中編寫代碼,根據(jù)紅外的編結(jié)碼,和LCD1602顯示屏初始化查忙,寫命令,寫數(shù)據(jù),來編寫代碼,了解紅外編結(jié)碼是編寫代碼重要的過程。
三、 設(shè)計(jì)內(nèi)容
- 最小系統(tǒng)電路
AT89S52芯片
圖一、AT89S52芯片
AT89S52 是一種低功耗、高性能CMOS8位微控制器,具有8K 在系統(tǒng)可編AT89S52-24PU程Flash存儲(chǔ)器。使用Atmel 公司高密度非易失性存儲(chǔ)器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 AT89S52具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,256字節(jié)RAM, 32 位I/O 口線,看門狗定時(shí)器,2 個(gè)數(shù)據(jù)指針,三個(gè)16 位 定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工串行口, 片內(nèi)晶振及時(shí)鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏 輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU 停止工作,允許RAM、定時(shí)器/計(jì)數(shù)AT89S52引腳圖 DIP封裝器、串口、中斷繼續(xù)工 作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。
晶振是晶體振蕩器的簡稱,在電氣上它可以等效成一個(gè)電容和一個(gè)電阻并聯(lián)再串聯(lián)一個(gè)電容的二端網(wǎng)絡(luò)。電工學(xué)上這個(gè)網(wǎng)絡(luò)有兩個(gè)諧振點(diǎn),以頻率的高低分,其中較低的頻率是串聯(lián)諧振;較高的頻率是并聯(lián)諧振。由于晶體自身的特性致使這兩個(gè)頻率的距離相當(dāng)?shù)慕咏,在這個(gè)極窄的頻率范圍內(nèi),晶振等效為一個(gè)電感,所以只要晶振的兩端并聯(lián)上合適的電容它就會(huì)組成并聯(lián)諧振電路。這個(gè)并聯(lián)諧振電路加到一個(gè)負(fù)反饋電路中就可以構(gòu)成正弦波振蕩電路,由于晶振等效為電感的頻率范圍很窄,所以即使其他元件的參數(shù)變化很大,這個(gè)振蕩器的頻率也不會(huì)有很大的變化
圖二、晶振電路
紅外接收電路一體化的紅外接收裝置將遙控信號(hào)的接收、放大、檢波、整形集于一身,并且輸出可以讓單片機(jī)識(shí)別的TTL 信號(hào),這樣大大簡化了接收電路的復(fù)雜程度和電路的設(shè)計(jì)工作,方便使用。在本系統(tǒng)中我們采用紅外一體化接收頭HS0038,HS0038 黑色環(huán)氧樹脂封裝,不受日光、熒光燈等光源干擾,內(nèi)附磁屏蔽,功耗低,靈敏度高。在用小功率發(fā)射管發(fā)射信號(hào)情況下,其接收距離可達(dá)35m。它能與TTL、COMS 電路兼容。HS0038 為直立側(cè)面收光型。它接收紅外信號(hào)頻率為38 kHz,周期約26 μs,同時(shí)能對(duì)信號(hào)進(jìn)行放大、檢波、整形,得到TTL 電平的編碼信號(hào)。三個(gè)管腳分別是地、+5 V 電源、解調(diào)信號(hào)輸出端。 紅外一體化接收頭的測試可以利用圖4 所示的電路進(jìn)行,在HS0038 的電源端與信號(hào)輸出端之間接上一只二極管及一只發(fā)光二極管后,再配上規(guī)定的工作電源(為+5V),當(dāng)手拿遙
控器對(duì)著接收頭按任意鍵時(shí),發(fā)光二極管會(huì)閃爍,說明紅外接收頭和遙控器工作都正常;如果發(fā)光二極管不閃爍發(fā)光,說明紅外接收頭和遙控器至少有一個(gè)損壞。
圖三、hs0038實(shí)物與原件介紹圖
圖四、左邊為遙控器的編結(jié)碼,右邊為遙控器的按鍵
主要功能就是顯示紅外遙控傳給單片機(jī)的數(shù)據(jù),也可以算作紅外對(duì)單片機(jī)的控制
1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊。它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符,每位之間有一個(gè)點(diǎn)距的間隔,每行之
間也有間隔,起到了字符間距和行間距的作用,正因?yàn)槿绱怂运荒芎芎玫仫@示圖形(用自定義CGRAM,顯示效果也不好)。1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母"A"的代碼是01000001B(41H),顯示時(shí)模塊把地址41H中的點(diǎn)陣字符圖形顯示出來,我們就能看到字母"A"。
圖五、lcd1602proteus圖和實(shí)物圖
圖六、lcd1602指令碼
四、 結(jié)論、總結(jié)與建議
仿真圖結(jié)果:
圖七、protues仿真效果
實(shí)物圖結(jié)果:
圖八、實(shí)物效果圖
圖八、實(shí)物電路搭建圖
流程圖:
此次試驗(yàn)的關(guān)鍵是鍵盤的編結(jié)碼,與對(duì)紅外信號(hào)發(fā)射原理的理解,接收裝置對(duì)紅外信號(hào)發(fā)射脈沖次數(shù)的記錄是關(guān)鍵。發(fā)射管的頻率一般為38kHz。通過這次課設(shè)實(shí)驗(yàn),讓我懂得的實(shí)驗(yàn)要踏實(shí),一步一個(gè)腳印的弄,不管遇到什么問題都不能親言放棄,這樣你必定會(huì)成功,還會(huì)在失敗的路上學(xué)習(xí)到好多好多經(jīng)驗(yàn),這是一筆寶貴的財(cái)富
五、主要參考文獻(xiàn)
[1]唐正. Proteus在單片機(jī)教學(xué)中的應(yīng)用[D].華中科技大學(xué),2008.(參考文獻(xiàn)字體字號(hào)要求,中文:宋體;英文與數(shù)字:Times New Roman,五號(hào))
[2]刁宇清. 基于PROTEUS的單片機(jī)仿真實(shí)驗(yàn)系統(tǒng)研究及應(yīng)用[D].西安工業(yè)大學(xué),2011
[3]趙月靜,陳繼榮,張永弟. 單片機(jī)原理及應(yīng)用課程創(chuàng)新實(shí)踐教學(xué)改革[J]. 實(shí)驗(yàn)技術(shù)與管理,2013,01:176-179.
[4]周靈彬,張靖武. PROTEUS的單片機(jī)教學(xué)與應(yīng)用仿真[J]. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2008,01:76-79.
六、 附錄
源代碼
- #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng)
- intrins.h>
- sbit IR=P3^2; //紅外接口標(biāo)志
- sbit LCD_RS=P1^0;
- sbit LCD_RW=P1^1;
- sbit LCD_EN=P2^5;
-
- #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換
- Unsigned char code dofly_DuanMa[10]={0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39};// 顯示段碼值0~9
- unsigned char irtime;//紅外用全局變量
-
- bit irpro_ok,irok;
- unsigned char IRcord[4];
- unsigned char irdata[33];
-
- void Ir_work(void);
- void Ircordpro(void);
-
- void delay(unsigned char t) {
- unsigned char i;
- while(t--)
- for(i = 200; i > 0; i--);
- }
- void LCD_write_instruction(unsigned char LCD_instruction) { //寫指令到LCD
- LCD_RS = 0;
- LCD_RW = 0;
- DataPort = LCD_instruction;
- LCD_EN = 1;
- _nop_();
- LCD_EN = 0;
- delay(1);
- }
-
- void LCD_write_data(unsigned char LCD_data) { //輸出一個(gè)字節(jié)數(shù)據(jù)到LCD
- LCD_RS = 1;
- LCD_RW = 0;
- DataPort = LCD_data;
- LCD_EN = 1;
- _nop_();
- LCD_EN = 0;
- delay(1);
- }
-
- void LCD_set_position(unsigned char x) { //LCD光標(biāo)定位到x處
- LCD_write_instruction(0x80|x);
- }
-
- void LCD_printc(unsigned char lcd_data) { //輸出一個(gè)字符到LCD
- LCD_write_data(lcd_data);
- }
- void LCD_prints(unsigned char *lcd_string) { //輸出一個(gè)字符串到 LCD
- unsigned char i = 0;
- while(lcd_string[i] != 0x00) {
- LCD_write_data(lcd_string[i]);
- i++;
- }
- }
-
- void LCD_initial(void) {
- LCD_RW = 0; //初始化 LCD
- LCD_write_instruction(0x38);
- LCD_write_instruction(0x0c);
- LCD_write_instruction(0x06);
- LCD_write_instruction(0x01);
- }
-
- void tim0_isr (void) interrupt 1 using 1
- {
- irtime++; //用于計(jì)數(shù)2個(gè)下降沿之間的時(shí)間
- }
-
- void EX0_ISR (void) interrupt 0 //外部中斷0服務(wù)函數(shù)
- {
- static unsigned char i; //接收紅外信號(hào)處理
- static bit startflag; //是否開始處理標(biāo)志位
-
- if(startflag)
- {
- if(irtime<63&&irtime>=33)//引導(dǎo)碼 TC9012的頭碼,9ms+4.5ms
- i=0;
- irdata[i]=irtime;//存儲(chǔ)每個(gè)電平的持續(xù)時(shí)間,用于以后判斷是0還是1
- irtime=0;
- i++;
- if(i==33)
- {
- irok=1;
- i=0;
- }
- }
- else
- {
- irtime=0;
- startflag=1;
- }
-
- }
- void TIM0init(void)//定時(shí)器0初始化
- {
-
- TMOD=0x02;//定時(shí)器0工作方式2,TH0是重裝值,TL0是初值
- TH0=0x00; //重載值
- TL0=0x00; //初始化值
- ET0=1; //開中斷
- TR0=1;
- }
- void EX0init(void)
- {
- IT0 = 1; //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
- EX0 = 1; //使能外部中斷
- EA = 1; //開總中斷
- }
-
- void Ir_work(void)//紅外鍵值散轉(zhuǎn)程序
- {
- switch(IRcord[2])//判斷第三個(gè)數(shù)碼值
- {
- case 0x0C:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints(" NOW: On");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("Number: ");
- LCD_set_position(0xC8); //LCD換行顯示
- LCD_printc('0');
- LCD_set_position(0x49); //LCD換行顯示
- LCD_printc(dofly_DuanMa[1]);
- break;//1 顯示相應(yīng)的按鍵值
- case 0x18:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints(" NOW: On");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("Number: ");
- LCD_set_position(0xC8); //LCD換行顯示
- LCD_printc('0');
- LCD_set_position(0xC9); //LCD換行顯示
- LCD_printc(dofly_DuanMa[2]);break;//2
- case 0x5E:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints(" NOW: On");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("Number: ");
- LCD_set_position(0xC8); //LCD換行顯示
- LCD_printc('0');
- LCD_set_position(0xC9); //LCD換行顯示
- LCD_printc(dofly_DuanMa[3]);break;//3
- case 0x08:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints(" NOW: On");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("Number: ");
- LCD_set_position(0xC8); //LCD換行顯示
- LCD_printc('0');
- LCD_set_position(0xC9); //LCD換行顯示
- LCD_printc(dofly_DuanMa[4]);break;//4
- case 0x1C:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints(" NOW: On");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("Number: ");
- LCD_set_position(0xC8); //LCD換行顯示
- LCD_printc('0');
- LCD_set_position(0xC9); //LCD換行顯示
- LCD_printc(dofly_DuanMa[5]);break;//5
- case 0x5A:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints(" NOW: On");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("Number: ");
- LCD_set_position(0xC8); //LCD換行顯示
- LCD_printc('0');
- LCD_set_position(0xC9); //LCD換行顯示
- LCD_printc(dofly_DuanMa[6]);break;//6
- case 0x42:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints(" NOW: On");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("Number: ");
- LCD_set_position(0xC8); //LCD換行顯示
- LCD_printc('0');
- LCD_set_position(0xC9); //LCD換行顯示
- LCD_printc(dofly_DuanMa[7]);break;//7
- case 0x52:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints(" NOW: On");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("Number: ");
- LCD_set_position(0xC8); //LCD換行顯示
- LCD_printc('0');
- LCD_set_position(0xC9); //LCD換行顯示
- LCD_printc(dofly_DuanMa[8]);break;//8
- case 0x4A:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints(" NOW: On");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("Number: ");
- LCD_set_position(0xC8); //LCD換行顯示
- LCD_printc('0');
- LCD_set_position(0xC9); //LCD換行顯示
- LCD_printc(dofly_DuanMa[9]);break;//9
- case 0x45:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints("WuLian");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("Class 152");
- break;//9
- case 0x46:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints("NAME: TangFang");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("ID:220153297 ");
- break;//9
- case 0x47:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints("NAME:CaiChaoyong");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("ID:220153273 ");
- break;//9
- case 0x44:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints("teacher: zzy");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("class:DanPianJi ");
- break;//9
- case 0x40:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints("key null");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("key null");
- break;//9
- case 0x43:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints("key null 1");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("key null 1");
- break;//9
- case 0x07:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints("key null -");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("key null -");
- break;//9
- case 0x15:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints("key null +");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("key null +");
- break;//9
- case 0x09:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints("key null EQ");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("key null EQ");
- break;//9
- case 0x16:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints(" NOW: On");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("Number: ");
- LCD_set_position(0xC8); //LCD換行顯示
- LCD_printc('0');
- LCD_set_position(0xC9); //LCD換行顯示
- LCD_printc(dofly_DuanMa[0]);break;//7
- case 0x19:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints("usb sd");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("usb sd");
- break;//9
- case 0x0d:
- LCD_write_instruction(0x01);
- LCD_set_position(0x00);
- LCD_prints("back!!!");
- LCD_set_position(0x40); //LCD換行顯示
- LCD_prints("back!!!");
- break;//9
- default:break;
- }
-
- irpro_ok=0;//處理完成標(biāo)志
-
- }
- void Ircordpro(void)//紅外碼值處理函數(shù)
- {
- unsigned char i, j, k;
- unsigned char cord,value;
-
- k=1;
- for(i=0;i<4;i++) //處理4個(gè)字節(jié)
- {
- for(j=1;j<=8;j++) //處理1個(gè)字節(jié)8位
- {
- cord=irdata[k];
- if(cord>7)//大于某值為1,這個(gè)和晶振有絕對(duì)關(guān)系,這里使用12M計(jì)算,此值可以有一定誤差
- value|=0x80;
- if(j<8)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
分工合作
唐*(220153297):1.仿真圖搭建
2.硬件材料選購
3.課設(shè)實(shí)驗(yàn)報(bào)告的撰寫,硬件資料的查找及整理,課程設(shè)計(jì)資料的查找分析與整理
4、對(duì)搭建出來,和搭檔寫好的代碼進(jìn)行通讀和理解,分析不足,共同改進(jìn)不足
蔡*(220153273):1.流程圖的先驅(qū)
2.實(shí)物圖連接,代碼編寫
3.實(shí)物圖調(diào)試分析
4.錄制講解整個(gè)課設(shè)制作的流程
0.png (50.8 KB, 下載次數(shù): 88)
下載附件
2018-6-11 05:12 上傳