CHƯƠNG 9 LẬP TRÌNH GIAO TIẾP MÁY TÍNH VÀ THIẾT BỊ
lượt xem 102
download
Giao tiếp qua cổng RS232 • Cổng RS232 là cổng thông dụng nhất trong truyền dữ liệu giữa máy tính và thiết bị • Mặc dù cổng RS232 phức tạp hơn cổng song song nhưng nó là cổng hữu hiệu nhất trong truyền dữ liệu, có thể là wireless trong một số ngành và ít
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: CHƯƠNG 9 LẬP TRÌNH GIAO TIẾP MÁY TÍNH VÀ THIẾT BỊ
- KỸ THU ẬT LẬP TRÌNH 1 CHƯƠNG 9 LẬP TRÌNH GIAO TIẾP MÁY TÍNH VÀ THIẾT BỊ Mục lục chương 9 2 9.1. Giao tiếp qua cổng RS232 • 9.2. Giao tiếp qua cổng song song • 9.3. Giao tiếp qua cổng nối tiếp • 9.4. Giao tiếp qua cổng máy in • m GIAO TIẾP QUA CỔNG RS232 3 o CHƯƠNG 9 c Giao tiếp qua cổng RS232 . 4 o • Cổng RS232 là cổng thông dụng nhất trong truyền dữ liệu giữa máy tính và thiết bị o • Mặc dù cổng RS232 phức tạp hơn cổng song song nhưng nó là cổng hữu h hiệu nhất trong truyền dữ liệu, có thể là wireless trong m ột số ngành và ít a tốn chi phí. y • Liên kết cổng RS232 bằng dây và dây này có 3 chức năng chính: “truyền”, “nhận”, “nối đất”, ... @ Giao tiếp qua cổng RS232 5 9 Giao tiếp qua cổng RS232 9 6 1 Giao tiếp qua cổng RS232 7 _ • Dây “nhận” và “truyền” này được kết nối giữa 2 máy tính với nhau. K • Dữ liệu được truyền theo chuỗi. Có 2 chân chính là TXD và RXD. Các chân khác của cổng là RTS, CTS, DSR, DTR, and RTS, RI 2 • Dữ liệu ‘1’ và ‘0’ được xác định theo m ức điện áp 3V to 25V và -3V to - Y 25V Giao tiếp qua cổng RS232 8 • Đặc tính điện áp của cổng nối tiếp theo EIA (Electronics Industry Association) RS232C tiêu chuẩn có tốc độ baud rate là 20,000bps, khá thấp so với tiêu chuẩn tốc độ hiện nay. • Vì lý do này, chúng ta nên chọn cổng RS-232D với tiêu chuẩn m ới và được áp dụng trên các máy tính thế hệ m ới hiện nay Giao tiếp qua cổng RS232 9 • Baud: tốc độ truyền dữ liệu. • Các tốc độ thiết lập: 300, 600, 1200, 2400, 4800, 9600, 19200, 1
- 38400,57600, 115200 • Kí hiệu baud tương ứng với số bit truyền được trong 1 giây • Có 1 bit b ắt đ ầu và 1 bit dừng được gửi kèm theo v ới 1 byte dữ liệu • à nếu định 9600 baud thì có tốc độ truyền 960 byte/giây Giao tiếp qua cổng RS232 10 • Cổng RS232D hiện đang tồn tại ở 2 dạng: D loại 25 chân và D loại 9 chân, và cả 2 dạng này ở dạng đầu “cái” nằm ở phía sau máy tính. • Chúng ta cần có m ột đầu “đực” để kết nối từ máy tính này sang máy tính khác. • Các chân ra của D-9 và D-25 được trình bày dưới đây: m Giao tiếp qua cổng RS232 11 o c Giao tiếp qua cổng RS232 . 12 o Giao tiếp qua cổng RS232 13 o Giao tiếp qua cổng RS232 h 14 a Giao tiếp qua cổng RS232 15 y • Các thiết bị dùng các c ổng nối tiếp cho giao tiếp được phân làm hai loại. Chúng gồm DCE (Data Communications Equipment) và DTE (Data Terminal Equipment) @ • DCE là các thiết bị tươ ng tự modem thiết bị, TA adapter, máy in chẳng hạn trong khi DTE là máy tính bạn hoặc các thiết bị ngoại vi. 9 • Một DTE là một máy tính và một modem là DCE. Thông thườ ng, mọi người hay nói về DTE tới DCE hoặc DCE tớ i các bộ phát DCE. 9 • Bộ truyền DTE tới DCE là giữa modem và máy tính của chúng ta (đôi khi được xem như là một bộ thiết bị ngoại vi ngoài). Điều này cho thấy truyền dự liệu r ất nhanh hơ n so với từ DCE đến DCE. 1 DCE to DCE là kết nối giữa các modem, đôi khi còn được gọi là bộ kết nối các đường truyền . _ Giao tiếp qua cổng RS232 16 K • Hầu hết hiện nay người dùng phổ biến các modem 28.8K hoặc 33.6K. Do vậy, chúng 2ta nên sử dụng các modem có tốc độ DCE đến DCE là 28.8K hoặc 33.6K. • Nếu cần loại modem có tốc độ cao, chúng ta nên dùng DTE đến DCE có tốc độ Y khoảng 115,200 BPS. (Tốc độ tối đa là 16550a UART) . • Các chương trình giao tiếp chúng ta sử dụng được thiết lập cho DCE đến DTE. Tuy nhiên, tốc độ thiết lập là 9.6 KBPS, 144 KBPS,... và theo tốc độ modem có thể truyền. Giao tiếp qua cổng RS232 17 • Nếu chúng ta chuyển dữ liệu dạng file text tại 28.8K (DCE- DCE), thì modem sẽ nén file này lại và tốc độ truyền thực tế là 115.2 KBPS giữa các máy tình và do đó, tốc độ truyền giữa DCE- DTE là 115.2 KBPS. • Vì vậy, điều này lý giải tại sao DCE- DTE nên có tốc độ kết nối cao hơn tốc độ kết nối của modem. Do đó, nếu tốc độ DTE đến DCE của chúng ta nhiều lần nhanh hơn tốc độ DCE đến DCE, PC có thể gửi dữ liệu đến modem của chúng ta ở tốc độ 115,200 BPS. 2
- Giao tiếp qua cổng RS232 18 • NULL MODEM (modem rỗng): • Null modem được dùng để kết nối giữa hai DTE với nhau. • Thường đ ược sử dụng đ ể truyền các file dữ liệu giữa các máy tính, sử dụng các giao thức (protocol) như Zmodem, xmodem,... Giao tiếp qua cổng RS232 19 Giao tiếp qua cổng RS232 20 • Hình vẽ được đề cập ở trên cho thấy kết nối các dây của null modem. Đặc tính chính được chỉ ra ở đây là sử dụng một máy tính để trao đổi mọi thứ (chat) vớ i modem gần giống như m vớ i một máy tính khác. o • Máy tính khách (guest) và máy tính chủ (host) được kết nối thông qua các chốt TD, RD, và c SG. . • Bất kỳ dữ liệu được truyền thông qua dây TD từ máy chủ đến máy khách, được nhận theo dây RD. Máy tính chủ phải được thiết lập thông số tương tự máy tính khách. o • Tín hiệu dây nối đất_signal ground (SG) của cả hai máy tính phải được ngắn lại. o Giao tiếp qua cổng RS232 21 h • Data Terminal Ready (DTR) được nối kín từ bộ Data Set Ready và Carrier Detect a trên cả hai máy tính. y • Khi bộ Data Terminal Ready được xác nhận hoạt động, thì Data Set Ready và Carrier Detect ngay lập tức được hoạt động. • Ở điểm này, máy tính được xem như là modem ảo Virtual Modem được kết nối sẵn @ sàng và được phát hiện bởi các modem truyền dữ liệu khác. 9 Giao tiếp qua cổng RS232 22 9 • All left to worry about now is the Request to Send and Clear To Send. 1 • As both computers communicate together at the same speed, flow control is not _ needed thus these two lines are also linked together on each computer. • When the computer wishes to send data, it asserts the Request to Send high and as K it is hooked together with the Clear to Send, It immediately gets a reply that it is ok to send and does so. 2 Giao tiếp qua cổng RS232 Y 23 • The Ring indicator line is only used to tell the computer that there is a ringing signal on the phone line. As we do not have, a modem connected to the phone line this is left disconnected Giao tiếp qua cổng RS232 24 • To know about the RS232 ports available in your computer, Right click on "My Computer", Goto 'Properties', Select tab 'Device Manager', go to Ports( COM & LPT ), In that you will find 'Communication Port(Com1)' etc. • If you right click on that and go to properties, you will get device status. Make sure that you have enabled the port( Use this port is selected). Giao tiếp qua cổng RS232 25 3
- • There are two popular methods of sending data to or from the serial port in Turbo C. • One is using outportb(PORT_ID, DATA) or outport(PORT_ID,DATA) defined in “dos.h” • Another method is using bioscom() function defined in “bios.h” Giao tiếp qua cổng RS232 26 • Using outportb() : • The function outportb () sends a data byte to the port ‘PORT_ID’. The function outport() sends a data word. These functions can be used for any port including serial port, parallel ports. Similarly to receive data these are used. • inport reads a word from a hardware port m • inportb reads a byte from a hardware port o • outport outputs a word to a hardware port c • outportb outputs a byte to a hardware port . Giao tiếp qua cổng RS232 o 27 • Declaration: (Cú pháp) o • int inport(int portid); h • unsigned char inportb(int portid); a • void outport(int portid, int value); y • void outportb(int portid, unsigned char value); Giao tiếp qua cổng RS232 28 @ • Remarks: 9 • inport works just like the 80x86 instruction IN. It reads the low byte of a word from 9 portid, the high byte from portid + 2. • inportb is a macro that reads a byte 1 • outport works just like the 80x86 instruction OUT. It writes the low byte of value to _ portid, the high byte to portid + 1. • outportb is a macro that writes value Argument K Giao tiếp qua cổng RS232 2 29 Y • portid: • Inport- port that inport and inportb read from; • Outport- port that outport and outportb write to • value: • Word that outport writes to portid; • Byte- that outportb writes to portid. Giao tiếp qua cổng RS232 30 • If you call inportb or outportb when dos.h has been included, they are treated as macros that expand to inline code. • If you don't include dos.h, or if you do include dos.h and #undef the macro(s), you get the function(s) of the same name. 4
- Giao tiếp qua cổng RS232 31 • Return Value: • # inport and inportb return the value read • # outport and outportb do not return Giao tiếp qua cổng RS232 32 • Using bioscom: • The macro bioscom () and function _bios_serialcom() are used in this method in the serial communication using RS-232 connecter. • First we have to set the port with the settings depending on our need and availability. In this method, same function is used to make the settings using control word, to send data to the port m and check the status of the port. • These actions are distinguished using the first parameter of the function. Along with that we are o sending data and the port to be used to communicate. c • Here are the deatails of the Turbo C Functions for communication ports. . Giao tiếp qua cổng RS232 33 o • Declaration: (Cú pháp) o • bioscom(int cmd, char abyte, int port) h • _bios_serialcom(int cmd ,int port, char abyte) a • bioscom() and _bios_serialcom() uses the bios interrupt 0x14 to perform y various communicate the serial communication over the I/O ports given in port. • cmd: The I/O operation to be performed. @ 9 Giao tiếp qua cổng RS232 34 9 Giao tiếp qua cổng RS232 35 1 • portid: port to which data is to be sent or from which data is to be read. _ • 0: COM1 K 1: COM2 2 2: COM3 Y Giao tiếp qua cổng RS232 36 • abyte: • When cmd =2 or 3 (_COM_SEND or _COM_RECEIVE) parameter abyte is ignored. • When cmd = 0 (_COM_INIT), abyte is an OR combination of the following bits (One from each group): Giao tiếp qua cổng RS232 37 Giao tiếp qua cổng RS232 38 • For example, if 5
- • abyte = 0x8B = (0x80 | 0x08 | 0x00 | 0x03) = (_COM_1200 | _COM_ODDPARITY | _COM_STOP1 | _COM_CHR8) • the communications port is set to 1200 baud (0x80 = _COM_1200) Odd parity (0x08 = _COM_ODDPARITY) 1 stop bit (0x00 = _COM_STOP1) 8 data bits (0x03 = _COM_CHR8) • To initialise the port with above settings we have to write, • bioscom(0, 0x8B, 0); Giao tiếp qua cổng RS232 39 • To send a data to COM1, the format of the function will be bioscom(1, data, 0). m • Similarly bioscom(1, 0, 0 ) will read a data byte from the port. o Giao tiếp qua cổng RS232 c 40 . Giao tiếp qua cổng RS232 o 41 • When you compile and run the above program in both the computers, The characters typed in one o computer should appear on the other computer screen and vice versa. h • Initially, we set the port to desired settings as defined in macro settings. Then we waited in an idle loop until a key is pressed or a data is available on the port. If any key is pressed, then kbhit() a function returns non zero value. • So will go to getch function where we are finding out which key is pressed. Then we are sending it y to the com port. Similarly, if any data is available on the port, we are receiving it from the port and displaying it on the screen. @ Giao tiếp qua cổng RS232 42 9 • To check the port, If you have a single computer, you can use loop-back 9 connection as follows. 1 • This is most commonly used method for developing communication programs. Here, data is transmitted to that port itself. Loop-back plug _ connection is as follows. K Giao tiếp qua cổng RS232 43 2 Giao tiếp qua cổng RS232 Y 44 • If you run the above program with the connection as in this diagram, the character entered in the keyboard should be displayed on the screen. • This method is helpful in writing serial port program with single computer. Also you can make changes in the port id if your computer has 2 rs232ports. • You can connect the com1 port to com2 of the same computer and change the port id in the program. • The data sent to the port com1 should come to port com2. then also whatever you type in the keyboard should appear on the screen. GIAO TIẾP QUA CỔNG MÁY IN 45 CHƯƠNG 9 Giao tiếp qua cổng máy in 46 6
- • Port Assignments • Each printer port consists of three port addresses; data, status and control port. • These addresses are in sequential order. That is, if the data port is at address 0x0378, the corresponding status port is at 0x0379 and the control port is at 0x037a. Giao tiếp qua cổng máy in 47 • Printer: LPT1, LPT2, LPT3 • Data port: 0x03bc, 0x0378, 0x0278 • Status: 0x03bd, 0x0379, 0x0279 m • Control: 0x03be, 0x037a, 0x027a • To definitively identify the assignments for a particular machine, use the DOS debug o program to display memory locations 0040:0008. For example: c • >debug . • -d 0040:0008 L8 0040:0008 78 03 78 02 00 00 00 00 o Giao tiếp qua cổng máy in 48 o • Note in the example that LPT1 is at 0x0378, LPT2 at 0x0278 and LPT3 h and LPT4 are not assigned. a • Thus, for this hypothetical machine; y • Printer: LPT1, LPT2, LPT3, LPT4 • Data port: 0x0378, 0x0278, none, none @ • Status: 0x0379, 0x0279 • Control: 0x037a, 0x027a 9 9 Giao tiếp qua cổng máy in 49 1 • An alternate technique is to run Microsoft Diagnostics (MSD.EXE) and _ review the LPT assignments. K Giao tiếp qua cổng máy in 50 2 • Outputs Y Giao tiếp qua cổng máy in 51 Giao tiếp qua cổng máy in 52 • Note that there are eight outputs on the Data Port (Data 7(msb) - Data 0) and four additional outputs on the low nibble of the Control Port. /SELECT_IN, INIT, /AUTO FEED and /STROBE. • [Note that with /SELECT_IN, the "in" refers to the printer. For normal printer operation, the PC exerts a logic zero to indicate to the printer it is selected. The original function of INIT was to initialize the printer, AUTO FEED to advance the paper. In normal printing, STROBE is high. The character to be printed is output on the Data Port and STROBE is momentarily brought low.] 7
- Giao tiếp qua cổng máy in 53 • All outputs on the Data Port are true logic. That is, writing a logic one to a bit causes the corresponding output to go high. • However, the /SELECT_IN, /AUTOFEED and /STROBE outputs on the Control Port have inverted logic. • That is, outputting a logic one to a bit causes a logic zero on the corresponding output. This adds some complexity in using the printer port, but the fix is to simply invert those bits using the exclusive OR function prior to outputting. Giao tiếp qua cổng máy in 54 • [One might ask why the designers of the printer port designed the port in this manner. Assume m you have a printer with no cable attached. An open usually is read as a logic one. Thus, if a logic one on the SELECT_IN, AUTOFEED and STROBE leads meant to take the appropriate o action, an unconnected printer would assume it was selected, go into the autofeed mode and assume there was data on the outputs associated with the Data Port. c . • The printer would be going crazy when in fact it wasn't even connected. Thus, the designers used inverted logic. A zero forces the appropriate action.] o Giao tiếp qua cổng máy in 55 o • #define DATA 0x03bc h • #define STATUS DATA+1 a • #define CONTROL DATA+2 • ... y • int val1, val2; • ... • val1 = 0x81; /* 1000 0001 */ /* Data bits 7 and 0 at one */ @ • outportb(DATA, val1); 9 • val2 = 0x08; /* 0000 1000 */ outportb(CONTROL, VAL2^0x0b); /* SELECT_IN = 1, INIT = 0, /AUTO_FEED = 0, /STROBE = 0 */ 9 Giao tiếp qua cổng máy in 1 56 _ • Note that only the lower nibble of val2 is significant. Note that in the last line of code, /SELECT_IN, /AUTO_FEED and /STROBE are output in K inverted form by using the exclusive-or function so as to compensate for 2 the hardware inversion. Y Giao tiếp qua cổng máy in 57 • For example; if I intended to output 1 0 0 0 on the lower nibble and did not do the inversion, the hardware would invert bit 3, leave bit 2 as true and invert bits 1 and 0. The result, appearing on the output would then be 0 0 1 1 which is about as far from what was desired as one could get. By using the exclusive-or function, 1 0 0 0 is actually sent to the port as 0 0 1 1. The hardware then inverts bits 3, 1 and 0 and the output is then the desired 1 0 0 0. Giao tiếp qua cổng máy in 58 • Note that in the diagram showing the Status Port there are five status leads from the printer. (BSY, /ACK, PE (paper empty), SELECT, /ERROR). • [The original intent in the naming of most of these is intuitive. A high on SELECT indicates the printer is on line. A high on BSY or PE indicates to the PC that the printer is busy or out of paper. A low wink on /ACK indicates the printer received something. A low on ERROR 8
- indicates the printer is in an error condition.] • These inputs are fetched by reading the five most significant bits of the status port Giao tiếp qua cổng máy in 59 • However, the original designers of the printer interface circuitry, inverted the bit associated with the BSY using hardware. That is, when a zero is present on input BSY, the bit will actually be read as a logic one. Normally, you will want to use "true" logic, and thus you will want to invert this bit. • The following fragment illustrates the reading the five most significant bits in "true" logic. Giao tiếp qua cổng máy in 60 m • #define DATA 0x03bc • #define STATUS DATA+1 o • ... c . • unsigned int in_val; • ... o • in_val = ((inportb(STATUS)^0x80) >> 3); o Giao tiếp qua cổng máy in h 61 a • Note that the Status Port is read and the most significant bit, corresponding to the BSY lead is inverted using the exclusive-or function. The result is then shifted such y that the upper five bits are in the lower five bit positions. • 0 0 0 BUSY /ACK PE SELECT /ERROR Another input, IRQ on the Status @ Port is not brought to a terminal on the DB-25 printer port connector. I have yet to figure out how to use this bit. 9 Giao tiếp qua cổng máy in 9 62 1 • At this point, you should see that, at a minimum, there are 12 outputs; eight on the Data Port and four on the lower nibble of the Control Port. _ There are five inputs, on the highest five bits of the Status Port. Three K output bits on the Control Port and one input on the Status Port are inverted by the hardware, but this is easily handled by using the exclusive- 2or function to selectively invert bits. Y Giao tiếp qua cổng máy in 63 • Refer to the figure titled Figure #3 - Typical Application showing a normally open push button switch being read on the BUSY input (Status Port, Bit 7) and an LED which is controlled by Bit 0 on the Data Port. A C language program which causes the LED to flash when the push-button is depressed appears below. Note that an output logic zero causes the LED to light. 64 • #include • #include /* required for delay function */ • #define DATA 0x03bc • #define STATUS DATA+1 9
- • #define CONTROL DATA+2 • void main(void) • { • int in; • while(1) • { • in = inportb(STATUS); • if (((in^0x80)&0x80)==0) /* if BUSY bit is at 0 (sw closed) */ • { • outportb(DATA,0x00); /* turn LED on */ • delay(100); • outportb(DATA, 0x01); /* turn it off */ • delay(100); • } • else • { • outportb(DATA,0x01); /* if PB not depressed, turn LED off */ • } • } m • } o Giao tiếp qua cổng máy in 65 c . Giao tiếp qua cổng máy in 66 o • Circuit Description: Logic 1 on output DATA 0 (Data Port - Bit 0) causes LED to be o off. Logic 0 causes LED to turn on. h • Normally open push-button causes +5V (logic 1) to appear on input BUSY (STATUS PORT - Bit 7). When depressed, push-button closes and ground (logic 0) is applied a to input Busy. y • Note external source of 5V. • Program Description: When idle, push-button is open and LED is off. On depressing push-button, LED blinks on and off at nominally 5 pulses per second. @ GIAO TIẾP CỔNG SONG SONG 9 67 CHƯƠNG 9 9 1 9.2. Giao tiếp qua cổng song song 68 _ • Parallel ports are easy to program and faster compared to the serial ports. • But main disadvantage is it needs more number of transmission lines. K Because of this reason parallel ports are not used in long distance 2communications. Y 9.2. Giao tiếp qua cổng song song 69 • Let us know the basic difference between working of parallel port and serial port. • In serial ports, there will be two data lines: One transmission and one receive line. To send a data in serial port, it has to be sent one bit after another with some extra bits like start bit, stop bit and parity bit to detect errors. • But in parallel port, all the 8 bits of a byte will be sent to the port at a time and a indication will be sent in another line. 9.2. Giao tiếp qua cổng song song 70 • In the PC there will be D-25 type of female connector having 25 pins and in the printer, there will be a 36-pin Centronics connector. • Connecting cable will combine these connecter using following convention. 10
- Pin structure of D-25 and Centronics connecters are explained bellow 9.2. Giao tiếp qua cổng song song 71 9.2. Giao tiếp qua cổng song song 72 • Now let us know how communication between PC and printer takes place. Computer places the data in the data pins, then it makes the strobe low. • When strobe goes low, printer understands that there is a valid data in data pins. Other pins are used to send controls to the printer and get status of the printer, you can understand them by the names assigned to the pins. 9.2. Giao tiếp qua cổng song song 73 • To use the printer port for applications other than printing, We need to know how ports are m organized. o • There are three registers associated with LPT port: Data register, Control register and Status register. c . • Data register will hold the data of the data pins of the port. That means, if we store a byte of data to the data register, that data will be sent to the data pins of the port. o • Similarly control and status registers. The following table explains how these registers are o associated with ports. h 74 a 9.2. Giao tiếp qua cổng song song 75 y • * Pins with * symbol in this table are hardware inverted. Than means, If a pin has a 'low' ie. 0V, Corresponding bit in the register will have value 1. @ • Signals with prefix 'n' are active low. That means, Normally these pins will have low value. When it needs to send some indication, it will become high. 9 • For example, Normally nStrobe will be high, when the data is placed in the port, 9 computer makes that pin low. 1 9.2. Giao tiếp qua cổng song song 76 _ • Normally, data, control and status registers will have following addresses. K We need these addresses in programming later 2 9.2. Giao tiếp qua cổng song song 77 Y 9.2. Giao tiếp qua cổng song song 78 • Note: All the parallel ports do not have bidirectional capability. Earlier parallel ports had only output enabled in data pins since printers only inputs data. But latter, to make parallel port capable of communicating with other devises, bidirectional ports are introduced. • By default, data port is output port. To enable the bidirectional property of the port, we need to set the bit 5 of control register. 9.2. Giao tiếp qua cổng song song 79 • To know the details of parallel ports available in your computer, follow this procedure: • Right click on My Computer, go to "Properties". • Select the tab Hardware, Click Device manager. • You will get a tree structure of devices; In that Expand "Ports(Com1 & LPT)". • Double Click on the ECP Printer Port(LPT1) or any other LPT port if available. 11
- • You will get details of LPT port. Make sure that "Use this Port (enable)" is selected. • Select tab recourses. In that you will get the address range of port. 9.2. Giao tiếp qua cổng song song 80 • To start programming, you will need a D-25 type Male connector. Its pin structures can be found in the connector as follows: 9.2. Giao tiếp qua cổng song song 81 • Programming the printer port in DOS: • To start programming the port, we will use DOS. • In DOS we have commands to access the port directly. But, these programs will not work on the systems based on Windows XP, Windows NT or higher versions. • For security reason, higher versions of the windows does not allow accessing the m port directly. o • To program the parallel port in these systems, we need to write kernel mode driver. c 9.2. Giao tiếp qua cổng song song . 82 • When we want to find out whether particular pin of the port is high or low, we need to o input the value of corresponding register as a byte. o • In that, we have to find out whether the corresponding bit is high or low using bitwise h operators. • We can't access the pins individually. So, you need to know basic bitwise operations. a 9.2. Giao tiếp qua cổng song song y 83 • Main bitwise operators that we need are bitwise AND '&' and bitwise OR '|'. • To make a particular bit in a byte high without affecting other bits, write a @ byte with corresponding bit 1 and all other bits 0; OR it with original byte. 9 • Similarly, to make particular bit low, write a byte with corresponding bit 0 9 and all other bits 1; AND it with original byte. 1 9.2. Giao tiếp qua cổng song song 84 _ • In Turbo C, there are following functions used for accessing the port: K • outportb( PORTID, data); 2 • data = inportb( PORTID); • outport( PORTID, data); Y • data = inport( PORTID); 9.2. Giao tiếp qua cổng song song 85 • outport() function sends a word to port, inport() reads a word from the port. outportb() sends a byte to port and inportb() reads a byte from the port. If you include DOS.H header, these functions will be considured as macro, otherwise as functions. • Function inport() will return a word having lower byte as data at PORTID and higher byte as data at PORTID+2. So, we can use this function to read status and control registers together. inportb() function returns byte at PORTID. outport() writes the lower byte to PORTID and higher byte to PORTID+1. • So this can be used to write data and control together. outportb() function write the data to PORTID. outport() and outportb() returns nothing. 9.2. Giao tiếp qua cổng song song 86 • Let us start with inputting first. Here is an example program, copy it and 12
- run in Turbo C or Borland C without anything connected to parallel port. • Then you should see data available in status register and pin numbers 10, 11, 12, 13 and 15 of the parallel port. • Pin 11 (active low) is 0 and all other pins are 1 means it is OK. 9.2. Giao tiếp qua cổng song song 87 • #include"stdio.h" #include"conio.h" #include"dos.h" #define PORT 0x378 void main() { int data; m clrscr(); while(!kbhit()) { o data=inportb(PORT+1); gotoxy(3,10); c printf("Data available in status register: %3d (decimal), %3X (hex)\n", data, data); . printf("\n Pin 15: %d",(data & 0x08)/0x08); printf("\n Pin 13: %d",(data & 0x10)/0x10); o printf("\n Pin 12: %d",(data & 0x20)/0x20); printf("\n Pin 11: %d",(data & 0x80)/0x80); o printf("\n Pin 10: %d",(data & 0x40)/0x40); delay(10); } h } a 9.2. Giao tiếp qua cổng song song 88 y • To understand bitwise operations: you want to find data in pin 15, value of (data & 0x08) will be 0x08 if bit 3 of register is high, 0therwise. @ 9.2. Giao tiếp qua cổng song song 89 9 • We will use the same logic throughout the article. 9 • Now, take a D-25 male with cables connected to each pins. Short all the pins from 18 1 to 25, call it as ground. Now you can run above program and see the change by shorting pins 10, 11, 12, 13 and 15 to ground. I prefer using switches between each _ input pins and ground. Be careful, do not try to ground the output pins. • To find out the availability of ports in a computer programmatically, we will use the K memory location where the address of port is stored. 2 9.2. Giao tiếp qua cổng song song 90 Y 9.2. Giao tiếp qua cổng song song 91 • If you run the the following code in Turbo C or Borland C, You will get the addresses of available ports. 92 9.2. Giao tiếp qua cổng song song 93 • Next we will go to check output pins. To check the output, we will use LED's. I have driven LED's directly from the port. • But it is preferred to connect a buffer to prevent excessive draw of current from the port. Connect an LED in series with a resister of 1KW or 2.2KW between any of the data pins(2 to 9) and ground. With that, if you run the program given below, you 13
- should see the LED blinking with app. 1 sec frequency. 9.2. Giao tiếp qua cổng song song 94 GIAO TIẾP QUA CỔNG NỐI TIẾP 95 CHƯƠNG 9 9.3. Giao tiếp qua cổng nối tiếp 96 9.3. Giao tiếp qua cổng nối tiếp 97 • Above is the standard port addresses. These should work for most P.C's. • If you just happen to be lucky enough to own a IBM P/S2 which has a m micro-channel bus, then expect a different set of addresses and IRQ's. o • Just like the LPT ports, the base addresses for the COM ports can be read c from the BIOS Data Area. . o 9.3. Giao tiếp qua cổng nối tiếp 98 o 9.3. Giao tiếp qua cổng nối tiếp 99 h • The above table shows the address at which we can find the a Communications (COM) ports addresses in the BIOS Data Area. y • Each address will take up 2 bytes. • The following sample program in C, shows how you can read these @ locations to obtain the addresses of your communications ports. 9 9.3. Giao tiếp qua cổng nối tiếp 100 9 • #include 1 • #include • void main(void) _ • { • unsigned int far *ptraddr; /* Pointer to location of Port Addresses */ • unsigned int address; /* Address of Port */ K • int a; • ptraddr=(unsigned int far *)0x00000400; 2 • for (a = 0; a < 4; a++) • { address = *ptraddr; Y • if (address == 0) printf("No port found for COM%d \n",a+1); • else • printf("Address assigned to COM%d is %Xh\n",a+1,address); • *ptraddr++; • } • } BÀI TẬP CĂN BẢN 101 CHƯƠNG 9 Bài 1. 102 • Lập trình C giao tiếp lấy tín hiệu và điều khiển đèn giao thông (xanh, đỏ, vàng) 14
- Bài 1. 103 • #include • #include • #include • #include • #include • • • #define COM1 0x03F8 • #define COM2 0x02F8 • #define DATA_READY 0X60B0 • #define SETTINGS (_COM_9600|_COM_NOPARITY|_COM_STOP1|_COM_CHR8) • • int start_addr(); • int end_addr(); • void group_addr(); m • void display_time(); • void transmit_frame(int*,int*); o • void recieve_frame(int*); c . Bài 1. 104 o • void main(void) • o • { • char send; h • int abyte,in; • int a,b,c,r,addr,status; a • unsigned int ret_value; • int count, arr[6]; y • int bit_num,s_addr, e_addr; • int parity, baud,port,mode; • int com_port_no,stop_bit; • char abyte_stopbit, abyte_baud, abyte_parity,abyte_databit; @ • char arr_baud[]= {0x00, 0x20, 0x40, 0x60,0x80,0xA0,0xC0,0xE0};; • 9 • clrscr(); 9 Bài 1. 105 1 • //COM PORT SELECT SETTINGS// • printf("\nSelect COM Port\nCOM 1\nCOM 2\n"); _ • scanf("%d",&com_port_no); • switch(com_port_no) K • { 2 • case 1:port = 0; • break; Y • • case 2:port =1; • break; • } Bài 1. 106 • //TRANSMISSION MODE// • clrscr(); • addr = start_addr(); • printf("\nESC to exit\n"); • // for(;;) • • { • transmit_frame(&addr,&port); • delay(5); • printf("\n"); • recieve_frame(&port); 15
- • } • printf("\n"); Bài 1. 107 • getch(); • • } • • void transmit_frame(int*addr,int*port) • { • • unsigned int in; • int trans,i; • char arr[] = {0x01}; • • • • if(kbhit()) • { m • if(getch()=='\x1B') • { exit(0); o • } • } c . Bài 1. 108 o • else • { o • trans = arr[0]; h • printf("%x ",trans); a • _bios_serialcom(_COM_SEND,*port, trans); • delay(100); y • } • @ • } 9 Bài 1. 109 9 • void recieve_frame(int*port) • {int v; 1 • int trans; • _ • unsigned int status,out; • { K • status = _bios_serialcom_COM_STATUS,*port,SETTINGS); • printf("%x",status); 2 • • out=_bios_serialcom(_COM_RECEIVE,*port,0); • trans = out; Y • printf("\n%x",trans); • • • • } • • } Bài 1. 110 • start_addr() • {int s_addr1; • printf("\nStart Address:"); • scanf("%x",&s_addr1); • return(s_addr1); • } 16
- Bài 2. 111 • Lập trình C giao tiếp lấy tín hiệu từ Card của hãng Advantech. Bài 3. 112 • Lập trình C giao tiếp với mô đun của màn hình LCD Bài 3. 113 • LCD modules are available in a wide range like 8x1, 8x2, 16x1, 16x2, 20x2, 20x4, 40x4. Here we have used 16x2- that means 2 rows of 16 characters. • It is a Hitachi HD44780 compatible module, having 16 pins including 2 pins for backlight m • Following table gives pin structure of LCD module. LCD modules without backlight o will have only 14 pins. If you are using such LCDs, simply ignore 15th and 16th pins c . Bài 3. 114 o Bài 3. 115 o • Here, we are going to write on the LCD module and not reading back. So, R/W is h connected to ground directly. a • We need not have to input any data through, so all output pins are used in our application. Data pins of LCD are connected to data pins of the port. y • Strobe signal (Pin 1 of D25 connector) is given to E (Pin 6 of LCD), Select printer (Pin 17 of D25) is connected to RS (pin 4 of the LCD). @ Bài 3. 116 9 9 Bài 3. 117 1 • In the above diagram, LCD module is connected to the lpt port using D25 _ male connector. • Pin number 3 of the LCD is for adjusting the contrast, connected in such a K way that it can be varied from 0V to 5V. Keep it to 0 initially. 2 Bài 3. 118 Y Bài 3. 119 Bài 3. 120 • #include #include #include #include #define PORTADDRESS 0x378 /* Enter Your Port Address Here */ #define DATA PORTADDRESS+0 #define STATUS PORTADDRESS+1 #define CONTROL PORTADDRESS+2 void lcd_init(void); void lcd_write(char char2write); 17
- void lcd_putch(char char2write); void lcd_puts(char * str2write); void lcd_goto(int row, int column); void lcd_clear(void); void lcd_home(void); void lcd_cursor(int cursor); void lcd_entry_mode(int mode); Bài 3. 121 • void main(void) { • lcd_init(); lcd_goto(1,1); lcd_puts("Welcome To"); lcd_goto(1,0); lcd_puts("electroSofts.com"); m while(!kbhit() ) //wait until a key is pressed... o {} •} c . void lcd_init() { o • outportb(CONTROL, inportb(CONTROL) & 0xDF); //config data pins as output o outportb(CONTROL, inportb(CONTROL) | 0x08); h //RS is made high: control (register select) a y Bài 3. 122 • lcd_write(0x0f); delay(20); @ lcd_write( 0x01); delay(20); 9 lcd_write( 0x38); delay(20); 9 •} 1 void lcd_write(char char2write) { _ • outportb(DATA, char2write); outportb(CONTROL,inportb(CONTROL) | 0x01); /* Set Strobe */ K delay(2); outportb(CONTROL,inportb(CONTROL) & 0xFE); /* Reset Strobe */ 2delay(2); •} Y Bài 3. 123 • void lcd_putch(char char2write) { • outportb(CONTROL, inportb(CONTROL) & 0xF7); //RS=low: data lcd_write(char2write); •} void lcd_puts(char *str2write) { • outportb(CONTROL, inportb(CONTROL) & 0xF7); //RS=low: data while(*str2write) lcd_write(*(str2write++)); 18
- •} Bài 3. 124 • void lcd_goto(int row, int column) { • outportb(CONTROL, inportb(CONTROL) | 0x08); if(row==2) column+=0x40; /* Add these if you are using LCD module with 4 columns if(row==2) column+=0x14; if(row==3) column+=0x54; */ lcd_write(0x80 | column); •} m Bài 3. 125 o • void lcd_clear() c { . • outportb(CONTROL, inportb(CONTROL) | 0x08); lcd_write(0x01); o •} • void lcd_home() o { • outportb(CONTROL, inportb(CONTROL) | 0x08); h lcd_write(0x02); •} a • void lcd_entry_mode(int mode) { y • /* if you dont call this function, entry mode sets to 2 by default. mode: 0 - cursor left shift, no text shift 1 - no cursor shift, text right shift @ 2 - cursor right shift, no text shift 3 - no cursor shift, text left shift 9 */ outportb(CONTROL, inportb(CONTROL) | 0x08); 9 lcd_write(0x04 + (mode%4)); •} 1 _ Bài 3. 126 K • void lcd_cursor(int cursor) { 2 • /* set cursor: 0 - no cursor, no blink Y 1 - only blink, no cursor 2 - only cursor, no blink 3 - both cursor and blink */ outportb( CONTROL, inportb(CONTROL) | 0x08 ); lcd_write( 0x0c + (cursor%4)); •} Bài 3. 127 Bài 3. 128 • Program to display date and time in an LCD module: Just replace the 'main' of previous program with the following and run. 19
- Bài 3. 129 • void main(void) { • struct time t; struct date d; char strtime[17]; • textbackground(0); clrscr(); textcolor(0); textbackground(10); gotoxy(8,5); cputs(" "); m gotoxy(8,4); o cputs(" "); • lcd_init(); c . lcd_cursor(0); o Bài 3. 130 o • while(!kbhit()) { h • gettime(&t); getdate(&d); a lcd_goto(0,4); sprintf(strtime,"%02d:%02d:%02d", t.ti_hour%12, t.ti_min, t.ti_sec); y lcd_puts(strtime); gotoxy(12,4); cputs(strtime); @ lcd_goto(1,3); sprintf(strtime,"%02d:%02d:%4d", d.da_day, d.da_mon, d.da_year); 9 lcd_puts(strtime); gotoxy(11,5); 9 cputs(strtime); delay(200); 1 •} textbackground(0); _ textcolor(7); •} K KẾT THÚC 131 2 CHƯƠNG 9 Y 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng hợp ngữ - Chương 2
9 p | 110 | 28
-
Bài giảng hợp ngữ - Chương 3
8 p | 106 | 25
-
Bài giảng hợp ngữ - Chương 4
7 p | 96 | 24
-
Bài giảng hợp ngữ - Chương 6
8 p | 100 | 21
-
Bài giảng hợp ngữ - Chương 7
10 p | 103 | 21
-
Bài giảng hợp ngữ - Chương 8
8 p | 75 | 21
-
Bài giảng hợp ngữ - Chương 1
10 p | 91 | 20
-
Bài giảng hợp ngữ - Chương 5
3 p | 116 | 20
-
Bài giảng hợp ngữ - Chương 9
8 p | 84 | 19
-
Giáo trình Lập trình mạng với ngôn ngữ java: Phần 2
85 p | 76 | 14
-
Giáo trình Kỹ thuật lập trình C: Căn bản & nâng cao - Phần 2
236 p | 25 | 14
-
Chương 9: Truy cập trực tiếp vào bộ nhớ
7 p | 70 | 11
-
Giáo trình C++ và lập trình hướng đối tượng: Phần 2
275 p | 32 | 10
-
Giáo trình Lập trình căn bản: Phần 2 - Ths. Nguyễn Văn Linh
42 p | 74 | 8
-
Giáo trình Lập trình căn bản: Phần 2
46 p | 43 | 6
-
Bài giảng Lập trình Java căn bản: Chương 9 - ThS. Võ Đức Cẩm Hải
50 p | 7 | 5
-
Các phương pháp lập trình trực quan: Phần 2
103 p | 8 | 3
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn