51单片机实例(含详细代码说明).pdf
《51单片机实例(含详细代码说明).pdf》由会员分享,可在线阅读,更多相关《51单片机实例(含详细代码说明).pdf(50页珍藏版)》请在三一文库上搜索。
1、. . 1 闪烁灯 1实验任务 如图 4.1.1 所示:在 P1.0 端口上接一个发光二极管L1,使 L1 在不停地一亮一 灭,一亮一灭的时间间隔为0.2 秒。 2电路原理图 图 4.1.1 3系统板上硬件连线 把“单片机系统”区域中的P1.0 端口用导线连接到“八路发光二极管指示模 块”区域中的 L1 端口上。 4程序设计内容 (1) 延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要 求的闪烁时间间隔为0.2 秒,相对于微秒来说,相差太大,所以我们在 执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程 序是如何设计呢?下面具体介绍其原理: . .
2、 如图 4.1.1 所示的石英晶体为12MHz ,因此, 1 个机器周期为 1 微秒 机器周期微秒 MOV R6,#20 2个2 D1: MOV R7,#248 2 个2 22248 498 20 DJNZ R7,$ 2 个2248 (498 DJNZ R6,D1 2 个22040 10002 因此,上面的延时程序时间为10.002ms。 由以上可知,当 R610、R7 248 时,延时 5ms ,R620、R7 248 时, 延时 10ms,以此为基本的计时单位。如本实验要求0.2 秒200ms , 10ms R5 200ms ,则 R5 20,延时子程序如下: DELAY: MOV R5,
3、#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET (2) 输出控制 如图 1 所示,当 P1.0 端口输出高电平, 即 P1.01 时,根据发光二极管 的单向导电性可知, 这时发光二极管L1 熄灭;当 P1.0 端口输出低电平, 即 P1.00 时, 发光二极管 L1 亮; 我们可以使用 SETB P1.0 指令使 P1.0 端口输出高电平,使用CLR P1.0 指令使 P1.0 端口输出低电平。 5程序框图 如图 4.1.2 所示 . . 图 4.1.2 6 汇编源程序 ORG 0 START: CL
4、R P1.0 LCALL DELAY SETB P1.0 LCALL DELAY LJMP START DELAY: MOV R5,#20 ;延时子程序,延时0.2 秒 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END 7 C 语言源程序 #include sbit L1=P10; void delay02s(void) /延时 0.2 秒子程序 unsigned char i,j,k; for(i=20;i0;i-) for(j=20;j0;j-) for(k=248;k0;k-); . . void
5、 main(void) while(1) L1=0; delay02s(); L1=1; delay02s(); . . 2 模拟开关灯 1 实验任务 如图 4.2.1 所示,监视开关 K1(接在 P3.0 端口上),用发光二极管L1(接 在单片机 P1.0 端口上)显示开关状态,如果开关合上,L1 亮,开关打开, L1 熄灭。 2 电路原理图 图 4.2.1 3 系统板上硬件连线 (1) 把“单片机系统”区域中的P1.0 端口用导线连接到“八路发光二极管指示模 块”区域中的 L1 端口上; (2) 把“单片机系统”区域中的P3.0 端口用导线连接到“四路拨动开关”区域中的 K1端口上; 4
6、程序设计内容 (1) 开关状态的检测过程 单片机对开关状态的检测相对于单片机来说,是从单片机的 P3.0 端口输入信号, 而输入的信号只有高电平和低电平两种,当拨开开关 K1拨上去,即输入高电平, 相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。单片机 . . 可以采用 JB BIT,REL或者是 JNB BIT,REL指令来完成对开关状态的检测即 可。 (2) 输出控制 如图 3 所示,当 P1.0 端口输出高电平,即P1.01 时,根据发光二极管的单向 导电性可知,这时发光二极管L1 熄灭;当 P1.0 端口输出低电平,即P1.00 时,发光二极管 L1 亮;我们可以使用
7、SETB P1.0 指令使 P1.0 端口输出高电平, 使用 CLR P1.0 指令使 P1.0 端口输出低电平。 5 程序框图 图 4.2.2 6 汇编源程序 ORG 00H START: JB P3.0,LIG CLR P1.0 SJMP START LIG: SETB P1.0 SJMP START END 7 C 语言源程序 #include sbit K1=P30; sbit L1=P10; void main(void) while(1) if(K1=0) . . L1=0; /灯亮 else L1=1; /灯灭 . . 3 多路开关状态指示 1 实验任务 如图 4.3.1 所示,
8、 AT89S51单片机的 P1.0P1.3 接四个发光二极管L1L4, P1.4P1.7 接了四个开关 K1K4,编程将开关的状态反映到发光二极管上。 (开关闭合,对应的灯亮,开关断开,对应的灯灭)。 2 电路原理图 图 4.3.1 3 系统板上硬件连线 (1 把“单片机系统”区域中的P1.0P1.3 用导线连接到“八路发光二 极管指示模块”区域中的L1L4 端口上; (2 把“单片机系统”区域中的P1.4P1.7 用导线连接到“四路拨动开 关”区域中的 K1K4端口上; . . 4 程序设计内容 (1 开关状态检测 对于开关状态检测, 相对单片机来说, 是输入关系, 我们可轮流检测每个开关状
9、 态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL 或 JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指 示,可以采用 MOV A,P1指令一次把 P1端口的状态全部读入, 然后取高 4 位的 状态来指示。 (2 输出控制 根据开关的状态,由发光二极管L1L4来指示,我们可以用SETB P1.X 和 CLR P1.X 指令来完成,也可以采用MOV P1,1111XXXXB 方法一次指示。 5 程序框图 读 P1口数据到 ACC中 ACC内容右移 4 次 ACC内容与 F0H相或 ACC内容送入 P1口 图 4.3.2 6 方法一(汇编源程
10、序) ORG 00H START: MOV A,P1 . . ANL A,#0F0H RR A RR A RR A RR A ORL A,#0F0H MOV P1,A SJMP START END 7 方法一( C语言源程序) #include unsigned char temp; void main(void) while(1) temp=P14; temp=temp | 0xf0; P1=temp; 8 方法二(汇编源程序) ORG 00H START: JB P1.4,NEXT1 CLR P1.0 SJMP NEX1 NEXT1: SETB P1.0 NEX1: JB P1.5,NEX
11、T2 CLR P1.1 SJMP NEX2 NEXT2: SETB P1.1 NEX2: JB P1.6,NEXT3 CLR P1.2 SJMP NEX3 NEXT3: SETB P1.2 NEX3: JB P1.7,NEXT4 CLR P1.3 SJMP NEX4 NEXT4: SETB P1.3 NEX4: SJMP START END 9 方法二( C语言源程序) #include . . void main(void) while(1) if(P1_4=0) P1_0=0; else P1_0=1; if(P1_5=0) P1_1=0; else P1_1=1; if(P1_6=0)
12、P1_2=0; else P1_2=1; if(P1_7=0) P1_3=0; else P1_3=1; . . 4 广告灯的左移右移 1 实验任务 做单一灯的左移右移,硬件电路如图4.4.1 所示,八个发光二极管L1L8 分别接在单片机的P1.0P1.7 接口上,输出“ 0”时,发光二极管亮,开始 时 P1.0P1.1P1.2P1.3P1.7P1.6P1.0 亮,重复循环。 2 电路原理图 图 4.4.1 3 系统板上硬件连线 把“单片机系统”区域中的P1.0P1.7 用 8 芯排线连接到“八路发光二极管指 示模块”区域中的L1L8 端口上,要求:P1.0 对应着 L1, P1.1 对应着
13、L2, , P1.7 对应着 L8。 4 程序设计内容 我们可以运用输出端口指令MOV P1,A或 MOV P1,DATA ,只要给累加器 值或常数值,然后执行上述的指令,即可达到输出控制的动作。 . . 每次送出的数据是不同,具体的数据如下表1 所示 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 说明 L8 L7 L6 L5 L4 L3 L2 L1 1 1 1 1 1 1 1 0 L1亮 1 1 1 1 1 1 0 1 L2亮 1 1 1 1 1 0 1 1 L3亮 1 1 1 1 0 1 1 1 L4亮 1 1 1 0 1 1 1 1 L5亮 1 1 0
14、1 1 1 1 1 L6亮 1 0 1 1 1 1 1 1 L7亮 0 1 1 1 1 1 1 1 L8亮 表 1 5程序框图 图 4.4.2 6 汇编源程序 ORG 0 START: MOV R2,#8 MOV A,#0FEH SETB C LOOP: MOV P1,A LCALL DELAY RLC A . . DJNZ R2,LOOP MOV R2,#8 LOOP1: MOV P1,A LCALL DELAY RRC A DJNZ R2,LOOP1 LJMP START DELAY: MOV R5,#20 ; D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,
15、$ DJNZ R6,D2 DJNZ R5,D1 RET END 7 C 语言源程序 #include unsigned char i; unsigned char temp; unsigned char a,b; void delay(void) unsigned char m,n,s; for(m=20;m0;m-) for(n=20;n0;n-) for(s=248;s0;s-); void main(void) while(1) temp=0xfe; P1=temp; delay(); for(i=1;i(8-i); P1=a|b; delay(); for(i=1;ii; b=temp
16、 unsigned char code table=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f, 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe, 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe, 0x00,0xff,0x00,0xff, 0x01; unsigned char i; void delay(void) unsigned char m,n,s; for(m=20;m0;m-) for(n=20
17、;n0;n-) for(s=248;s0;s-); void main(void) while(1) if(tablei!=0x01) P1=tablei; . . i+; delay(); else i=0; . . 6 报警产生器 1 实验任务 用 P1.0 输出 1KHz和 500Hz的音频信号驱动扬声器,作报警信号,要求1KHz 信号响 100ms ,500Hz信号响 200ms,交替进行, P1.7 接一开关进行控制,当 开关合上响报警信号,当开关断开告警信号停止,编出程序。 2 电路原理图 图 4.6.1 3 系统板上硬件连线 (1 把“单片机系统”区域中的P1.0 端口用导线连接
18、到“音频放大模块” 区域中的 SPK IN 端口上; (2 在“音频放大模块”区域中的SPK OUT 端口上接上一个 8 欧的或者是 16 欧的喇叭; (3 把“单片机系统”区域中的P1.7/RD 端口用导线连接到“四路拨动开 关”区域中的 K1端口上; 4 程序设计内容 . . (1 信号产生的方法 500Hz信号周期为 2ms ,信号电平为每 1ms变反 1 次,1KHz的信号周 期为 1ms ,信号电平每 500us 变反 1 次; 5 程序框图 图 4.6.2 6 汇编源程序 FLAG BIT 00H ORG 00H START: JB P1.7,START JNB FLAG,NEXT
19、 MOV R2,#200 DV: CPL P1.0 LCALL DELY500 LCALL DELY500 DJNZ R2,DV CPL FLAG . . NEXT: MOV R2,#200 DV1: CPL P1.0 LCALL DELY500 DJNZ R2,DV1 CPL FLAG SJMP START DELY500: MOV R7,#250 LOOP: NOP DJNZ R7,LOOP RET END 7 C 语言源程序 #include #include bit flag; unsigned char count; void dely500(void) unsigned char
20、i; for(i=250;i0;i-) _nop_(); void main(void) while(1) if(P1_7=0) for(count=200;count0;count-) P1_0=P1_0; dely500(); for(count=200;count0;count-) P1_0=P1_0; dely500(); dely500(); . . . . 7 I/O并行口直接驱动 LED显示 1. 实验任务 如图 13 所示,利用 AT89S51单片机的 P0端口的 P0.0P0.7 连接到一个共阴数 码管的 ah 的笔段上,数码管的公共端接地。在数码管上循环显示09 数字, 时
21、间间隔 0.2 秒。 2. 电路原理图 图 4.7.1 3. 系统板上硬件连线 把“单片机系统”区域中的P0.0/AD0P0.7/AD7 端口用 8 芯排线连接到“四路 静态数码显示模块”区域中的任一个数码管的ah 端口上;要求: P0.0/AD0 与 a 相连, P0.1/AD1 与 b 相连, P0.2/AD2 与 c 相连, P0.7/AD7 与 h 相连。 4. 程序设计内容 (1 LED 数码显示原理 . . 七段 LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根 据各管的极管的接线形式,可分成共阴极型和共阳极型。 LED数码管的 ga七个发光二极管因加正电压而发亮
22、,因加零电压而不以发亮, 不同亮暗的组合就能形成不同的字形,这种组合称之为字形码, 下面给出共阴极 的字形码见表 2 “0”3FH “8”7FH “1”06H “9”6FH “2”5BH “A”77H “3”4FH “b”7CH “4”66H “C ”39H “5”6DH “d”5EH “6”7DH “E”79H “7”07H “F”71H (2 由于显示的数字 09 的字形码没有规律可循,只能采用查表的方 式来完成我们所需的要求了。这样我们按着数字09 的顺序,把 每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLE DB 3FH ,06H ,5BH ,4FH ,66H ,6DH ,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 实例 详细 代码 说明
链接地址:https://www.31doc.com/p-5633494.html