Đang tải... (xem toàn văn)
Mô phỏng trênproteus và kiểm tra trên mạch phần cứng.1.5.. - CờbáobậnBF:BusyFlagKhi đang thực thi các hoạt động bên trong, LCD bỏ qua mọi giao tiếp với bênngoài và bật cờ BF thông qua ch
Trang 3LẬPTRÌNHCVỚIVIĐIỀUKHIỂN80511.1 MỤCĐÍCH
ƯuđiểmcủagóicôngcụMikroC8051là:- Giaodiệntrựcquan
- Rất dễ sử dụng đặc biệt là với những người mới làm quen với việc lập trình cho vi điều khiển 8051
- Hỗtrợthưviệnhầuhếtchocácứngdụngnhư:Uart,Spi,i2c,onewrite, Nhược điểm:
- Người sử dụng gặp khó khăn trong việc tìm hiểu cấu trúc của hàm libraryvà khó thay đổi được nó.
1.2.2 ĐiềukhiểnLedđơn
Ledlàlà1loạidiodephátquang,đểLedsángđơngiảncấpcho nóđủdòng điện tầm 10mA.
- Điềukhiểnởchếđộhútdòng(hình1.3).- Điềukhiểnởchếđộxảdòng(hình1.4).
Trongbàinàytasẽlàmởchếđộhútdòngnhưhình1.1
Trang 4- MuốnLedsángchỉviệcchođầuKatotcủaLedởmứclogic“0”- MuốnLedtắtchỉviệcchođầuKatotcủaLedởmứclogic“1”.
1.3 Thiếtbịthựchànhthínghiệmvàvậttưtiêuhao:1.3.1 Thiếtbịthựchànhthínghiệm
- MáytínhcàiđặtphầnmềmMikroCfor8051.
1.4 CÁCBƯỚCTIẾNHÀNHTHÍNGHIỆM1.4.1 Kếtnốivàlậptrình
Nộidungbài toány ê u cầu :sinhvi ên p hả i thực hiệnbậttắtcác đ è n Ledđơn theo các yêu cầu sau: ON/OFF led trong 1 thời gian.
Trênmáytính,mởphầnmềmMikroC
Trang 5DeviceName:tênchipmàchúngtasửdụng Device Clock: Thạch anh của mạch
TiếptheochọnNext vàchọn I n c l u d e Nonenghĩalàtakhôngthêmbấtkỳ library nào vào dự án cả.
Trang 6//design by : Template code// version: 1.0
Delay_ms(100); // 1 second delay
P0 = 0xFF;P1 = 0xFF;P2 = 0xFF; P3 = 0xFF;
// Turn OFF diodes on PORT0// Turn OFF diodes on PORT1// Turn OFF diodes on PORT2// Turn OFF diodes on PORT3Delay_ms(100); // 1 second delay
} while(1);// Endless loop}
Trang 71.4.2 Bàitậpthựchành
1 ViếtlạichươngtrìnhđiềukhiểnLedđơnnóitrênvớicáchiệuứngledđuổinhau từ P0.0🠒P0.7🠒P1.0🠒P1.7🠒P2.0🠒P2.7🠒P3.0🠒P3.7 sử dụng các lệnh
dịchb i t T h ờ i g i a n c h u y ể n t r ạ n g t h á i c ủ a m ỗ i đ è n L E D l à 1 g i â y M ô p h ỏ ng trên
2 Sử dụng ma trận đèn LED 4 × 8 tạo bởi các port P0, P1, P2, P3 để hiện têncủa bản thân, thời gian chuyển trạng thái của mỗi ký tự là 500ms Mô phỏng trênproteus và kiểm tra trên mạch phần cứng.
1.5 CÂUHỎIKIỂMTRA
- VớisơđồmắcLednhưhình1.5:tínhgiátrịđiệntrởphùhợp?- Vònglặpwhile,dowhile,for?
- Cáchthựchiệnloopforevervớiwhile,dowhile,for?- ViđiềukhiểnAT89S8253?
Trang 8- Lưuđồthuậttoán?
Trang 91.6 TÀILIỆUTHAMKHẢO
- DatasheetAT89S8253;- Easy8051V6Usermanual;- Easy8051V6Schematic;- HelpMikroC8051.
Trang 10char keypadPort at P0 ;Keypad_Init();
// khai báo ma trận phím ở port0// khởi tạo ma trận bàn phím
char Keypad_Key_Click(void);// trả về trạng thái của phím bấm từ (116))
GIAOTIẾPVỚIMATRẬNBÀNPHÍMVÀMÀNHÌNHLCD16x22.1 MỤCĐÍCH
- Tìmhiểuvàviếtchươngtrìnhgiaotiếpvớikeypad4x4;- HiểnthịtrạngtháiphímbấmlênLCD16x2.
2.2 CƠSỞLÝTHUYẾT2.2.1 Matrậnbànphím
Trong các hệ thống sử dụng vi điều khiển , bàn phím ,LCD là công cụ giúp cho việc giao tiếp giữa người và vi xử lý.
Ma trận bàn phím kết nối với vi điều khiển thông qua PORT0,n g u y ê n t ắ ch o ạ t đ ộ n g c ủ a m a t r ậ n p h í m l à : k í c h l ầ n l ư ợ t c á c c h â n P 0 0 ,P 0 1 , P 0 2 , P 0 3 v à đ ọ c t r ạ n g t h á i c ủ a c á c p h í m b ấ m t h ô n g q u aP 0 4 , P 0 5 , P 0 6 , P 0 7
Trong mikroC cung cấp các thư viện hàm giao tiếp với keypad 4x4 Thamkhảotrong phần help của MikroC.
2.2.2 LàmviệcvớiLCD16x2
Trang 11Hình2.2.MànhìnhLCD16x2.
Trang 12- CờbáobậnBF:(BusyFlag)
Khi đang thực thi các hoạt động bên trong, LCD bỏ qua mọi giao tiếp với bênngoài và bật cờ BF( thông qua chân DB7 khi có thiết lập RS=0, R/W=1) lên để chobiết nó đang “bận”.
Trang 13- BộđếmđịachỉAC:(AddressCounter)
Khi một địa chỉ lệnh được nạp vào thanh ghi IR, thông tin được nối trựctiếpc h o 2 v ù n g R A M ( v i ệ c c h ọ n l ự a v ù n g R A M t ư ơ n g t á c đ ãđ ư ợ c b a o h à m t r o n g m ã lệnh).
Saukhighivào(đọctừ)RAM,bộđếmACtựđộngtănglên(giảmđi)1đơnvị.- VùngnhớcủaLCD
Vùng CGRAM : (Character Generator RAM) Ngườidùngcóthểtạocácmẫukítựđồhọariêng-PhầncứnggiaotiếpvớiLCD:
7 Dịchhiểnthịsangtrái8 Tắtcontrỏ,tắthiểnthị
Trang 14voidLcd_Out(row,column,*text);//inraởhàngvàcộttươngứng void Lcd_Cmd(char out_char);
A Tắthiểnthị,bậtcontrỏC Bậthiểnthị,tắtcontrỏ
E Bậthiểnthị,nhấpnháycontrỏF Tắtcontrỏ,nhấpnháycontrỏ10 Dịchvịtrícontrỏsangtrái14 Dịchvịtrícontrỏsangphải18 Dịchtoànbộhiểnthịsangtrái1C Dịchtoànbộhiểnthịsangphải
80 épcontrỏvềđầudòngthứnhấtC0 épcontrỏvềđầudòngthứhai
38 Haidòngvàmatrận57-MộtsốcấuhìnhvàhàmLCDtrongmikroC
_LCD_MOVE_CURSOR_LEFT MovecursorleftwithoutchangingdisplaydataRAM
_LCD_MOVE_CURSOR_RIGHT MovecursorrightwithoutchangingdisplaydataRAM
_LCD_SHIFT_LEFT ShiftdisplayleftwithoutchangingdisplaydataRAM
Trang 15_LCD_SHIFT_RIGHT ShiftdisplayrightwithoutchangingdisplaydataRAM
2.3.THIẾTBỊTHỰCHÀNHTHÍNGHIỆMVÀVẬTTƯTIÊUHAO:2.3.1 Thiếtbịthựchànhthínghiệm
- MáytínhcàiđặtphầnmềmMikroCfor8051.
2.4.CÁCBƯỚCTIẾNHÀNHTHÍNGHIỆM2.4.1 GiaotiếpvớimatrậnphímvàmànhìnhLCD16x2
//Design by : Template code// version: 1.0
//date: 1/3/2023
//description: keypad 4x4 on LCD unsigned short kp, cnt, oldstate = 0;char txt[6)];
// Keypad module connectionschar keypadPort at P0;
// End Keypad module connections
// LCD module connectionssbit LCD_RS at P2_0_bit; sbit LCD_EN at P2_1_bit;
sbit LCD_D4 at P2_2_bit;
sbit LCD_D5 at P2_3_bit; sbit LCD_D6) at P2_4_bit; sbit LCD_D7 at P2_5_bit;
// End LCD module connections
void main() {cnt = 0; Keypad_Init();
// Reset counter// Initialize Keypad
Lcd_Init();// Initialize LCD
Lcd_Cmd(_LCD_CLEAR);// Clear display Lcd_Cmd(_LCD_CURSOR_OFF);// Cursor off
Trang 16Lcd_Out(1, 1, "Key: " ) ; //WritemessagetextonLCD Lcd_Out(2, 1, "Times:");
//Waitforkeytobepressedandreleaseddo//k p = K e y p a d _ K e y _ P r e s s ( ) ;
//Storekeycodeinkpvariable kp = Keypad_Key_Click(); // Store key code in kp variable
//Preparevalueforoutput,transformkeytoit'sASCIIvalue switch(kp) {
case1 : kp=49;break;//1case2 : kp=50;break;//2case3 : kp=51;break;//3case4 : kp=6)5;break;//Acase5 : kp=52;break;//4case6) : kp=53;break;//5case7 : kp=54;break;//6)case8 : kp=6)6);break;//Bcase9 : kp=55;break;//7case10:kp=56);break;//8case11: kp=57;break;//9case12:kp=6)7;break;//Ccase13: kp= 42;break;// *case14: kp=48;break;//0case15: kp= 35;break;// #case16):kp=6)8;break;//D
if (kp != oldstate) { //Pressedkeydiffersfromprevious cnt = 1;
oldstate=kp;
Trang 17- Viết chương trình trên, vẽ sơ đồ trên proteus và kiểm tra hoạt động của hệthống quan sát kết quả.
- Vẽlưuđồthuậttoánchochươngtrìnhtrên.
2.4.2 Bàitậpthựchành
1 Viết chương trình nhập vào một số nhị phân 4 bit và chuyển đổi số nhị phânđó sang số hexa hiển thị lên màn hình LCD Mô phỏng trên proteus và kiểm tratrênmạch phần cứng.
2 Viết chương trình nhập vào hai số hexa và tính tổng, tích của hai số hiểnthịhai số đó lên màn hình LCD Mô phỏng trên proteus và kiểmtra trên mạch phần cứng.
- Giảithíchcấutrúcswitch?- Phươngphápquétmatrậnphím?
- DatasheetAT89S8253.- Easy8051V6Usermanual.- Easy8051V6Schematic.- HelpMikroC8051.
else { cnt++;}
Lcd_Chr(1, 10, kp);
// Pressed key is the same as previous
// Print key ASCII value on LCD
if (cnt == 255) {cnt = 0;
Lcd_Out(2, 10, " ");}
// If counter variable overflow
WordToStr(cnt, txt);Lcd_Out(2, 10, txt);} while (1);
// Transform counter value to string// Display counter value on LCD
}
Trang 18- TìmhiểuvềLed7thanhvàphươngphápđiềukhiển;- LậptrìnhứngdụnghiểnthịLed7thanh.
3.2.1 GiớithiệuvềđènLED7thanh
Led7thanhlàthiếtbịchuyêndùngđểhiểnthịsố0🠒9 Hình dạng của led 7 thanh trong hình 3.1.
Có2loạiLed7thanh:- Led7thanhAnotchung.- Led7thanhKatotchung.
8 3
A B76
G DP10 95
8 3
Trang 20unsignedshortshifter,digits_array_index; unsigned intd i g i t , n u m b e r ;
ĐiềukhiểnLed7thanhthôngquaPort0và q u é t ledthôngquaDIS0, DIS1, DIS2, DIS3.
Các số hiểnthị
3.4.CÁCBƯỚCTIẾNHÀNHTHÍNGHIỆM3.4.1 LậptrìnhgiaotiếpvớicácđènLED7thanh
Viếtchươngtrìnhthựchiệnhiểnthịsốcó4chữsốlênđènLED7thanhvàđếm lùi về 0000 Vẽ sơ đồ nguyên lý trên proteus, lưu lại kết quả để viết báo cáo.
Trang 21voidmain(){ int n=0;
digit = 0; //initializevariables digits_array_index = 0;
shifter =1;
P0= 0; //InitializePORT0
number = 6)789; //someinitialvalue do{
digit = number / 1000u ; // extract thousands digit digits_array[3]=mask(digit);/ / andstoreittodigitsarray digit = (number / 100u) % 10u;/ / e x t r a c t h u n d r e d s d i g i t
d i g i t s _ a r r a y [ 2 ] =mask(digit);/ / andstoreittodigitsarraydigit = (number / 10u) % 10u;/ / e x t r a c t t e n s d i g i t
d i g i t s _ a r r a y [ 1 ] =mask(digit);/ / andstoreittodigitsarray digit = number % 10u; // extract ones digit
digits_array[0]=mask(digit);/ / andstoreittodigitsarray
P0=digits_array[digits_array_index];//bringappropriatevaluetoPORT0 P1 = shifter; // turn on appropriate 7seg display
//Delay_us(10); //oneseconddelay//moveshiftertonextdigit
shifter <<= 1;
if(shifter>8u) shifter = 1;delay_ms(1);
//incrementdigits_array_index digits_array_index++ ;
digits_array_index=0; //turnon1st,turnoff2nd7seg.}
}while(1); //endlessloop
Trang 22// -ReturnsmaskforcommoncathodeDisplay_utils.hunsignedshortmask(unsignedshortnum){ switch
(num) {
case0:return0xC0;case1 :return0xF9;case2:return0xA4;case3:return0xB0;case4:return0x99;case5:return0x92;case6):return0x82;case7 :return0xF8;case8:return0x80;case9:return0x90;}//caseend
- Giảithíchcấutrúcfor?
- Tínhthờigianlưuảnhcủamắtngười?Từđósuyrathờigiantrễtốithiểu?- Phươngphápquétled7thanh?
3.6 TÀILIỆUTHAMKHẢO
- DatasheetAT89S8253.
- Easy8051V6Usermanual,Easy8051V6Schematic.- HelpMikroC8051.
Trang 23sbit OW_Bit at P1_2_bit;unsigned short Ow_Reset();
//Khởi tạo chân data
// Phát ra lệnh reset cảm biến DS1820unsigned short Ow_Read();// Đọc dữ liệu từ cảm biến ds1820, dữ liệu trả vềdưới dạng unsigned short
Void Ow_Write( char par)// Gửi lệnh xuống ds1820
4.2 CƠSỞLÝTHUYẾT4.2.1 CảmbiếnnhiệtđộDS1820
Cảm biến nhiệt độ DS18B20 là cảm biến nhiệt độ chuyên dùng để đo nhiệt độmôi trường với đầu ra dạng số khác với một số loại cảm biến analog như:LM35,LM335,
4.3.THIẾTBỊTHỰCHÀNHTHÍNGHIỆMVÀVẬTTƢTIÊUHAO:4.3.1 Thiếtbịthựchànhthínghiệm
-MáytínhcàiđặtphầnmềmMikroCfor8051.
Trang 244.4.CÁCBƯỚCTIẾNHÀNHTHÍNGHIỆM4.4.1 LậptrìnhgiaotiếpvớicảmbiếnnhiệtđộDS1820
Hiển thị nhiệt độđođượctừ cảmbiến DS1820lênLCD16x2 Trongphần code dưới đây là 1 đoạn code ví dụ:
//description:mesurementtempbyds1820onlCD//LCDmoduleconnections sbit
LCD_RS at P2_0_bit; sbit LCD_EN at P2_1_bit; sbit LCD_D4 at P2_2_bit; sbit LCD_D5 at P2_3_bit; sbit LCD_D6) at P2_4_bit; sbit LCD_D7 at P2_5_bit;
//S e t TEMP_RESOLUTIONtothecorrespondingresolutionofusedDS18x20sensor://1 8 S 2 0 : 9( d e f a u l t setting;canbe9,10,11,or12)
//1 8 B 2 0 : 12
constunsignedshortTEMP_RESOLUTION=9; char *text = "000.0000";
void Display_Temperature(unsigned int temp2write) { constunsignedshortRES_SHIFT=TEMP_RESOLUTION -8; char temp_whole;
unsignedinttemp_fraction;//checkiftemperatureisnegative if (temp2write & 0x8000) {
//extracttemp_whole
Trang 25temp_whole=temp2write>>RES_SHIFT;//converttemp_wholetocharacters if (temp_whole/100)
text[0]=temp_whole/100+ 48;elsetext[0]='0';
text[1] = (temp_whole/10)%10 + 48; //Extracttensdigit text[2] =t e m p _ w h o l e % 1 0 + 48; // Extract ones digit
//extracttemp_fractionandconvertittounsigned int
temp_fraction= t e m p 2 w r i t e < < ( 4 - R E S _ S H I F T ) ; t e m p _ f r a c ti o n & = 0 x 0 0 0 F ;
text[4] =t e m p _ f r a c ti o n / 1 0 0 0 + 48; // Extractthousands digit text[5] = (temp_fraction/100)%10 + 48;
//Extracthundredsdigit text[6)] =
(temp_fraction/10)%10+ 4 8 ; // Extract tens digit text[7] =t e m p _ f r a c ti o n % 1 0 + 48; // Extract ones digit
//printtemperatureonLCD Lcd_Out(2, 5, text);
Lcd_Init(); // Initialize LCDLcd_Cmd(_LCD_CLEAR); // Clear
LCDLcd_Cmd(_LCD_CURSOR_OFF); //Turncursoroff Lcd_Out(1, 1, " temp exemple :" ) ;
Lcd_Cmd(_LCD_CLEAR); //ClearLCD Lcd_Out(1, 1, " Temperature:" ) ;
Lcd_Chr(2,13,223);/ / differentLCDdisplayshavedifferentcharcodefordegree//
// -mainloop
Trang 264.4.2 Bàitậpthựchành
1 ViếtlạichươngtrìnhtrênđổinhiệtđộC🠒 Fvàngượclại.Môphỏngtrên proteus và kiểm tra trên mạch phần cứng.
2 Hiển thị nhiệt độ đo được từ cảm biến DS1820 lên các đèn LED 7 thanh Mô phỏng trên proteus và kiểm tra trên mạch phần cứng.
- Chuẩn1dâylàgiaotiếpmấychiều?- Hàmconlàgì?cấutrúchàmcon?
4.6 TÀILIỆUTHAMKHẢO
- DatasheetAT89S8253.- Easy8051V6Usermanual.- Easy8051V6Schematic.- HelpMikroC8051.
do {
// - perform temperature reading P3=0X00;
Ow_Reset();Ow_Write(0xCC); Ow_Write(0x44); Delay_us(120); Ow_Reset(); Ow_Write(0xCC); Ow_Write(0xBE);temp = Ow_Read();
// Onewire reset signal// Issue command SKIP_ROM// Issue command CONVERT_T
// Issue command SKIP_ROM
// Issue command READ_SCRATCHPAD
temp = (Ow_Read() << 8) + temp;
// - Format and display result on LcdDisplay_Temperature(temp);
Delay_ms(500);} while (1);}
Trang 27LẬPTRÌNHSỬDỤNGNGẮTNGOÀI5.1 MỤCĐÍCH
- Tìmhiểungắtngoàicủaviđiềukhiển8051
- LậptrìnhứngdụngđếmsốlầnbấmnútvàhiểnthịlênLCD
5.2 CƠSỞLÝTHUYẾT5.2.1 Ngắtngoàicủa8051
Khái niệm ngắt: Ngắt là sự đáp ứng các sự kiện bên trong hoặc bên ngoài nhằm thông báo cho bộ vi điều khiển biết thiết bị đang cần được phục vụ
Ngắtngoàiđượcsửdụngtrongcácứngdụngnhư:- Đếmtrạngtháixuấthiệnsựkiện
- Đolườngtốcđộđộngcơdùngencoder-
Trang 28EA:( I E 7 bit)là bitchophép ngắt toàn bộ.Tức lànếu bạn sử dụng mộttrong5 ngắtkể trên của vđk thì bạn phải setb i t n à y l ê n v ớ i g i á t r ị 1 N g ư ợ cl ạ i k h i b i t E A = 0 t h ì t o à n b ộ c á c n g ắ t c ủ a v đ k s ẽb ị c ấ m
ET2: (IE.5 bit) là bit cho phép ngắt của timer 2 ( chỉ ở họ 52 ) Khi bit này = 1thì ngắt định thời 2 sẽ được cho phép và ngược lại.
ET1,ET0: (IE.3, IE.1 bit) là bitchophép ngắtđịnhthời1,0của vđk8051 Khi các bitnày =1 thì ngắt của hai bộ định thời này được cho phép và ngược lại.
TF1(TCON.7)c ờ tràncủaTimer1
TR1(TCON.6)b i t ĐkhoạtđộngcủaTimer1 TF0 ( TCON.5)c ờ t r à n c ủ a T i m e r 0
TR0(TCON.4)b i t ĐkhoạtđộngcủaTimer0
IE1(TCON.3)C ờ ngắtngoàikíchtheosườn ;đượcCPUthiếtlậpkhiphát hiền có sườn xuống ngắt ngoài và đựơc CPU xoá khi ngắt được xư lý
IT1 ( TCON.2)b i t Đ k k i ể u n g ắ t I N T 1 đ ư ợ c t h i ế t l ậ p v à x o á b ở i p h ầ n m ề m đ ể x á c đ ị n h k i ể u n g ắ t t h e o s ư ờ n h a y m ứ c t h ấ p
IE0(TCON.1)C ờ ngắtngoàikíchtheosườn ;đượcCPUthiếtlậpkhiphát hiền có sườn xuống ngắt ngoài và đựơc CPU xoá khi ngắt được xư lý
IT0 ( TCON.0)b i t Đ k k i ể u n g ắ t I N T 0 đ ư ợ c t h i ế t l ậ p v à x o á b ở i p h ầ n m ề m đ ể x á c đ ị n h k i ể u n g ắ t t h e o s ư ờ n h a y m ứ c t h ấ p
Như vậy từ 2 thanh ghi trên , để sử dụng ngắt INT0 (ngắt theomứcta sẽ phảik h ở i t ạ o n h ư s a u ) :
5.2.2 NguyênlýghépnốiviđiềukhiểnvớiphímbấmvàmànhìnhLCD16x2
voidExternal_ISR()org0x0003ilevel0{
Trang 29Sơ đồ nguyên lý ghép nối vi điều khiển với phím bấm và màn hình LCD 16x2 được trình bày trên hình 5.1 và 5.2.
Trang 30Hình5.2.SơđồnguyênlýghépnốiviđiềukhiểnvớimànhìnhLCD16x2
Trang 31//Design by : Template code// version: 1.0
//date: 1/3/2023
//description: counter on lcd NOTES:
Make sure you turn ON the PORT0 LEDs (SW7.1), set Pull up PORT3.2 (SW4.3) and set jumper J4 in GND position
// End LCD module connectionsunsigned int cnt=0;
values bit tmp;char *text="0000" ;
// Global variable cnt and tmp with starting
void External_ISR()org 0x0003 ilevel 0 {// Interrupt rutineEA_bit = 0;// Disable Interrupts
tmp= 1;// Increment variable cntEA_bit = 1;// Enable Interrupts}
void main() { unsigned int j=0; tmp=0;P0 = 0xFF;
// Main program
// Set P0 as output
5.3 THIẾTBỊTHỰCHÀNHTHÍNGHIỆMVÀVẬTTƯTIÊUHAO:5.3.1 Thiếtbịthựchànhthínghiệm
- MáytínhcàiđặtphầnmềmMikroCfor8051.
5.4 CÁCBƯỚCTIẾNHÀNHTHÍNGHIỆM
5.4.1 HiểnthịsốlầnngắtngoàitrênchânP3.2lênLCD16x2