單片機(jī)測(cè)試程序_第1頁(yè)
單片機(jī)測(cè)試程序_第2頁(yè)
單片機(jī)測(cè)試程序_第3頁(yè)
單片機(jī)測(cè)試程序_第4頁(yè)
單片機(jī)測(cè)試程序_第5頁(yè)
已閱讀5頁(yè),還剩20頁(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、本單片機(jī)最小系統(tǒng)是以 AT89S51單片機(jī)為控制核心,由驅(qū)動(dòng)芯片 ZLG7289與16鍵 的鍵盤(pán)矩陣實(shí)現(xiàn)對(duì)兩個(gè)4位一體共陰數(shù)碼管LED的驅(qū)動(dòng)顯示,由LCD1602實(shí)現(xiàn)液晶顯示, 再通過(guò)電平轉(zhuǎn)換芯片MAX232并連接到232接口實(shí)現(xiàn)串口通信,系統(tǒng)還包含有蜂鳴器,USB 及適配器供電接口,JTAG程序下載接口,總線擴(kuò)展等。首先,用protel99se軟件制作硬 件電路原理圖及繪制PCB板;其次,安裝焊接單片機(jī)最小系統(tǒng)開(kāi)發(fā)板及下載線,并且進(jìn) 行電路調(diào)試;再次,在 Keil uVisi on2 軟件環(huán)境下調(diào)試單片機(jī)匯編程序或 C語(yǔ)言程序, 用單片機(jī)下載軟件ISPLAY或 STC-ISP V31實(shí)現(xiàn)程序

2、下載,從而用編程實(shí)現(xiàn)最小系統(tǒng)的基 本功能;最后,編寫(xiě)綜合程序以實(shí)現(xiàn)系統(tǒng)功能的綜合以及拓展功能,其中串口通信用到 電腦自帶的超級(jí)終端或 AccessPort 軟件。單片機(jī)最小系統(tǒng)板焊接首先對(duì)照元件清單和電路圖,檢查器件是否完整,型號(hào)、規(guī)格、安裝是否正確。然 后將各器件根據(jù)焊接規(guī)則焊接到電路板上, 其中對(duì)于器件的擺放方向和位置需十分注意。 先焊發(fā)熱器件電阻和較低的電容, 再焊較大的器件,焊接JTAG線,JTAG線里面的芯片電 阻,電阻電容均為貼片封裝,焊接時(shí)需小心謹(jǐn)慎,對(duì)于各條線引的焊接也需謹(jǐn)慎,按照 其對(duì)應(yīng)的順序進(jìn)行焊接,焊接結(jié)束后,自行組裝。檢查已經(jīng)焊好的電路板和JTAG下載線是否無(wú)誤:先用萬(wàn)

3、用表檢查電路板焊接是否 都正確。當(dāng)檢查沒(méi)有短路,斷路,虛焊,漏焊等錯(cuò)誤后,給電路板供電,看二極管是 否亮,是否有器件過(guò)熱,有可能二極管或三極管會(huì)在焊接的過(guò)程中被燒壞,那樣的話就 要重新焊器件。 再用 Keil 軟件給板子拷正確的程序,檢查是否能按功能正常工作。單 片機(jī)系統(tǒng)的硬件調(diào)試和軟件調(diào)試是不能分開(kāi)的,許多硬件錯(cuò)誤是在軟件調(diào)試中被發(fā)現(xiàn)和 糾正的。軟件設(shè)計(jì)在 Keil 軟件環(huán)境下對(duì)照相關(guān)資料編寫(xiě)單片機(jī)最小系統(tǒng)開(kāi)發(fā)板的有用程序, 使設(shè)計(jì)好 的程序編譯無(wú)誤,得到 hex 格式文件,用程序下載軟件加載到單片機(jī)芯片中,實(shí)現(xiàn)仿真 電路,在板上得出效果。設(shè)計(jì)工具:電腦, Keil 軟件, Isplay 軟

4、件, STC-ISP V31 軟件 蜂鳴器調(diào)試主要是檢驗(yàn)程序能否下載到芯片,蜂鳴器能正常工作,掌握程序的編譯下載到芯片 的方法。在Keil環(huán)境中用C語(yǔ)言編寫(xiě)簡(jiǎn)單是蜂鳴器程序或音樂(lè)播放程序。對(duì)Keil軟件和程序下載軟件進(jìn)行相關(guān)配置設(shè)置。 將編譯產(chǎn)生的 hex 文件下載到芯片,檢測(cè)其工作是否正常,若工作不正常,則從軟件 及硬件兩方面進(jìn)行檢查。 有用的報(bào)警聲程序見(jiàn)附錄 4串口通信調(diào)試實(shí)現(xiàn)計(jì)算機(jī)與單片機(jī)之間相互通訊功能將編寫(xiě)的串口調(diào)試程序經(jīng)過(guò)編譯,下載到單片機(jī)。串口實(shí)現(xiàn)功能為在計(jì)算機(jī)上能顯示單片機(jī)的輸出。檢測(cè)串口是否能正常工作,此階段 需用到串口軟件及串口線。若不能正常工作,則需從軟件和硬件兩方面進(jìn)行

5、檢查。正確功能為在電腦超級(jí)終端不停顯示輸出內(nèi)容,與預(yù)期相同,工作正常。液晶顯示調(diào)試保證液晶屏LCD能正常工作,輸出效果有所擴(kuò)展。在編寫(xiě)程序前,認(rèn)真閱讀LCD液晶屏資料,掌握LCD1602及 1602液晶模塊數(shù)據(jù)手冊(cè)(中文)中的液晶的使用和編程方法,了解其工作時(shí)序,及各個(gè)指令及初始化。對(duì)照電路圖中LCD連接情況,編寫(xiě)LCD1602移動(dòng)顯示程序,經(jīng)編譯下載至單片機(jī),檢 測(cè)輸出,若無(wú)輸出,則調(diào)整電位器,若仍無(wú)輸出則從軟件及硬件兩方面進(jìn)行檢查,找 出錯(cuò)誤原因,直至液晶屏能正常工作。在程序編寫(xiě)時(shí)應(yīng)時(shí)刻注意各個(gè)指令間的延時(shí)控制。以保證液晶屏呈現(xiàn)效果移動(dòng)循環(huán)顯 示,液晶屏工作正常。之后也可用 LCD做數(shù)字鐘

6、,這將在綜合程序里被用到,液晶移 屏顯示程序見(jiàn)附錄 6數(shù)碼管及鍵盤(pán)控制調(diào)試 保證數(shù)碼管能正常顯示,以及按鍵能控制數(shù)碼管的顯示 .在編寫(xiě)程序前,應(yīng)認(rèn)真閱讀LED和 ZLG7289A資料,了解和掌握其工作時(shí)序,及各個(gè)指 令及初始化,在程序編寫(xiě)時(shí)應(yīng)時(shí)刻注意各個(gè)指令間的延時(shí)控制。對(duì)照電路圖中ZLG7289模塊的連接情況,編寫(xiě)程序,經(jīng)過(guò)編譯,然后下載到單片機(jī), 檢測(cè)展現(xiàn)效果,是否與程序預(yù)期相同。實(shí)現(xiàn)效果逐個(gè)閃爍,逐個(gè)消隱,鍵盤(pán)控制改變數(shù)據(jù)并移動(dòng),與預(yù)期相同,工作狀態(tài)正 常。、再利用單片機(jī)內(nèi)部時(shí)鐘中斷,編寫(xiě)數(shù)碼管時(shí)鐘程序,使數(shù)碼管能夠?qū)崿F(xiàn)計(jì)時(shí)功能, 鍵盤(pán)能夠控制時(shí)分秒。系統(tǒng)綜合功能設(shè)計(jì) 綜合單片機(jī)開(kāi)發(fā)板上

