找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7478|回复: 8
打印 上一主题 下一主题
收起左侧

单片机数字频率计proteus仿真设计 带汇编语言源程序

[复制链接]
跳转到指定楼层
楼主


汇编频率计的所有资料下载:
频率计.zip (110.65 KB, 下载次数: 135)


源程序:
  1. //************************************济南大学 赵向坤 数字频率计 功能:每隔1s(忽略了lcd显示所需时间,实际大于1s)刷新显示测量频*************************************//
  2. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  3. //内部RAM的120,121,122,123,124,125存储单元用于暂存显示频率数值。120,122,124依此存储TL0,TL0计满100,122计满100的次数,使用BACI程序转换成非压缩的ASCII码
  4. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  5. RS  EQU P2.0                  ;数据/命令选择端  
  6. RW  EQU P2.1                  ;读/写选择端
  7. E   EQU P2.2                  ;使能控制
  8. LCD EQU P0                    ;LCD的数据口,对应DB0-DB7
  9. ORG      0000H            
  10. AJMP     START               ;转向主程序
  11. ORG      000BH
  12. LJMP     INTTF0               ;转向计数器0
  13. ORG      001BH
  14. LJMP     INTTF1               ;转向计数器1
  15. ORG      0100H
  16. START:                        ;START用于LCD初始显示LCD第一行显示FRQC: ,第一行显示 WAIT
  17. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  18. //复位后SP=07,为防止与堆栈区占用工作寄存器区域0-31地址,需要重新设置堆栈区域
  19. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  20.         MOV   SP,#60H         ;设置堆栈区域
  21. //--------------------------------------------------------------------------------------------------------------------------------------------------------------------
  22. //LCD液晶初始化设置,并使LCD第一行显示FRQC:,第二行显示    WAIT  HZ  
  23. //---------------------------------------------第一行显示FRQC:---------------------------------------------------------------------------------------------------------
  24.        CALL  INTI_LCD         ;初始化液晶
  25.        MOV  A,#99
  26.        MOV  120,A
  27.        MOV  122,A
  28.        MOV  124,A
  29.       CALL  BACI
  30.         MOV  A,#0C0H            ;设置写入数据到LCD的开始地址
  31.         CALL  WRITE_COMMAND
  32.         MOV  DPTR,125        ;字符表首地址送DPTR
  33. LINE1:
  34.         MOV  A,@DPTR       ;将TAB1中数据送至A
  35.         ACALL  WRITE_DATA      ;调用写数据到LCD程序
  36.         DEC   DPTR
  37.         CJNE  DPTR,#120H,LINE1       ;是否写满5个
  38. NN:     SJMP  MM
  39.        SJMP  NN
  40. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  41. //B-A是将以120为首地址存放的压缩BCD频率数据转换成ASCI码,方便LCD显示
  42. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  43. BACI:
  44.         MOV  R0,#120        ; DPTR指向RAM120存储单元
  45. BACIW:
  46.         MOV  A,@R0
  47.         DA   A
  48.         MOV  B,A
  49.         ANL  A,#0FH
  50.         ORL  A,#30H
  51.         MOV  @R0,A
  52.         INC   R0
  53.         MOV  A,B
  54.         SWAP A
  55.         ANL  A,#0FH
  56.         ORL  A,#30H
  57.         MOV  @R0,A
  58.         INC   R0
  59.         MOV  A,R0
  60.         CJNE A,#126,BACIW
  61.         DEC  R0
  62. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  63. AGAIN1:
  64.         MOV   A,@R0
  65.         CJNE A,'0',BAEE
  66.         MOV  @R0,' '          ;将高位的显示数字0转换为空格
  67.         DEC  R0
  68.         CJNE R0,#120,AGAIN1    ;若要显示的数字全部为零,则只显示最后一个120存储单元中的0
  69. BAEE:    RET
  70. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  71. //LCD服务程序
  72. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  73. INTI_LCD:
  74.         MOV A,#38H  ;显示模式设置
  75.         CALL WRITE_COMMAND
  76.         CALL CHECK_BUSY  ;判忙
  77.         MOV A,#01H  ;清屏
  78.         CALL WRITE_COMMAND
  79.         MOV A,#0CH  ;显示开及光标设置
  80.         CALL WRITE_COMMAND
  81.         MOV A,#06H  ;显示光标移动设置
  82.         CALL WRITE_COMMAND
  83.         RET
  84. CHECK_BUSY:
  85.         CLR RS
  86.         SETB RW
  87. WAIT:
  88.         SETB E     ;E=1,允许送数据周期
  89.         MOV R7,#5
  90.         CALL DELAYR7MS
  91.         MOV A,LCD ;将LCD中数据送到A
  92.         MOV R7,#5
  93.         MOV R7,#5
  94.         CALL DELAYR7MS
  95.         CLR E  ;E=0,结束送数据周期
  96.         ANL A,#80H ;检查LCD是否忙碌
  97.         JNZ WAIT  ;是,返回TO继续检查,否则返回原程序地址
  98.         RET

  99. WRITE_COMMAND:
  100.       CLR RW
  101.       CLR RS
  102.       SETB E
  103.       MOV LCD,A ;将命令字写入LCD
  104.       CLR E
  105.       MOV R7,#5
  106.       CALL DELAYR7MS
  107.       RET

  108. WRITE_DATA:
  109.       SETB RS
  110.       CLR RW
  111.       SETB E
  112.       MOV LCD,A ;将数据送到LCD
  113.       CLR E
  114.       MOV R7,#5
  115.       CALL DELAYR7MS
  116.       RET
  117. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  118. //定时计数器初始模式设置
  119. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  120. STMOD:  
  121.         SETB  EA
  122.         MOV   TMOD,#26H      ;设置TMOD=26H,计数器0工作于计数工作方式2,初值为0
  123.         MOV   TH1,#(256-100)    ;定时100us次溢出中断
  124.         MOV   TL1,#(256-100)
  125.         MOV   TH0,#(256-100)    ;计数100次溢出中断
  126.         MOV   TL0,#(256-100)
  127.         SETB  ET1              ;开计数器1中断        
  128.         SETB  ET0              ;开计数器0中断
  129.         SETB  TR1              ;启动计数器0
  130.         SETB  TR0              ;启动计数器0
  131.         RET
  132. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  133. //延时子程序(延时时间=R7*1MS)
  134. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  135. DELAYR7MS:                     ;延时1ms*R7
  136. DL1:
  137.     MOV  R6,#8EH
  138. DL0:
  139.     MOV  R5,#02H
  140.     DJNZ R5,$
  141.     DJNZ R6,DL0
  142.     DJNZ R7,DL1
  143.     RET     
  144. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  145. //用于LCD查表显示
  146. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  147. TAB1: DB "FRQC:"
  148. TAB2: DB "WAIT"
  149. TAB3: DB "HZ"
  150. END
复制代码




评分

参与人数 2黑币 +10 收起 理由
王存超1998 + 5
wk123147 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:337682 发表于 2018-5-24 22:43 | 只看该作者
楼主好人!
回复

使用道具 举报

板凳
ID:345953 发表于 2018-6-13 15:04 | 只看该作者
谢谢,谢谢
回复

使用道具 举报

地板
ID:420497 发表于 2018-11-15 11:25 | 只看该作者
太感谢了!
回复

使用道具 举报

5#
ID:426970 发表于 2018-11-15 11:54 来自触屏版 | 只看该作者
很全,还有步骤讲解,谢谢
回复

使用道具 举报

6#
ID:420497 发表于 2018-11-15 13:14 | 只看该作者
太感谢啦!!!
回复

使用道具 举报

7#
ID:430684 发表于 2018-11-22 13:21 | 只看该作者
为什么一直显示606100
回复

使用道具 举报

8#
ID:458682 发表于 2018-12-31 16:03 | 只看该作者
王存超1998 发表于 2018-11-22 13:21
为什么一直显示606100

同问 而且和设置的频率根本不一样啊
回复

使用道具 举报

9#
ID:489357 发表于 2019-3-21 11:48 | 只看该作者
谢谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表