《学生DIY单片机实验手册(16页).doc》由会员分享,可在线阅读,更多相关《学生DIY单片机实验手册(16页).doc(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-一 STC89C51单片机实验开发板套件元件清单元件个数元件名称原理图上的标号单价1DIP40插座U10.51DIP16插座U20.591K 电阻R10(8个),R10.52三极管PNP(8550)Q1,Q20.6110uf电解电容(有正负之分)C30.3230PF陶瓷电容C1,C20.21发光二极管(有正负之分)L10.41晶振(11.0592MHZ)11.059211电源开关S111电源座+5V输入1110K 9脚排阻R2011910K电阻R4,R3,R30(8个)R5R614104陶瓷电容C4,C5,C6,C711DS18B20(温度传感器)918按键KEY1到KEY17,REST51
2、串口下载线515v开关电源141面包板121STC89C51U11227段数码管(共阳极)LED1,LED2,LED34.51MAX232U24.5注意:在焊板子时,由于我们采用的是面包板,元件的焊接位置需要大家自己布局,在焊元件时,先看一下原理图上有那些几元件,在脑海里有一个大体上的布局,避免将来放的元件太密,或者说放的太运,导致了无法连线,或者有些元件在面包板上放不下.第一步先焊接单片机最小系统: 什么是单片机最小系统? 单片机最小系统就是:有单片机,晶振,复位电路,EA引脚接高电平,即组成单片机最小系统 1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40引脚,负极(地
3、)接20引脚。 (如下图所示)2、振蒎电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,将晶体振荡器,接单片机18、19脚。(如下图所示)3、复位引脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。 4、EA引脚:EA引脚接到正电源端。 至此,一个单片机就接好,通上电,单片机就开始工作了。按照原理图,1).将DIP40座焊好,DIP40座是用来插51单片机,焊它方便将来的调试和维修,这个元件尽可能的放在面包板的中央.2)再焊晶振,和C1,C2,这是单片机的振荡电路,也是单片机的心脏,只它的可靠的启振,单片机才能工作。焊接晶振时,其位置尽可能的靠近单片机,不要
4、离的太远,否则单片机容易收到干扰有可能工作的不可靠。3)焊接复位电路,就是C3,RST,R5组成,焊接时要注意C3是一个10UF的电解电容,有正负之分,电解的长脚为正,短脚为负。4)焊接电源座和电源开关,并单片机的20脚的地和电源座连好,单片机40脚连到+5V上,同样复位电路也要连接+5V,地;振荡电路有个地要连。程序实验一闪烁灯1) 实验任务学习一下,如何用单片机通过程序来控制一个端口!从P2.7 端口经过了一个限流电阻接一个发光二极管L1,使L1 不停地一亮一灭,一亮一灭的时间间隔为0.2 秒。重点是学习程序的编写思路,看一下程序是如何将课堂上所学到的指令综合运用起来。2) 电路原理图程序
5、设计内容 在编程序以前先给大家讲一下延时程序:(1) 延时程序的设计方法作为单片机的指令的执行的时间是很短,一条指令的运行速度能达到微秒级,(所谓指令运行速度与外接晶振有关)因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如下图 所示,我们实际用的石英晶体为11。0592MHz,(之所以用它是为了方便串口波特率计算准确)但为了计算方便我们暂且按12M晶振来计算,因些,1 个机器周期为1 微秒因此,上面的延时程序时间为10.002ms。由以上可知,当R610、R7248
6、时,延时5ms,R620、R7248 时,延时10ms,以此为基本的计时单位。如本实验要求0.2 秒200ms,10msR5200ms,则R520,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2) 输出控制如 原理图 所示,当P2.7 端口输出低电平,即P2.70 时,根据发光二极管的单向导电性可知,这时发光二极管LED1亮;当P2.7 端口输出高电平,即P2.71 时,发光二极管LED1熄灭;我们可以使用SETB P1.0 指令使P1.0 端口输出高电平,使用CL
7、R P1.0 指令使P1.0 端口输出低电平。5) 程序框图图4.1.26) 汇编源程序ORG 0000HAJMP STARTSTART: CLR P2.7 ;关闭P2.7,使P2.7=0;LCALL DELAY ;延时子程序,延时0.2 秒SETB P0.0 ;开启P2.7,使P2.7=1;LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2 秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7) C 语言源程序#include #include #define
8、port_P2 P2sbit L1=P27;/* 延时t毫秒 */void delay02s(unsigned int t)/*精典模块,建议日后开发直接引用unsigned int i;while(t-)/* 对于12M时钟,约延时1ms */for (i=0;i125;i+)void main(void)port_P2 =0;while(1)port_P2 =0; ;关闭P2.7,使P2.7=0;delay02s(200); ;延时子程序,延时0.2 秒L1=1; ;开启P2.7,使P2.7=1;delay02s(200); ;延时子程序,延时0.2 秒实验二 LED 共阳极数码管 静态显
9、示驱动1. 实验任务利用51 单片机的P0 端口的P0.0P0.7 连接到一个共阳极数码管的ag 的笔段上,数码管的公共端经三极管接到+5V。在数码管上循环显示09 数字,时间间隔0.2 秒。学习重点是程序的编写思路和7段数码驱动原理。希望通过这个程序大家能理解MOVC A,A+DPTR,怎么样使用!2. 电路原理图3. 系统板上硬件连线 1)在实验一的基础上,先焊排阻,排阻就将8个电阻电绑定在一个陶瓷片中,引出了9个脚,一个共公脚,和8个电阻脚。再焊8个限流电阻.后焊七段LED数码4. 程序设计内容1)LED 数码显示原理七段LED 数码内部由七个条形发光二极管和一个小圆点发光二极管组成,根
10、据各管的极管的接线形式,可分成共阴极型和共阳极型。LED 数码管的ga 七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阳极的字形码见下表“0”0C0H; “1”0F9H, “2”0A4H, “3”0B0H, “4”99H, “5”92H, “6”82H, “7”0F8H, “8”80H, “9”90H 由于显示的数字09 的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。这样我们按着数字09 的顺序,把每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLE: DB 0C0H;0F9H,0A4H,0B0
11、H,99H,92H,82H,0F8H,80H,90H2)在七段LED 数码的COM口(也称为公共口),接了一个PNP三极管Q1,当PNP三极管Q1的基极加高电时,则PNP三极管Q1,C E结是不导通的;当PNP三极管Q1的基极加低电时,则PNP三极管Q1,C E结是导通的.5程序框图图5.26 汇编源程序ORG 0START: MOV R1,#00H CLR P2.0 ;将控制LED1的三极管Q1打开,也就是使其导通NEXT: MOV A,R1 MOV DPTR,#TABLE ;将表格的首地址送到DPTR指钟中,MOVC A,A+DPTR ; 表格的首地址+累加器的内容,得到了一地址,然后从这
12、个地址取出MOV P0,A ;将取出的数送到P0口上,也就是送到了LED显示LCALL DELAYINC R1 ;地址加1 CJNE R1,#10,NEXT ;判断0-9字形码是否送完,不完继续从表中取数/LJMP STARTDELAY: MOV R5,#20D2: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1DJNZ R5,D2RETTABLE: DB 0C0H;0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HEND7 C 语言源程序#include unsigned char code table=0XC0H;0XF
13、9H,0XA4H,0XB0H,0X99H, 0X 92H, 0X 82H, 0X F8H, 0X 80H, 0X 90H;unsigned char dispcount;sbit led1_bit=p22;void delay02s(void)unsigned char i,j,k;for(i=20;i0;i-)for(j=20;j0;j-)for(k=248;k0;k-);void main(void) led1_bit=0;while(1)for(dispcount=0;dispcount10;dispcount+)P0=tabledispcount;delay02s();实验三 0099
14、 计数器(LED 数码管 动态 显示技术)1 实验任务利用51 单片机来制作一个手动计数器,在51 单片机的P2.3 管脚接一个按键,作为手动计数的按钮,用单片机的P2.0 控制一个共阳数码管,作为0099 计数的个位数显示,用单片机的P2.1控制一个共阳数码管,作为0099 计数的十位数显示;学习重点是什么是动态显示?什么是静态显示?如何检测按键?2 电路原理图 3 系统板上硬件连线4 程序设计内容(1 单片机对按键的识别的过程处理(2 单片机对正确识别的按键进行计数,计数满时,又从零开始计数; 在此了解一下按键为什么要去抖动。(3 单片机对计的数值要进行数码显示,计得的数是十进数,含有十位
15、和个位,我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上显示。如何拆开十位和个位我们可以把所计得的数值对10 求余,即可个位数字,对10 整除,即可得到十位数字了。(4 通过查表方式,分别显示出个位和十位数字。5 程序框图图8.26 汇编源程序ORG 00HAJMP MAINORG 30HMAIN: MOV r0,#0 LOOP1:MOV R3,#50 ;设置循环次数LOOP2:MOV A,R0 MOV B,#10 DIV AB ;A除B 将R0的数据折分成两个字节的BCD码 SETB P2.0 ;开启数码管LED1的段选 CLR P2.1 ;关闭数码管LED2的段选 MOV
16、 DPTR,#TABLE ;装入表头 MOVC A,A+DPTR ;从表中取十位要显示的数据 MOV P0,A LCALL DELAY10MS ;调用10MS延时 LOOP3: SETB P2.1 ;开启数码管LED2的段选 CLR P2.0 ;关闭数码管LED1的段选 MOV A,B MOV DPTR,#TABLE ;装入表头 MOVC A,A+DPTR ;从表中取个位要显示的数据 MOV P0,A LCALL DELAY10MSLOOP4:DJNZ R3,LOOP2JB P2.3 LOOP5 ;判断P2。3是否按下,没有按下,继续显示上一次数据LCALL DELAY10MS ;按下,延时一
17、段时,做按键去抖动,防干扰JB P2.3 LOOP5 ;再次 判断P2。3是否按下. INC R0 ;按下,将要显示的数据+1LOOP5:CJNE R0,#100,LOOP1 SJMP MAIN DELAY10MS: MOV R6,#20D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RETTABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END实验四 44 矩阵式键盘识别技术1 实验任务用89C51 的并行口P1 接44 矩阵键盘,以P1.0P1.3 作输入线,以P1.4P1.7作输出线;在数码管上显示每个
18、按键的“0F”序号。对应的按键的序号排列如图9.1 所示2 硬件电路原理图3 系统板上硬件连线4 程序设计内容(1 44 矩阵键盘识别处理。(2 每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU 通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码
19、而识别按键,通过软件查表,查出该键的功能。5 程序框图图9.3注意:P1=0XFF;是将上一个行扫描引脚电位,拉成高电平,每一次扫描只能有一行(即一个引脚)是低电平。6 汇编源程序KEYBUF EQU 30H ;设定一个变量存放按键码ORG 00HSTART: MOV KEYBUF,#2WAIT:MOV P1,#0FFHCLR P1.0 ;扫描第一行,将第一行的引脚拉低MOV A,P1ANL A,#0F0H ;取低4位引脚电平状态XRL A,#0F0H ;异或判断,低4位是否有按键按下JZ NOKEY1 ;没按键按下,则跳转到无按键按下程序LCALL DELY10MS ;延时10MS,做为软件
20、去抖动MOV A,P1 ;再次取出按键状态ANL A,#0F0H ;取低4位引脚电平状态XRL A,#0F0H ;异或判断,低4位是否有按键按下JZ NOKEY1 ;没按键按下,则跳转到无按键按下程序,做为一次干扰MOV A,P1ANL A,#0F0HCJNE A,#0E0H,NK1 ;将ACC中数据和00001110相比较,相等则表明,K4被按下MOV KEYBUF,#3LJMP DK1NK1: CJNE A,#0D0H,NK2 ;将ACC中数据和00001101相比较,相等则表明,K3被按下MOV KEYBUF,#2LJMP DK1NK2: CJNE A,#0B0H,NK3 ;将ACC中数
21、据和00001011相比较,相等则表明,K2被按下MOV KEYBUF,#1LJMP DK1NK3: CJNE A,# 70H,NK4 ;将ACC中数据和00001101相比较,相等则表明,K1被按下MOV KEYBUF,#0LJMP DK1NK4: NOPDK1:MOV A,KEYBUF ;将键码送到数码管显示MOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,ACLR P2.2 ;允许LED6显示DK1A: MOV A,P1ANL A,#0F0HXRL A,#0F0HJNZ DK1A ;等待按键松开,不停取出P1口的状态,不为0,继续读出P1口状态NOKEY1:MOV P
22、1,#0FFH ;在扫描第二行以前,将第一行的引脚电平拉高CLR P1.1 ;扫描第二行,将第二行的引脚拉低MOV A,P1ANL A,#0F0HXRL A,#0F0HJZ NOKEY2LCALL DELY10MSMOV A,P1ANL A,#0F0HXRL A,#0F0HJZ NOKEY2MOV A,P1ANL A,#0F0HCJNE A,#0E0H,NK5 ;将ACC中数据和00001110相比较,相等则表明,K8被按下MOV KEYBUF,#7LJMP DK2NK5: CJNE A,#0D0H,NK6 ;将ACC中数据和00001101相比较,相等则表明,K7被按下MOV KEYBUF,
23、#6LJMP DK2NK6: CJNE A,#0B0H,NK7 ;将ACC中数据和00001011相比较,相等则表明,K6被按下MOV KEYBUF,#5LJMP DK2NK7: CJNE A,# 70H,NK8 ;将ACC中数据和00000111相比较,相等则表明,K5被按下MOV KEYBUF,#4LJMP DK2NK8: NOPDK2:MOV A,KEYBUF ;将键码送到数码管显示MOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,ACLR P2.2 ;允许LED6显示DK2A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK2A ;等待按键松开
24、,不停取出P1口的状态,不为0,继续读出P1口状态NOKEY2:MOV P1,#0FFH ;在扫描第三行以前,将第二行的引脚电平拉高CLR P1.2 ;扫描第三行,将第三行的引脚拉低MOV A,P1ANL A,#0F0HXRL A,#0F0HJZ NOKEY3LCALL DELY10MSMOV A,P1ANL A,#0F0HXRL A,#0F0HJZ NOKEY3MOV A,P1ANL A,#0F0HCJNE A,#0EH,NK9 ;将ACC中数据和00001110相比较,相等则表明,K12被按下MOV KEYBUF,#8LJMP DK3NK9: CJNE A,#0DH,NK10 ;将ACC中
25、数据和00001101相比较,相等则表明,K11被按下MOV KEYBUF,#9LJMP DK3NK10: CJNE A,#0BH,NK11 ;将ACC中数据和00001011相比较,相等则表明,K10被按下MOV KEYBUF,#10LJMP DK3NK11: CJNE A,#07H,NK12 ;将ACC中数据和00000111相比较,相等则表明,K9被按下MOV KEYBUF,#11LJMP DK3NK12: NOPDK3:MOV A,KEYBUF ;将键码送到数码管显示MOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,ACLR P2.2 ;允许LED6显示DK3A:
26、MOV A,P1ANL A,#0FHXRL A,#0FHJNZ DK3A ;等待按键松开,不停取出P1口的状态,不为0,继续读出P1口状态NOKEY3:MOV P1,#0FFH ;在扫描第四行以前,将第三行的引脚电平拉高CLR P1.3 ;扫描第三行,将第三行的引脚拉低MOV A,P1ANL A,#0F0HXRL A,#0F0HJZ NOKEY4LCALL DELY10MSMOV A,P1ANL A,#0F0HXRL A,#0F0HJZ NOKEY4MOV A,P1ANL A,#0F0HCJNE A,#0EH,NK13 ;将ACC中数据和00001110相比较,相等则表明,K16被按下MOV
27、KEYBUF,#12LJMP DK4NK13: CJNE A,#0DH,NK14 ;将ACC中数据和00001101相比较,相等则表明,K15被按下MOV KEYBUF,#13LJMP DK4NK14: CJNE A,#0BH,NK15 ;将ACC中数据和00001011相比较,相等则表明,K14被按下MOV KEYBUF,#14LJMP DK4NK15: CJNE A,#07H,NK16 ;将ACC中数据和00000111相比较,相等则表明,K13被按下MOV KEYBUF,#15LJMP DK4NK16: NOPDK4:MOV A,KEYBUF ;将键码送到数码管显示MOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,ACLR P2.2 ;允许LED6显示DK4A: MOV A,P1ANL A,#0F0HXRL A,#0F0HJNZ DK4A ;等待按键松开,不停取出P1口的状态,不为0,继续读出P1口状态NOKEY4:LJMP WAIT ;继续扫、描按键DELY10MS:MOV R6,#10D1: MOV R7,#248 ;延时一段时间DJNZ R7,$DJNZ R6,D1RETTABLE: END实验五 -第 15 页-
限制150内