7、的各個(gè)功能模塊,以實(shí)現(xiàn)一個(gè)完整的系統(tǒng)功能 :根據(jù)前面對(duì)各模塊功能的理解和程序編寫(xiě),結(jié)合各個(gè)模塊實(shí)現(xiàn)一個(gè)整體系統(tǒng),把各模 塊功能綜合起來(lái)。設(shè)計(jì)一綜合系統(tǒng),使數(shù)碼管實(shí)現(xiàn)數(shù)字鐘且可右移、閃爍,液晶屏實(shí)現(xiàn)時(shí)間、日期的顯 示且可移屏, 鍵盤(pán)能夠控制系統(tǒng), 蜂鳴器與鍵盤(pán)且可整點(diǎn)報(bào)時(shí), 可實(shí)現(xiàn)串口通信功能 鳴器調(diào)試程序 本程序根據(jù)蜂鳴器與單片機(jī)口相連設(shè)計(jì),可以驗(yàn)證單片機(jī)及下載功能的正確 .#include <>#include <>sbit buz = P3A3;unsigned char flag;void delayms(unsigned char ms)/* 延時(shí)子程序 */u

8、nsigned char i;while(ms-)for(i = 0; i < 120; i+);/* 主程序 */main()TMOD = 0x01;flag = 0x00;TH0 = 0x00;TL0 = 0xff;TR0 = 1;IE = 0x82;while(1)flag+;delayms(1);/* 中斷控制 */void timer0() interrupt 1 using 1TH0 = 0xfe;TL0 = frq;buz= buz;串口通信調(diào)試程序(單片機(jī)到PC機(jī)) 此為串口通信程序,可在電腦上的超級(jí)終端顯示相關(guān)語(yǔ)句,實(shí)現(xiàn)單片機(jī)與電腦的相 互通信。遇到的問(wèn)題:在進(jìn)行單片機(jī)

