




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 微型計算機及控制技術實訓 班級: 1220331 姓名: 李帥 學號: 44 實驗一:LED流水燈設計1、 設計目的1. 通過此次涉及、熟悉并掌握實驗系統原理和方法2. 掌握流水燈原理和使用方法2、 設計過程(1) 設計內容1. 了解LED發光二極管的順序滅2. 了解LED的使用原理和引腳接法3. 掌握實用Keil環境編程4. 掌握下載Keil編譯好的稱序列AT89C51單片機中(2) 實驗步驟1. 掌握AT89C51單片機與外設LED的引腳接法和使用原理2. 使用Keil編譯環境,編寫LED發光二極管順序滅的程序3. 在Keil編譯好的程序下載到AT89c51單片機中,實現LED發光二極管
2、順序滅(3) 電路及程序設計1. 電路設計2. 編程如下org 0sjmp startorg 30hstart:mov P1,#1;P1.0為1,不亮mov P1,#2;P1.1為1,不亮mov P1,#4;以下原理同上mov P1,#8mov P1,#10hmov P1,#20hmov P1,#40hmov P1,#80hsjmp startdelay:nopnopnopnopretend(4) 設計結果如上圖:D7亮了。如上圖:D3亮了。實驗二8*8點陣的設計一、實驗目的:1. 了解點陣式LED顯示原理。2.掌握單片機與8×8點陣塊之間接口電路設計及編程。3.掌握8155工作原理
3、及與單片機的接口電路設計。二、實驗要求:利用8×8點陣顯示屏,自己設計并調試電路板,實現在單片機的控制下,點陣顯示屏顯示數字。3、 實驗步驟: 1、實驗電路圖 2、編碼程序: #include<reg52.h>#include <intrins.h> #define uchar unsigned char#define uint unsigned intuchar i=0,n,k;uchar code Table8=0x00,0x00,0x3C,0x42,0x42,0x3C,0x00,0x00,0x00,0x00,0x00,0x22,0x7E,0x02,0x0
4、0,0x00,0x00,0x00,0x22,0x46,0x4A,0x32,0x00,0x00,0x00,0x00,0x22,0x49,0x49,0x36,0x00,0x00,0x00,0x00,0x18,0x28,0x7E,0x08,0x00,0x00,0x00,0x00,0x7A,0x29,0x29,0x2E,0x00,0x00,0x00,0x00,0x3E,0x49,0x49,0x26,0x00,0x00,0x00,0x00,0x40,0x4F,0x50,0x60,0x00,0x00,0x00,0x00,0x36,0x49,0x49,0x36,0x00,0x00,0x00,0x00,0x3
5、2,0x49,0x49,0x3E,0x00,0x00,0x91,0x52,0x00,0xA4,0xF5,0xBF,0xF4,0xA4, 0x11,0x13,0x55,0x51,0x55,0x12,0x11,0x00, ;uchar code Tab=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; void delay(uint i); void main()TMOD=0x00;TH0=(8192-3000)/32;TL0=(8192-3000)%32;TR0=1;EA=1;ET0=1;while(1)n=4; void T0_ISP(void) interru
6、pt 1 TH0=(8192-3000)/32; TL0=(8192-3000)%32;P3 =Tabk+;if(k=8)k=0;P0 = Tableni; if(+i = 8) i = 0;void delay(uint i)while(i-); 3、實驗結果:實驗三:矩陣鍵盤的設計一、實驗目的:1、掌握鍵盤接口的基本特點,了解獨立鍵盤和矩陣鍵盤的應用方法。2、掌握鍵盤接口的硬件設計方法,軟件程序設計和貼士排錯能力。3、復習利用Keil51軟件對程序進行編譯。4、用Proteus軟件繪制“矩陣鍵盤掃描”電路,并用測試程序進行仿真。 二、實驗要求 通過實訓,學生應達到以下幾方面的要
7、求: (1)素質要求 1.以積極認真的態度對待本次實訓,遵章守紀、團結協作。 2.善于發現數字電路中存在的問題、分析問題、解決問題,努力培養獨立工作能力。 (2)能力要求 1.模擬電路的理論知識 2.脈沖與數字電路的理念知識 3.通過模擬、數字電路實驗有一定的動手能力 4.能熟練的編寫8951單片機匯編程序 5.能夠熟練的運用仿真軟件進行仿真三、實訓基本步驟 1、用Proteus繪制“矩陣鍵盤掃描”電路原理圖。 2、編寫程序使數碼管顯示當前閉
8、合按鍵的鍵值。(代碼)#include<reg51.h>#define uchar unsigned char#define uint unsigned int ucharcodedis= 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E;uchar code tab=0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee;void delay(uint x) uchar
9、i;while(x-)for(i=0;i<120;i+); uchar scan() uchar a,b,c,i;P2=0XF0; delay(10);P2=0X0F; for(i=0;i<16;i+)if(c=tabi)return i; void main()ucharkey;while(1)key=scan();if(key!=-1) P0=diskey;delay(100); 3、 利用Proteus軟件的仿真功能對其進行仿真測試,觀察數碼管的顯示狀態和按鍵開關的對應關系。(實驗結束)如上圖:當K7被按下時,數碼管上顯示出數字7了。實驗四:電子時鐘設計一、設計目的通過此次設
10、計,熟悉并掌握實驗系統的原理和方法。掌握電子時鐘的原理和使用方法。二、設計要求1、設計一個電子時鐘,并且能夠實現分秒實現的和調節。2、設計出硬件電路、3、設計出軟件編程方法,并寫出程序。4、用匯編語言實現程序設計5、利用查表,中斷等方式實現目的三、電路程序設計1、電路設計2、 編碼程序#include <REG51.H>#include <intrins.h>/#include "LCD1602.h"/#include "DS1302.h"#define uint unsigned int#define uchar unsigne
11、d charsbit DS1302_CLK = P17; /實時時鐘時鐘線引腳 sbit DS1302_IO = P16; /實時時鐘數據線引腳 sbit DS1302_RST = P15; /實時時鐘復位線引腳sbit ACC0 = ACC0;sbit ACC7 = ACC7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; /秒,分,時到日,月,年位閃的計數sbit Set = P20; /模式切換鍵sbit Up = P21; /加法按鈕sbit Down = P22; /減法按鈕sbit
12、out = P23; /立刻跳出調整模式按鈕char done,count,temp,flag,up_flag,down_flag;uchar TempBuffer5,week_value2;void show_time(); /液晶顯示程序/*1602液晶顯示部分子程序*/Port Definitions*sbit LcdRs= P25;sbit LcdRw= P26;sbit LcdEn = P27;sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據端口/內部等待函數*unsigned char LCD_Wait(void)LcdRs
13、=0;LcdRw=1;_nop_();LcdEn=1;_nop_();LcdEn=0;return DBPort;/向LCD寫入命令或數據*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0x01 / 清屏#define LCD_HOMING 0x02 / 光標返回原點void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意順序Lcd
14、En=1;_nop_();/注意順序LcdEn=0;_nop_();LCD_Wait();/設置顯示模式*#define LCD_SHOW0x04 /顯示開#define LCD_HIDE0x00 /顯示關 #define LCD_CURSOR0x02 /顯示光標#define LCD_NO_CURSOR0x00 /無光標 #define LCD_FLASH0x01 /光標閃動#define LCD_NO_FLASH0x00 /光標不閃動void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|Displ
15、ayMode);/設置輸入模式*#define LCD_AC_UP0x02#define LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 畫面可平移#define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38); /8位數據端口,2行顯示,5*7點陣LCD_Writ
16、e(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /開啟顯示, 無光標LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC遞增, 畫面不動/液晶字符輸入的位置*void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);/將
17、字符輸出到液晶顯示void Print(unsigned char *str)while(*str!='0')LCD_Write(LCD_DATA,*str);str+;/*DS1302時鐘部分子程序*/typedef struct _SYSTEMTIME_unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString11
18、;unsigned char TimeString9;SYSTEMTIME;/定義的時間類型SYSTEMTIME CurrentTime;#define AM(X)X#define PM(X)(X+12) / 轉成24小時制#define DS1302_SECOND0x80 /時鐘芯片的寄存器位置,存放時間#define DS1302_MINUTE0x82#define DS1302_HOUR0x84 #define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C void
19、 DS1302InputByte(unsigned char d) /實時時鐘寫入一字節(內部函數) unsigned char i;ACC = d; for(i=8; i>0; i-) DS1302_IO = ACC0; /相當于匯編中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; unsigned char DS1302OutputByte(void) /實時時鐘讀取一字節(內部函數) unsigned char i; for(i=8; i>0; i-) ACC = ACC >>1; /相當于匯
20、編中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1;DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要寫的數據 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 寫1Byte數據 DS1302_CLK = 1; DS1302_RST
21、 = 0; unsigned char Read1302(unsigned char ucAddr)/讀取DS1302某地址的數據 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 讀1Byte數據 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_GetTime(SYSTEMTIME *Time) /
22、獲取時鐘芯片的時鐘數據到自定義的結構型數組unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time->Minute = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR)
23、;Time->Hour = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Re
24、ad1302(DS1302_MONTH);Time->Month = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);void DateToStr(SYSTEMTIME *Time) /將時間年,月,日,星期數據轉換成液晶顯示字符串,放到數組里DateString if(hide_year<2) /這里的i
25、f,else語句都是判斷位閃爍,<2顯示數據,>2就不顯示,輸出字符串為 2007/07/22 Time->DateString0 = '2' Time->DateString1 = '0' Time->DateString2 = Time->Year/10 + '0' Time->DateString3 = Time->Year%10 + '0' else Time->DateString0 = ' ' Time->DateString1 = '
26、 ' Time->DateString2 = ' ' Time->DateString3 = ' 'Time->DateString4 = '/'if(hide_month<2)Time->DateString5 = Time->Month/10 + '0' Time->DateString6 = Time->Month%10 + '0' else Time->DateString5 = ' ' Time->DateString6
27、= ' 'Time->DateString7 = '/'if(hide_day<2)Time->DateString8 = Time->Day/10 + '0' Time->DateString9 = Time->Day%10 + '0' elseTime->DateString8 = ' 'Time->DateString9 = ' ' if(hide_week<2) week_value0 = Time->Week%10 + '
28、0' /星期的數據另外放到 week_value數組里,跟年,月,日的分開存放,因為等一下要在最后顯示 else week_value0 = ' ' week_value1 = '0'Time->DateString10 = '0' /字符串末尾加 '0' ,判斷結束字符void TimeToStr(SYSTEMTIME *Time) /將時,分,秒數據轉換成液晶顯示字符放到數組 TimeString; if(hide_hour<2) Time->TimeString0 = Time->Hour/1
29、0 + '0' Time->TimeString1 = Time->Hour%10 + '0' else Time->TimeString0 = ' 'Time->TimeString1 = ' 'Time->TimeString2 = ':'if(hide_min<2) Time->TimeString3 = Time->Minute/10 + '0' Time->TimeString4 = Time->Minute%10 + '
30、0' else Time->TimeString3 = ' 'Time->TimeString4 = ' ' Time->TimeString5 = ':' if(hide_sec<2) Time->TimeString6 = Time->Second/10 + '0' Time->TimeString7 = Time->Second%10 + '0' elseTime->TimeString6 = ' 'Time->TimeStr
31、ing7 = ' ' Time->DateString8 = '0'void Initial_DS1302(void) /時鐘芯片初始化 unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) /判斷時鐘芯片是否關閉 Write1302(0x8e,0x00); /寫入允許Write1302(0x8c,0x07); /以下寫入初始化時間 日期:07/07/25.星期: 3. 時間: 23:59:55Write1302(0x88,0x07);Write1302(0x86,0x25);Wr
32、ite1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); /禁止寫入void Delay1ms(unsigned int count)unsigned int i,j;for(i=0;i<count;i+)for(j=0;j<120;j+);/*延時子程序*/void mdelay(uint delay)uint i;for(;delay>0;delay-)for(i=0;i<62;i+) /1ms延時.;void out
33、key() /跳出調整模式,返回默認顯示 uchar Second;if(out=0) mdelay(8); count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;Second=Read1302(DS1302_SECOND); Write1302(0x8e,0x00); /寫入允許Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); /禁止寫入done=0; while(out=0); /void Upkey()/升
34、序按鍵 Up=1;if(Up=0) mdelay(8);switch(count)case 1: temp=Read1302(DS1302_SECOND); /讀取秒數 temp=temp+1; /秒數加1 up_flag=1; /數據調整后更新標志 if(temp&0x7f)>0x59) /超過59秒,清零 temp=0; break; case 2:temp=Read1302(DS1302_MINUTE); /讀取分數 temp=temp+1; /分數加1up_flag=1;if(temp>0x59) /超過59分,清零temp=0;break;case 3: temp
35、=Read1302(DS1302_HOUR); /讀取小時數temp=temp+1; /小時數加1up_flag=1;if(temp>0x23) /超過23小時,清零 temp=0; break; case 4: temp=Read1302(DS1302_WEEK); /讀取星期數 temp=temp+1; /星期數加1 up_flag=1; if(temp>0x7) temp=1; break; case 5: temp=Read1302(DS1302_DAY); /讀取日數 temp=temp+1; /日數加1 up_flag=1; if(temp>0x31) temp=
36、1; break; case 6: temp=Read1302(DS1302_MONTH); /讀取月數 temp=temp+1; /月數加1 up_flag=1; if(temp>0x12) temp=1; break; case 7: temp=Read1302(DS1302_YEAR); /讀取年數 temp=temp+1; /年數加1 up_flag=1; if(temp>0x85) temp=0; break; default:break;while(Up=0); /void Downkey()/降序按鍵 Down=1;if(Down=0) mdelay(8); swit
37、ch(count) case 1: temp=Read1302(DS1302_SECOND); /讀取秒數 temp=temp-1; /秒數減1 down_flag=1; /數據調整后更新標志 if(temp=0x7f) /小于0秒,返回59秒 temp=0x59; break; case 2: temp=Read1302(DS1302_MINUTE); /讀取分數 temp=temp-1; /分數減1 down_flag=1; if(temp=-1) temp=0x59; /小于0秒,返回59秒 break; case 3: temp=Read1302(DS1302_HOUR); /讀取小時
38、數 temp=temp-1; /小時數減1 down_flag=1; if(temp=-1) temp=0x23; break; case 4: temp=Read1302(DS1302_WEEK); /讀取星期數 temp=temp-1; /星期數減1 down_flag=1; if(temp=0) temp=0x7; break; case 5: temp=Read1302(DS1302_DAY); /讀取日數 temp=temp-1; /日數減1 down_flag=1; if(temp=0) temp=31; break; case 6: temp=Read1302(DS1302_MO
39、NTH); /讀取月數 temp=temp-1; /月數減1 down_flag=1; if(temp=0) temp=12; break; case 7: temp=Read1302(DS1302_YEAR); /讀取年數 temp=temp-1; /年數減1 down_flag=1; if(temp=-1) temp=0x85; break; default:break;while(Down=0); void Setkey()/模式選擇按鍵Set=1;if(Set=0) mdelay(8); count=count+1; /Setkey按一次,count就加1 done=1; /進入調整模
40、式 while(Set=0); void keydone()/按鍵功能執行 uchar Second; if(flag=0) /關閉時鐘,停止計時 Write1302(0x8e,0x00); /寫入允許 temp=Read1302(0x80); Write1302(0x80,temp|0x80); Write1302(0x8e,0x80); /禁止寫入 flag=1; Setkey(); /掃描模式切換按鍵 switch(count) case 1:do /count=1,調整秒 outkey(); /掃描跳出按鈕 Upkey(); /掃描加按鈕 Downkey(); /掃描減按鈕 if(up
41、_flag=1|down_flag=1) /數據更新,重新寫入新的數據 Write1302(0x8e,0x00); /寫入允許 Write1302(0x80,temp|0x80); /寫入新的秒數 Write1302(0x8e,0x80); /禁止寫入 up_flag=0; down_flag=0; hide_sec+; /位閃計數 if(hide_sec>3) hide_sec=0; show_time(); /液晶顯示數據 while(count=2);break; case 2:do /count=2,調整分 hide_sec=0; outkey(); Upkey(); Downk
42、ey(); if(temp>0x60) temp=0; if(up_flag=1|down_flag=1) Write1302(0x8e,0x00); /寫入允許 Write1302(0x82,temp); /寫入新的分數 Write1302(0x8e,0x80); /禁止寫入 up_flag=0; down_flag=0; hide_min+; if(hide_min>3) hide_min=0; show_time(); while(count=3);break; case 3:do /count=3,調整小時 hide_min=0; outkey(); Upkey(); Do
43、wnkey(); if(up_flag=1|down_flag=1) Write1302(0x8e,0x00); /寫入允許 Write1302(0x84,temp); /寫入新的小時數 Write1302(0x8e,0x80); /禁止寫入 up_flag=0; down_flag=0; hide_hour+; if(hide_hour>3) hide_hour=0; show_time(); while(count=4);break; case 4:do /count=4,調整星期 hide_hour=0; outkey(); Upkey(); Downkey(); if(up_flag=1|down_flag=1) Write1302(0x8e,0x00); /寫入允許 Write1302(0x8a,temp); /寫入新的星期數 Write1302(0x8e,0x80); /禁止寫入 up_flag=0; down_flag=0; hide_week+; if(hide_week>3) hide_week=0; show_time(); while(count=5);break; case 5:do /count=5,調整日 hide_week=0; outkey(); Upkey(); Downkey(); if(up_flag=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中生參與社團活動經費監管的困境與對策分析論文
- 高中數學教學中學生推理能力培養的案例教學策略研究論文
- 藝術生宿舍管理制度
- 蘇州商品房管理制度
- 茶坊市衛生管理制度
- 飾品店員工管理制度
- 讀寫結合 提高能力──《火燒云》教學案例(13篇)
- 財務會計基礎編制方法
- 財會經濟-高級經濟師-旅游經濟-14-強化練習題-強化練習題五
- 設計公司管理制度
- 競選車間班長的演講稿
- 校園欺凌事件調解協議書
- 麗思卡爾頓酒店介紹
- 藥物過敏性休克急救護理課件
- 國企物流公司筆試題庫答案
- 重癥醫學科的建設與管理指南(2023版)
- 甘肅省的自然災害分析報告
- 社區獲得性肺炎護理查房
- 管理者自我執行力提升的兩大抓手-課后測試及答案
- 塵肺病的運動康復計劃
- 守株待兔-幼兒成語故事
評論
0/150
提交評論