找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机频率计 显示有问题

[复制链接]
跳转到指定楼层
楼主
有大神能帮我看看是哪儿出问题了吗,想弄一个脉冲频率计,显示有问题啊,只有不输入频率时是对的

  1. ;********************************************************************************
  2. ;频率计———六位数码管显示                                                        *
  3. ;喇叭接p3.7口,数码管数据p0,数码管控制p2                                        *
  4. ;p3.5为频率输入端。p1.4是控制信号输出端                                         *
  5. ;在不增加任何外部计数硬件的情况下,本试验测试软件可测最高频率达到460KHz。       *
  6. ;用一根1pin排线短接P1.4 → P3.5 显示:; 000066(Hz)                             *
  7. ;工作原理:                                                                     *
  8. ;1S 钟内对输入脉冲所计数的次数则为频率值。                                      *
  9. ;16位二进制加法计数器的最大计数值为 65535。                                     *
  10. ;设置定时器 0 工作在定时方式1,定时1S。                                         *
  11. ;设置定时器 1 工作在计数方式1,对输入脉冲进行计数,溢出产生中断。               *
  12. ;将定时器 1 中断定义为优先。在中断处理程序里对中断次数进行计数。1S到后,        *
  13. ;将中断次数和计数器里的计数值取出进行综合数据处理,处理后的数据送数码管显示。   *
  14. ;信号来源:                                                                     *
  15. ;1、软件里对 P1.4 定时取反,形成输出脉冲,接到 P3.5 可自测。                     *
  16. ;包含:外部中断设置,中断服务程序,定时程序,定时服务程序                       *
  17. ;以及数据处理,显示,包括三位十进制数转化为四位BCD码,                          *
  18. ;********************************************************************************
  19.         BEEP   BIT  P3.7        ;蜂鸣器控制线
  20.         S1     BIT  P2.7        ;数码管位线
  21.         S2     BIT  P2.6
  22.         S3     BIT  P2.5
  23.         S4     BIT  P2.4
  24.         S5     BIT  P2.3
  25.         S6     BIT  P2.2
  26.         S7     BIT  P2.1
  27.         S8     BIT  P2.0
  28.         LED_DATA   EQU  P0      ;数码管数据定义
  29. ;--------------------------------------------------------------
  30.         TIMER_H   EQU   46H     ;定时器高位字节单元
  31.         TIMER_L   EQU   47H     ;定时器低位字节单元
  32.         TIMCOUNT  EQU   48H     ;时间中断数
  33.         INT_H    EQU   45H      ;T1计数缓冲单元高地址
  34.         INT_L    EQU   44H      ;T1计数缓冲单元低地址
  35.         INT_G    EQU   43H      ;T1计数溢出次数计数
  36.         T_G      EQU   63H
  37.         T_H      EQU   60H      ;数据显示的高位
  38.         T_S      EQU   61H      ;数据显示中位
  39.         T_M      EQU   62H      ;数据显示低位
  40.         DISSTART EQU   70H      ;显示单元首地址
  41. ;--------------------------------------------------------------
  42.            ORG 00H
  43.            JMP MAIN             ;主程序开始
  44.            ORG 0BH
  45.            JMP TIMER_INT        ;定时器T0中断服务程序
  46.            ORG  1BH
  47.            JMP  TIMER1          ;定时器T1中断服务程序
  48.            ORG 030H
  49. ;-------------------------------------------------------------
  50. ;主程序
  51. ;-------------------------------------------------------------
  52. MAIN:      MOV  SP,#30H         ; 设置SP指针
  53.            LCALL PRO_SET        ;初始化
  54.            LCALL TIM_T0
  55. MLP:
  56.            LCALL EX_PRO         ;外部中断数据转换
  57.            LCALL EX_DISPLAY     ;外部中断数据显示
  58.                                 ;我们利用它来进行中断计数操作
  59.            JMP MLP
  60. ;---------------------------------------------------------
  61. ;初始化程序
  62. ;---------------------------------------------------------
  63. PRO_SET:
  64.           MOV A,#00H
  65.           MOV B,#00H
  66.           MOV 2AH,A
  67.           MOV P0,#0FFH
  68.           MOV P1,#0FFH
  69.           MOV P2,#0FFH
  70.           MOV INT_H,#00H
  71.           MOV INT_L,#00H
  72.           MOV INT_G,#00H
  73.           MOV T_S,#00H
  74.           MOV T_H,#00H
  75.           MOV T_M,#00H
  76.           MOV T_G,#00H
  77.           MOV TIMCOUNT,#00H
  78.           MOV TIMER_H,#4CH      ;定时 50 MS
  79.           MOV TIMER_L,#0FH        
  80.           CLR BEEP
  81.           SETB  P3.5            ;3.5端口(T1)置输入状态
  82.           RET
  83. ;--------------------------------------------------------
  84. ;对T1溢出产生中断的次数进行计数
  85. ;计满65535,产生一次溢出中断。
  86. ;--------------------------------------------------------
  87. TIMER1:
  88.           INC  2AH
  89.           RETI
  90. ;--------------------------------------------------------
  91. ;定时/计数器设置
  92. ;--------------------------------------------------------
  93. TIM_T0:   MOV TMOD,#0D1H         ;
  94.           MOV TH0,TIMER_H        ;设置定时初值高位
  95.           MOV TL0,TIMER_L        ;设置定时初值低位
  96.           MOV  TH1,#00H          ;清T1计数器
  97.           MOV  TL1,#00H
  98.           MOV  IE,#8AH           ;开中断总允许,允许T1溢出中断
  99.           SETB  PT1              ;TIMER1优先
  100.           SETB  TR1
  101.           SETB  TR0              ;定时器开始工作
  102.           RET
  103. ;-------------------------------------------------------
  104. ;定时器0中断服务程序
  105. ;-------------------------------------------------------
  106. TIMER_INT:
  107.          CLR TR0              ;关闭定时器
  108.          MOV TL0,TIMER_L      ;重新赋初值
  109.          MOV TH0,TIMER_H                 ;
  110.          INC TIMCOUNT         ;定时1S,时间单位
  111.          MOV A,TIMCOUNT       ;查看数量值
  112.          CJNE A,#20,T_END     ;如果没有到1S返回
  113.          CLR  TR1
  114.          MOV TIMCOUNT,#00H    ;到1S则清零
  115.          MOV INT_L,TL1        ;取出计数值
  116.          MOV INT_H,TH1        ;
  117.          MOV  INT_G,2AH
  118.          MOV  TH1,#00H
  119.          MOV  TL1,#00H
  120.          MOV  2AH,#00H
  121.          SETB  TR1
  122. T_END:   SETB TR0             ;重新开始定时操作
  123.          RETI
  124. ;-------------------------------------------------------
  125. ;-------------------------------------------------------
  126. EX_DISPLAY:
  127.          MOV R0,#DISSTART      ;获得显示单元首地址
  128.          MOV R1,#0BFH          ;从第二个数码管开始
  129.          MOV R2,#06H           ;共显示6位数码管
  130. DISLP:  MOV LED_DATA,@R0      ;读取显示单元数据
  131.          INC R0                ;取下一个单元地址
  132.          MOV P2,R1             ;开始显示当前位
  133.          MOV A,R1              ;准备显示下一位
  134.          RR A                          ;
  135.          MOV R1,A              ;下一位
  136.          LCALL DELAY5MS        ;延时 5 MS
  137.          DJNZ R2,DISLP         ;重复显示下一个
  138.          RET                   ;显示完成,返回
  139. ;-----------------------------------------------------
  140. ;时间处理,主要为 BCD码转换,查表
  141. ;-----------------------------------------------------
  142. EX_PRO:   SETB PSW.3                    ;准备 寄存器
  143.           CLR PSW.4                     ;
  144.           MOV R6,INT_H                 ;得到高位数据
  145.           MOV R7,INT_L                  ;得到低位数据
  146.           MOV R5,INT_G
  147.           LCALL DATA_PRO               ;开始转换
  148.           LCALL BCD                 ;转换完成后,开始进行码型变换
  149.           MOV R0,#DISSTART          ;开始填充显示单元
  150.           MOV R2,#06H                ;共计填充 6 位
  151.   PRLP:   MOV A,@R0                  ;获得当前位地址
  152.           MOV DPTR,#TAB_NU        ;获得表头
  153.           MOVC A,@A+DPTR         ;获得编码数据
  154.           MOV @R0,A                  ;保存编码数据
  155.           INC R0                        ;指向下一个带转换数据
  156.           DJNZ R2,PRLP                 ;继续转换,直到完成
  157.           RET                           ;转换完成,返回
  158. ;-------------------------------------------------------------
  159. ;两位 十六进制 转化为 2 位 BCD 码
  160. ;高位 ->R6 低位 ->R7,转化后 从高到低 T_S,T_M,T_H
  161. ;-------------------------------------------------------------
  162. DATA_PRO:
  163.            PUSH PSW
  164.            SETB PSW.3              ;设置当前寄存器
  165.            CLR  PSW.4
  166.            CLR  A                   ;清累加器
  167.            MOV T_G,A
  168.            MOV T_H,A               ;清除出口单元,准备转换
  169.            MOV T_M,A
  170.            MOV T_S,A
  171.            MOV R2,#24              ;共计转换24位
  172. HB3:       MOV A,R7                ;获得低位数据
  173.            RLC A                   ;带位左移,高位数据在CY中
  174.            MOV R7,A                ;保存数据
  175.            MOV A,R6                ;取得高位数
  176.            RLC A                   ;带进位左移
  177.            MOV R6,A                ;保存数据
  178.            MOV A,R5                ;取得高位数
  179.            RLC A                   ;带进位左移
  180.            MOV R5,A
  181.            MOV A,T_S               ;得到低位数据
  182.            ADDC A,T_S              ;累加
  183.            DA A                    ;十进制调整
  184.            MOV T_S,A               ;保存数据
  185.            MOV A,T_M               ;得到第二位数据
  186.            ADDC A,T_M              ;累加
  187.            DA A                    ;十进制调整
  188.            MOV T_M,A               ;保存结果
  189.            MOV A,T_H               ;得到第三位
  190.            ADDC A,T_H              ;累加
  191.            DA A
  192.            MOV T_H,A               ;保存
  193.            MOV A,T_G               ;得到第四位
  194.            ADDC A,T_G              ;累加
  195.            MOV T_G,A
  196.            DJNZ R2,HB3             ;没有转换完毕,重复转换
  197.            POP PSW                 ;转换完毕,恢复PSW
  198.            RET                     ;返回
  199. ;-----------------------------------------------------------
  200. ;码型变换,将带转换的数据分成,不同的数位,并转换成单位BCD码
  201. ;-----------------------------------------------------------
  202. BCD:       MOV R0,#DISSTART    ;获得首地址
  203.            MOV A,T_S           ;获得待转化的低位
  204.            MOV B,#10           ;转化进制,如果要进行十进制转换 改为 10
  205.            DIV AB              ;计算 A/B
  206.            MOV @R0,B           ;第一位转换完毕,保存低位转化后的数据
  207.            INC R0              ;自增
  208.            MOV @R0,A           ;保存高位
  209.            INC R0              ;取第二个数据地址
  210.            MOV A,T_M           ;获得第二个需要转换的数据
  211.            MOV B,#10           ;十六进制
  212.            DIV AB              ;计算
  213.            MOV @R0,B           ;存低位
  214.            INC R0
  215.            MOV @R0,A           ;存高位
  216.            INC R0              ;第三位
  217.            MOV A,T_H           ;获得第三个需要转换的数据
  218.            MOV B,#10           ;十六进制
  219.            DIV AB              ;计算
  220.            MOV @R0,B           ;存低位
  221.            INC R0
  222.            MOV @R0,A           ;存高位
  223.            RET                 ;完毕,返回
  224. ;---------------------------------------------------
  225. ;定时 5MS
  226. ;---------------------------------------------------
  227. DELAY5MS:
  228.    PUSH PSW
  229.    CLR  PSW.3
  230.    SETB  PSW.4
  231.    MOV R0,#250
  232.    MOV R1,#2
  233. D20:     DJNZ R0,D20
  234.           MOV R0,#250
  235.           DJNZ R1,D20
  236.           POP PSW
  237.           RET
  238. ;----------------------------------------------------------------
  239. ;这是数字显示表格,其中 带小数点的数字比不带小数点的数字小20
  240. ; 比如 0 的显示代码为 28;那么 0.的显示代码为 8;如此类推
  241. ;----------------------------------------------------------------
  242. TAB_NU:
  243.    DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;3FH,06H,5BH,04FH,66H,6DH,7DH,07H,7FH,6FH;28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h,30h,25h,0a9h,26h,0a1h,0b1h;
  244.    ;DB 8H,5eH,82H,42H,54H,41H,1H,5aH,00H,40H,00,00,00,00,00,00;带小数点
  245. ;-----------------------------------------------------------------
  246.     END     ;告诉编译器本程序到此结束。
复制代码




捕获.PNG (30.95 KB, 下载次数: 24)

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

使用道具 举报

沙发
ID:401564 发表于 2018-12-4 10:04 | 只看该作者
TMOD设定为外部输入计数器模式,而不是内部的定时器模式,你现在设定的是内部的时钟作为16位计数器的时钟源
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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