9、傳信息到電腦終端時(shí),可是利用宏文件,直接調(diào)用 printf. 但是在實(shí)際的運(yùn)用中占用大量的空間資源,而且容易出現(xiàn)錯(cuò)誤,讓程序的工作不 正常,因此我們改用字節(jié)的傳送,利用串口一個(gè)字節(jié)一個(gè)字節(jié)的傳送,這樣就大大增加 了程序的可讀性。#include <> /* special function register declarations */* for the intended 8051 derivative*/#include <> /* prototype declarations for I/O functions*/#ifdef MONITOR51 /* Debug

10、ging with Monitor-51 needs*/char code reserve 3 _at_ 0x23; /* space for serial interrupt if */#endif /* Stop Exection with Serial Intr. is enabled*/*The main C function. Program execution startshere after stack initialization.*/void main (void) /*Setup the serial port for 1200 baud at 12MHz.*/#ifnde

11、f MONITOR51SCON = 0x50;/* SCON: mode 1, 8-bit UART, enable rcvr */TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */TH1 = 0xe6; /* TH1: reload value for 1200 baud 12MHz */TR1 = 1; /* TR1: timer 1 run*/TI = 1; /* TI: set TI to send first char of UART*/#endif/*Note that an embedded program never

12、exits (becausethere is no operating system to return to). Itmust loop and execute forever.*/while (1) printf (" liu jing longn"); /* Print " liu jing long " */ 串口通信調(diào)試程序 (PC 機(jī)到單片機(jī) )#include<>#include<>#include<>#define uchar unsigned char#define uint unsigned int

13、 Uchar data ReceiveBuffer16=0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20;/ 設(shè)置 16 字節(jié)的串行通信接收緩沖區(qū)uchar data BufferPointer=0;/ 串行通信接收緩沖區(qū)指針,初始為 0 bit data OnReceive=0;/ 串行通信接收事件標(biāo)志位 void Send(uchar data dat);/* 以下為串行通信接收中斷處理函數(shù) */void serialport(void) interrupt 4 using 2u

