欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PDF文档下载
     

    51单片机实例(含详细代码说明).pdf

    • 资源ID:5633494       资源大小:2.67MB        全文页数:50页
    • 资源格式: PDF        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    51单片机实例(含详细代码说明).pdf

    . . 1 闪烁灯 1实验任务 如图 4.1.1 所示:在 P1.0 端口上接一个发光二极管L1,使 L1 在不停地一亮一 灭,一亮一灭的时间间隔为0.2 秒。 2电路原理图 图 4.1.1 3系统板上硬件连线 把“单片机系统”区域中的P1.0 端口用导线连接到“八路发光二极管指示模 块”区域中的 L1 端口上。 4程序设计内容 (1) 延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要 求的闪烁时间间隔为0.2 秒,相对于微秒来说,相差太大,所以我们在 执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程 序是如何设计呢?下面具体介绍其原理: . . 如图 4.1.1 所示的石英晶体为12MHz ,因此, 1 个机器周期为 1 微秒 机器周期微秒 MOV R6,#20 2个2 D1: MOV R7,#248 2 个2 22×248 498 20× DJNZ R7,$ 2 个2×248 (498 DJNZ R6,D1 2 个2×2040 10002 因此,上面的延时程序时间为10.002ms。 由以上可知,当 R610、R7 248 时,延时 5ms ,R620、R7 248 时, 延时 10ms,以此为基本的计时单位。如本实验要求0.2 秒200ms , 10ms ×R5 200ms ,则 R5 20,延时子程序如下: DELAY: MOV R5,#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: CLR 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 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 程序设计内容 (1) 开关状态的检测过程 单片机对开关状态的检测相对于单片机来说,是从单片机的 P3.0 端口输入信号, 而输入的信号只有高电平和低电平两种,当拨开开关 K1拨上去,即输入高电平, 相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。单片机 . . 可以采用 JB BIT,REL或者是 JNB BIT,REL指令来完成对开关状态的检测即 可。 (2) 输出控制 如图 3 所示,当 P1.0 端口输出高电平,即P1.01 时,根据发光二极管的单向 导电性可知,这时发光二极管L1 熄灭;当 P1.0 端口输出低电平,即P1.00 时,发光二极管 L1 亮;我们可以使用 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 所示, 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 开关状态检测 对于开关状态检测, 相对单片机来说, 是输入关系, 我们可轮流检测每个开关状 态,根据每个开关的状态让相应的发光二极管指示,可以采用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 方法一(汇编源程序) 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,NEXT2 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) 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 对应着 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 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,$ 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 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;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 端口用导线连接到“音频放大模块” 区域中的 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 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 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 数字, 时间间隔 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七个发光二极管因加正电压而发亮,因加零电压而不以发亮, 不同亮暗的组合就能形成不同的字形,这种组合称之为字形码, 下面给出共阴极 的字形码见表 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 ,7DH ,07H ,7FH ,6FH 5程序框图 图 4.7.2 . . 6 汇编源程序 ORG 0 START: MOV R1,#00H NEXT: MOV A,R1 MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A LCALL DELAY INC R1 CJNE R1,#10,NEXT LJMP START DELAY: MOV R5,#20 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 7 C 语言源程序 #include unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f; unsigned char dispcount; 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) while(1) for(dispcount=0;dispcount unsigned char count; void delay10ms(void) unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-); void main(void) while(1) if(P3_7=0) delay10ms(); if(P3_7=0) count+; if(count=16) count=0; . . P1=count; while(P3_7=0); . . 9 一键多功能按键识别技术 1实验任务 如图 4.9.1 所示,开关 SP1接在 P3.7/RD 管脚上,在 AT89S51单片机的 P1端口 接有四个发光二极管,上电的时候,L1 接在 P1.0 管脚上的发光二极管在闪烁, 当每一次按下开关SP1的时候, L2 接在 P1.1 管脚上的发光二极管在闪烁,再按 下开关 SP1的时候, L3 接在 P1.2 管脚上的发光二极管在闪烁,再按下开关SP1 的时候, L4 接在 P1.3 管脚上的发光二极管在闪烁,再按下开关SP1的时候,又 轮到 L1 在闪烁了,如此轮流下去。 2电路原理图 图 4.9.1 3系统板上硬件连线 (1 把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘” 区域中的 SP1端口上; (2 把“单片机系统”区域中的P1.0P1.4 端口用 8 芯排线连接到 “八路发光二极管指示模块”区域中的“L1L8”端口上; 要求, P1.0 连接到 L1,P1.1 连接到 L2,P1.2 连接到 L3,P1.3 连接到 L4 上。 . . 4程序设计方法 (1 设计思想由来 在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那 是因为每个人有不同的名子, 我们就很快认出, 同样,对于要通过一个按键来识 别每种不同的功能,我们给每个不同的功能模块用不同的ID 号标识,这样,每 按下一次按键, ID 的值是不相同的,所以单片机就很容易识别不同功能的身份 了。 (2 设计方法 从上面的要求我们可以看出, L1 到 L4 发光二极管在每个时刻的闪烁的时间是受 开关 SP1来控制,我们给 L1 到 L4 闪烁的时段定义出不同的ID 号,当 L1 在闪烁 时,ID0;当 L2 在闪烁时, ID1;当 L3 在闪烁时, ID2;当 L4 在闪烁时, ID3;很显然,只要每次按下开关K1时,分别给出不同的ID 号我们就能够完 成上面的任务了。下面给出有关程序设计的框图。 5程序框图 图 4.9.2 . . 6 汇编源程序 ID EQU 30H SP1 BIT P3.7 L1 BIT P1.0 L2 BIT P1.1 L3 BIT P1.2 L4 BIT P1.3 ORG 0 MOV ID,#00H START: JB K1,REL LCALL DELAY10MS JB K1,REL INC ID MOV A,ID CJNE A,#04,REL MOV ID,#00H REL: JNB K1,$ MOV A,ID CJNE A,#00H,IS0 CPL L1 LCALL DELAY SJMP START IS0: CJNE A,#01H,IS1 CPL L2 LCALL DELAY SJMP START IS1: CJNE A,#02H,IS2 CPL L3 LCALL DELAY SJMP START IS2: CJNE A,#03H,IS3 CPL L4 LCALL DELAY SJMP START IS3: LJMP START DELAY10MS: MOV R6,#20 LOOP1: MOV R7,#248 DJNZ R7,$ DJNZ R6,LOOP1 RET DELAY: MOV R5,#20 LOOP2: LCALL DELAY10MS DJNZ R5,LOOP2 RET . . END 7 C 语言源程序 #include unsigned char ID; void delay10ms(void) unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-); void delay02s(void) unsigned char i; for(i=20;i0;i-) delay10ms(); void main(void) while(1) if(P3_7=0) delay10ms(); if(P3_7=0) ID+; if(ID=4) ID=0; while(P3_7=0); switch(ID) case 0: P1_0=P1_0; delay02s(); break; case 1: P1_1=P1_1; delay02s(); break; case 2: P1_2=P1_2; . . delay02s(); break; case 3: P1_3=P1_3; delay02s(); break; . . 10 00 99 计数器 1 实验任务 利用 AT89S51单片机来制作一个手动计数器,在AT89S51单片机的 P3.7 管脚接 一个轻触开关,作为手动计数的按钮,用单片机的P2.0P2.7 接一个共阴数码 管, 作为 0099 计数的个位数显示,用单片机的 P0.0P0.7 接一个共阴数码管, 作为 0099 计数的十位数显示;硬件电路图如图19 所示。 2 电路原理图 图 4.10.1 3 系统板上硬件连线 (1 把“单片机系统”区域中的P0.0/AD0P0.7/AD7 端口用 8 芯排线连接到 “四路静态数码显示模块”区域中的任一个ah 端口上;要求: P0.0/AD0 对应着 a,P0.1/AD1 对应着 b, P0.7/AD7 对应着 h。 (2 把“单片机系统”区域中的P2.0/A8 P2.7/A15 端口用 8 芯排线连接到 “四路静态数码显示模块”区域中的任一个数码管的ah 端口上; (3 把“单片机系统”区域中的P3.7/RD 端口用导线连接到“独立式键盘”区 域中的 SP1端口上; . . 4 程序设计内容 (1 单片机对按键的识别的过程处理 (2 单片机对正确识别的按键进行计数,计数满时,又从零开始计数; (3 单片机对计的数值要进行数码显示,计得的数是十进数, 含有十位和个位, 我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码 管上显示。如何拆开十位和个位我们可以把所计得的数值对10 求余,即 可个位数字,对 10 整除,即可得到十位数字了。 (4 通过查表方式,分别显示出个位和十位数字。 5程序框图 图 4.10.2 6 汇编源程序 Count EQU 30H SP1 BIT P3.7 ORG 0 START: MOV Count,#00H NEXT: MOV A,Count MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,B MOVC A,A+DPTR . . MOV P2,A WT: JNB SP1,WT WAIT: JB SP1,WAIT LCALL DELY10MS JB SP1,WAIT INC Count MOV A,Count CJNE A,#100,NEXT LJMP START DELY10MS: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 7 C 语言源程序 #include unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f; unsigned char Count; void delay10ms(void) unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-); void main(void) Count=0; P0=tableCount/10; P2=tableCount%10; while(1) if(P3_7=0) delay10ms(); if(P3_7=0) Count+; if(Count=100) . . Count=0; P0=tableCount/10; P2=tableCount%10; while(P3_7=0); . . 11 00 59 秒计时器(利用软件延时) 1 实验任务 如下图所示,在 AT89S51单片机的 P0和 P2端口分别接有两个共阴数码管, P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个位。 2 电路原理图 图 4.11.1 3 系统板上硬件连线 (1 把“单片机系统”区域中的P0.0/AD0P0.7/AD7 端口用 8 芯排线连接到 “四路静态数码显示模块”区域中的任一个ah 端口上;要求: P0.0/AD0 对应着 a,P0.1/AD1 对应着 b, P0.7/AD7 对应着 h。 (2 把“单片机系统”区域中的P2.0/A8 P2.7/A15 端口用 8 芯排线连接到 “四路静态数码显示模块”区域中的任一个ah 端口上;要求:P2.0/A8 对应着 a,P2.1/A9 对应着 b, P2.7/A15 对应着 h。 4 程序设计内容 (1 在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时, 就 让秒计数单元加 1,当秒计数达到60 时,就自动返回到0,从新秒计数。 . . (2 对于秒计数单元中的数据要把它十位数和个数分开,方法仍采用对10 整 除和对 10 求余。 (3 在数码上显示,仍通过查表的方式完成。 (4 一秒时间的产生在这里我们采用软件精确延时的方法来完成,经过精确计 算得到 1 秒时间为 1.002 秒。 DELY1S: MOV R5,#100 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET 5 程序框图 图 4.11.2 . . 6 汇编源程序 Second EQU 30H ORG 0 START: MOV Second,#00H NEXT: MOV A,Second MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,B MOVC A,A+DPTR MOV P2,A LCALL DELY1S INC Second MOV A,Second CJNE A,#60,NEXT LJMP START DELY1S: MOV R5,#100 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 7 C 语言源程序 #include unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f; unsigned char Second; void delay1s(void) unsigned char i,j,k; for(k=100;k0;k-) for(i=20;i0;i-) for(j=248;j0;j-); void main(void) . . Second=0; P0=tableSecond/10; P2=tableSecond%10; while(1) delay1s(); Second+; if(Second=60) Second=0; P0=tableSecond/10; P2=tableSecond%10; . . 12 可预置可逆 4 位计数器 1 实验任务 利用 AT89S51单片机的 P1.0P1.3 接四个发光二极管 L1L4,用来指示当前计 数的数据;用 P1.4P1.7 作为预置数据的输入端,接四个拨动开关K1K4,用 P3.6/WR和 P3.7/RD 端口接两个轻触开关,用来作加计数和减计数开关。具体的 电路原理图如下图所示 2 电路原理图 图 4.12.1 3 系统板上硬件连线 . . (1 把“单片机系统”区域中的P1.0P1.3 端口用 8 芯排线连接到“八路发 光二极管指示模块”区域中的L1L4 上;要求: P1.0 对应着 L1,P1.1 对应着 L2,P1.2 对应着 L3,P1.3 对应着 L4; (2 把“单片机系统”区域中的P3.0/RXD,P3.1/TXD,P3.2/INT0 ,P3.3/INT1 用导线连接到“四路拨动开关”区域中的K1K4上; (3 把“单片机系统”区域中的P3.6/WR ,P3.7/RD 用导线连接到“独立式键 盘”区域中的 SP1和 SP2上; 4 程序设计内容 (1 两个独立式按键识别的处理过程; (2 预置初值读取的问题 (3 LED输出指示 5 程序框图 图 4.12.2 . . 6 汇编源程序 COUNT EQU 30H ORG 00H START: MOV A,P3 ANL A,#0FH MOV COUNT,A MOV P1,A SK2: JB P3.6,SK1 LCALL DELY10MS JB P3.6,SK1 INC COUNT MOV A,COUNT CJNE A,#16,NEXT MOV A,P3 ANL A,#0FH MOV COUNT,A NEXT: MOV P1,A WAIT: JNB P3.6,WAIT LJMP SK2 SK1: JB P3.7,SK2 LCALL DELY10MS JB P3.7,SK2 DEC COUNT MOV A,COUNT CJNE A,#0FFH,NEX MOV A,P3 ANL A,#0FH MOV COUNT,A NEX: MOV P1,A WAIT2: JNB P3.7,WAIT2 LJMP SK2 DELY10MS: MOV R6,#20 MOV R7,#248 D1: DJNZ R7,$ DJNZ R6,D1 RET END 7 C 语言源程序 #include unsigned char curcount; void delay10ms(void) . . unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-); void main(void) curcount=P3 P1=curcount; while(1) if(P3_6=0) delay10ms(); if(P3_6=0) if(curcount=15) curcount=15; else curcount+; P1=curcount; while(P3_6=0); if(P3_7=0) delay10ms(); if(P3_7=0) if(curcount=0) curcount=0; else curcount-; P1=curcount; while(P3_7=0); . .

    注意事项

    本文(51单片机实例(含详细代码说明).pdf)为本站会员(白大夫)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开