基于ATMega16單片機(jī)鬧鐘設(shè)計(jì)_第1頁(yè)
基于ATMega16單片機(jī)鬧鐘設(shè)計(jì)_第2頁(yè)
基于ATMega16單片機(jī)鬧鐘設(shè)計(jì)_第3頁(yè)
基于ATMega16單片機(jī)鬧鐘設(shè)計(jì)_第4頁(yè)
基于ATMega16單片機(jī)鬧鐘設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上基于ATMega16單片機(jī)的鬧鐘設(shè)計(jì)班級(jí):1102班姓名:陳獻(xiàn)彬 學(xué)號(hào):同組:陸彥瀟郵箱:目錄摘要本文主要講述基于AVR單片機(jī)的數(shù)字電子鬧鐘,能夠顯示年月日時(shí)分秒,具備閏年平年補(bǔ)償及鬧鈴功能。時(shí)鐘信號(hào)源采用單片機(jī)內(nèi)部定時(shí)器中斷實(shí)現(xiàn),該系統(tǒng)原理簡(jiǎn)單,成本低廉,操作簡(jiǎn)單。控制核心為Atmel公司的AVR高性能單片機(jī),程序基于C語(yǔ)言開(kāi)發(fā),可讀性強(qiáng)。顯示核心為字符液晶LCD1602,顯示效果穩(wěn)定。輸入模塊為6個(gè)獨(dú)立式按鍵,可操作性強(qiáng),便于使用。關(guān)鍵詞: AVR單片機(jī)、LCD1602、數(shù)字電子鬧鐘This paper mainly described the digital e

2、lectronic based on AVR microcontroller able to display when the alarm clock, date of February alone, have a leap year provides compensation and alarm function. The clock signal source adopts singlechip internal timer interrupt achieve, this system theory is simple, low cost, simple operation. Atmel

3、company control core for the AVR high-performance single chip microcomputer based on C language, program development, readable. Show LCD1602 core to characters LCD display effect, stable. Input module for six independent type key, the maneuverability is strong, easy to use.Keywords: AVR microcontrol

4、ler, LCD1602, digital electronic alarm clock專(zhuān)心-專(zhuān)注-專(zhuān)業(yè)一 系統(tǒng)構(gòu)造 根據(jù)系統(tǒng)設(shè)計(jì)要求,本設(shè)計(jì)由電源模、用戶(hù)設(shè)置鍵盤(pán)、報(bào)警模塊、顯示模塊組成,形成實(shí)時(shí)時(shí)鐘系統(tǒng)??傮w的框圖如下:AVR單片機(jī)ATmega16L用戶(hù)輸入按鍵報(bào)警模塊顯示模塊(LCD1602)電源模塊方案論證一.1 單片機(jī)的的選擇:方案一:使用功能較為簡(jiǎn)單的89C51單片機(jī)作為控制器,其優(yōu)點(diǎn)是價(jià)格便宜。但是功能相對(duì)較為簡(jiǎn)單,燒錄比較復(fù)雜,不便于程序調(diào)試。方案二:使用功能齊全的ATMEGA16單片機(jī)作為控制器,內(nèi)部資源多,價(jià)格相對(duì)51稍貴,程序燒錄容易,便于系統(tǒng)調(diào)試。根據(jù)我們?cè)O(shè)計(jì)的實(shí)際要求

5、,我需要一個(gè)性能較高,穩(wěn)定性好的單片機(jī),我們選擇了ATMEGA16單片機(jī)實(shí)現(xiàn)設(shè)計(jì)。一.2 時(shí)鐘信號(hào)源; 方案一:采用單片機(jī)內(nèi)部定時(shí)器實(shí)現(xiàn)時(shí)鐘,不需要外接芯片,成本較低,但是時(shí)間精度不高,時(shí)間掉電會(huì)丟失,只適合一般場(chǎng)合使用;方案二:使用時(shí)鐘芯片DS1302作為時(shí)鐘源,該芯片斷電后需要通過(guò)外接電池或者電容供電,因此電路相對(duì)比較復(fù)雜,成本也較高。結(jié)合我們應(yīng)用的實(shí)際情況,我們一般要求時(shí)鐘精度不是很高,只用于一般使用,故選擇成本較低的方案一實(shí)現(xiàn)。一.3 顯示器方案一:使用數(shù)碼管掃描,顯示效果一般,只能顯示數(shù)字,顯示效果單一,不易于使用。方案二:使用LCD1602液晶顯示,可以顯示一些字符,顯示效果較好,