14、char data c,i;if(RI)c=SBUF;/ 讀取接收到的數(shù)據(jù) if(BufferPointer<16) ReceiveBufferBufferPointer=c;/ 將接收到的數(shù)據(jù)存入接收緩沖區(qū) BufferPointer+; else for(i=0;i<15;i+) ReceiveBufferi=ReceiveBufferi+1;/ 將緩沖區(qū)數(shù)據(jù)左移ReceiveBuffer15=c;/ 將接收到的數(shù)據(jù)存入接收緩沖區(qū)RI=0;/ 清空接收標(biāo)志Send(c);/ 發(fā)送接收到的數(shù)據(jù),以便回顯 OnReceive=1;/ 接收事標(biāo)志位置 1/* 以下為串口初始化函數(shù) *

15、/void Initserialport(void)TMOD=0x20;SCON=0x50;TH1 = 0xe6; /* TH1: reload value for 1200 baud 16MHz */ES=1; / 允許串口中斷EA=1;1 runTR1 = 1; /* TR1: timer */void Send(uchar data dat)SBUF=dat;while(TI=0);TI=0;void main(void) / 主函數(shù)uchar data i;LcdReset();/ 初始化 LCDInitserialport();/ 初始化串口DisplayListChar(0,0,&

16、quot;Receive Data:",13); while(1) if(OnReceive) for(i=0;i<16;i+) / 接收顯示 DispOneChar(i,1,ReceiveBufferi); OnReceive=0; 液晶移屏顯示程序?qū)崿F(xiàn)LCD1602勺基本顯示功能,以及使其能夠?qū)崿F(xiàn)移屏功能。#include <>#define uchar unsigned char#define uint unsigned int uchar code dispcode1="happy new year!" uchar code dispco

17、de2="thanks everyday!"sbit RS=P2A0;sbit RW=P2A1;sbit E=P2A2; void delay(uint t)uint k,l;for(k=t;k>0;k-) for(l=0;l<=10;l+);void wcom()RS=0;RW=0;E=0;delay(1000);E=1;void wdata()RS=1;RW=0;E=0;delay(1000);E=1;void init() / 初始化子程序/ for(i=0;i<20;i+)P0=0x38;wcom();P0=0x0c;wcom();P0=0x06;

18、wcom();P0=0x01;wcom();/ uint i;/指令碼設(shè)置16X 2顯示,8位數(shù)據(jù)接口/ 開(kāi)顯示,不顯示光標(biāo),不閃爍光標(biāo)/ 讀或?qū)懸粋€(gè)字符后地址累加器加一,光標(biāo)加一/ 清屏void main()/ 主函數(shù)顯示uchar i;init();P0=0x80;wcom();for(i=0;i<=15;i+)P0=dispcode1i;wdata();P0=0xC0;wcom();for(i=0;i<=15;i+)P0=dispcode2i; wdata(); for(i=0;i<=40;i+)P0=0x1c; wcom(); delay(100);ZLG7289空制

19、鍵盤(pán)及數(shù)碼管顯示程序本程序根據(jù)ZLG7289芯片資料,來(lái)實(shí)現(xiàn)其對(duì)數(shù)碼管和鍵盤(pán)的控制。首先在數(shù)碼管上 顯示0-7八位數(shù),然后循環(huán)左右各移八次,再分別左移右移各兩次,而后實(shí)現(xiàn)閃爍、消 隱功能,再是按鍵時(shí)可以在數(shù)碼管顯示按鍵值,如沒(méi)有按鍵則顯示時(shí)鐘,而且可用鍵盤(pán) 對(duì)時(shí)鐘的時(shí)分秒進(jìn)行校對(duì)。#include <>#include <>#include <>#define uchar unsigned char#define uint unsigned int/* 端口定義 */sbit CS=P1A0;sbit CLK=PM1;sbit DIO=P1A2;sbit K

20、EY=P3A2;/需要在INT區(qū)把KEY用跳線冒跳到INTO,其余四個(gè)跳到VCC/這樣,P3A2就相當(dāng)于直接連接到keybdata uchar com_data;/ 定義 8 位數(shù)據(jù) datasbit mos_bit=com_dataA7;sbit low_bit=com_dataA0;/* 變量定義 */uchar half_hign;uchar half_low;uchar sl,sh,ml,mh,hh,hl;uchar second=0;uchar minute=0;uchar hour=12;uint s_cnt,key;/* 延時(shí)子程序 */void delay_8us()uchar

21、 i;for (i=0; i<1; i+);void delay_50us()uchar i;for (i=0; i<6; i+);void delay_50ms()uchar i,j;for(j=0;j<50;j+)for(i=0;i<125;i+); void delay_1s()uchar i = 20;while(i-) delay_50ms(); void delay_2s()uchar i = 40;while(i-) delay_50ms();void delay_5s()uchar i = 100;while(i-) delay_50ms();/* 發(fā)送

22、單字節(jié)指令 */ void send(uchar sebuf)uchar i; com_data=sebuf;CLK=0;CS=0; delay_50us(); for(i=0;i<8;i+) delay_8us(); DIO=mos_bit;CLK=1; delay_8us(); com_data=com_data<<1;CLK=0;DIO=0;/* 接收數(shù)據(jù) */uchar receive(void)uchar i,rebuf;CLK=1;delay_50us();for(i=0;i<8;i+) com_data=com_data<<1; low_bit

23、=DIO; CLK=1; delay_8us(); CLK=0; delay_8us();rebuf=com_data;DIO =1;CS=1;return rebuf;/* 復(fù)位 */void reset(void)DIO=1;delay_50ms();send(0xa4);CS=1;/*7289 數(shù)碼管顯示, addr 為顯示位置 范圍 07, dat 為現(xiàn)實(shí)內(nèi)容 */ void display(uchar addr,uchar dat)if(addr<0 | addr >7) return;send(0xc8 + addr);delay_50us();send(dat);CS

24、=1;/*功能:執(zhí)行ZLG7289屯指令參數(shù):cmd命令字*/void ZLG(uchar t)CS = 0; delay_50us(); send(t);CS = 1;delay_50us();/* 發(fā)送雙字節(jié)命令 */void sendcommand(uchar addr,uchar dat)send(addr);delay_50us(); send(dat); CS=1;/* 獲取鍵盤(pán)的位置碼 */ uchar getkeycode(uchar dat) uchar key; switch(dat) case 0x00: key = 0x00;break; case 0x01: key

25、= 0x01;break; case 0x02: key = 0x02;break; case 0x03: key = 0x03;break; case 0x04: key = 0x04;break; case 0x05: key = 0x05;break; case 0x06: key = 0x06;break; case 0x07: key = 0x07;break; case 0x08: key = 0x08;break; case 0x09: key = 0x09;break; case 0x0a: key = 0x10;break; case 0x0b: key = 0x11;bre

26、ak; case 0x0c: key = 0x12;break; case 0x0d: key = 0x13;break; case 0x0e: key = 0x14;break; case 0x0f: key = 0x15;break; default: key = 0xee;break; return key; /*7289 按鍵指令 */ ZLG7289_Key()uchar key,dat; send(0x15); delay_50us(); dat = receive(); delay_50us(); key = getkeycode(dat);/* 按鍵設(shè)定時(shí)分加一 */ void

27、 Set_time(void) / 設(shè)定時(shí)間 if(key=0x00) / 按鍵 0, 控制時(shí)delay_50ms();if(key=0x00)hour+;if(hour=24)hour=0;hl=hour%10;hh=hour/10;if(key=0x01) / 按鍵 1, 控制分delay_50ms();if(key=0x01)minute+;if(minute=60) minute=0;ml=minute%10;mh=minute/10;if(key=0x02) / 按鍵 2, 控制秒delay_50ms();if(key=0x02)second+;if(second=60)second

28、=0;sl=second%10; sh=second/10;hh=hour/10; hl=hour%10; mh=minute/10;ml=minute%10; sh=second/10;sl=second%10;/* 定時(shí)器中斷初始化 */void Init(void) / 初始化子程序IP=0x02;EX0=1;TMOD=0x02; /TH0=0x06;TL0=0x06;EA=1;ET0=1;TR0=1;/* 中斷控制 */ void service_int0() interrupt 0 EX0=0;TR0=0;key= ZLG7289_Key();Set_time();delay_1s(

29、);EX0=1;TR0=1;/* 中斷控制 */void time0() interrupt 1s_cnt+;if(s_cnt=400)/1ss_cnt=0; second+; if(second=60)second=0;minute+; if(minute=60) minute=0; hour+; if(hour=24)hour=0;/* 時(shí)鐘顯示 */void Disp_time(void)do hh=hour/10;hl=hour%10;mh=minute/10;ml=minute%10; sh=second/10;sl=second%10;sendcommand(0x81,0x0a);

30、 / 顯示“” sendcommand(0x86,0x0a);display(3,sl);delay_50ms();display(2,sh);delay_50ms();display(0,ml);delay_50ms(); display(7,mh);delay_50ms();display(5,hl);delay_50ms(); display(4,hh);delay_50ms(); while(1);/* 主函數(shù) */main() uchar half_high;uchar half_low;uchar dat,key,n;reset();send(0xbf); /* 測(cè)試指令 */CS

