1、实验一、单片机P3口、P1口应用一、实验目的1掌握P3口、P1口简单使用。2学习延时程序的编写和使用。二、实验内容 1、P3.3口做输入口,外接一脉冲,每输入一个脉冲,P1口按十六进制加一。2、P1口做输出口,编写程序,使P1口接的8个发光二极管L1L8按16进制加一方式点亮发光二极管。三、实验说明1、P1口是准双向口,它作为输出口时与一般的双向口使用方法相同,由准双向口结构可知:当P1口作为输入口时,必须先对它置高电平,使内部MOS管截止,因内部上拉电阻是20K40K,故不会对外部输入产生影响。若不先对它置高,且原来是低电平,则MOS管导通,读入的数据是不正确的。 2、延时子程序的延时计算问
2、题。对于延时程序 DELAY :MOV R6, #00H DELAY1:MOV R7, #80H DJNZ R7, $ DJNZ R6, DELAY1查指令表可知MOV、DJNZ指令均需用两个机器周期,而一个机器周期时间长度为12/ 6.0MHZ,所以该段指令执行时间为:(128+1)256+1)2(126000000)=132.1ms四、实验步骤 P3.3用插针连至K1, P1.0P1.7用插针连至L1L8。 从起始地址0540H开始连续运行程序(输入0540后按EXEC键。若第一次开机,则依次按下0 F1 0FFF F2 0 EPMOV 0540 EXEC)。 开关K1每拨动一次,L1L8
3、发光二极管按16进制方式加一点亮。五、实验原理图六、实验程序:(请给程序加上注释) 汇编程序C语言程序:ORG 0540HA1S:MOV A,#00HHA1S1: JB P3.3,HA1S1; MOV R2,#20H LCALL DELAY JB P3.3,HA1S1HA1S2:JNB P3.3,HA1S2 MOV R2,#20H LCALL DELAY JNB P3.3,HA1S2 INC A PUSH ACC NOP CPL A MOV P1,A POP ACC AJMP HA1S1DELAY:PUSH 02HDELAY1: PUSH 02HDELAY2: PUSH 02HDELAY3:
4、DJNZ R2,DELAY3 POP 02H DJNZ R2,DELAY2 POP 02H DJNZ R2,DELAY1 POP 02H DJNZ R2,DELAY RET END#include /包含特殊功能寄存器库#define uchar unsigned char#define uint unsigned intsbit P3_3=P33;void delay(uint j);void main()uchar i;i=0;while(1)if(P3_3=0)delay(20);if(P3_3=1)i=i+1;P1=i;void delay(uint j)uint m;while(j-
5、)for(m=0;m200;m+); 七、实验思考1、 演示实验中是在脉冲的上升沿还是下降沿进行加一计数方式?2、 演示实验程序PUSH 02H、POP 02H中的02H指的是什么?3、 修改程序变成减一计数方式?实验二、可编程并行接口(8255)应用一、实验目的了解8255芯片的结构及编程方法,学习模拟交通灯控制的实现方法。二、实验内容 用8255做输出口,控制十二个发光二极管燃灭,模拟交通灯管理。三、实验说明1、 因为本实验是交通灯控制实验,所以要先了解实际交通灯的变化情况和规律。假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯。然后转状态1东西绿灯通车,南北红灯。过一段时间
6、转状态2,东西绿灯灭,黄灯闪烁几次,南北仍然红灯。再转状态3,南北绿灯通车,东西红灯。过一段时间转状态4,南北绿灯灭,闪几次黄灯,延时几秒,东西仍然红灯。最后循环至状态1。四、实验步骤 8255 PC0PC7、PB0PB3依次接发光二极管L1L12。以连续方式从0630H开始执行程序,初始态为四个路口的红灯全亮之后,东西路口的绿灯亮南北路口的红灯亮,东西路口方向通车。延时一段时间后东西路口的绿灯熄灭,黄灯开始闪耀。闪耀若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪耀。闪耀若干次后,再切换到东西路口方向,之后重复以上过程。五
7、、实验原理六、实验程序(请给程序加上注释)汇编程序C语言程序ORG 0630HHA4S:MOV SP,#60HMOV DPTR,#0FF2BHMOV A,#80H ;设置PC、PB口为输出,工作在方式0MOVX DPTR,AMOV DPTR,#0FF29HMOV A,#02HMOVX DPTR,AINC DPTRMOV A,#49HMOVX DPTR,A ;点亮四个红灯 MOV R2,#25HLCALL DELAYHA4S3:MOV DPTR,#0FF29HMOV A,#08HMOVX DPTR,AINC DPTRMOV A,#61HMOVX DPTR,A ;东西绿灯亮,南北红灯亮MOV R2
8、,#55HLCALL DELAYMOV R7,#05H ;东西黄灯闪烁5次HA4S1: MOV DPTR,#0FF29HMOV A,#04HMOVX DPTR,AINC DPTRMOV A,#51HMOVX DPTR,A ;东西黄灯亮,南北红灯亮MOV R2,#20HLCALL DELAYMOV DPTR,#0FF29HMOV A,#00HMOVX DPTR,AINC DPTRMOV A,#41H ;南北红灯亮MOVX DPTR,AMOV R2,#20HLCALL DELAYDJNZ R7,HA4S1MOV DPTR,#0FF29HMOV A,#03HMOVX DPTR,AINC DPTRMO
9、V A,#0cHMOVX DPTR,A ;东西红灯亮,南北绿灯亮MOV R2,#55HLCALL DELAYMOV R7,#05H ;南北黄灯闪烁5次HA4S2: MOV DPTR,#0FF29HMOV A,#02HMOVX DPTR,AINC DPTRMOV A,#8aHMOVX DPTR,A ;东西绿灯亮,南北黄灯亮MOV R2,#20HLCALL DELAYMOV DPTR,#0FF29HMOV A,#02HMOVX DPTR,AINC DPTRMOV A,#08H ;东西绿灯亮MOVX DPTR,AMOV R2,#20HLCALL DELAYDJNZ R7,HA4S2LJMP HA4S
10、3 ;循环DELAY:PUSH 02HDELAY1: PUSH 02HDELAY2: PUSH 02HDELAY3: DJNZ R2,DELAY3POP 02HDJNZ R2,DELAY2POP 02HDJNZ R2,DELAY1POP 02HDJNZ R2,DELAYRETEND# include# define PORTA XBYTE0X7FFE# define CONTROL XBYTE0X7FFFvoid DELAYLONG(void);void DELAYSHORT(void);void main(void)CONTROL=0x80;PORTA=0XFF;DELAYLONG();wh
11、ile(1) PORTA=0X21; DELAYLONG(); PORTA=0X11; DELAYSHORT(); PORTA=0X01; DELAYSHORT(); PORTA=0X11; DELAYSHORT(); PORTA=0X01; DELAYSHORT(); PORTA=0X11; DELAYSHORT(); PORTA=0X01; DELAYSHORT(); PORTA=0X0C; DELAYLONG(); PORTA=0X0A; DELAYSHORT(); PORTA=0X08; DELAYSHORT(); PORTA=0X0A; DELAYSHORT(); PORTA=0X0
12、8; DELAYSHORT(); PORTA=0X0A; DELAYSHORT(); PORTA=0X08; DELAYSHORT(); void DELAYLONG(void)unsigned i,j,k;for(i=0;i20;i+) for(j=0;j40;j+) for(k=0;k2500;k+);void DELAYSHORT(void)unsigned i;for(i=0;i30000;i+);七、实验思考1、 请找出东、南、西、北方向的红、黄、绿灯?2、 请说明黄灯闪烁的原理?3、 理解交通灯的工作原理。实验三、步进电机控制实验一、实验目的1、 了解步进电机控制的基本原理。 2、
13、 2、掌握步进电机转动编程方法。二、实验内容从键盘上输入正、反转命令,转速参数和转动步数显示在显示器上,CPU再读取显示器上显示的正、反转命令,转速级数(16级)和转动步数后执行。转动步数减为零时停止转动。三、实验说明步进电机驱动原理是通过对它每相线圈中的电流和顺序切换来使电机作步进式旋转。驱动电路由脉冲信号来控制,所以调节脉冲信号的频率便可改变步进电机的转速,微电脑控制步进电机最适合。四、实验步骤 1、步进电机插头插到实验系统J3插座中,P1.0P1.3接到BABD插孔。 2、在“P.”状态下,从起始地址开始(0A30H)连续执行程序。输入起始地址后按EXEC键。3、在键盘上输入数字在显示器
14、上显示,第一位为0表示正转,为1表示反转,第二位0F为转速等级,第三到第六位设定步数,设定完按EXEC键,步进电机开始旋转。五、实验原理六、实验程序(请给程序加上注释)实验箱电路汇编程序上图C语言程序ORG 0A30H MONIT:MOV SP,#50HMOV 7EH,#00H ;设步进电机正转标志显示在第一位MOV 7DH,#02H;设步进电机速转控制值显示在第二位MOV R0,#7CH ;设步距数8888,显示在第3位到第6位MOV A,#08HMOV R4,#04HMONIT1: MOV R0,ADEC R0DJNZ R4,MONIT1MOV A,#7EHMOV DPTR,#1FFFH
15、;DISPFLAGMOVX DPTR,AMOV 76H,#00HMOV 77H,#00HKEYDISP0:LCALL KEYJC DATAKEYAJMP MONIT2DATAKEY:LCALL DATAKEY1DB 79H,7EHSJMP KEYDISP0MONIT2: CJNE A,#16H,KEYDISP0LCALL DISPMOV A,7AH ; 取步距数送R6、R7ANL A,#0FHSWAP AADD A,79HMOV R6,AMOV A,7CHANL A,#0FHSWAP AADD A,7BHMOV R7,AMOV A,7EHCJNE A,#00H,MONIT4 ;判转动方向MON
16、IT3: MOV P1,#03H ;顺时针转LCALL DELAY0LCALL MONIT5MOV P1,#06HLCALL DELAY0LCALL MONIT5MOV P1,#0CHLCALL DELAY0LCALL MONIT5MOV P1,#09HLCALL DELAY0LCALL MONIT5SJMP MONIT3MONIT4: MOV P1,#09H ;逆时针转LCALL DELAY0LCALL MONIT5MOV P1,#0CHLCALL DELAY0LCALL MONIT5MOV P1,#06HLCALL DELAY0LCALL MONIT5MOV P1,#03HLCALL DE
17、LAY0LCALL MONIT5SJMP MONIT4MONIT5: DEC R6CJNE R6,#0FFH,MONIT6DEC R7CJNE R7,#0FFH,MONIT6; 判步距数到否LJMP MONITMONIT6: LCALL MONIT7RETMONIT7: MOV R0,#79HMOV A,R6LCALL MONIT8MOV A,R7LCALL MONIT8LCALL DISPRETMONIT8: MOV R1,AACALL MONIT9MOV A,R1SWAP AMONIT9: ANL A,#0FHMOV R0,AINC R0RETDELAY0: MOV R0,#7DH;根据(
18、7D)内容改变延时时间,即改变速度MOV A,R0SWAP AMOV R4,ADELAY1: MOV R5,#80HDELAY2: DJNZ R5,DELAY2LCALL DISPDJNZ R4,DELAY1 RETDATAKEY1:MOV R4,A;数字键处理子程序MOV DPTR,#1FFFHMOVX A,DPTRMOV R1,AMOV A,R4MOV R1,ACLR APOP 83HPOP 82HMOVC A,A+DPTRINC DPTRCJNE A,01H,DATAKEY3DEC R1CLR AMOVC A,A+DPTRDATAKEY2:PUSH 82HPUSH 83HMOV DPTR
19、,#1FFFHMOVX DPTR,APOP 83HPOP 82HINC DPTRPUSH 82HPUSH 83HRETDATAKEY3:DEC R1MOV A,R1SJMP DATAKEY2KEY0:MOV R6,#20H; 数字键显示闪动程序MOV DPTR,#1FFFHMOVX A,DPTRMOV R0,AMOV A,R0MOV R7,AMOV A,#10HMOV R0,AKEY3:LCALL KEYDISPJNB 0E5H,KEY2DJNZ R6,KEY3MOV DPTR,#1FFFH MOVX A,DPTRMOV R0,A MOV A,R7MOV R0,AKEY:MOV R6,#50H
20、; 显示键扫子程序KEY1:LCALL KEYDISPJNB 0E5H,KEY2 DJNZ R6,KEY1SJMP KEY0KEY2:MOV R6,AMOV A,R7MOV R0,AMOV A,R6 ;A=KEYDATAKEYEND: RETKEYDISP:LCALL DISP;调显示子程序LCALL KEYSM;调键扫子程序MOV R4,A ;KEYDATAMOV R1,#76H ;DATASAME TIMEMOV A,R1MOV R2,AINC R1MOV A,R1MOV R3,A ;LAST KEYDATAXRL A,R4 ;TWO TIME KEYDATAMOV R3,04H ;NEW
21、 KEYDATA-R3MOV R4,02H ;TIME-R4JZ KEYDISP1MOV R2,#88HMOV R4,#88HKEYDISP1:DEC R4MOV A,R4XRL A,#82HJZ KEYDISP2MOV A,R4 ;R4=TIMEXRL A,#0EHJZ KEYDISP2MOV A,R4ORL A,R4JZ KEYDISP3MOV R4,#20H ;R4=20HDEC R2LJMP KEYDISP5KEYDISP3:MOV R4,#0FHKEYDISP2:MOV R2,04HMOV R4,03HKEYDISP5:MOV R1,#76HMOV A,R2MOV R1,AINC R
22、1MOV A,R3MOV R1,AMOV A,R4 ;*CJNE R3,#10H,KEYDISP4KEYDISP4:RETDISP:SETB 0D4H;显示子程序MOV R1,#7EHMOV R2,#20HMOV R3,#00HDISP1:MOV DPTR,#0FF21HMOV A,R2MOVX DPTR,AMOV DPTR,#DATA1MOV A,R1MOVC A,A+DPTRMOV DPTR,#0FF22HMOVX DPTR,ADISP2:DJNZ R3,DISP2DEC R1CLR CMOV A,R2RRC AMOV R2,AJNZ DISP1MOV A,#0FFHMOV DPTR,#0
23、FF22HMOVX DPTR,ACLR 0D4HRETDATA1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HDB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEHKEYSM:SETB 0D4H;键扫子程序MOV A,#0FFHMOV DPTR,#0FF22HMOVX DPTR,A ;OFF DISPKEYSM0: MOV R2,#0FEHMOV R3,#08HMOV R0,#00HKEYSM1: MOV A,R2MOV DPTR,#0FF21HMOVX DPTR,ANOPRL AMOV R2,AMOV D
24、PTR,#0FF23HMOVX A,DPTRCPL ANOPNOPNOPANL A,#0FHJNZ KEYSM2INC R0;NOKEYDJNZ R3,KEYSM1SJMP KEYSM10KEYSM2: CPL A;YKEYJB 0E0H,KEYSM3MOV A,#00HSJMP KEYSM7KEYSM3: JB 0E1H,KEYSM4MOV A,#08HSJMP KEYSM7KEYSM4: JB 0E2H,KEYSM5MOV A,#10HSJMP KEYSM7KEYSM5: JB 0E3H,KEYSM10MOV A,#18HKEYSM7: ADD A,R0CLR 0D4HCJNE A,#10
25、H,KEYSM9KEYSM9: JNC KEYSM10MOV DPTR,#DATA2MOVC A,A+DPTRKEYSM10:RETDATA2:DB 07H,04H,08H,05H,09H,06H,0AH,0BHDB 01H,00H,02H,0FH,03H,0EH,0CH,0DHEND#include #define uint unsigned int#define uchar unsigned charuchar code FFW= 0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09; /*八拍正转代码*/uchar code REV=0x09,0x08,0x0c
26、,0x04,0x06,0x02,0x03,0x01; /*八拍反转代码*/sbit K1 = P30; /*设置正转开关*/sbit K2 = P31; /*设置反转开关*/sbit K3 = P32; /*设置停止开关*/ void DelayMS(uint ms) /*延时子程序*/ uchar i;while(ms-) for(i=0;i120;i+);void SETP_MOTOR_FFW(uchar n) /*正转子程序*/ uchar i,j;for(i=0;i5*n;i+) for(j=0;j8;j+) if(K3 = 0)break;P1 = FFWj;DelayMS(25);
27、void SETP_MOTOR_REV(uchar n) /*反转子程序*/ uchar i,j;for(i=0;i5*n;i+) for(j=0;j8;j+) if(K3 = 0)break;P1 = REVj;DelayMS(25);void main() uchar N = 3;while(1) if(K1 = 0) P0 = 0xfe;SETP_MOTOR_FFW(N);if(K3 = 0) break;else if(K2 = 0) P0 = 0xfd;SETP_MOTOR_REV(N);if(K3 = 0) break;else P0 = 0xfb;P1 = 0x03;七、实验思考
28、1、 步进电机的转动方向是如何控制的?2、 步进电机的转动速度是如何控制的?实验四、继电器控制实验一、实验目的1、掌握继电器的工作原理。2、掌握用继电器控制的基本方法和编程。二、实验内容利用P1口输出高低电平,控制继电器的开合,以实现对外部装置的控制。三、实验说明 现代自动化控制设备都存在一个电子与电气电路的互相联结问题,一方面要使电子电路的控制信号能够控制电气电路的执行元件(电动机、电磁铁、电灯等),另一方面又要为电子电路和电气电路提供良好的电隔离,以保护电子电路和人身的安全,电子继电器便能完成这一桥梁作用。 本实验采用JZC23F型继电器,其控制电压为5V。继电器电路中一般要在继电器的线圈
29、两头加一个二极管以吸收继电器线圈断电时产生的反电势,防止干扰。四、实验步骤1、 在EXIC1上插上07芯片。2、 把8031的P10插孔接到07芯片的第一脚,07芯片的第二脚接JIN端,继电器的JZ(中心轴头)接GND,JK常开开关接L1,JB常闭开关接L2。3、编制程序,使P10电平变化,低电平时继电器吸合,常开触点接上L1点亮,L2熄灭,高电平时继电器不工作,常闭触点闭合,L1熄灭,L2点亮。4、在“P”状态下,从起始地址0C60H开始连续运行程序,L1、L2交替亮灭。五、实验原理 六、实验程序(请给程序加上注释)汇编程序C语言程序ORG 0C60HSTART: SETB P1.0 LCA
30、LL DELAY CLR P1.0 LCALL DELAY SJMP STARTDELAY: MOV R7,#0FFHDELAY1: MOV R6,#0FFHDELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET END#include reg52.hsbit P1_0=P10;void delay();main()while(1)DELAY();P1_0=P1_0;void delay()unsigned char k,j;for(k=0;k200;k+)for(j=0;j200;j+);7、思考题在原理图中7407的作用是什么?实验五、A/D、D/A转换实验一、
31、实验目的A/ D 1、掌握A/ D转换与单片机的接口方法。 2、了解A/ D芯片0808转换性能及编程方法。3、通过实验了解单片机如何进行数据采集。D/A 1、了解D/ A转换与单片机的接口方法。2、了解D/ A转换芯片0832的性能及编程方法。3、了解单片机系统中扩展D/ A转换芯片的基本方法。二、实验内容A/ D: 利用0808做A/ D转换实验,电位器提供模拟量输入。编制程序,将模拟量转换成数字量,通过数码管管显示。 D/A :利用0832输出一个从-5V开始逐渐升到0V再逐渐升至5V,再从5V逐渐降至0V,再降至-5V的锯齿波电压。三、实验步骤 A/ D:把A/D区0809的0通道IN
32、0用插针接至W1的中心抽头V01插孔(0-5V)。 0809的CLK插孔与分频输出端T4相连。 将W2的输入VIN接+12V插孔,+12V插孔再连到外置电源的+12上(电源内置时,该线已连好)。调节W2,使V REF端为+5V。 将A/D区的VREF连到W2的输出VREF端。 EXIC1上插上74LS02芯片,将有关线路按图连好。 将A/D区D0-D7用排线与BUS1区XD0-XD7相连。 将BUS3区P3.0用连到数码管显示区DATA插孔。 将BUS3区P3.1用连到数码管显示区CLK插孔。 单脉冲发生/SP插孔连到数码管显示区CLR插孔。 仿真实验系统在P.状态下。 D/A : 把D/A区
33、0832片选CS信号线接至译码输出插孔Y0。 将+12V插孔、12V插孔通过导线连到外置电源上,如果电源内置时,则+12V,-12V电源已连好。 将D/A区WR插孔连到BUS3区XWR插孔。 将电位器W2的输出VREF连到D/A区的VREF上,电位器W2的输VIN连到+12V插孔,调节W2使VREF为+5V。 用8芯排线将D/A区D0D7与BUS2区XD0XD7相连。 在“P.”状态下,从起始地址0740H开始连续运行程序(输入0740后按EXEC键)。 用万用表或示波器测D/A输出端AOUT,应能测出不断加大和减小的电压值。四、实验原理图五、实验程序A/D转换C程序D/A转换C程序#incl
34、ude unsigned char code dispbitcode=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00; unsigned char dispbuf8=10,10,10,10,10,0,0,0;/5,6,7有效 unsigned char dispcount; unsigned char getdata; unsigned int temp; long int i; unsign
35、ed int R1; sbit ST=P30; sbit OE=P31; sbit EOC=P32; sbit CLK=P33; void main(void) ST=0; OE=0; ET0=1; ET1=1; EA=1; TMOD=0x12; TH0=216; TL0=216; TH1=(65536-5000)/256; TL1=(65536-5000)%256; TR1=1; TR0=1; ST=1; ST=0; while(1) if(EOC=1) OE=1; getdata=P0; OE=0; i=getdata*196;/5/255=0.0196dispbuf5=i/10000;
36、i=i%10000; dispbuf6=i/1000;i=i%1000; dispbuf7=i/100; ST=1; ST=0; void t0(void) interrupt 1 using 0 /定时器0 中断服务 CLK=CLK; void t1(void) interrupt 3 using 0 /定时器1 中断服务 TH1=(65536-6000)/256; TL1=(65536-6000)%256; P2=0xff; P1=dispcodedispbufdispcount; P2=dispbitcodedispcount; if(dispcount=5) P1=P1 | 0x80;
37、 dispcount+; if(dispcount=8) dispcount=0; #include#include #define DAC0832 XBYTE0x7fff /* 定义DAC0832端口地址 */#define uchar unsigned charvoid saw(void) /* 锯齿波发生函数 */ uchar i; for (i=0;i0;i-) DAC0832=i; void main(void) uchar i; i=0xff; while(i-) saw(); /* 产生一段锯齿波 */ 实验六、数码显示和矩阵式键盘C51程序设计一、实验目的1、掌握Proteus
38、软件与Keil软件的使用。2、利用Proteus软件与Keil软件来设计单片机数码显示和矩阵式键盘。二、实验内容1、设计一个4x4的键盘接口,键盘值分别为0-15。2、设计一个2位的数码管来显示键盘值。 三、实验说明利用PROTEUS软件进行硬件电路的设计、调试,掌握硬件电路图中元器件参数的确定及系统的扩展和系统的配置。利用Keil软件创建项目,进行C语言源程序的编译和调试以生成.HEX文件,以及进行硬件和软件系统的总调。四、实验步骤 1、利用PROTEUS软件进行硬件电路的设计 2、进行C语言源程序的编译和调试五、实验原理图六、实验程序#include#includeunsigned char code led_code=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /共阴极#define uch