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

    单片机实验指导书100710.pdf

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

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

    单片机实验指导书100710.pdf

    电工电子实验 单片机实验指导书单片机实验指导书单片机实验指导书单片机实验指导书 电工电子实验教学中心 2008 年 11 月 1 目目目目录录录录 1.闪烁灯 2.模拟开关灯 3.广告灯的左移右移 4.广告灯(利用取表方式) 5.蜂鸣器报警信号产生 6.按键识别方法之一 7.0099 计数器 8.0059 秒计时器(利用软件延时) 9.动态数码显示技术 10. 4×4 矩阵式键盘识别技术 11. 定时计数器 T0 作定时应用技术(一) 12. 定时计数器 T0 作定时应用技术(二) 13. 99 秒马表设计 14. “嘀、嘀、”报警声 15. ADC0809 A/D 转换器基本应用技术 16. 8×8LED 点阵显示技术 17. 点阵 LED“09”数字显示技术 18. 附录:TKStudio 集成开发环境使用简介 2 1 1 1 1、闪烁灯、闪烁灯 1 1、实验任务实验任务 8 个发光二极管(L1-L8)不停地一亮一灭,一亮一灭的时间间隔为 0.2 秒。 2 2、实验箱上端口地址实验箱上端口地址 发光二极管单元地址:2FFFH 3.3. 程序设计内容程序设计内容 (1)延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间 隔为 0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来 达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理: 石英晶体为 12MHz,因此,1 个机器周期为 1 微秒 机器周期微秒 DELAY: MOV R6,#202 个2 D1:MOV R7,#2482 个222×24849820× DJNZ R7,$2 个2×248(498 DJNZ R6,D12 个2×204010002 因此,上面的延时程序时间为 10.002ms。 由以上可知,当 R610、R7248 时,延时 5ms,R620、R7248 时,延时 10ms,以 此为基本的计时单位。如本实验要求 0.2 秒200ms,10ms×R5200ms,则 R520,延时 子程序如下: DELAY:MOV R5,#20 D1:MOV R6,#20 D2:MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET (2)输出控制 根据发光二极管的单向导电性可知,当给端口 2FFFH 单元输出高电平时,发光二极管 熄灭;当端口 2FFFH 单元输出低电平,发光二极管亮; 5 5、程序框图、程序框图 如图 1.1 所示 6 6、汇编源程序、汇编源程序 ORG 0000h AJMP 0030H ORG 0030H START:MOV DPTR,#2FFFH MOVA,#55H MOVX DPTR,A LCALLDELAY CPLA MOVX DPTR,A LCALLDELAY LJMPSTART DELAY:MOV R5,#20;显示0.2 秒 D1:MOV R6,#20 D2:MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END 3 图 1.1 2 2 2 2、模拟开关灯、模拟开关灯 1 1、实验任务、实验任务 监视开关 Ki(i=1,2,8)的状态,用发光二极管 Li 显示开关状态,如果开关 Ki 按下,对 应 Li 亮,开关不按,Li 熄灭。 2 2、实验箱上端口地址实验箱上端口地址 将 8 路按键开关的状态送到八路发光二极管指示模块 8 路按键开关地址:3FFFFH 发光二极管单元地址:2FFFH 3 3、程序设计内容、程序设计内容 (1)开关状态的检测过程 单片机对开关状态的检测相对于单片机来说,是从单片机 3FFFFH 端口输入信号, 而 输入的信号只有高电平和低电平两种, 当按键开关 K1 不按时, 输入高电平, 相当开关断开, 当按键开关 K1 按下去,即输入低电平,相当开关闭合。单片机可以采用 JBBIT,REL 或 者是 JNBBIT,REL 指令来完成对开关状态的检测即可。 (2)输出控制 当 2FFFH 端口输出高电平,根据发光二极管的单向导电性可知,这时对应发光二极管 L 熄灭;当 2FFFH 端口输出低电平,对应发光二极管 L 亮。 4 4、程序框图、程序框图见图 2. 1 5 5、汇编源程序、汇编源程序 ORG 0000H AJMP 0030H ORG 0030H START:MOV DPTR,#3FFFH MOVX A,DPTR MOV DPTR,#2FFFH MOVX DPTR,A LJMPSTART 开始 输出 55H, Li 熄灭,Lj 亮 (i 表示奇数,j 表示偶数) 延时 0.2 秒 55H 求反输出,Li 亮,Lj 熄灭 (i 表示奇数,j 表示偶数) 延时 0.2 秒 4 END 图 2. 1 3 3 3 3、广告灯的左移右移、广告灯的左移右移 1 1、实验任务、实验任务 做单一灯的左移右移,八个发光二极管 L1L8 分重复循环。 2 2、实验箱上端口地址实验箱上端口地址 发光二极管单元地址:2FFFH 3 3、程序设计内容、程序设计内容 只要给累加器值或常数值, 然后执行MOV DPTR,#2FFFHMOVX DPTR,A的指令, 即可 达到输出控制的动作。 使用RLC A,RRCA 实现左移和右移。 每次送出的数据是不同,具体的数据如下表 1 所示 4 4、程序框图、程序框图 L8L7L6L5L4L3L2L1 11111110 11111101 11111011 11110111 11101111 11011111 10111111 01111111 (表中数据为 0 时,灯亮,为 1 时,灯灭) 5 5、汇编源程序、汇编源程序 ORG 0000H AJMP START ORG 0030H START:MOV R2,#8 MOVA,#0FEH SETB C LOOP:MOV DPTR,#2FFFH MOVX DPTR,A LCALL DELAY RLCA DJNZ R2,LOOP N Y 开 始 Li亮 开关 ki 按下了吗? (i=1,2,8) Li 灭 5 MOV R2,#8 RRCA LOOP1:MOV DPTR,#2FFFH MOVX DPTR,A LCALL DELAY RRCA DJNZ R2,LOOP1 LJMPSTART DELAY:MOV R5,#20;延时 0.2S D1:MOV R6,#20 D2:MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END 4 4 4 4、广告灯(利用取表方式)、广告灯(利用取表方式) 1 1、实验任务、实验任务 利用取表的方法, 使 L1-L8 变化: 左移 2 次, 右移 2 次, 闪烁 2 次 (延时的时间 0.2 秒) 。 2 2、实验箱上端口地址实验箱上端口地址 发光二极管单元地址:2FFFH 3 3、程序设计内容、程序设计内容 在用表格进行程序设计的时候,要用以下的指令来完成 (1)利用 MOVDPTR,DATA16 的指令来使数据指针寄存器指到表的开头。 (2)利用 MOVCA,ADPTR 的指令,根据累加器的值再加上 DPTR 的值,就可以使 程序计数器 PC 指到表格内所要取出的数据。 因此,只要把控制码建成一个表,而利用 MOVCA,ADPTR 做取码的操作,就 可方便地处理一些复杂的控制动作,取表过程如下图所示: 4 4、程序框图、程序框图 图 4.1 5 5、汇编源程序、汇编源程序 ORG 0000H AJMPSTART ORG 0030H START:MOV DPTR,#TABLE LOOP2:CLR A MOVC A,A+DPTR N Y 数 据 指 针 DPTR 指 到 TABLE(表)的开头 根据 DPTR 到表内取码 开 始 将取出的码输出至 2FFFH 取出的码是结 束码 (01H) 吗? 将数据指针加 1 6 PUSH DPL PUSH DPH CJNEA,#01H,LOOP1 JMPSTART LOOP1:MOV DPTR,#2FFFH MOVX DPTR,A LCALLDELAY POP DPH POP DPL INC DPTR JMP LOOP2 DELAY:MOV R3,#20 D1:MOV R4,#20 D2:MOV R5,#248 DJNZ R5,$ DJNZ R4,D2 DJNZ R3,D1 RET TABLE: DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,7FH DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,7FH DB 7FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 7FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 00H, 0FFH,00H, 0FFH DB 01H END 5 5 5 5、蜂鸣器报警信号产生、蜂鸣器报警信号产生 1 1 实验任务实验任务 用 P1.4 输出 1KHz 和 100Hz 的音频信号驱动扬声器,作报警信号,要求 1KHz 信号响 4s,100Hz 信号响 1s,交替进行,从按键单元读取开关信号,当开关合上响报警信号,当开 关断开告警信号停止,编出程序。 2 2、实验箱上端口地址实验箱上端口地址 “单片机系统”区域中的 P1.4 端口用导线连接到“音频放大模块”区域中的 蜂鸣器 端口上; 2 2 程序设计内容程序设计内容 100Hz 信号周期为 10ms,信号电平为每 5ms 变反 1 次,1KHz 的信号周期为 1ms,信号 电平每 500us 变反 1 次; 3 3 程序框图程序框图 图 5.1 4 4 汇编源程序汇编源程序 FLAGBIT 00H ORG 0000H AJMP START ORG 0030H START:MOV DPTR,#3FFFH MOVXA,DPTR ANDA,01H JB A,START;=1 转移 JNB FLAG,NEXT;=0 转移 MOV DPTR,#200 DV:CPLP1.4 LCALL DELY500 LCALL DELY500 LCALL DELY500 LCALL DELY500 LCALL DELY500 N Y N N N YY Y 开始 K1 按下了吗? FLAG0 吗? 置 8000 次计数 P1.4 输出取反 延时 500us 计数值计完了吗? FLAG 取反 置 200 次计数 P1.4 输出取反 延时 5ms 计数值计完了吗? FLAG 取反 8 LCALL DELY500 LCALL DELY500 LCALL DELY500 LCALL DELY500 LCALL DELY500 CPLFLAG NEXT:MOV DPTR,#8000 DV1:CPLP1.4 LCALL DELY500 DJNZ R2,DV1 CPLFLAG SJMP START DELY500:MOV R7,#250; 延时 0.5ms LOOP:NOP DJNZ R7,LOOP RET END 6 6 6 6、按键识别方法之一按键识别方法之一 1 1 实验任务实验任务 每次按下一次开关(实验箱按键单元最右边的按键) ,计数值加 1,通过实验箱上发光 二极管单元的右边四个发光二极管显示出其的二进制计数值。 2 2、实验箱上端口地址实验箱上端口地址 发光二极管地址:2FFFH 2 2 程序设计方法程序设计方法 作为一个按键从没有按下 到按下以及释放是一个完整 的过程,也就是说,当我们按 下一个按键时,总希望某个命 令只执行一次,而在按键按下 的过程中,不要有干扰进来, 因为,在按下的过程中,图 6.1 一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时 候,要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下, 我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体 积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法 去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定 的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个按键从按下到释放的全 过程的信号图如上图所示: 从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时 5ms 以上,从 而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按 下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起 的误触发,CPU 就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可 靠性。 由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命 令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键 释放的过程,显然释放的过程,就是使其恢复成高电平状态。 3 3 3 3程序框图程序框图 9 开始 按键按下了吗 Temp+ 送入发光二极管地址 图 6.1 4 4 C C 语言源程序语言源程序 #include #include #include #define uint unsigned int #define uchar unsigned char uchar temp,temp1,temp2; void delay(uint z); void main(void) temp=0xf0; XBYTE0x2fff=temp; while(1) delay(100); temp1=XBYTE0X3FFF; if(temp1=0xfe) delay(50); temp1=XBYTE0X3FFF; if(temp1=0xfe) temp+; temp2=temp; temp2=temp2|0xf0; XBYTE0x2fff=temp2; void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); 7 7 7 7、0000000099999999 计数器计数器 1 1 实验任务实验任务 利用 AT89S51 单片机来制作一个手动计数器,用实验箱上按键单元的最右边的按键作 为手动计数的按钮,用实验箱数码管显示单元的最右边 2 个数码管显示 0099 的计数计数 值。 2 2、实验箱上端口地址实验箱上端口地址 数码管段码地址:0FFFH 数码管位码地址:1FFFH 按钮地址:3FFFH 2 2 程序设计内容程序设计内容 (1)单片机对按键的识别的过程处理 (2)单片机对正确识别的按键进行计数,计数满时,又从零开始计数; (3)单片机对计的数值要进行数码显示,计得的数是十进数,含有十位和个位,我们 要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上显示。 如何拆开十位 10 和个位我们可以把所计得的数值对 10 求余,即可个位数字,对 10 整除,即可得到十位数字 了。 (4)通过查表方式,分别显示出个位和十位数字。 3 3 程序框图程序框图 开始 Count 初始为 0 Count+ 按键识别成功 Count=100? 显示 count 数值 图 7.1 4 4 C C 语言源程序语言源程序 #include #include #define uint unsigned int #define uchar unsigned char Ucharcode table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0 x07,0x7f,0x6f; uchar temp; uint count; void delay(uint z); void disp(uchar count) XBYTE0X0FFF=tablecount% 10; XBYTE0X1FFF=0xfe; delay(2); XBYTE0X0FFF=tablecount/1 0; XBYTE0X1FFF=0xfd; delay(2); XBYTE0X1FFF=0xff; void main(void) p14=1; count=0; while(1) disp(count); temp=XBYTE0X3FFF; temp=temp|0xfe; if(temp=0xfe) delay(50); temp=XBYTE0X3FFF; temp=temp|0xfe; if(temp=0xfe) count+; if(s=100) count=0; 11 void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); 8 8 8 8、0000000059595959 秒计时器(利用软件延时)秒计时器(利用软件延时) 1 1 1 1 实验任务实验任务 利用软件延时,在实验箱数码管显示单元的最右边 2 个数码管显示秒时间的十位和个 位。 2 2、实验箱上端口地址实验箱上端口地址 数码管段码地址:0FFFH 数码管位码地址:1FFFH 2 2 2 2 程序设计内容程序设计内容 (1)在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计 数单元加 1,当秒计数达到 60 时,就自动返回到 0,从新秒计数。 (2)对于秒计数单元中的数据要把它十位数和个数分开,方法仍采用对 10 整除和对 10 求余。 (3)在数码上显示,仍通过查表的方式完成。 (4)一秒时间的产生在这里我们采用软件精确延时的方法来完成。 3 3 3 3 程序框图程序框图 图 8.2 4 4 4 4 C C 语言源程序语言源程序 #include #include #define uint unsigned int #define uchar unsigned char ucharcode table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0 12 x07,0x7f,0x6f; uchar inttime,second; void delay(uint z); void dispsecond(uchar s) XBYTE0X0FFF=tables%10; XBYTE0X1FFF=0xfe; delay(2); XBYTE0X0FFF=tables/10; XBYTE0X1FFF=0xfd; delay(2); XBYTE0X1FFF=0xff; void main(void) TMOD=0x01; EA=1; ET0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; inttime=0; second=0; while(1) dispsecond(second); void time0() interrupt 1 using 1 inttime+; if(inttime=20) inttime=0; second+; if(second=60) second=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); 9 9 9 9、动态数码显示技术动态数码显示技术 1 1 1 1 实验任务实验任务 利用实验箱数码管显示单元右边的 5 个数码管,当按键单元最右边的按键按下时,显示 “12345”字样;当按键复位后时,显示“HELLO”字样。 2 2、实验箱上端口地址实验箱上端口地址 数码管段码地址:0FFFH 数码管位码地址:1FFFH 按钮地址:3FFFH 2 2 2 2 程序设计内容程序设计内容 (1)动态扫描方法 动态接口采用各数码管循环轮流显示的方法, 当循环显示频率较高时, 利用人眼的暂留 特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择) ,另一 接口完成各数码管的轮流点亮(数位选择) 。 (2)在进行数码显示的时候,要对显示单元开辟 8 个显示缓冲区,每个显示缓冲区装有 显示的不同数据即可。 (3)对于显示的字形码数据我们采用查表方法来完成。 3 3 3 3 程序框图 13 开始 K1 按键识别成功否? 置显示“12345”字形码首地址置显示“HELLO”字形码首地址 置字形码偏移量和位选代码 查表并送出显示 延时 2ms,并指向下一个偏移量 5 个数码管显示完否? 图 9.1 4 4 4 4 C C 语言源程序语言源程序 #include #include #define uint unsigned int #define uchar unsigned char uchar code table1=0x06,0x5b,0x4f,0x66,0x6d; uchar code table2=0x76,0x79,0x38,0x38,0x3f; uchar temp; void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); void disp(uchar s) XBYTE0X0FFF=s4; XBYTE0X1FFF=0xfe; delay(2); XBYTE0X0FFF=s3; XBYTE0X1FFF=0xfd; delay(2); XBYTE0X0FFF=s2; XBYTE0X1FFF=0xfb; delay(2); XBYTE0X0FFF=s1; XBYTE0X1FFF=0xf7; delay(2); XBYTE0X0FFF=s0; XBYTE0X1FFF=0xef; delay(2); XBYTE0X1FFF=0xff; void main(void) while(1) temp=XBYTE0X3FFF; temp=temp|0xfe; if(temp=0xfe) disp(table1); else if(temp=0xff) disp(table2); 14 101010104 4××4 4 矩阵式键矩阵式键盘识别技术盘识别技术 1 1、实验任务、实验任务 利用实验箱上键盘单元的按键,在数码管显示 单元上显示每个按键的“0F”序号。对应的 按键的序号排列如图 10.1 所示 图 10.1 2 2、实验箱上端口地址实验箱上端口地址 数码管段码地址:0FFFH 数码管位码地址:1FFFH 键盘列选线:CFFFH 键盘行选线:DFFFF 3 3 3 3、程序设计内容程序设计内容 (1)4×4 矩阵键盘识别处理 (2)每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的 行线和列线分别通过两并行接口和 CPU 通信。 每个按键的状态同样需变成数字量 “0” 和 “1”, 开关的一端(列线)通过电阻接 VCC,而接地是通过程序输出数字“0”实现的。键盘处理程 序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合 或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输 入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键 的功能。 4 4、程序框图、程序框图 0 4 8 C 1 5 9 D 2 6 A E 3 7 B F 15 开始 有按键按下吗? 延时 10ms 真的有按键按下吗? 根据当前状态识别按键 显示按键 图 10.2 5 5、C C 语言源程序语言源程序 16 #include #include #define uint unsigned int #define uchar unsigned char ucharcode table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0 x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 ; uchar temp; uchar key; uchar i,j; void main(void) XBYTE0x1fff=0xff; while(1) XBYTE0xdfff=0x0e; temp=XBYTE0xcfff; temp=temp if(temp!=0x0f) for(i=40;i0;i-) for(j=100;j0;j-); temp=XBYTE0xcfff; temp=temp if(temp!=0x0f) temp=XBYTE0xcfff; temp=temp switch(temp) case 0x0e: key=0; break; case 0x0d: key=1; break; case 0x0b: key=2; break; case 0x07: key=3; break; XBYTE0x0fff=tablekey; XBYTE0x1fff=0; temp=XBYTE0xcfff; temp=temp while(temp!=0x0f) temp=XBYTE0xcfff; temp=temp XBYTE0xdfff=0x0d; temp=XBYTE0xcfff; temp=temp if (temp!=0x0f) for(i=40;i0;i-) for(j=100;j0;j-); temp=XBYTE0xcfff; temp=temp if (temp!=0x0f) temp=XBYTE0xcfff; temp=temp switch(temp) case 0x0e: key=4; break; case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=7; break; temp=XBYTE0xcfff; XBYTE0x0fff=tablekey; XBYTE0x1fff=0; temp=temp while(temp!=0x0f) temp=XBYTE0xcfff; temp=temp 17 XBYTE0xdfff=0x0b; temp=XBYTE0xcfff; temp=temp if(temp!=0x0f) for(i=40;i0;i-) for(j=100;j0;j-); temp=XBYTE0xcfff; temp=temp if(temp!=0x0f) temp=XBYTE0xcfff; temp=temp switch(temp) case 0x0e: key=8; break; case 0x0d: key=9; break; case 0x0b: key=10; break; case 0x07: key=11; break; temp=XBYTE0xcfff; XBYTE0x0fff=tablekey; XBYTE0x1fff=0; temp=temp while(temp!=0x0f) temp=XBYTE0xcfff; temp=temp XBYTE0xdfff=0x07; temp=XBYTE0xcfff; temp=temp if (temp!=0x0f) for(i=40;i0;i-) for(j=100;j0;j-); temp=XBYTE0xcfff; temp=temp if (temp!=0x0f) temp=XBYTE0xcfff; temp=temp switch(temp) case 0x0e: key=12; break; case 0x0d: key=13; break; case 0x0b: key=14; break; case 0x07: key=15; break; temp=XBYTE0xcfff; XBYTE0x0fff=tablekey; XBYTE0x1fff=0; temp=temp while(temp!=0x0f) temp=XBYTE0xcfff; temp=temp 18 1111、定时计数器、定时计数器 T0T0 作定时应用技术(一)作定时应用技术(一) 1. 1. 1. 1.实验任务实验任务 用 AT89S51 单片机的定时/计数器 T0 产生一秒的定时时间,作为秒计数时间,当一秒 产生时,秒计数加 1,秒计数到 60 时,自动从 0 开始。 2. 2. 2. 2.程序设计内容程序设计内容 AT89S51 单片机的内部 16 位定时/计数器是一个可编程定时/计数器,它既可以工作在 13 位定时方式,也可以工作在 16 位定时方式和 8 位定时方式。只要通过设置特殊功能寄存 器 TMOD,即可完成。定时/计数器何时工作也是通过软件来设定 TCON 特殊功能寄存器来 完成的。 3. 3. 3. 3.程序流程图程序流程图 Second=0 并分 离十位、个位 Tcount=0 Tmod=01 H 置 TH0 、TL0 初值 允许 T0 中断 开中断 调用显示子程 序 往端口 0FFFH 送十位数字的 段码 Second=0 并分 离十位、个位 往端口 1FFFH 送十位数字的 位码 0F0H 往端口 0FFFH 送个位数字的 段码 往端口 1FFFH 送个位数字的 位码 0F0H 延时 延时 主程序 显 示 子 程 序 DISPLAY T0 中断子程序 赋 TH0、TL0 初值 TcounT1 +1 (A)=(TcounT) (A)=20 (TcounT)=0 (Second) +1 (A)= (Second (Second)=60 (Second)=0 中断返回 开始 现在我们选择 16 位定时工作方式, 对于 T0 来说, 最大定时也只有 65536us, 即 65.536ms, 无法达到我们所需要的 1 秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取 T0 的最大定时为 50ms,即要定时 1 秒需要经过 20 次的 50ms 的定时。对于这 20 次我们就 可以采用软件的方法来统计了。 因此,我们设定 TMOD00000001B,即 TMOD01H 19 下面我们要给 T0 定时/计数器的 TH0,TL0 装入预置初值,通过下面的公式可以计算出 TH0(21650000)/256 TL0(21650000)MOD256 当 T0 在工作的时候,我们如何得知 50ms 的定时时间已到,这回我们用中断来实现, 当然我们也可以通过检测 TCON 特殊功能寄存器中的 TF0 标志位, 如果 TF01 表示定时时 间已到。 4.4.汇编源程序(中断法)汇编源程序(中断法) SECONDEQU 30H TCOUNTEQU 31H ORG 00H LJMP START ORG 0BH LJMP INT0X START: MOV SECOND,#00H MOV A,SECOND MOV B,#10 DIVAB MOV TCOUNT,#00H MOV TMOD,#01H MOV TH0,#(65536-50000) / 256 MOVTL0,#(65536-50000) MOD 256 SETB TR0 SETB ET0 SETB EA LCALL DISPLAY INT0X:MOV TH0,#(65536-50000) / 256 MOVTL0,#(65536-50000) MOD 256 INC TCOUNT MOV A,TCOUNT CJNE A,#20,NEXT MOV TCOUNT,#00H INC SECOND MOV A,SECOND CJNE A,#60,NEX MOV SECOND,#00H NEX:NOP NEXT:RETI DISPLAY: MOV A,SECOND MOV B,#10 DIVAB MOV DPTR,#TAB MOVCA,A+DPTR MOV DPTR,#0FFFH MOVX DPTR,A MOV DPTR,#1FFFH MOV A, #0FDH MOVX DPTR,A LCALL DELAY MOV A,B MOV DPTR,#TAB MOVCA,A+DPTR MOV DPTR,#0FFFH MOVX DPTR,A MOV DPTR, #1FFFH MOV A, #0FEH MOVX DPTR,A LCALL DELAY LJMP DISPLAY RET DELAY: MOV R5,#2 D1:MOV R6,#20 D2:MOV R7,#100 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET TAB:DB 3FH, 06H, 5BH, 4FH, 66H,6DH,7DH DB 07H,7FH,6FH,77H,7CH,39H,5EH,79 H END 20 1212 、定时计数器、定时计数器 T0T0 作定时应用技术(二)作定时应用技术(二) 1.1.实验任务实验任务 用 AT89S51 的定时/计数器 T0 产生 2 秒钟的定时,每当 2 秒定时到来时,更换指示灯 闪烁,每个指示闪烁的频率为 0.2 秒,也就是说,开始 L1 指示灯以 0.2 秒的速率闪烁,当 2 秒定时到来之后,L2 开始以 0.2 秒的速率闪烁,如此循环下去。0.2 秒的闪烁速率也由定时 /计数器 T0 来完成。 2.2.程序设计内容程序设计内容 (1)定时 2 秒,采用 16 位定时 50ms,共定时 40 次才可达到 2 秒,每 50ms 产生一中 断,定时的 40 次数在中断服务程序中完成,同样 0.2 秒的定时,需要 4 次才可达到 0.2 秒。 对于中断程序,在主程序中要对中断开中断。 (2)由于每次 2 秒定时到时,L1L4 要交替闪烁。采用 ID 来号来识别。当 ID0 时,L1 在闪烁,当 ID1 时,L2 在闪烁;当 ID2 时,L3 在闪烁;当 ID3 时,L4 在闪烁 3.3.程序流程图程序流程图 4.4.汇编源程序汇编源程序 TCOUNT2SEQU 30H TCNT

    注意事项

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

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




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

    三一文库
    收起
    展开