31、=1;delay_5s();sendcommand(0x88,0xff); /* 禁止閃爍 */ /* 顯示 01234567*/ display(0,0x04); display(1,0x05); display(2,0x06); display(3,0x07); display(4,0x00); display(5,0x01); display(6,0x02); display(7,0x03);delay_5s();delay_2s();/* 循環(huán)左移 */for ( n=0; n<=7; n+ )ZLG(0xA3); delay_2s();delay_2s();/* 循環(huán)右移 */

32、for ( n=0; n<=7; n+ )ZLG(0xA2);delay_2s();/* 左移 2 位*/for ( n=0; n<=1; n+ )ZLG(0xA1);delay_5s();/* 右移 2 位*/for ( n=0; n<=1; n+ )ZLG(0xA0);delay_5s();/* 閃爍控制 */dat = 0xFE;for ( n=0; n<8; n+ ) / 逐位閃爍sendcommand(0x88,dat);dat <<= 1; dat+; / 數(shù)據(jù) OxFE循環(huán)左移 delay_2s();sendcommand(Ox88,OxOO)

33、;/ 八位同時(shí)閃爍delay_5s();delay_5s();sendcommand(Ox88,OxFF); / 停止閃爍 delay_5s();/* 消隱控制 */dat = OxFE;for ( n=O; n<8; n+ )sendcommand(Ox98,dat);dat <<= 1; dat+; / 數(shù)據(jù) OxFE循環(huán)左移 delay_2s();sendcommand(Ox98,OxFF);/ 停止消隱delay_5s();/* 復(fù)位 */reset();delay_5s();reset();display(0,0);display(1,0);display(2,0)

34、;display(3,0);display(4,0);display(5,0);display(6,0);display(7,0);delay_5s();delay_5s();while(1)while(KEY); /* 判斷是否有按鍵按下 */ send(0x15); / 讀鍵盤(pán)數(shù)據(jù)指令 delay_50us();dat = receive();delay_50us();key = getkeycode(dat);half_high = key >> 4; half_low = key & 0x0f;/* 顯示鍵盤(pán)的位置碼 */ display(0,half_high);

35、 display(1,half_low);display(2,half_high);display(3,half_low); display(4,half_high);display(5,half_low);display(6,half_high); display(7,half_low);delay_2s(); while(!KEY); / 當(dāng)沒(méi)有鍵按下后顯示時(shí)鐘 delay_50us();reset();delay_50us();Init();delay_50ms();Disp_time(); 系統(tǒng)綜合設(shè)計(jì)程序?qū)CD led蜂鳴器,串口通信的綜合程序。實(shí)現(xiàn)了單片機(jī)的總體功能。使數(shù)碼管和

36、液晶第一行顯示年月日,并且可是實(shí)現(xiàn)整點(diǎn)報(bào)和鬧鐘時(shí)間到的刷屏顯示,第二行顯示由 單片機(jī)控制的鬧鐘設(shè)定,并且可是顯示接收到的由電腦發(fā)送的數(shù)據(jù)。按鍵分別能對(duì)年月 日,時(shí)分秒進(jìn)行調(diào)整,開(kāi)啟串口通信,轉(zhuǎn)換顯示等功能;蜂鳴器在每次按鍵時(shí)都有提示, 而且能夠?qū)崿F(xiàn)整點(diǎn)報(bào)時(shí)功能;串口通信使電腦超級(jí)終端。#include <>#include <>#include <>#include <>#include <>#include <>Uchar data ReceiveBuffer16=0x20,0x20,0x20,0x20,0x20,0x2

37、0,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20;/ 設(shè)置 16字節(jié)的串行通信接收緩沖區(qū) uchar data BufferPointer=0;/ 串行通信接收緩沖區(qū)指針,初始為 0 bit data OnReceive=0; / 串行通信接收事件標(biāo)志位#define uint unsigned int#define uchar unsigned charsbit buz=P3A3;/ 蜂鳴器口定義uchar code dispcode1="Date :2010-00-00"/ 顯示字符串uchar code disp

