ࡱ> ` Abjbj e^^^^wwwwtwD*Ny^yyyy,Kmoooooo$hbJQ!l^^yyu4 ^Ryymmj%"yBy ` bDw20*dcru\фcccccc*oww^^^^^^ LAB #1 - RAM Memory EET 211 - K. Dudeck Connect a seven segment (common cathode) display to a 74LS48 decoder/driver. Use the pin information for the display as shown on the attached drawing (page 2). Test the display by simulating a BCD input to the driver. This RAM has the capacity to store 16 4-bit binary numbers. The pulser on the counter increments the address of the RAM and displays that address on the four LEDs. The seven segment display shows the value at that memory location. __ When the negative pulser, connected to the WE (write enable), goes low, the value of the four DIP switches is written to the memory location. Try writing your 11 digit student number into the first 11 memory locations on the RAM. Try reading back your lab partner's student number. (Design)-- Using principles learned in this lab, design a memory system which will store and display (32) 8-bit numbers. Draw a block diagram of your design and explain how it operates, do not build.    LAB 2 - Using the 8051 Simulator Program EET 211 - K. Dudeck, Penn State Hazleton The 8051 Simulator is written by Steve Nolan and is a nice way to develop 8051 programs off line. The simulator is freeware. The Simulator will only read programs that have been assembled and converted into an Intel Hex format file. This processes begins with writing the 8051 assembly program using a text editor and saving it as an *.ASM file. The assembler produces a *.OBJ binary file. Then a utility called an Object to Hex converter OHis run and the result is a *.HEX file that is burned into the ROM of the 8051. This process is shown below. prog.asm ((Assembler) ( proj.obj ( (OH ultility) ( prog.hex The 8051 assembler used here is called AS31 and is a free 8051 assembler originally written by Ken Stauffer. Versions of AS31 found here include important bug fixes and added features, such as standard intel-hex output format that can be used for the Nolan Simulator as well as for use with PAULMON2 and EPROM programmers. AS31 is a good tool for building small 8051-based projects that are written in 100% 8051 assembly language. All the files needed to test this out are on the course webpage. Procedure Download the file sim8051.zip from the course homepage into a directory you wish to work in. Extract all the files therein. Using Note Pad, view the assembly text file test1.asm You should see a program like this: .ORG 0H ; Assembler directive to load program at 0000H MOV R5,#99H MOV R7,#69H MOV A,#10H ADD A,R7 ADD A,#01H HERE: SJMP HERE .END ; Assembler directive marking program end 3) Minimize note pad, do not close it. Then go into the DOS prompt. Unfortunately, DOS always places you into the C:\windows directory. Using the CD command, get into the directory you placed these files into. You will see the a31.exe file which is the assembler. 4) Assemble the TEST1 program by typing > a31-l test1.asm This produces a test1.hex file. The simulator will run this. The -l (the letter L option) produces a list file. Return to windows by typing > exit View the test1.lst file using Notepad. You will see the machine code produced by the assembler. Using Windows explorer, run the sim8051 application. Then Load the test1.hex into the simulator. It will confirm it loaded 11 bytes from the hex file. Then hit the view code listing button to see the 11 bytes of machine code and the corresponding assembly program. Also hit the View Processor registers button. This program will adjust the contents of the registers. Run the program by hitting the Execute Loaded File button. This program should load a 99H into R5, a 69H into R7, and after loading a 10H into the accumulator, it adds the contents of R5 plus another 01H yielding a final result of 7A residing in the accumulator. The program runs indefinitely because of the SJMP 9 command, but hit the Stop button. This stops and resets the processor. All the register values clear. Single step through the program by hitting the Single Step button. You can observe what happens to the registers one instruction at a time in this manner. For you to do: Modify the TEST1.asm so that it places your age into R0, your most comfortable temperature into R1 and adds 20 to your age and places that result into the accumulator. Assemble and run your program on the simulator. LAB 3 Intro to Paul 8051 Microcontroller Board EET 211 - K. Dudeck Introduction In this lab we will become familiar the Paul Stoffregens 8051 Microcontroller Board. This 8051 development board provides an easy and low-cost way to develop projects based on the 8051 microcontroller, without the need to purchase any other equipment, such as EPROM programmers or emulators. It accomplishes this by coming equipped with a FLASH ROM containing a boot-up program called PAULMON2. PAULMON2 is a user-friendly 8051 family monitor, intended for use in a single board computer like the development board used in this course. By placing PAULMON2 in the board's EPROM, the board will "boot-up" to a friendly menu-driven monitor which allows you to download your programs to RAM and run them, which is much faster and easier than reprogramming the EPROM. PAULMON2 also provides several features to help you debug your programs, including a de-assembler and single-step program execution. It is very easy to use and together with an 8051 family assembler, such as the one above, it provides a very low-cost 8051 development system. PAULMON2 is in the public domain. You may use pieces of the code in your own programs and even incorporate the code into your own commercial products, if you wish. For more information on the board and software details, visit:  HYPERLINK "http://www.pjrc.com/tech/8051/ " http://www.pjrc.com/tech/8051/  The memory map for the board is shown below. Memory Map of Paul 8051 Microcontroller Board 0000H 1FFFH 8K ROM with PAULMON2 permanently stored. 00H FFH Internal RAM Amtel AT89C52 Chip Port 0 Port 3 Internal I/O Ports (port 1 direct) 2000H 2FFFH 8K External RAM (user programs) 6264 Chip 4000H 4003H Port Expansion 82C55 Chip 4000H -Port A 4001H Port B 4002H Port C (on board LEDs) 4003H Port Program Byte 8000H 81FFH 8K External Flash ROM SST39F512 The procedure for running a program on the 8051 board is as follows. First the assembly program is written using a text editor, such as notepad. The program is stored as a text file with a *.asm file extension. Then an 8051 assembler utility, such as as31.exe, is used to generate the machine code in the Intel hex-file format. The board is capable of downloading this hex file into its memory. Normally the program is downloaded into the boards external RAM location, 2000H. The first couple of lines of the original assembly program contains a 64 byte header file. Two of the lines, shown below, cause the program to be downloaded beginning at RAM location 2000H. .equ locat, 0x2000 ;Location for this program .org locat To cause it to be loaded into the flash memory, set the location between 0x8000 to 0xFF00 (the last two digits must be zero for PAULMON2 to recognize the header). To program the flash memory, download your program in the same way as loading it into RAM, and PAULMON2 will automatically handle the flash programming as it receives the data. The portion of flash memory where you're downloading must be erased, otherwise the download will not work and you'll see errors reported. Because the RAM doesn't need to be erased before it is written, it's easier to develop your code by downloading it into the RAM, and then setting it to the flash when it's working. If you want to make the board run your program immediately upon power up of the board, as in a dedication system application, you must have the board bypass the running of the PAULMON2 startup program. This is accomplished by editing a line in the 64 byte assembly header file. The appropriate line is shown below: .db 35,255,0,0 ;id (35=prog) To do this, change the "35" to "249" in the header. More details can be found in the PAULMON2 manual. Once you've done this, the board will boot up and run your program, stored in Flash ROM, instead of PAULMON2. Once this program has been downloaded into memory, the PAULMON2 program will never again to be able to be run. You would never be able to download another program to board unless there were a way to erase the Flash ROM without using the PAULMON2 software. To manually erase the flash ROM and get back to PAULMON2, short the "ERASE FLASH" jumper and press the reset button. The board will now boot-up to PAULMON2 as before. Procedure There is a very good detailed description of Using the board for the first time on Paul Stoffregens web page listed below.  HYPERLINK "http://www.pjrc.com/tech/8051/board3/first_use.html" http://www.pjrc.com/tech/8051/board3/first_use.html Connect the serial cable from the COM1 port of the PC to the upper D connector on the 8051 board. Run the Hyperterminal application named 8051 Board. This session has been already been created with the proper communication settings the for the 8051 board, as described in the web site. Apply 12 - 15VDC power to the board. Hit Enter on the keyboard and the welcome message should appear. Type a ? to see a list of functions the Monitor Program has performs. Try editing the External RAM using the E command. Once there, change the contents of memory locations (using control-E and control-X) 2000H to 200EH to the following: 2000: 45 45 54 20 32 31 31 20 69 73 20 66 75 6E 21 24 Notice how the corresponding ASCII are displayed. What is the text message you just programmed? Clear the Hyperterminal screen, turn off the power supply and hit the Enter. Notice how the RAM contents are gone. We will now download our first assembly program to the Board. This program is called Blink.asm and it is an assembly text file. In order for this program to be transferred to the boards RAM, it must be assembled and converted into an Intel hex file, named Blink.hex. To do this, we must run the DOS-based assembler program, as31.exe . This assembler is available from the sim8051.zip file downloaded from the course homepage. Go into DOS and using the CD command, change the directory to the one that contains the unzipped files that you downloaded. Then to assemble the blink program type: as31 blink.asm Notice how a file called blink.hex is generated. This is the HEX text file that will be sent to the 8051 board at RAM location 2000H. Return to windows by typing exit From the hyperteminal window, select Transfer Send text file. You will need to set the all file type option in notepad to list the blink.hex file. Send the BLINK.HEX file to the board. From PAULMON2 issue the R command. All programs written for PAULMON2 contain a 64 byte header. In this header are the program names and download locations. The R command recognizes that header and names. Run the blink program. The LEDs will blink. To end the program, press ESC on the keyboard. Cycle the power on the board. Try to run the program again. You will notice that PAULMON2 states that there are no program headers found in memory. We will next download the blink program directory into flash ROM. To do this, edit the blink.asm and change the first line to read: .equ locat, 0x8000 ;Location for this program Save the changes to the assembly program and compile and download the new version to the board by repeating steps 8 and 9. But before doing this you must make sure that the FLASH ROM is erased. This is done by issuing the PAULMON2 Z command. Run the program again. Cycle the power on the board, and try to run the program again. This time it is there. There is a way to examine the assembly code of a program that is in RAM or ROM. To view the code of this program, do the following PAULMON2 commands. Edit external RAM E Goto to Memory loactaion 8040 ^G 8040 (where our program begins after the 64 (40H) byte header file). You see only the machine code. Quit this ^Q Now notice PAULMON2 set to this location, 8040H. Issue the program list command L Notice the assembly and machine code. Run the program again using the R command. We will now modify the blink program so that it will be a self starting program. This is mentioned in the introduction. First, we MUST erase the Flash ROM using the Z command. Edit the blink.asm file and locate the line : .db 35,255,0,0 ;id (35=prog) Change the 35 to 249, and re-assemble and download to the board, as described previously. Cycle the power to the board, and notice the program runs automatically. Cycle the power again. This board will forever more run the dedicated blink program. In order to get PAULMON2 to run again in order to download any future programs, the Flash ROM must be erased by shorting the Erase Flash jumper located on the board, and pressing the reset button. The board boots up as before. Edit the blink.asm so that it will be downloaded into RAM again by changing back the location to 0x2000 and the program id back to 35. You can also make the LEDs blink faster by changing the number of times the delay loop runs from 250 to 100 in the following portion of the program. delay: mov r0, a dly2: mov r1, #250 dly3: nop You can also change LED pattern by editing the LED look up table. The 0s indicate where the LED is ON. Change the values in the look up table so that only one LED is on at a time. The decimal number that follows is a second delay. Change all of them to 50. The first couple of line should look like: table: .db 01111111b, 50 .db 10111111b, 50 .db 11011111b, 50 .db 11101111b, 50 Finish with the rest of the data table. Assemble, download and run this new modified blink program. This is the end of this lab. LAB 4 Simple I/O Programming for the 8051 Microcontroller Board EET 211 K. Dudeck Introduction In this lab we see how to we will be able to we will see how to read data from 8 switches into the 8051 and also be able to send a 8-bit binary number from the 8051 out to 8 LEDs. The 8051 controller board makes use of an 8255 I/O chip. This chip is located all the on the right side of the board. The chip uses a technique called Mapped Memory I/O. This means that the I/O chip appears to the processor as simply a group of memory locations. Moving data to these memory locations causes the chip to send data out of one of its output ports, while moving data from these memory locations causes data to be read from one of chips input ports. The 8255 I/O has four addressable ports. Three are actual ports, and one is a port programming register that is used to configure how each of the other ports acts, input or output. The following address show how these ports are assigned on the 8051 board. Port nameAddressCommentsPort_a4000HInput (Switches)Port_b4001HPort_c4002HOutput (LEDs)Port_abc_pgm4003HPort Program Register It is important to note that the each of the 8255 ports can be programmed as input or output ports, but the selections listed here reflect the actual hardware configuration on the 8051 microcontroller board. Additionally, Port C can be split programmed, half input half output. The configuration for the Port Program register is as follows: I/O=1 BSR=0Mode = 0Mode = 0Port A In = 1Port C h Out = 0Mode = 0Port B Out = 0Port C l Out = 0 We must therefore send the value 1001000 or 90H to memory location 4003 before any attempt to read the switches or write to the LEDs is made. The following code must be placed in the beginning of your assembly program to accomplish this: .equ port_abc_pgm, 0x4003 mov dptr, #port_abc_pgm mov a, #90H movx @dptr, a ;Port A in, B and C out In order to read the switches at Port A into the Accumulator, the following assembly code must be entered into your program: .equ port_a, 0x4000 mov dptr, #port_a ;Read Port A clr a movc a, @a+dptr In order to send to contents of the Accumulator to the LEDs on Port C, the following code must be entered into your program: .equ port_c, 0x4002 mov dptr, #port_c ; Write to Port C cpl a ; complement A because a 0 turns on a LED movx @dptr,a The entire program that will continuously read the value of the switches into the Accumulator and send that value to the LEDs is shown on the page. Notice some key elements of this assembly program. The program location where is will be downloaded is 2000H, the beginning of RAM. The 64 byte header file required by PAULMON2 is first defined, and the real program code will be located 64 bytes later, or at address 2040H. This program also utilizes a subroutine called esc at ROM location 003EH in PAULMON2. When this subroutine is called, it goes out to the computer keyboard and checks to see is the escape key was pressed. If it was, the C flag is set, and our program will break out of the continuous loop and return to PAULMON2. This is a useful way to do break out of a continuous loop and return to PAULMON2. This can be done for any future programs we write for the 8051 board. The program itself first configures the 8255 chip correctly by sending 90H to the Port Program register. Then the loop is set up and the program first reads Port A and then sends the value to Port C and repeats until the escape key is press on the keyboard. The accumulator must be complemented prior to sending the value to Port C because the LEDs are connected so that a 0 turns on the corresponding LED.  SHAPE \* MERGEFORMAT  Procedure Using Notepad, enter the assembly program listed above and save it as simio.asm. There is a file called Blank.asm contained in the zip file that contains the basic structure for a PAULMON2 program. This is a good starting point for all your programs. Be sure to the save your modified program as another name and also change the listed program name in the 64 byte header file. You must save using the ALL FILES option. Assemble the program using the as31 assembler as demonstrated in the previous lab. Download the simio.hex file to the board using Hyperterminal. Run the program and see how it works. *Program Challenge* Write another program that will continuously (until escape is pressed) display the contents, as a binary number on the LEDs, of any of the first 256 RAM locations beginning with 2000H. This means that the highest address is 20FFH. Therefore, the high byte of the address will ALWAYS be 20H, and the low byte of the address will be 00-FF. The actual memory location that will be displayed on the LEDs will be 20xx, where xx is 8-bit byte obtained by reading the switch positions on Port A. Address of memory location to be displayed : DPTR = 2000H + (Port A) The program you have written functions like the E command in PAULMON2, without actually running PAULMON2. Assemble and run this program. Verify that when all the switches on Port A are off, the LED display shows : On Off On Off Off On Off On This value could have been anticipated, why? Turn on the least significant switch, the one closest to the end of the board. The LED display should show: On On On Off Off On Off On Again, why? Modify this program so that is runs automatically when the board is powered up. This is the end of this lab. LAB 5 - Loops and Decision Making EET 211 - K. Dudeck Introduction In this lab we will explore the use of conditional jumps, such as CJNE . This instruction compares two bytes and jumps to a label if they are not equal. For example, CJNE A, #43H, HERE jumps to the label HERE if the accumulator is NOT equal to the value 43H. If the value is equal then the next program line is executed. The concept of nested loops will be used to illustrate how to generate time delays. Each 8051 instruction takes a number of machine cycles to operate. The time for one machine cycle to execute, tm, is related to the boards crystal frequency, fxtal .  EMBED Equation.3  For the Paul 8051 boards, the crystal frequency is 11.0592MHz, which has the machine cycle time, tm = 1.085s. To calculate the total delay time for a program or subroutine, simply add the number machine cycles for each instructor and multiply that total by 1.085s. The program below uses to nested loop to count down the inner loop 255 times, and repeat that process  num times in the outer loop.   SHAPE \* MERGEFORMAT  The total number of machine cycles for this subroutine is calculated: Delay time = (#machine cycles)  tm = (1025  num + 11)  1.085s For num=100, the delay time is 111.2ms, which is a little under 1/8th of a second. Procedure: Using the CJNE command, write a program that reads the switches at Port A and turns on the LEDs at Port C continuously until ALL the switches are on, then the program should end and return to PAULMON. This is a variation of a program already written in the previous lab. Assemble, download, and run this program. Write a program that sends the number 00H to the LEDs and then the number 01H to the LEDs and repeats until the key is pressed. Analyzing the total number machine cycles in between the light ON then off. When this program is running, place an oscilloscope on the LED. See if you can experimentally verify the boards crystal frequency. Show how you measured and calculated this. Calculate the num value needed to make the delay subroutine to generate a delay of exactly of a second. Then add that subroutine so that the light blinks on for half a second and then off for half and repeats until the is pressed. Write another program that causes the LEDs to be an 8-bit binary counter that counts up by one every quarter of a second until the value on the LEDs matches the pattern set on the switches. Write a program that will produce a 1 kHz Square wave that comes of the least significant bit of Port C. Using an Oscilloscope, see that it is working. LAB 6 Subroutines and Structured Programming EET 211 - K. Dudeck Introduction: In this lab, we will learn how to use subroutines. A subroutine is a group of instructions that are written to be called at various points of a main program. A subroutine can be appended to the end of a main program, as the delay subroutine was in the previous lab, or accessed from code already written in ROM if the starting address is known. The program below will print to the terminal two ASCII text strings. It uses two subroutines pstr and newline. These subroutines have already been written for you and exist in the PAULMON program. To use them, you simply need to know the ROM address that they begin at, how they work, and include a equate declaration at the top of your program with this information. pstr is stored at ROM location 0038H and will print a string stored at the beginning address pointed to by the DPTR register. It will print each character, found in consecutive memory location to the terminal until it finds a ASCII value of 0 which is used to denote the end of the string. The subroutine will then terminate. newline is stored at ROM location 0048H and will essentially send a carriage return and a line feed. This is the same thing that happens when you hit the ENTER key on your keyboard. Using this subroutine enables you print the second message on a newline. Notice how the .equ statements contain the information for the assembler to link these subroutines into your program. .equ locat, 0x2000 ;Location for this program .equ esc, 0x003E ;paulmon2's check for esc key .equ pstr,0x0038 ;prints a string pointed to by DPTR and ending with 0. .equ newline,0x0048 ;prints a new line ;[Pauls header file must be here] do_msg: mov dptr, #mesg1 lcall pstr lcall newline mov dptr, #mesg2 lcall pstr loop: lcall esc jc exit sjmp loop exit: ret mesg1: .db "EET 211 is a great course!",0 mesg2: .db "Ken Dudeck is the instructor.",0 Procedure: Assemble, download, and run this program on the Microcontroller board. Modify this program so that it first prints a message asking the person if he feels well today. The program should then get a character from the keyboard by using an existing subroutine in PALUMON called cin stored at ROM location 0032H. If the person answers Y your program should then say Great!, if the person says anything else, your program should say Too Bad!. Do not forget to include the equate declaration for the cin subroutine in the top of your program. Assemble, download and run this program. This is the end of this lab. LAB 7 - Arithmetic and Logical Instructions EET 211 - K. Dudeck The following program, get2bcd.asm, reads a two digit decimal number from the keyboard and then sends that two-digit decimal number to a LEDs as two digit BCD number. The program uses an appended subroutine, getnum that will read a ASCII character from the keyboard but ensure that it is a valid decimal number 0-9 (ASCII values 30H-39H). The subroutine will not terminate until one of those valid codes is received from the keyboard. The subroutine then converts the ASCII the corresponding BCD code by clearing the upper four bits of the code and returns the BCD number in the accumulator. ; get2bcd.asm .equ locat, 0x2000 ;Location for this program .equ cin,0x0032 .equ esc, 0x003E [Pauls Header File here] startup: mov dptr, #port_abc_pgm mov a, #90H movx @dptr, a ;Port A in, B and C out begin: lcall getnum swap a mov r5,a lcall getnum orl a,r5 cpl a mov dptr,#port_c movx @dptr,a lcall esc jc exit sjmp begin exit: ret getnum: lcall cin cjne a,#2FH,cnt1 sjmp getnum cnt1: jc getnum cjne a,#3AH,cnt2 sjmp getnum cnt2: jnc getnum anl a,#0FH ret .end Procedure 1) Enter, assemble, download, and Run this program to the Micro-controller board. 2) Write a program that requests the user to enter the number of seconds for a count down timer to count down from. Once that value is entered, the program counts down from that value and sends the value to LEDs as a BCD number. Once the number reaches zero, the program sends a BANG!! to the display and then ends. 3) Write a program that counts how many switches are closed at the Switches Port and continually lights the LED that corresponds to how many. For example, if no switches on LED #0 is on. If three switches are on LED#3 is on. When any more than six switches are on, the program terminates. LAB #8- Analog to Digital Conversion EET 211 -K. Dudeck Microprocessors have the ability to interface to the external world via I/O ports. These I/O ports allow the microprocessor to read input bits (8 in the case of the 8085) from an external source (i.e. switches, sensor) into the microprocessor, or write the contents of a memory location out to an external destination (i.e. LEDs, control surfaces). In either case, the I/O information is DIGITAL, on/off. Some applications require that the microprocessor deal with analog information. For example, reading the voltage off some circuit element which can range from 0 to 24V. In that case the voltage is not simply on or off, but rather a range of possibilities. An Analog to Digital Converter (ADC) is used to digitize the voltage level to an 8-bit binary number that is proportional to the voltage. Another application may require the microprocessor to drive a voltage signal into a circuit ranging from 0 to 10V. A Digital to Analog Converter (DAC) is needed to accomplish this task. In this lab you will use an ADC0809 to convert an analog signal from a function generator into an 8-bit binary number. You will also use a DAC08CP to convert an 8-bit binary number into an analog signal that will be displayed on the o-scope. Although in this lab you will not be interfacing the ADC and DAC directly to the microprocessor, future labs will illustrate how digital interfacing is accomplished, which when combined with the concepts learned here, make analog interfacing possible. Equipment Needed Components Needed (1) Function generator (1) ADC0809 ADC (1) O-scope with probes (1) DAC08CP DAC (1) TTL designer console (1) LM741 Op Amp (1) +15 -15V power supply (1) 74LS163 4-bit Counter PART I. Analog to Digital Conversion. Study the circuit containing the ADC0809, Figure 1, which is found on the next page. Also review the data sheet for the ADC0809, found at the end of this lab write up on page 6. The ADC0809 has the potential of converting 8 different analog channels (pins IN 0 to IN 7) one at a time. The channel that is selected to be converted is determined by the three-bit address input (AD C, AD B, AD A -where AD A is least significant). Figure 1 shows the address selections all grounded and therefore IN 0 is selected. The reference voltage establishes the lowest (VR-) and highest (VR+) voltages that the input voltage will be compared to. This voltage range is divided into 256 segments. The value that the input voltage nearest compares to will be placed on the data outputs, D7->D0 (or 2-1 -> 2-8). Figure 1 shows the VR- connected to ground, and the VR+ connected to 5V. This means that 0V will be represented as $00 while 5V is represented as $FF on the data outputs. The resolution of this eight bit ADC is: Resolution = (VR+ - VR-)/256 = (5-0)/256 = 19.5mV . If the output is $2C, what's the input voltage? solution: $2C = 2 x 16 +12 = 4410 (Convert to Decimal) Vin = Output x Resolution = 44 x 0.0195 = 0.858 V In order for the ADC to operate, the OE must be high, and the ALE and START must pulsed to start a conversion.  Figure 1 - Analog to Digital Conversion Procedure: 1) Connect the circuit of figure 1. Connect the four most significant data outputs, D4 -> D7 to the four LEDs. Verify that grounding the IN 0 produces a $0 output, and connecting IN 0 to 5V produces a $F output. The pulser switch must be pulsed to take a new reading. 2) Using the o-scope, set the function generator to a 1Hz sine wave with 5V peak to peak output and a 2.5V DC offset. Connect this signal to the IN 0 pin. While observing the o-scope, sample the voltage at various times along the sine wave. 3) To achieve continuous sampling, disconnect the pulser switch and connect the EOC (End of Convert) output to the START and ALE inputs. PART II. Digital to Analog Conversion. Study the circuit shown in Figure 2. This circuit uses a DAC08CP Digital to Analog converter chip. The chip takes an 8-bit binary input (B8 -> B1) and converts it to an analog voltage that is in the range of VREF- to VREF+ (in this case, 0 -> +15V). The chip requires the standard power of 5V and GND and additionally a negative supply rail of approximately -15V. In order for the DAC to supply an external analog voltage, it is common practice to use an operational amplifier, such as a LM741 or equivalent, to buffer the DAC output. This is shown in Figure 2. The circuit in Figure 2 will convert any 8-bit binary number to an analog voltage ranging from 0 -> +15V. Pin diagrams for the DAC08CP and the LM741 are found at the end of this lab, on page 6.  Figure 2 - Digital to Analog Conversion  Procedure Connect the circuit shown in figure 2. Use a 74LS163 counter to drive the four most significant input bits of the DAC. Set the clock input to 10kHz square wave. Connect the output of the LM741 to the o-scope and observe a digitally generated saw-tooth wave. If you expand the time base of the o-scope you will notice that the saw-tooth wave is generated in 16 distinct steps that correspond to the 16 count states of the counter. The voltage steps (resolution) should be approximately 0.93V (15V/16) apart. Sketch carefully what you see taking note to the o-scope sensitivity settings. Measure the frequency of the saw-tooth wave. It should be 1/16th of the clock frequency. See if you can make the waveform smoother by designing an 8-bit counter to drive all 8 data inputs of the DAC, and thus generate 256 steps in the saw-tooth wave. An 8-bit counter can be designed by using the RCO (ripple carry output) of the least significant 4-bit counter into the clock input of the most significant 4-bit counter.    .equ locat, 0x2000 ;Location for this program ;82C55 memory locations .equ port_a, 0x4000 .equ port_b, 0x4001 .equ port_c, 0x4002 .equ port_abc_pgm, 0x4003 .equ esc, 0x003E ;paulmon2's check for esc key .org locat .db 0xA5,0xE5,0xE0,0xA5 ;signiture bytes .db 35,255,0,0 ;id (35=prog) .db 0,0,0,0 ;prompt code vector .db 0,0,0,0 ;reserved .db 0,0,0,0 ;reserved .db 0,0,0,0 ;reserved .db 0,0,0,0 ;user defined .db 255,255,255,255 ;length and checksum (255=unused) .db "Simple I/O",0 ;max 31 characters, plus the zero ,-  * + F G ` d e (L\ zqqh6CJ]hOJQJ^JhOJQJ^JhCJOJQJ^JhCJmHnHu jhCJmHnHu hCJ h5\hjh3CJUmHnHuhh|CJOJQJaJh3h3CJOJQJaJ h3CJ h35\h3),- &  B C D              & Fgd3gd3^gd3@     ! " # $ % & ' ( * , - . / 0 1 2 3 4 5 6 7 8 9 : gd3: ; < = > ? @ A B C D E F H I J K L M N O P Q R S T U V W X gd3X Y Z [ \ ] ^ _ *+-.;<^gd & Fgdgdgdgd3O_o~@_qr ,^,gd & Fgd^gdgd^gdqr)67;<jt  M { h$p$&&"(V(****Y-c---7.8.9.l.m.1\13ŻŮŝŏņŝŝŝŝŻys hUCJjhUCJUhU6CJ]jhUUmHnHuhU5CJ\hU0JCJjhUCJUjhUCJU hUCJ hc/CJhUh3hc/ hhhh6CJ] hCJh:hCJ-  89'()*+,-./012345,^,gd & Fgdgd567j%&'(_`  L M { !h^hgd!!!"H"{"""0#1#d#&&l&&&'w(1)2)u*v***+++,,h^h,T-U-V-W-X-Y-c-d---o.p....// 0 0R0S001M1N111^ & Fh^h112?2@222F33344e44455a555556x6666777h^h & F334555J>L>>>@@ A AAfAAAAAAACCDDDD#D'D(DeDmDyDDDDEEFEXFYF%G>HGHHHOHPHXHZH`HaHfHgHwHyHHHHHʹ͟ h~VCJ h)CJ hK]CJ hcCJhQ^hQ^CJ hQ^>*CJ hl;CJh mh3hl; h mCJ hU5\hU56\]hUhU5CJ\ hUCJhU6CJ]:77888884959999<:::::#;$;n;;;;;5<b<< ^  & F h^h & F<<<===>===>>>>7>;>p>s>>>>3????&@@@@^h^h & F & F @AAfAAAAAA BBCCDCKC^CqCCCCCCDDDD D!D"D ^ h^h"D#DeDxDyDDDFE%G,H-H>HHHPHYH$Ifl$Ifl$Iflgdl;^gdl;YHZHaHgHxH_O?/$Ifl$Ifl$Iflkd$$Ifl   FB $V2  t0  6    44 lapxHyHHHH_O?/$Ifl$Ifl$Iflkd$$Ifl  FB $V2 t0  6    44 lapHHHHH_O?/$Ifl$Ifl$Iflkd$$Ifl   FB $V2 t0  6    44 lapHHHHHHHHHHHHHHHIIII-J/J0J1J5J6JDJEJMJNJOJUJVJ[J\JeJfJlJmJrJsJuJvJ}J~JJJJJJJJJ.K/K0K[KlKKKKKȾȾȾδδδδδή hQ^CJ h"wCJ h_#5CJh(\h(\5CJh6h65CJ h6CJ h(\CJ hJRCJ h/CJh6h~V5CJh6h)5CJ h~VCJ h)CJT\TUUUVMVNVvVwVVVVVVV{XXXXXXXYjYkYYYYǽǷǷDZǫvh(\hvACJOJQJhvACJOJQJh(\hK]CJOJQJhi.*CJOJQJ h(\hK] hi.*CJ hvACJ hYCJhmQhmQ>*CJ hmQCJjzhhCJUjhCJUmHnHujhCJU hCJ hCJ)TUU VVNVOVuVvVVV{XXXaYbYYYYY(Z)Z^gdvAgdvAh^hgdvA & F gdvAgdK]^gdi.*gdgdmQ,^,gdmQ & F gdmQYYYYYYYYZZZZZZZZZZZZZ[[:[<[=[A[B[D[_[i[u[{[[[[[E\W\\\&]D]E]]Ż|vv hRM0CJh4h45CJh4h4>*CJ h4CJ ho1CJ h CJho1h3h  h mCJ hK5\hK56\]hY56\]hKCJOJQJhKhvA5CJOJQJhvACJOJQJhvAhvA5CJOJQJ,)ZZZZZ[[<[=[_[t[u[[[[2\Z\\\E]]]^^gd $a$gdf,h^hgdo1gdo1gdK & F gdKgdK^gdvA]]]]]]]]]]]] ^ ^^^^^^^^^_0`4`:`<`HaJaLaNahanapaaaŶ걪nfZfZjh~BCJUaJh~BCJaJ"jhiCJUaJmHnHuh~B hi5hf,h~B5h~Bh~B5 h~B5hf,hf,hf,5 hf,hf, hf,5j hRM0hf,CJEHUjۋ? hf,UVjhRM0CJU hf,CJH*hf,hf,CJ hRM0CJhf,hf,CJH* hf,CJ#^<`JaLaaa:b*CJ h CJ h CJh h3h  hih%h +CJaJhACJaJhTCJaJh#?CJaJh%CJaJhQCJaJ2hhh,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;ii?i@iAiBiCigdigdA & FgdAh^hgd#?Ciriiiiik kllmmnn`oaoboooo+p_pbppppppgdo1h^hgd gd ^pbppqqqqqqq rrrss ttt"t&t't)tNtXtct^uhuvvvv!w"w2wQwxxxxx\yzzzzžۺզۗxhzhzCJ h,CJ hACJhAhA>*CJ hSXCJhThTCJ h*1CJ h CJhTh3h  hYP5\hYP56\] h +CJ hZnCJ hYPCJhYPhYP>*CJ hTCJ ho1CJho1ho1CJ,pppp qq+q5q6qaqqqqqqqqr_sssssssgd +h^hgd +^gd +h^hgdZn & FgdZngdo1sssttttttttttttttttt t!t"tNtbtctugdT^gdTgdYPgdo1uvvvvw"w3w4wQwRw[wtwwwwwwwwwwxxxx#xBxNxgdTgdo1NxOxYxZxlx~xxxxxxxxxxxxxxCyDyzz{{{{{{gdzgdTzzzz6{<{^{j{{{{{{{{{}}ށ )Pnpuw¼ªѪššŠqªqª0jhh|hh|CJOJQJUaJmHnHuhh|hh|CJH*OJQJaJhh|hh|CJH*OJQJaJ"hh|hh|5>*CJOJQJaJ hh|CJhh|hh|CJOJQJaJhh|hh|5CJOJQJaJ hh|5CJ hh|CJ hSXCJ h,CJ hzCJ({{{{{{{{{{{{{{{{{{{{{{{|}}gdh|gdz݁ށ]ނ'()PQWXz{TÇć@Agdh|ˆÈĈQR$a$gdh|gdh|RŽÎĎŎƎǎȎɎ$a$gdh|gdh| ef & Fgdh|gdh|pqӓԓՕ2:KaȮzpgpgpgeg_g_g_g_g_g_gYg_g hmQCJ hCJUh mhCJhh5CJhh|hh|CJaJ0jhh|hh|CJOJQJUaJmHnHuhh|hh|5CJOJQJaJ3jhh|hh|5CJOJQJUaJmHnHuhh|hh|CJOJQJaJ"hh|hh|5>*CJOJQJaJ+jhh|hh|5>*CJOJQJUaJ"fWXpғӓCqgdgdzgdh| & Fgdh|ϔ#QՕ=>G`m12brgd.org locat+64 ;executable code begins here startup: mov dptr, #port_abc_pgm mov a, #90H movx @dptr, a ;Port A in, B and C out loop: lcall esc ;Checks for escape key jc exit mov dptr, #port_a ;Read Port A clr a movc a, @a+dptr mov dptr, #port_c ; Write to Port C cpl a movx @dptr,a sjmp loop exit: ret .equ num,100 delay: push 4 push 5 mov r4,#num outer: nop mov r5,#255 inner: nop djnz r5,inner djnz r4,outer pop 5 pop 4 ret =>?@Ahh|hh|CJaJhUh~Bhih~BCJaJhihiCJaJhih mh (3>?@Agdzgdi(/ =!"#$% @= VW -!,>Fs [*gA x[olUE?sBt 4T1Q)} ,mѲ,j%}[?Zjd!bp1'B ‡&b_0ȗF!%{sΝw髫_&әw͙3s Xi2u`y-@" @@S!|%^ L15'7Je藕Z@Y45 Z)Tq;/x'cb;2b{SBR`-XK(h+R2M7b%LuMsX#sz+<_SmHG? JR 69v fqKPP π 3(h@*-3HgV 3-nGHg@z2bڼk&2%S͸*NS!jlIbX@EyTb.qbi8JشqH8TSƩmR6m * 1xsxӰT$˻W\HgKn:GQxYg6Œ+٪=EzڴѭvPoفnotjN 8%X*}nAcZ]3i[ZQb,P֕Θ|9|@w@?es3UciDxYB:%bN`bti$k̭Qg]>重oc=w`y"/txNw8nionV2:&o%+WZi;bxvH9sK,va_쮠xguJ#`6̨Ϗ@X휝D:P=}0JZ)V֟0I?Sx,MmltjN{-}gk֡<_'pQ_לu^Wlpkk«yk:LϽ9:&or9vuF3|0mH簳trmQC=FɼQ6SGB7nk@ڕoĎc6)]>Lw04Bs[ݬZ)t8_"nreAd#Xa,iegkz IR,O1v%[H&,m.'c[n "~xIOՏGԛ4VfYZ"N?+-}dku8$Wl mdz}>#B#X`}dz]u$Ay?kIe6`wjX鿋V15>Q 4EG2f4%[L~~dmX^%/J7 \ʞhnA%ie:?nmPטZL4ŬJp, *}{54!%r4j;A':'9cZiœXSrcLŗ N,+ H@#"Vb_O"򹀩 ӿ1`aY>>oLŔ_1·eU1|$z2{~څr'찿<*TDy8=l0,,{ f.4sKg~A_b/ofY~բ'9pg=fp|:51,i7<'2n6I;h XVo-z )=>q6a>G?cM;07uN,IણzZ\+=|c![!'[igfWԃi-&m lFQ۟JՋvzJ2#=!2bD=e+e4p vJ 6찁~O~_~og:Vʆ Q a1vv V;k`m3ʳn ^2܆9Ƃ!c`l#$>d6'L}B_fف'wl=D+fnM"qMgd,د |> 1#1}?a`D"$ccRv Xuߍ^CJ|γp>'sׂ^ Q˂&bd.v#})my&$sXE,>=jתw'Σh9g>QTeGalo  l$cS1ؔѶT %1X);`8+c1>w ?D[ c5>VtZ٫bZ:Z,Ygm_` xVjϽ }nnEe1%=nձa:bصaOL}m}{MېYb 7Y,sY1K^=1t Vʾ5YobRvXo@x026݀DF1{I̥1݄뷵zWD} }V IV1/@x,m u {+7li[oǦmK{a ٣b{zn@> Y;CCƬ8& aԚpc8]Ump0'.GG˂u9؊@ +sXyFY7D>%03%i5U۠fdzSh!%>1[HNJza0N&'O=-> z C!kV{,XfDNj-}oKXwS=SXuS":)7uzv޲cwrߘ>m:6yhfe,6܎bfmfn٦hO5gmcngy|U|JlS2Χ>0gmYdnYb%|٦lO}jOm*T,Ͳq>+|Vf8V&*L;FaOm4sb6q>s{8^5Χ1gm`nC|{#I3wl^ŒiĹS6fQ'_c1 $&aOueq>Q%fLYs5'yHi ,3GTئbO=0Χ6e|q>Kldsi",ܮSbq>%q>l3oY8 d0כ|SAwFtmGlg\S}dG6y84}`gs\zN{E:3#h.Yl.;]28K,p O{؇#7֡10U:R_tʕttPP6Mduns?g\<ҽ[s?dn%\Qxτe15x`7-=.L } jBv2 w(?>ɐH5PU',/@e.5MS-uI1h+qϣ|+N%5w+q'A+u_(@}{䢋K~lB {tBko4[EږP?_6d|yi^;m>d;06hs%=شVEu9k;|Ns} /Ls65plo1.!{?EJmu~}!+u| {'Ya7L)6JCO"S|<,gl)==Ms?⋸g<߮]];"?[.Eץt=wANj|:w}5AޅJ\k>0`fQrYg5y7Q/u/8>L}G mX]@v|rFg$.ẾIwwPrر}ڠ=ɻzɳA:KDg|y'O"<I?wFXTY saIwTkKi[[T8谤;`|)tX]R>|:,*ؒߒA% vчA%K t+ز{ѹ9谤TV|V:,P>|:,R+>|W:,ҍ =ߨraIQ&4{A%k:,^S>|{:,( tC.lS}{UrK)nյELit樂~Kz "%ݗf 8% V7;}{`us_ dK V7W;}`ukK PK Vn}`ukw |Kn$%J`I7`u{x}q,(X3}jK VWw_nS}H`NYbw='AwZOOs%Λ~0.(49ߍ%{s’u= ʭW!޵o{VWgו:;ހrJ=̀wW9x-87g:\='ϟs}4SQ6:bNw@=0 M^)(iF@B@.1. x[_lS?I(a뀆LEb&Aч ICXITa; ){X꾥iS.&jTM Ө}:>UG}Im{{}=s? +>Y@ǿ#;vz~`mXmgKY]\rY KsW~'K>zV7̘&^iqU5ߏB!%j=-!kљ,Ƈ*6V2]|?fAX;`s%Â;C ٙ,'>w >OJx96>~B?vybz,__.G&/%bWIz(B0o0_z| _V23C}'G GE<;03y%>%趂piGTW%8h\ ी92\[KQ(xtLž_h0)aC8+` cBp.z8`A;}2gL?l#n虀P,:p8hGF":hUi5 Xpa[=U8B6O̶P턻;ژ=NL83 SL:`#=Rkcʴ/2HnTObJ`D܊zV(fX qggb,d)&k'K1֓ qa'M1ic=iY0ֳ@^1֓q6֓$qIPLXO63L1zqc=C3dg0G1}z[^5Kܞ2I1z:ۦot9TnѸ܂uRzHnři_#n' Q̐!6bgb qc= IIz4֓$nIQLXOngb,)&m'MnPLXO}`'K1Yc=YeY6ֳLYc=+3c=%)))lL-S=a#l [[eb,S=]mBOVqvjC>Tyi4hȌ(S{rQ99zavw|[ԋHdj>s$)G2@y>>|)jZ%[K/i:-S}ԇ=r#C#{Fvs-7eݎoѹ}a߅/ٮa+GNܒs}^s*w?T;>>zuiJkxu׈vҲ|uu e7+; $`J\ XYY[ ZXvj{ѱ¶XvX}|MIES;].aJ_rc M; ߀݇o[~J_bx"p^ \ q5qq="> $^]^jeXc^T _߮NN0D=V6* Vҷ vmaۅJ_AhniR3JN7YioO"}!YKsAؗL5<֤ UWYД{U1q>UFf\Z{ W++{F;TF׵j mڶ^;P5 aϳrQ݇旄*u-}4kR\{++Wֺ\ٿ_o@mu=:q 蟠v ey‡fpĺʕFoPh=v}@m}=nPr?/_| T\]X~(7Eӎ8 VUϚ,\oP<%}QQs9c\[yz oۏ}{7a7>#g`I|u@F?]=\粣N5(~sqs}/ a}斳&4`Jz쇤f\9fUy@|)P}nwr]?c` ;o5(~λ˪kou,zUB|ud=u=,6p|n~*,1-e:>7}p|n*, 8ǰˌ 6eTXð ¢æبssPa.h.0*,^aؔoqPa7ͰI $¢/ΰ ¢4k3*,3쐆qx}} eTX=Ű M.l^- }{V-! êڢڭêN,oaU}qQ`7ΰ8kȰyUU}9Γy }3j.w^/h{aUkKP^EmUE }0lV78aU{"x% }V7ʁw`êrE ,fX3}j^E_ŪE ,Vρ9 o 1e$]#Sڜx8Sʃqz'Ǻs΃wqcwguϱv|9Xtcg;n`s{a4|U,y;ubŒ6 Tk .@ZRoQiUr%lIYiL$@= h =Ԯ;{Иؠg;B_7-^x\klUU^AAEKTm5(NPyx[_!LhC03NC$qP3j;kݳ{9Cmַ^{}hݐ̰gs%/ uJ!@;xņDǰ56̭G:_/E&\#F^Aht.cYqe#k:C2FƱt&dY0 AUPςۂ%p%"BRbخ[7=Ā3YỊ2GPo +ǭd2+h;V%5"4ފ ]{ܒ;& suan.bʬo:o).2LM fd|>'~iK W\ f2d6,ᨥm }-l lW sX9{znN8݁#v(1F@ `rL;BP~6A{Q+`>TU01EA-Tw`A-@f(@0էZjA~@?~;"_;(aԻ`s,sNbzsD`c"1Ɣ Lc!OVLkqLefڟs3lmH#9O1OoZ?s;*0!?sΏoz뛌1aF p+X4c<+H"M͍M Z[d9_vv㖊av(,gXd<ݸ7<{;p3s<Ș`}a`!v2ke9 xjc +ru,g)=qk7D!`;U=l3U&q1<0qϭmDX1}vO L}DG,ԌJ|fIhQIp/QyXSiIW,SLb6Aݘ }繼jt~WA5ٯwV` hs'01ss\`kV&fAׇi}X0p S&0eaf㞩oDv8bcY5QQkwLW^8Ӄ?2Ӄqƒq==_\?p@ocW@3Y&({5m-8ZȄG`+p&U^= U1QJ£Ƙ[u5NE_;JKۯ:v ߞx"ӫ,mUGCԥᨯ1ka!f -ޘgyܘgb̳Y Mb\=߶ vk}t&4Mn|3 3UhYb0L-a t(1Ɣ2L5aj1"ƾ4u뙸okpCu ݕ =ѣW }Ns%K1H>\vrG=Jw]rPl79{Rs{y1ޏx 4LˆXG9KCȻnT^kW&њqYOd +DN\g΍>1L!ӇFɼ|hl|Hw,FXN$%\Xt[>V*>pspԣEq̇F.!9>@ϹAn_".r]h-yق~yg!myխƸ{qW˸zeS|sg܇qW~qs~׈{oY|s_`ܗ/qW:e5isS;Aew>`u0ng9̫S/kw>f}~́wA+0sw1aܿs1=Tik4}>7F};q>˸q>k= ~/3+w/n:wU}e1]ɸg9pndj-2onu1_;p/2ŸzeվjZ&˼jZ>:dV27=wH{F8)oSF5̸՚e9U٫4ƕ{q;x|Z{d^^EE7Qt40;bwЧV*(}#]:]CT|UtϹS|Ů.J<#~~> X80!]|O*Mgt|I%өxc.߾ҽ ÎtǶ[]J]$62.ɞ5 /;n_SƋ˼QǪg)2Noa2E'NHnlFw5tIͮq<$[I }Iu{g]tIX=dOu'.$kStu>Wd~lѻS3~-!鵁Y I{E7J֕3;.[t]v-ɗClt9,,gԟ ym! nfPjt{ yn"3`_g4$Ru2:z.2^QI3ΐ'xnPo:CSS[_ m[5dItj*#`D//}eJv 5}#!yUp\QHε.L\guj%Oq,R(c$;>ɶSmjD}F?`$9یJ+wu&wc@RҥYѥ{.Հ5.v+v׹}\f.ս'8qǙdnp!~Bp3nTH!. &}34>ӃXe2;Edtn qR]U+5|&.J \|Y.f*2^x&z:ϯYxV^;qY9KqZWe^0qOؙ)N1| :q۷2< wNlJyz34LyWkF?G999_9_$XCcOk,l_S@=ccsSBRFPg@[zkB6x\{lUE涥[*cyxK޾@--4P, " KaX#&V lD7(ubM QDpWp#%]=̝;9saCs^97A,p7]Op 4 \a|~0~HSÊ5l< 3+:.rA}(KKR3?M-cUijǵmJS\K)jɋjɆp5WO°􄹞Sē&Z#LIW0+xZ[B+`(m'/D]c]X Ukc\}G'6au HOO3SLzjaUzZ0LISغY P '.R'Bͳ`1ܙ.6^j( II4F]D.wag3e̺al]zKoeT(;$ pՖZ8w̛67'\H\S4dMs(?e13ã睺!2VGX2ǭevI]29r4%hi2m2>pdVcj'Yf};.)e-T,)efZʧ'DlB˓(#R& /ebvrQMFude5Bgukdi?9۷~u<||sn8x̫֟ xd2I|%ee1^@pû֫CDl~(:Nq>4XL'|@27IKsiKk;祝o|M2KAFFzcF1n#豥p5a"l~qfb@!}00td0K`SjmgSam\ڹNɼa劋@jmBs8%wqm=#gpd[&tH()&5xfX*k=#m-S!SaBZF[l$k=Miu0^w ]VܼR朔9 =ty`>-=z|1sI!"b˗o+uB+>Sy5BpIbePW6먖&D(+W^Kv)l.XaoICt;'eTħ>%< [{t | Y)FelEWckLx2Zf/ZhuJ,ox.|sS^ѵ8tz!PeE;2<;(r $7䄞l~>Ay-PJ6ŕi>aZi0"L`ZeiTg6߹`diTg$Lv%1݉e2=I0 Z_` CDՀcHpz晌6A!67wVj$q}m#3c-聍7zv$(6b-8c羳TıiEۊa +\3b뷾r d+Lk{{:MGl}?XOx [ ^1ԌySq;Ad'=|-'WsNA*T7YC&h~s\gTq+ Eb&Mpr mM5Kl5 l?[mcBRHla8 ۣXQ(c&ߖ  %m[Y,5lfMmF6¨g=[K.oOY $cw>? ݚ$rbNd-h~*q;?;.a;a<l˰ Guy[,b9pTλhYXon0l߉88bqS]vy~ς3c$247~`F= Khv}XœܝcUlf6e,T7k]]RޥLޙiY< R&s/,rZYzu&An~ݣ\rm$Br?;nFPQ=<⎫:DHKQT_CuTWP=kz Uu5akzM^?x_W0V΀;]9^RgÍoNʂX'P93w/&Y;ypL4{Ѓ iL؍u'(߿͚/[CyT}<-;办Si{!x?eYM_jz{FދH[ۘ/xAaKn&#nC ‹=X{WW|00-W ^` P~[顷B[:Mo0^Lz~&Z=tOub?@| ] eZ_wQ?Gc}IvM6kzwX~M3ݖ](s+J('_\@{.yYM7ޫ5<5<e=4aBVﻂϿPC}WA+Vy.r ma-!-5 U#4#<0VxVhx+<0jxkz-k,~/ º bR‹yXw{>y'p?pC?kg47O~.^=@=F  Rl [96<J(- xZolG؎Q¥Jх{w/E:Ċc[cIQ*"ٍ` C)DCQ?V~0T)(XP!*$i!Լ;7fw]ݛy7o{3>P>f3j82#t W&MzRt5ƎN`+ah??GnvF/aiDؒwmA>ĸeGpHն+UuIwU^PzN/o-+ҢEkXYնYֶҶ3Զd>M~5_gnU>8}*}>K}xv|ݭ.[6X}Σ3[ƳGyym;qee6p[0yg+ƳG[';Kj|P?׹pZ)҉'?Nk>eihV%s3ڔBfnzh5X )XwOE8- iLM =p`cLht<צ1 pHEx#)]w{&Bc,D2g1Kj t4g54RF\40,DLS(g2X VQgʣ/a˽b_÷+8ExD8A8N0COnNї+:|g?=g:}{2qtwW7MNh#C#wbٿ=U B6+?P^%p aҴ?ù*ٗ3C;Zz!e~G?Txvͥkݶ#HKb[l g`apSb[YFmA1뼭|q]}Dw6XK9)FomœkϹ9w+>_ a%g< {n;8,k CŒY=]2y]Jຈ8!ZZ5L8luy om mX"OT_i|y5 y2sG;6~z,tjS_4JxVb[|4 ʚ`?;pIR>*0W|T HYm3|Lq?RlKYxe{~5+%GX3XW2g.y~ǽcYyϲdA>zK _;C7O) )$Ǣ>f-.DKqb= XGmr}4-'n\1k}$xиGaYGX.(j$cM{Ϙ/9~?eNJ6r{I|ATHYgϯ&pMZsSm#.{)fԏYc5CNβh˯sHYou%s:lj}yX'|fYyӽ#(Yk3nuLosMܟ6j<>uߴlr&'.;v)y,;.CJ2x@=1/=EA^KZ+ 0)8 X-&xZMlG~kN0"D-l Up (jIkWb6Q{@VP%mT'z)@ġ> XH*ew=Åv޾oo&<[__6 eO`|7@G5P\~<(VC||Bl?nB -((>Qk13 hx/3d?[o}}A>W5aERvۇ=3f68>,}OkX\6oLNLg"̨[Vvw dΜMMNMfCp@Megpd籂XdcB+cŧ0cCp$8<Ggoixa}owF'v'"m1BocHHBh hתotݮ@|[xq;Qꄋ8N`!sna".M&F#i}4c@탛{VAů}0XRd V !! 'b!`h`gUs"Èn=L%8z '3tf*kLf ~!L:87.@QhkmN@ SSj5oD >AӢl.bVJEf[uOR+5۪}"WV]ļ쓗8JͶ".>R9''qm"Y$3f[wN3\IH1f[uvP(5۪}gUV]Ĭ쓕8JͶ"dYRjU1"D$NRI')q敚mXy^K3 )lЃAу\ڷs,> OUP"ο9\gc-.ņj[:h{qڮRm+Sۻ|6JKqnFB[ Z%y@spw0nYAC9gy= d}LĐ Y8F-3x7{YF%uGd'h'+ m֊7rL7M:oT~nfnU9̞c`q؊8V*pa| qac(RjRnP kXYrFXq 6 nq:?(8431[i[-Oϛ_\Cyrk{=yۜߟnkۯT~Q_!rXI[9奓aqDA6ƔJG:leC3ֺ lAT+gg Oz6Ãqi9H3Wu?9ΨNk!k9f~gM4444fԌy,-r_U/ /a͛Ї~p#y*'(Vݾ%>)=Aݾ-p, v;KEE,Nz`'>O${ #;'*z`/{`/2y`爾Don w\qЗ [8w>F(, <)@; 6!#8>[ٞi@=`XLK@S\S#8X-o]xXoU:v惐 -UAq$pk8kMT.* q@DH!U-B ጄzn>sZQX?8/k'G5ݷ;3z6 ?v{~F _* 9}Bw O GEb4IL $ɨ{cC,{d};Ia3#=w7d8>|h'EvHwnnƙBZTڜ$O`9-\c <ØDJtKB=ưYA,XR,kd q4ETVJbmRMz9_ jp0SG<v5 )9BX_µRjޏ}]DX lQ@i. 2&PFQ t[ \q`U깊^z9fxzS(/-];!!Fm?"ⶨ'獎8#4Cz?uS G:'gkeIfg+GEsY!1 D/U]dJg:?#YF "CJ0j0 rMTu+ӳ>&W҇hQMpBֲ@r?Zn8]sIߥ/.c}xox1:W% lqoG7|:QDyK yK >http://www.pjrc.com/tech/8051/DyK yK hhttp://www.pjrc.com/tech/8051/board3/first_use.html|$$If!vh5P552 #vP#v#v2 :Vl  t65552 a|$$If!vh5P552 #vP#v#v2 :Vl t65552 a|$$If!vh5P552 #vP#v#v2 :Vl  t65552 a|$$If!vh5P552 #vP#v#v2 :Vl  t65552 a|$$If!vh5P552 #vP#v#v2 :Vl t65552 az$$If!vh5S5S5S5S5S5S5S5S#vS:Vl t65SDd  D  3 @@"?VDd .*b  c $A? ?3"`?2yz{WKI|NL`!tyz{WKI @~ BxڝRJAP#6z!ZxO\"dCRYYX+4(xή6* sfx3ofgjj`VD!e).6ɫSˋ*V*3!C =Ӟ8Nv]rl9: ct>_)*-J:I4Y;S~p5L qV=9^U"cʹU8YTqߡ/:I9>YfM]9"; oq Cr[qv~m aJ[yHHN3n S4;f)Dd D  3 @@"?BDd 7#n 0  # A2h:U '܆o2D`!h:U '܆o2.YXWp`xZ]lUl c)TI@1hUBJF)XUJ0hm6]haP"!/,i}'F_4%!Ԙ(&4imgg]6Lw;w̝;#x P+Wj^1j; 2ȿ忱&Di:D-2^J*}Qc!s^s@ny&0iB S,x4'?:<(j{п#dz4svErⰘ/DU؈GOݜ)38ncJ5#WS|&CRkQsH5O EeB]OcpFk\9/ك&bRu1=^3?c&n 4.NU\o.0/^/z?JOKK h.j=Nۉ͚z%"ߏǴK}hC'-&po&PslC񘶋ZFje/2b8w3Yj(B԰C){v=ѓaep<¦QjjcsBcn748{Ly Lvl%lg7Yyن}NgКO8c5ϳX=*fMFpM5k{y.ɮIrW]6.,cG.~?|K8uHGʞQv&/}ҷ#sxnyngG#ONez{zQㅂ[bYYJ<yVlraxv6_xiȓu%mU䌷K#pٕc\ǼJWQpTɨf|%_ ^k!:kkFR8cJ7I1JǥKWy1w$@~B&E6Ta g<"Zt6~I8%(գ/}oE^QѨqKa4h4fH:yr_dænStpjs2e/LUiBcϳ!zM]@Cl{zj Wnb4S.6o0Gy)V9ыӞ|NwMu]R#!#o|P9)IvOPʙߑ+gnX-@3*kz }\eK:uqB9^jcf\bbg93cdX!'ch=(vbw5kW  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~01Root Entry  F@=DData WordDocument eObjectPool ` bD@=D_1067420635F` bD` bDOle CompObjfObjInfo  FMicrosoft Equation 3.0 DS Equation Equation.39qM t m =12f xtalOh+'0 Equation Native i1TableSummaryInformation( DocumentSummaryInformation8  0 < H T`hpx1) Ken DudeckNormalked227Microsoft Office Word@f@`@/@//@~DPs՜.+,D՜.+,@ hp  Penn State HazletonEׇ 1) Title\ 8@ _PID_HLINKSA J34http://www.pjrc.com/tech/8051/board3/first_use.htmlu nhhttp://www.pjrc.com/tech/8051/u 0000000000000000008@8 mNormal_HmH sH tH F@F Heading 1$h@&^h 5CJ\D@D Heading 2$h@&^h>*CJ@@@ Heading 3$h@&^hCJ>@> Heading 4$@& 5CJ\DA@D Default Paragraph FontVi@V  Table Normal :V 44 la (k@(No List 6U@6 Hyperlink >*B*phFV@F FollowedHyperlink >*B* ph*W@* Strong5\8Z@"8 K] Plain TextOJQJbr@3b ~VTable Classic 1:V0  j#j#j#jj 9B*`Jph6]5\56\]j@Cj 6 Table Grid7:V0a a,-  & BCD  !"#$%&'(*,-./0123456789:;<=>?@ABCDEFHIJKLMNOPQRSTUVWXYZ[\]^_*+- . ; <   O _ o ~ @   _   q r  89'()*+,-./01234567j%&'(_`LM{H{01dlw 1!2!u"v"""###$$T%U%V%W%X%Y%c%d%%%o&p&&&&'' ( (R(S(()M)N))))*?*@***F+++,,e,,,--a-----.x....7///000004151111<22222#3$3n3333354b44445=5>555666676;6p6s666637777&888899f999999 ::C;D;K;^;q;;;;;;<<<< <!<"<#<e<x<y<<<F=%?,@-@>@H@P@Y@Z@a@g@x@y@@@@@@@@@@@@@@AA0B1B7B=BBBFBKBOBVB]BfBnBsBwB~BBBBBB/C0CCCCCCC#D$DDDDDEE9E:EEEEEF[FtFuFGGJGKGGGG9H:HJJhJJ+KAKBKKKKKKKKLLMM NNNNONuNvNNN{PPPaQbQQQQQ(R)RRRRRSS^?^@^A^B^C^r^^^^^` `aabbcc`dadbdddd+e_ebeeeeeeeee ff+f5f6faffffffffg_hhhhhhhhhiiiiiiiiiiiiiiiii i!i"iNibicijkkkkl"l3l4lQlRl[ltllllllllllmmmm#mBmNmOmYmZmlm~mmmmmmmmmmmmmmCnDnooppppppppppppppppppppppppppppqrrtttvvww]www'x(x)xPxQxWzXzz{{{T|||||}}@}A}}}}}}}}}}}}}}}}}}}}}}}}QRƒÃăŃƃǃȃɃ efWXp҈ӈCqω#QՊ5Bijpً7G\^pq{|}ƌҌ000 00 00 00 00 000 00000000000000000000000000000000000000000000000000000000000000000000000000 0 00000000000000000000000 00 00 000 00 00 00 00 00 0000000000.0.0.0.0.0.0.0.00707070000000000000000000000000000000000000000000000000000000070Y%0Y%0Y%0Y%0Y% 0Y%0Y%0Y% 0Y%0Y% 0Y%0Y% 0Y%0Y% 0Y%0Y%0Y%0Y%0Y%0Y%0Y% 0Y%0Y%0Y% 0Y%0Y%0Y%0Y%0Y%0Y%0Y% 0Y%0Y%0Y%0Y%0Y%0Y%0Y%0Y%0Y%0Y% 0Y%0Y%0Y%0Y% 0 Y%0Y%0Y%0Y%0Y%0Y% 0 Y%0Y% 0 Y%0Y%0Y%0Y%0Y% 0 Y%0Y%0Y%0Y%0Y% 0 Y%0Y%0Y% 0Y%0Y%0Y%0Y% 0Y% 0Y%0Y% 0Y% 0Y% 0Y% 0Y% 0Y%0Y% 0Y%0Y%0Y%0Y%0Y%0Y% 0Y%0Y%0Y%0Y%0Y%0Y%0Y% 0Y%0Y%0Y% 0Y%0Y%0Y%0Y% 0Y%0Y%0Y%(0Y%090909090909090909090909090909090909098090<0<      !"#$%&'()*+,-./0<0<0<00#<0#<0#<0#<0#<0#<0#<0#<0#<0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#< 0#<0#<0#<0#<0#<0#<0#< 0#<0#< 0#<0#< 0#<0#< 0#<0#< 0#<0#< 0#<0#< 0#<0#< 0#< 0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#<0#< 0#<0#<0#< 0#<0#< 0#<0#< 0#<0#<0#<0#<0#< 0#<0#<0#<0#<0#<0#<0#<0#<0#< 0#<0#< 0#<0#< 0#<0#< 0#<0#< 0#<0#<0#<0#<0#<0#<0#< 0#<0#< 0#<0#<0#<0#<0#<0#<0#<0#< 0#<80#<80#<0S00=S0=S0=S0=S0=S0=S0=S0=S0=S0=S0=S0=S0=S0000W0W0W00W0W0W0W0W0W0W0W 0W0W 0W0W 0W0W 0W0W0W 0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W00C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^0C^ 0C^0C^ 0C^0C^0C^0C^0C^ 0C^0C^0C^0C^0C^80C^0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h0h00"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i0"i 0"i0"i 0"i0"i 0"i0"i0"i0"i0"i0"i0"i0"i0"i000000000000000000000000000000000000000000000y0+0h000000000000y00y003HK@SY]ae^pzAKRX`fhjlnorw} : X  5!,17<@"DYHxHHHHBJJJOT)Z^hCipsuNx{RfALNOPQSTUVWYZ[\]^_abcdegikmpqstuvxyz{|~@M%8&l&KKKUVVWWWXX_:_-.`"$VW -!,> *"$1^0qMtStK ("$M^)(i8 s!"$ h =Ԯ;{И,"$ccsSBRFPgC="$ Rl [9N M"$1/=EA^KZ+ 0KX"$`XLK@S\S#@`@-b(  R  .%[) 3  s"*?`  c $X99? .%[)N    .{$[)  h =& #  s"*?`  c $X99?h =&(   B     D !  A"D "  A"D #  A"D $  A"D %  A"D &  A" D '  A" D (  A" B S  ? *FKWW}!V&t#9t"t M1t !-t  txt$t&t%8'^t&r rt''t( = Qt _Hlt522697997 _Hlt523293813 _Hlt523293814 _Hlt522688486 _Hlt522688487P&P&P&W&W&@@@@@Q&Q&Q&X&X& "T4TT|1##,"$T00]]ooo  00]]ooo 9*urn:schemas-microsoft-com:office:smarttagsplaceB*urn:schemas-microsoft-com:office:smarttagscountry-region;*urn:schemas-microsoft-com:office:smarttagsaddress= *urn:schemas-microsoft-com:office:smarttags PlaceName= *urn:schemas-microsoft-com:office:smarttags PlaceType8 *urn:schemas-microsoft-com:office:smarttagsCity:*urn:schemas-microsoft-com:office:smarttagsStreet    %+NT8>w|w}@E,/259>""%%&& )")/)1)))**\+e+,-"-+---].f.11X1[1_1d1333466j6n6889999: :p<v<>=B=Z@`@y@@@@@@CCCCCCCCCCCCCDDDDDDDDDDDDDEE&E*E2E8EEEEEEEEEEF$F'FfFjFlFrFOLXLtL}LN%N?NLNQQRRRRRRlSrSUU^^q`u`|``aabbcccccdfdjdoddddd,e/eeeeeeeeeeeeeeeeeeeeeeeefff!f%frfxfgghh[iai>jDjkkkkll#l&l\l_l`ldlglslulxlllllllllllllllllllllllmmm mmmmmCmGmZm`mbmgmhmkmmmqmmmmmmmmmmmmmmmmmmmmmppJrNr}}b~f~~~,2 $)qtx~ɈԈ׈ 3<ko !%(469CGIMqv‹ ?BOSU[fj~͌Ќӌ׌ #dh ! Y [ i k x z   @ I !%ltUcQZ""##^$h$&&))))))****L+O+++++k,s,,,h-j-'.*...C/K/////00w1111B2F233t3v333<4A455L6T66697<777,83888k9p99999::D;I;CCCCCDDDEE&E*EEE$F'FfFjFGGJJ7K?KJLOLO OPPPPQQRRSS[T`TUUHXOXXX]]aatbubbbdddddd:eAebedeeeeeeeeeeeff!f%f+f/f^f`fffZh\hWjgjkkkkl lRlYl\l_lulxlllllllllllllllllmmmmmmCmGmOmSmZm`mmmqmmmmmmmmmmmnott2xOxyy {y{h|l|||}}}}<EX^-MUʼnΉ"CHqx 69CGjnqv?BOSfjquƌˌӌ׌3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333#&_1 < &&))** ..m..../0002233445666,737>@@1BBGG7KBKKLMMvNNXYZDZ[[ffgoopqɃ q{>L]|Q ZZk: GufY& HBn)1p$ 86.A_?#`f"AC.VEf+XbOyLn{7PXN{2W 4W&R]^Xwf6c6Sgh?p>njw6~2.h ^`o(hH) ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH.h^`)h^`.hpLp^p`L.h@ @ ^@ `.h^`.hL^`L.h^`.h^`.hPLP^P`L.k^`ko()^`o()^`.pLp^p`L.@ @ ^@ `.^`.L^`L.^`.^`.PLP^P`L.^`o()^`.pLp^p`L.@ @ ^@ `.^`.L^`L.^`.^`.PLP^P`L.tt^t`o()DD^D`. L ^ `L.  ^ `.^`.L^`L.TT^T`.$$^$`.L^`L.^`o() ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH.h^`)^`.pLp^p`L.@ @ ^@ `.^`.L^`L.^`.^`.PLP^P`L.h^`)h^`.h L ^ `L.hUU^U`.h%%^%`.hL^`L.h^`.h^`.heLe^e`L.k^`ko()hhh^h`)h88^8`.hL^`L.h  ^ `.h  ^ `.hxLx^x`L.hHH^H`.h^`.hL^`L.^`o()h dd^d`o(hH.4L4^4`L.  ^ `.  ^ `.L^`L.tt^t`.DD^D`.L^`L.h hh^h`hH)h 88^8`hH.h L^`LhH.h   ^ `hH.h   ^ `hH.h xLx^x`LhH.h HH^H`hH.h ^`hH.h L^`LhH.^`o() dd^d`hH. 4L4^4`LhH.   ^ `hH.   ^ `hH. L^`LhH. tt^t`hH. DD^D`hH. L^`LhH.hhh^h`.h88^8`.hL^`L.h  ^ `.h  ^ `.hxLx^x`L.hHH^H`.h^`.hL^`L.hhh^h`)h88^8`.hL^`L.h  ^ `.h  ^ `.hxLx^x`L.hHH^H`.h^`.hL^`L.h ee^e`hH)h 55^5`hH.h  L ^ `LhH.h   ^ `hH.h ^`hH.h uLu^u`LhH.h EE^E`hH.h ^`hH.h L^`LhH.h ^`hH)h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h^`)h^`.hpLp^p`L.h@ @ ^@ `.h^`.hL^`L.h^`.h^`.hPLP^P`L.h^`)h^`.h L ^ `L.hUU^U`.h%%^%`.hL^`L.h^`.h^`.heLe^e`L.k^`ko()h ^`o(hH) ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH.Y& 2W86ghQ A_??pCWn)k:6~PXNOyLf6c]>1GVEjw`f"A                                    @޺                                            -v[                                                                                        65c/~V*1 mSX f!)i.*f,RM0o1_#5l;y;vA~B^-KYPmQJRTYK]"w[v3c(\KQ^j,U +i#?%/ZnQ64g/Ach|z).e<,@-@>@H@P@Y@Z@a@g@x@y@@@@@@@@@@@@@1B=BFBOB]BnBwBBBBCCDEEtFJ{PRp@}}y}LVWXYՊ@^`b@@UnknownGz Times New Roman5Symbol3& z Arial;WingdingsMCentury SchoolbookO& rDigitalCourier New?5 z Courier New"qhkXFI&lXFPsEPsE!24dׇׇ2QHP? m21) Ken Dudeckked2d                 CompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89q