6、易于使用。綜上,我們考慮到用戶(hù)的使用方便,選擇用LCD1602作為顯示終端。一.4 報(bào)警方案一:通過(guò)使用語(yǔ)音芯片實(shí)現(xiàn)語(yǔ)音播報(bào)來(lái)實(shí)現(xiàn)報(bào)時(shí)和鬧鐘功能。但是接口比較麻煩,同時(shí)需要錄音和實(shí)現(xiàn)地址檢索。方案二:通過(guò)三極管控制蜂鳴器發(fā)出BEEP聲報(bào)警,電路簡(jiǎn)單,價(jià)格便宜。比較適合我們這個(gè)設(shè)計(jì)的應(yīng)用。二 硬件電路:二.1 按鍵輸入模塊 使用六個(gè)按鍵設(shè)計(jì),分別為鬧鐘/時(shí)鐘切換鍵,設(shè)置鍵,修改切換鍵,加,減,確認(rèn)。人性化設(shè)計(jì),將調(diào)節(jié)按鍵分開(kāi),使用加、減鍵分離,更加便于調(diào)試。二.2 控制器最小系統(tǒng):系統(tǒng)使用ATmega16L作為系統(tǒng)主控芯片,主要接受到按鍵設(shè)置信號(hào)。對(duì)報(bào)警蜂鳴器和顯示器做出相應(yīng)控制。單片機(jī)不斷的掃

7、描按鍵信息,通過(guò)LCD顯示時(shí)鐘和實(shí)現(xiàn)設(shè)置、鬧鐘的功能。二.3 顯示模塊:使用1602液晶的4線控制方法,減少端口使用,提高硬件資源的充分利用。偏置電壓使用RP1對(duì)電源分壓輸入,可以對(duì)液晶對(duì)比度進(jìn)行調(diào)節(jié)。4線控制需要對(duì)一個(gè)字節(jié)的數(shù)據(jù)分兩次寫(xiě)入液晶,所以在程序設(shè)計(jì)中每個(gè)字節(jié)需要使用2次傳輸完成。二.4 報(bào)警電路設(shè)置:使用PNP三極管驅(qū)動(dòng)蜂鳴器報(bào)警。當(dāng)單片機(jī)輸出為低電平時(shí),三級(jí)管導(dǎo)通,蜂鳴器發(fā)聲報(bào)警。這樣設(shè)計(jì)的原因在于,AVR單片機(jī)在上電時(shí)的電平輸出為高電平,這樣可以防止在單片機(jī)上電時(shí)發(fā)出蜂鳴聲。三 程序設(shè)計(jì)框圖:三.1 主流程圖:三.2 按鍵設(shè)置程序:四 液晶屏驅(qū)動(dòng):四.1 模塊說(shuō)明:1602引腳

8、說(shuō)明主要技術(shù)參數(shù):四.2 通信時(shí)序圖讀時(shí)序?qū)憰r(shí)序4線式數(shù)據(jù)傳送共分兩次實(shí)現(xiàn)一個(gè)字節(jié)數(shù)據(jù)的傳輸。時(shí)序參數(shù)四.3 字符顯示坐標(biāo)五 AVR定時(shí)器CTC模式介紹CTC( 比較匹配時(shí)清零定時(shí)器)模式 本設(shè)計(jì)的時(shí)間采用AVR單片機(jī)內(nèi)部定時(shí)器0的CTC模式實(shí)現(xiàn)。六 系統(tǒng)調(diào)試經(jīng)過(guò)分階段的調(diào)試,成功完成系統(tǒng)的調(diào)試。六.1 可以顯示時(shí)間六.2 調(diào)節(jié)時(shí)間六.3 系統(tǒng)整體運(yùn)行正常。 a. 開(kāi)機(jī)正常顯示初始化時(shí)間2013年9月10號(hào)星期2,00:00:00鬧鈴關(guān)。b. 通過(guò)按鍵可以設(shè)置時(shí)間和鬧鐘。c. 鬧鐘響起時(shí)按下除功能鍵、設(shè)置鍵外其他鍵,鬧鐘停止。d. 顯示信息正常。七 附錄七.1 電路總圖七.2 全部程序#inc

9、lude <iom16v.h>#define bee PORTB.0#include <alcd.h>#include<delay.h>int s,year;int sec,min,hour,date,month,xuanze,flog,flog1,week;int sec0,min0,hour0,bee_0,bee_turn;unsigned char key,moshi;unsigned char key_scan();unsigned const date_run12=31,28,31,30,31,30,31,31,30,31,30,31; /閏年月份

10、unsigned const date_pin12=31,29,31,30,31,30,31,31,30,31,30,31; /平年月份unsigned char leapyear(int year1);unsigned char bee_clock();interrupt TIM0_COMP void timer0_comp_isr(void) unsigned char temp,temp1,tt; s+; if(s=1000) s=0; sec+; tt=bee_clock(); if(bee_turn) if(tt=1) bee=0; bee_0=1; if(bee_0>0) b

11、ee_0+; if(bee_0=20) bee=1; bee_0=0; if(sec=60) sec=0; min+; if(min=60) min=0; hour+; if(hour=24) hour=0; temp=leapyear(year); if(temp=0) temp1=date_pinmonth+1; if(temp=1) temp1=date_runmonth+1; date+; week+; if(week=8) week=1; if(date=temp1) date=0; month+; if(month=13) month=0; year+; if(year=2099)

12、 year=1899; unsigned char leapyear(int year1) /判斷某年是否閏年 閏年返回1,平年返回0 if (year1%400=0) | (year1%100!=0) && (year1%4=0)return 1; else return 0; void guangbaioshanshuo() /光標(biāo)閃爍函數(shù) switch(xuanze) case 0: lcd_gotoxy(14,1);_lcd_write_data(0x0d); break; case 1: lcd_gotoxy(9,1);_lcd_write_data(0x0d); b

13、reak; case 2: lcd_gotoxy(6,1);_lcd_write_data(0x0d); break; case 3: lcd_gotoxy(3,1);_lcd_write_data(0x0d); break; case 4: lcd_gotoxy(14,0);_lcd_write_data(0x0d); break; case 5: lcd_gotoxy(10,0);_lcd_write_data(0x0d); break; case 6: lcd_gotoxy(7,0);_lcd_write_data(0x0d); break; case 7: lcd_gotoxy(4,0

14、);_lcd_write_data(0x0d); break; void display_0() char i; unsigned char dis2; lcd_gotoxy(4,0); lcd_putsf("Alarm"); /顯示時(shí) dis0=hour0/10; dis1=hour0%10; lcd_gotoxy(2,1); for(i=0;i<2;i+) lcd_putchar(disi+'0'); lcd_putchar(':'); /顯示分 dis0=min0/10; dis1=min0%10; lcd_gotoxy(5,1)

15、; for(i=0;i<2;i+) lcd_putchar(disi+'0'); lcd_putchar(':'); /顯示秒 dis0=sec0/10; dis1=sec0%10; lcd_gotoxy(8,1); for(i=0;i<2;i+) lcd_putchar(disi+'0'); lcd_gotoxy(12,1); switch(bee_turn) case 0:lcd_putsf("off"); break; case 1:lcd_putsf("on"); break; void

16、 display() char i; unsigned char dis4; /顯示年 dis0=year/1000; dis1=year%1000/100; dis2=year%1000%100/10; dis3=year%1000%100%10; lcd_gotoxy(1,0); for(i=0;i<4;i+) lcd_putchar(disi+'0'); lcd_putchar('-'); /顯示月份 dis0=month/10; dis1=month%10; lcd_gotoxy(6,0); for(i=0;i<2;i+) lcd_putch

17、ar(disi+'0'); lcd_putchar('-'); /顯示日期 dis0=date/10; dis1=date%10; lcd_gotoxy(9,0); for(i=0;i<2;i+) lcd_putchar(disi+'0'); lcd_gotoxy(12,0); switch(week) case 1:lcd_putsf("Mon"); break; case 2:lcd_putsf("Tues"); break; case 3:lcd_putsf("Wed");