38、code3=" zheng dian bao "uchar sl,sh,ml,mh,hh,hl,moh,mol,dh,dl;uchar temp,t,s;uint second=0;uint minute=0;uint hour=12;uchar dat,key,k;uint s_cnt,i;uint year=2010;uint month=0;uint day=0;void riqi();void Init();void Disp_time();void Sendy(uchar data dat);/* 以下為串行通信接收中斷處理函數(shù) */void serialport

39、(void) interrupt 4 using 2uchar data c,i;if(RI)c=SBUF;/ 讀取接收到的數(shù)據(jù)if(BufferPointer<16)ReceiveBufferBufferPointer=c;/BufferPointer+;將接收到的數(shù)據(jù)存入接收緩沖區(qū)else for(i=0;i<15;i+)ReceiveBufferi=ReceiveBufferi+1;/ 將緩沖區(qū)數(shù)據(jù)左移 ReceiveBuffer15=c;/ 將接收到的數(shù)據(jù)存入接收緩沖區(qū)RI=0;/ 清空接收標(biāo)志Sendy(c);/ 發(fā)送接收到的數(shù)據(jù),以便回顯 OnReceive=1;/ 接

40、收事標(biāo)志位置 1void Sendy(uchar data dat)SBUF=dat; while(TI=0);TI=0;void Init(void)/ 定時(shí)器初始化DisplayListChar(0, 0, dispcode1,16); delay(100);IP=0x02;TMOD=0x22; / 定時(shí)器初始化 ,TH0=0x06;TL0=0x06;SCON=0x50;TH1=0xe6;EA=1;ET0=1;TR0=1;TR1=1;ES=1;void time0() interrupt 1 / 定時(shí)器中斷服務(wù)程序計(jì)時(shí)s_cnt+; if(s_cnt=4000) /1ss_cnt=0; s

41、econd+; if(second=60)second=0;minute+;if(minute=60)minute=0;hour+;if(hour=24)hour=0;day+;if(day=31) day=0; if(month>=12) year+;month=1; if(year>=2012)year=2010; void Disp_time(void) / 顯示時(shí)間dh=day/10;dl=day%10; hh=hour/10;hl=hour%10;mh=minute/10;ml=minute%10;sh=second/10;sl=second%10; if(sl=0&am

42、p;&sh=0&&ml=0&&mh=0) buz=0;delay(10000);buz=1;DisplayListChar(0, 0, dispcode3,16);delay(20000);DisplayListChar(0, 0, dispcode1,16);delay(1000); sendcommand(0x81,0x0a);/ 數(shù)碼管顯示 sendcommand(0x86,0x0a); display(3,sl);delay_50ms(); display(2,sh);delay_50ms(); / 秒 display(0,ml);delay_5

43、0ms(); display(7,mh);delay_50ms();/ 分display(5,hl);delay_50ms(); display(4,hh);delay_50ms();/ 時(shí)/ 液晶DispOneChar(6,0,(year/1000)%10+0x30);/ 年DispOneChar(7,0,(year/100)%10+0x30);DispOneChar(8,0,(year/10)%10+0x30);DispOneChar(9,0,(year/1)%10+0x30);DispOneChar(10,0,'-');DispOneChar(11,0,moh+0x30)

44、; / 月DispOneChar(12,0,mol+0x30);DispOneChar(13,0,'-');DispOneChar(14,0,dh+0x30); / 日DispOneChar(15,0,dl+0x30);void riqi() / 日期選擇顯示display(3,dl);delay_50ms(); display(2,dh);delay_50ms(); display(1,mol);delay_50ms(); display(0,moh);delay_50ms(); display(5,temp=(year/100)%10);delay_50ms(); disp

45、lay(4,temp=(year/1000)%10);delay_50ms();display(6,temp=(year/10)%10);delay_50ms; display(7,temp=(year/1)%10);delay_50ms;void main(void)/ 主函數(shù)LcdReset();Init();delay(100);while(1) / 讀鍵盤(pán)Disp_time();if(!KEY=1)key= ZLG7289_Key();switch(key)case 0x00:if(minute=60)minute=0;else minute+; ml=minute%10;mh=min

