帶有LCD顯示的音樂倒數計數器 單片機技術是一門不可或缺的技術,對我們將來的工作以及生活和學習都有很密切的聯系。近年來,隨著電子技術和微機計算機的迅速發展,單片機的檔次不斷提高,其應用領域也在不斷的擴大,已在工業控制、尖端科學、智能儀器儀表、日用家電、汽車電子系統、辦公自動化設備、個人信息終端及通信產品中得到了廣泛的應用,成為現代電子系統中最重要的智能化的核心部件。 單片機由CPU、一定容量的RAM和ROM構成,定時、計數和多種接口于一體的微控制器。它體積小,成本低,功能強,廣泛應用于智能產業和工業自動化上。而51系列單片機是各單片機中最為典型和最有代表性的一種。這次設計通過對它的學習、應用,從而達到學習、設計、開發軟、硬的能力。 本設計利用AT89C51單片機結合字符型LCD顯示器設計一個簡易的倒數計數器。用4個按鍵操作來設置當前想要倒計數的時間。做一小段時間倒計數,當倒計數為0時,則發出一段音樂聲響,通知倒計數終了,該做應當做的事。應用 Proteus的ISIS軟件和Keil uVision3來實現該計數器的設計與仿真。該方法仿真效果真實、準確,節省了硬件資源。 該多功能計數器可以應用于一般的生活和工作中,也可以通過改裝,提高性能,增加新功能,從而給人們的生活和工作帶來更多的方便。
目 錄 1 設計概述和要求 1.1 設計概述 1.2 設計要求 2 系統設計 2.1 框圖設計 2.2 元件清單 3軟件設計 3.1 程序流程圖 3.1.1 主程序流程圖 3.1.2 蜂鳴器發聲程序流程圖 3.2 蜂鳴器發聲電路原理 3.3 蜂鳴器發聲程序的關鍵代碼 4 PROTEUS仿真結果 4.1 總體電路仿真結果 4.2 假設倒計時為5秒時的仿真結果 5 總結 6 附表(本設計所有程序) ………………………………………….14 參考文獻
1 設計概述和要求本設計的任務是利用AT89C51單片機結合字符型LCD顯示器設計一個簡易的倒數計數器。做一小段時間倒計數,當倒計數為0時,則發出一段音樂聲響。 1.1 設計概述20世紀末,電子技術獲得了飛速的發展。在其推動下,現代電子產品幾乎滲透到了社會的各個領域,有力的推動和提高了社會生產力的發展與信息化程度。同時也使現代電子產品性能進一步提升,產品更新換代的節奏也越來越快。 隨著科技的發展和社會的進步,人們對數字鐘的要求越來越高,多功能數字鐘不管在性能還是在樣式上都發生了質的變化。數字鐘實際上是一個對標準頻率進行計數的計數電路,走時精度高,穩定性好,使用方便,不需要經常調校。單片計算機即單片微型計算機,是集CPU,RAM,ROM,定時/計數和多種接口于一體的微控制器。它體積小成本低,功能強,廣泛應用于智能產品和工業自動化上。由于數字集成電路的發展和石英晶體振蕩器的廣泛應用,使得數字鐘的精度遠遠超多老式鐘表,鐘表的數字化給人們生產生活帶來了極大地方便,而且大大的擴展了鐘表原先的報時功能,諸如定時自動報警、0按時自動打鈴、定時廣播、自動啟閉路燈、定時開關烘箱、通斷動力設備、甚至各種定時電氣的自動啟用等,所有這些,都是以數字化為基礎的,因此研究數字鐘及擴大其應用有著非常現實的意義。 本系統采用單片機作為數字鐘的核心控制器,讀取時鐘的值,并通過LCD液晶顯示器顯示出來,而且可以通過按鍵電路控制執行信號,給時鐘賦初值。還可以設置鬧鐘,當計數為0時,發出一陣音樂聲。并可拓展其功能顯示年月日。 1.2設計要求 利用AT89C51單片機結合字符型LCD顯示器設計一個簡易的倒數計數器,可用來煮方便面、煮開水或小睡片刻等。作品先接受用戶輸入的倒數計數時間,然后由用戶啟動作品工作(可用一個閃爍的LED燈指示),當倒計數為0時,則發出一段音樂聲響,通知倒計數終了,該做應當做的事。定時鬧鐘的基本功能如下。 - 字符型LCD(16 ? 2)顯示器。
- 顯示格式為“TIME 分分:秒秒”。
用4個按鍵操作來設置當前想要倒計數的時間。一旦按下鍵則開始倒計數,當計數為0時,發出一陣音樂聲 2 系統設計2.1 框圖設計本項目的系統設計框圖如圖2-1所示: 
圖2-1 系統框圖 由系統框圖可看出,本設計由單片機AT89C51、LCD液晶顯示器、控制鍵盤、蜂鳴器、復位單路和定時器電路幾大模塊構成。 2.2 元件清單主控單片機采用AT89C51芯片,時鐘模塊選用一12MHZ晶振,產生時鐘脈沖。顯示模塊采用LCD1602,設置部分選用鍵盤按鍵電路,發聲部分選用BUZZER蜂鳴器。還有一些電源、電阻、電容、接地等。 主要元件清單如圖2-2所示:   
圖2-2 主要元件清單
AT89C51: AT89C51是一種帶4K字節閃存可編程可擦除只讀存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS 8位微處理器,俗稱單片機。 主要特性:與MCS-51 兼容 、4K字節可編程閃爍存儲器 、壽命:1000寫/擦循環、數據保留時間:10年 、全靜態工作:0Hz-24MHz 、三級程序存儲器鎖定 、128×8位內部RAM 、32可編程I/O線 、兩個16位定時器/計數器 、5個中斷源 、可編程串行通道 、低功耗的閑置和掉電模式 、片內振蕩器和時鐘電路。
1602LCD: 1602液晶模塊內部的控制器共有11條控制指令,如表2-1所示. 表2-1 1602液晶模塊控制指令 序號 | 指令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 1 | 清顯示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 光標返回 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | * | 3 | 置輸入模式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | 4 | 顯示開/關控制 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B | 5 | 光標或字符移位 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | * | * | 6 | 置功能 | 0 | 0 | 0 | 0 | 1 | DL | N | F | * | * | 7 | 置字符發生存貯器地址 | 0 | 0 | 0 | 1 | 字符發生存貯器地址 | 8 | 置數據存貯器地址 | 0 | 0 | 1 | 顯示數據存貯器地址 | 9 | 讀忙標志或地址 | 0 | 1 | BF | 計數器地址 | 10 | 寫數到CGRAM或DDRAM) | 1 | 0 | 要寫的數據內容 | 11 | 從CGRAM或DDRAM讀數 | 1 | 1 | 讀出的數據內容 |
鍵盤: 鍵盤采用5個button,分別控制倒計時開始、調分個位、調分十位、調秒個位、調秒十位;另外還加一個總開關用于控制所有電路的通電情況。
蜂鳴器: 用三極管、電阻和speaker組成蜂鳴器電路。蜂鳴器最重要的特點是只要按照極性要求加上合適的直流電壓就可以發出固有頻率的聲音 3軟件設計3.1 程序流程圖3.1.1 主程序流程圖主程序開始初始化,然后掃描鍵盤、復位電路和計數器。當鍵盤按鍵有按下時,調整計數器值,LCD顯示新值。當復位鍵有按下時,計數器復位為初值,重新倒計數。當計數器值倒計為0時,蜂鳴器發出聲音,計數器停止倒計,程序結束。主程序流程圖如圖3-1所示: 
1
電子信息工程專業設計文檔 3軟件設計3.1 程序流程圖3.1.1 主程序流程圖主程序開始初始化,然后掃描鍵盤、復位電路和計數器。當鍵盤按鍵有按下時,調整計數器值,LCD顯示新值。當復位鍵有按下時,計數器復位為初值,重新倒計數。當計數器值倒計為0時,蜂鳴器發出聲音,計數器停止倒計,程序結束。主程序流程圖如圖3-1所示: 
圖3-1 主程序流程圖 3.1.2 蜂鳴器發聲程序流程圖 蜂鳴器發聲程序流程圖如圖3-2所示: 
圖3-2 蜂鳴器發聲程序流程圖 3.2 蜂鳴器發聲電路原理 對于單片機產生音樂,關鍵是控制頻率的輸出.我們知道,不同的聲音對應不同的頻率,產生有規律的頻率輸出就可以得到相應規律的聲音.有8個基本音符:do﹑re﹑mi﹑fa﹑so﹑la﹑xi﹑do,八個不同的音符對應著不同的頻率.只要我們對照音符輸出相對應的頻率,就可以產生美妙的音樂.本文中采用了T0中斷方式產生不同頻率, 并用按鍵控制音樂的播放和停止。用三極管、電阻和BUZZER組成蜂鳴器電路。蜂鳴器最重要的特點是只要按照極性要求加上合適的直流電壓就可以發出固有頻率的聲音。 3.3 蜂鳴器發聲程序的關鍵代碼下面是蜂鳴器報警的子程序清單: FLAG BIT 00H ORG 00H START: JB P3.1,START JNB FLAG,NEXT MOV R2,#200 DV: CPL P3.7 LCALL DELY500 LCALL DELY500 DJNZ R2,DV CPL FLAG NEXT: MOV R2,#200 DV1: CPL P3.7 LCALL DELY500 DJNZ R2,DV1 CPL FLAG SJMP START DELY500: MOV R7,#250 LOOP: NOP DJNZ R7,LOOP RET END
4 PROTEUS仿真結果4.1 總體電路仿真結果總體電路仿真結果如圖4-1所示: 
圖4-1 總體電路仿真結果
4.2 假設倒計時為5秒時的仿真如圖4-2所示
圖4-2 假設倒計時設為5秒時的仿真 4、3 時間設置的仿真 設置時間的仿真,例如設置為22分22秒如圖4-3 
5 總結通過此次多功能數字計數器的設計制作,我們將從書本上學到的知識應用于實踐,再次鞏固了我的單片機知識,提高了我的電路仿真設計能力。雖然設計過程中遇到了很多困難,但是在解決這些問題的過程無疑是對自身專業素質的提高。當最終調試成功的時候也是對自己的一種肯定。此次的設計不僅增強了自己在專業設計方面的信息,鼓舞了自己,更是一次興趣的培養,為以后的學習方向明確了重點。 另外在這次設計中我們遇到了不少的問題,針對不同的問題我們采取不同的解決方法,最終一一解決了。在我們遇到不懂得問題時,利用課本上、參考書上的知識,以及網上的資料最終解決問題。和隊友之間相互討論,明白了團隊合作的重要性。 本次項目設計還存在很多不足,比如,LCD的日期顯示還不夠完美,計數功能也不夠詳細等。以后爭取完善這個設計,以提高我們的單片機設計能力。 這里很感謝李曉艷老師給我們的指導和教育,感謝她給我們提供了良好的學習設計環境,也很感謝可愛的伙伴們,讓我覺得團隊的力量很偉大。 6 附表(本設計所有程序)
- #include <reg51.h>
- #include <intrins.h>
- sbit rs= P2^4;
- sbit rw = P2^5;
- sbit ep = P2^6;
- sbit k1=P1^4;
- sbit k2=P1^5;
- sbit k3=P1^6;
- sbit k4=P1^7;
- sbit k5=P1^3;
- sbit speaker=P3^0;
- unsigned char code dis1[] = {"The Last Time "};
- unsigned char code dis2[] = {"TIME 00:00"};
- unsigned char code dis3[] = {"0123456789"};
- unsigned int num=0;
- unsigned int miaogw=0;
- unsigned int miaosw=0;
- unsigned int fengw=0;
- unsigned int fensw=0;
- unsigned char flag=1;
- unsigned char timer0h,timer0l,time;
- //世上只有媽媽好數據表
- code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
- 6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
- 6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
- 5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
- 2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
- };
- // 音階頻率表 高八位
- code unsigned char FREQH[]={
- 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
- 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
- 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
- 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
- } ;
- // 音階頻率表 低八位
- code unsigned char FREQL[]={
- 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
- 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
- 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
- 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
- };
- void delayyy(unsigned char t)
- {
- unsigned char t1;
- unsigned long t2;
- for(t1=0;t1<t;t1++)
- {
- for(t2=0;t2<8000;t2++)
- {
- ;
- }
- }
- TR0=0;
- }
- void t0int() interrupt 1
- {
- TR0=0;
- speaker=!speaker;
- TH0=timer0h;
- TL0=timer0l;
- TR0=1;
- }
- void song()
- {
- TH0=timer0h;
- TL0=timer0l;
- TR0=1;
- delayyy(time);
- }
- void delay(unsigned char ms)
- {
- unsigned char i;
- while(ms--)
- {
- for(i = 0; i< 250; i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- bit lcd_bz()
- {
- bit result;
- rs = 0;
- rw = 1;
- ep = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- result = (bit)(P0 & 0x80);
- ep = 0;
- return result;
- }
- void lcd_wcmd(unsigned char cmd)
- {
- while(lcd_bz());//判斷LCD是否忙碌
- rs = 0;
- rw = 0;
- ep = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- _nop_();
- _nop_();
- ep = 1;
- _nop_();
- _nop_();
- ep = 0;
- }
- void lcd_pos(unsigned char pos)
- {
- lcd_wcmd(pos | 0x80);
- }
- void lcd_wdat(unsigned char dat)
- {
- while(lcd_bz());//判斷LCD是否忙碌
- rs = 1;
- rw = 0;
- ep = 0;
- P0 = dat;
- _nop_();
- _nop_();
- ep = 1;
- _nop_();
- _nop_();
- ep = 0;
- }
- void lcd_wshuzi(void)
- {
- lcd_pos(0x47);
- lcd_wdat(dis3[fensw]);
- lcd_pos(0x48);
- lcd_wdat(dis3[fengw]);
- lcd_pos(0x4A);
- lcd_wdat(dis3[miaosw]);
- lcd_pos(0x4B);
- lcd_wdat(dis3[miaogw]);
- }
- void lcd_init() //LCD初始化
- {
- lcd_wcmd(0x38);
- delay(1);
- lcd_wcmd(0x0c);
- delay(1);
- lcd_wcmd(0x06);
- delay(1);
- lcd_wcmd(0x01);
- delay(1);
- }
- void keyscan(void)
- {
- while(flag)
- {
- if(k1==0)
- {
- delay(10);
- if(k1==0)
- {
- fensw++;
- while(!k1);
- if(fensw==10)
- fensw=0;
- }
- }
- if(k2==0)
- {
- delay(10);
- if(k2==0)
- {
- fengw++;
- while(!k2);
- if(fengw==10)
- fengw=0;
- }
- }
- if(k3==0)
- {
- delay(10);
- if(k3==0)
- {
- miaosw++;
- while(!k3);
- if(miaosw==10)
- miaosw=0;
- }
- }
- if(k4==0)
- {
- delay(10);
- if(k4==0)
- {miaogw++;
- while(!k4);
- if(miaogw==10)
- miaogw=0;
- }
- }
- if(k5==0)
- flag=0;
- lcd_wshuzi();
- }
- }
- void delay1s(void)
- {
- unsigned char h,i,j,k;
- for(h=5;h>0;h--)
- for(i=4;i>0;i--)
- for(j=116;j>0;j--)
- for(k=214;k>0;k--);
- }
- void main(void)
- {
- unsigned char j; unsigned char k,i;
- speaker=0;
- lcd_init();// 初始化LCD
- delay(10);
- lcd_pos(0x02);//設置顯示位置
- j = 0;
- while(dis1[j] != '\0')
- {
- lcd_wdat(dis1[j]);//顯示字符
- j++;
- }
- while(1)
- {
- lcd_pos(0x42);// 設置顯示位置
- i = 0;
- while(dis2[i] != '\0')
- {
- lcd_wdat(dis2[i]);// 顯示字符
- i++; }
- keyscan();
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整的Word格式文檔51黑下載地址:
帶有LCD顯示的音樂倒數計數器課程設計.doc
(807 KB, 下載次數: 131)
2018-5-28 16:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|