18、break; case 4:lcd_putsf("Thur"); break; case 5:lcd_putsf("Fri"); break; case 6:lcd_putsf("Sat"); break; case 7:lcd_putsf("Sun"); break; /顯示時(shí) dis0=hour/10; dis1=hour%10; lcd_gotoxy(2,1); for(i=0;i<2;i+) lcd_putchar(disi+'0'); lcd_putchar(':')

19、; /顯示分 dis0=min/10; dis1=min%10; lcd_gotoxy(5,1); for(i=0;i<2;i+) lcd_putchar(disi+'0'); lcd_putchar(':'); /顯示秒 dis0=sec/10; dis1=sec%10; lcd_gotoxy(8,1); for(i=0;i<2;i+) lcd_putchar(disi+'0'); lcd_gotoxy(12,1); switch(bee_turn) case 0:lcd_putsf("off"); break;

20、 case 1:lcd_putsf("on"); break; void adjust(unsigned char i,unsigned char j)/切換修改 i為選擇位 j為加或減判斷 int temp1; /臨時(shí)變量用于計(jì)算日期的上限 switch(i) case 1: /調(diào)秒 if(j=0) sec+; if(sec>=60) sec=0; else else sec-; if(sec<=0) sec=59; break; case 2: if(j=0) min+; if(min>=60) min=0; else else min-; if(mi

21、n<0) min=59; break; case 3: if(j=0) hour+; if(hour>=24) hour=0; else else hour-; if(hour<0) hour=23; break; case 4: if(j=0) week+; if(week>7) week=1; else else week-; if(week<1) week=7; break; case 5: if(j=0) date+; temp1=leapyear(year); if(temp1=0) if(date>date_pinmonth+1) date=0;

22、 else else if(date>date_runmonth+1) date=0; else else date-; if(date<=0) temp1=leapyear(year); if(temp1=0) date=date_pinmonth+1; else date=date_runmonth+1; break; case 6: if(j=0) month+; if(month>=12) month=1; else else month-; if(month<1) month=12; break; case 7: if(j=0) year+; if(year&

23、gt;=2099) year=1899; else else year-; if(year<1899) year=2099; break; lcd_clear(); display();void adjust_0(unsigned char i,unsigned char j)/切換修改 i為選擇位 j為加或減判斷 switch(i) case 0: if(bee_turn) bee_turn=0; else bee_turn=1; break; case 1: /調(diào)秒 if(j=0) sec0+; if(sec0>=60) sec0=0; else else sec0-; if(

24、sec0<=0) sec0=59; break; case 2: if(j=0) min0+; if(min0>=60) min0=0; else else min0-; if(min0<0) min0=59; break; case 3: if(j=0) hour0+; if(hour0>=24) hour0=0; else else hour0-; if(hour0<0) hour0=23; break; lcd_clear(); display_0();void clock() display(); key=key_scan(); switch(key) c

25、ase 1: /時(shí)鐘 鬧鈴 moshi=1; flog=0; break; case 2: /設(shè)置 flog1=1; xuanze=1; guangbaioshanshuo(); TIMSK=0x00; while(flog1) key=key_scan(); switch(key) case 3: /切換 xuanze+; if(xuanze=8) xuanze=1; guangbaioshanshuo(); break; case 4: /加 adjust(xuanze,0); guangbaioshanshuo(); break; case 5: /減 adjust(xuanze,1);

26、 guangbaioshanshuo(); break; case 6: /確認(rèn) flog1=0; TIMSK=0x02; _lcd_write_data(0x0c); break; break; case 3: case 4: case 5: case 6: if(bee_0!=0) bee=1; bee_0=0; break; void alarm_clock() display_0(); key=key_scan(); switch(key) case 1: /時(shí)鐘 鬧鈴 moshi=0; flog=0; break; case 2: /設(shè)置 flog1=1; xuanze=0; guangbaioshanshuo(); while(flog1) key=key_scan(); switch(key) case 3: /切換 xuanze+; if(xuanze=4) xuanze=0; guangbaioshanshuo(); break; case 4: /加 adjust_0(xuanze,0); guangbaioshanshuo(); break; case 5: /減 adjust_0(xuanze,1); guangbaioshanshuo(); break; case 6: /確認(rèn) f

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論