46、ute/10; display(0,ml);delay_50ms(); display(7,mh);delay_50ms(); / 分 ;break;case 0x01:if(hour=24)hour=0;else hour+;hl=hour%10;hh=hour/10;display(5,hl);delay_50ms();display(4,hh);delay_50ms(); / 時(shí) break;case 0x04:if(day=32)day=1; / 校日 else day+;dh=day/10;dl=day%10;DispOneChar(15,0,dl+0x30);DispOneChar

47、(14,0,dh+0x30); break;case 0x05:if(month=12)month=1; / 較月else month+;moh=month/10;mol=month%10;DispOneChar(12,0,mol+0x30);DispOneChar(11,0,moh+0x30);break;case 0x06:if(year=2012) year=2010; /較年else year+; temp=(year/1000)%10;DispOneChar(6,0,temp+0x30); temp=(year/100)%10;DispOneChar(7,0,temp+0x30);

48、temp=(year/10)%10;DispOneChar(8,0,temp+0x30); temp=(year/1)%10;DispOneChar(9,0,temp+0x30); break;case 0x08:riqi();break;/ 轉(zhuǎn)換顯示年月日case 0x09: dh=day/10;dl=day%10; hh=hour/10;hl=hour%10;mh=minute/10;ml=minute%10;Sendy(' ');Sendy('t');Sendy('i');Sendy('m');Sendy('e

49、9;);Sendy(':');Sendy(hh+0x30);Sendy(hl+0x30);Sendy(':');Sendy(mh+0x30);Sendy(ml+0x30);Sendy(':');Sendy(sh+0x30);Sendy(sl+0x30); break;default:break; while(!KEY);if(OnReceive) / 顯示接收數(shù)據(jù)for(i=0;i<16;i+)DispOneChar(i,1,ReceiveBufferi);OnReceive=0;使用的頭文件#define lataport P0#defi

50、ne buly 0x80sbit rs=P2A0;sbit rw=P2A1;sbit e =P2A2;/* */ void delay(unsigned int j) /*for(j;j>0;j-);/* 延時(shí) */液晶簡(jiǎn)易延時(shí)函數(shù) */顯示程序void Lcddelay(unsigned char MS)unsigned char i, j;while(MS!=0) j = 4;while(j!=0)i=0xf0;while(i!=0)i-;j-;MS-;/* 檢測(cè) lcd 狀態(tài) */ void WaitForEnable(void)lataport=0xff; rs=0;rw=1;L

51、cddelay(5);_nop_();e=1;_nop_();_nop_(); while(lataport&buly);e=0;/* 寫(xiě)控制字 */void LcdWriteCommand(unsigned char CMD,unsigned char AttribC)if(AttribC) WaitForEnable();rs=0;rw=0;_nop_();lataport=CMD; Lcddelay(5);_nop_();e=1;_nop_();_nop_();e=0;/* 顯示光標(biāo)定位 */ void LocateXY(char polx,char poly) unsigned

52、 char temp; temp=polx&0xf;poly&=0x1;if(poly) temp|=0x40;temp|=0x80;LcdWriteCommand(temp,0);寫(xiě)字符void LcdWriteLata(char lataW)WaitForEnable(); rs=1;rw=0;_nop_(); lataport=lataW;Lcddelay(5);_nop_(); e=1;_nop_();_nop_();e=0;/* 在指定位置顯示字符 */ void DispOneChar(unsigned char x,unsigned char y,unsigned

53、 char Wlata) LocateXY(x,y);LcdWriteLata(Wlata);初始化/* void LcdReset(void)LcdWriteCommand(0x38,0);Lcddelay(5);LcdWriteCommand(0x38,0);Lcddelay(5);LcdWriteCommand(0x38,0);Lcddelay(5);LcdWriteCommand(0x38,1);/ 清屏LcdWriteCommand(0x08,1);LcdWriteCommand(0x01,1);LcdWriteCommand(0x06,1);LcdWriteCommand(0x0c,1);codevoid DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DLata,unsigned char L)unsigned char i;for(i=0;i<L;i+)DispOneChar(X+,Y,DLatai);#define uchar unsigned chars

溫馨提示

  • 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)論