5939|1

275

帖子

4848

TA的资源

五彩晶圆(初级)

楼主
 

不用外时钟,用8051做一个满位分辨率和精度都为1的频率计 [复制链接]

来源:http://www.51c51.com/bbs/dispbbs.asp?boardid=6&replyid=200397&id=34655&page=1&skin=0&Star=1

我们知道,如果采用12MHz时钟时候,51定时计数器最大延时为65536us,为了产生1秒的频率计时间基准,通常的做法是采用50ms定时,然后再计数20次产生频率基准,这里就产生了几个问题。

1:由于定时计数器通过中断再装载定时值,其中因为中断等待和执行中断程序的时间误差在经过20次累计后将是一个很大的数值,直接造成的结果是对最终的时间基准产生≥20us的影响,很显然如果这样做,满位精度1Hz是无从谈起的。
2:通过微调定时器初值,我们或许可以将其误差调整到一个合适的范围,但是由于1/65536 的分辨率,很显然满足不了满位1Hz分辨率的要求。
那么除了用外时钟难道就没有别的方法了吗?方法当然是有的。
我用了一种全新的自动重装载方法,通过软件实现了分辨率和精度都是1us的1秒基准。
大家也许知道,如果只给51的定时计数器赋一次0初值,在16位模式进行定时器方式运行时,会按照0-65535循环计数、并在65535的下一个1us也就是TH和TL都是0时候发生溢出中断,我这个设计就是用到了这个原理。

这里我把1秒分解为:
65536X15+16960(us)
也就是说定时计数器的前15次中断,我并不进行定时值重装,这样,定时计数器实际上实现了自动重装的满16位定时器,其定时值
为:
65536X15=983040(us)由于没有进行初值重装而由硬件自动溢出重新开始,中断响应中就不会引入任何影响基准精度误差了。
最后我只是在第16次中断把16960的初值对定时计数器进行重装,(实际程序中是在第一次进行这个的)。这样我就实现了
983040+16960=1000000us=1秒 时间基准,由于可以对最后重装的尾数进行以1为单位的调整,这样就实现了分辨率和精度都是1us的时间基准,也就可以做出满位分辨率和精度都是1Hz的频率计了。

实验的线路如下:





当被测量频率为1MHz时候,显示为1000000+1Hz,结果完全达到实验要求。
说明:资料上说12MHz时钟时,51最高频率极限为500KHz不到,不过我在仿真时候反正能用到1MHz,所以我这里说的满位都是指1MHz,反正实际应用时候能用到多少算多少,这里只是一个程序的验证。

仿真源文件.rar (14.39 KB, 下载次数: 65)

[ 本帖最后由 老夫子 于 2009-11-24 11:23 编辑 ]
此帖出自51单片机论坛
点赞 关注
 

回复
举报

275

帖子

4848

TA的资源

五彩晶圆(初级)

沙发
 
  1. FREL EQU 20H ;频率地位缓存
  2. FREM EQU 21H ;频率中位缓存
  3. FREH EQU 22H ;频率高位缓存
  4. DISPBUF EQU 4FH ;显示缓冲区首地址,地址高低等于显示位高低顺序。
  5. TEMP EQU 47H
  6. FRETMP EQU 46H ;频率高位计数器
  7. BCDH EQU 43H ;压缩BCD码缓存入口,H\M1\M0\L分别对应由高到低4位压缩BCD码
  8. BCDM1 EQU 42H
  9. BCDM0 EQU 41H
  10. BCDL EQU 40H
  11. ;===========================主程序开始
  12. ORG 00H
  13. LJMP START
  14. ORG 0BH
  15. LJMP INT_T0
  16. ORG 1BH
  17. LJMP INT_T1
  18. START: MOV SP,#60H
  19. MOV DPTR,#TAB
  20. MOV FREL,#0
  21. MOV FREM,#0
  22. MOV FREH,#12
  23. MOV TEMP,#16
  24. MOV TMOD,#01010001B ;定时器1:计数器模式1,定时器0:定时器,模式1
  25. MOV TH0,#0
  26. MOV TL0,#0
  27. SETB TR0
  28. setb tr1
  29. SETB ET0
  30. setb et1
  31. SETB EA
  32. setb PT0
  33. clr PT1
  34. LOOP: ACALL BCD
  35. ACALL SEARCHTAB
  36. ACALL DISP
  37. SJMP LOOP
  38. ;*********************************
  39. INT_T0: CPL P3.0 ;P3.0端口发送脉冲方波,供自检
  40. DJNZ TEMP,INTDONE ;tmep减1
  41. mov TL0,#191 ;共循环16次,第一次送10000000us的尾数,该数可以根据时钟偏差以us为单位调整,尾数这次中断会对整个1秒定时产生误差也可以在这里调整,
  42. MOV TH0,#0BDH ;尾数计算公式:65536-(1000000-65536X15)= 48576=BDCOH
  43. MOV TEMP,#16 ;重置temp
  44. MOV FREL,TL1 ;保存频率数据低位
  45. MOV FREM,TH1 ;保存频率数据中位
  46. MOV FREH,FRETMP ;保存频率数据高位
  47. MOV TL1,#0 ;清除计数器1,重新开始
  48. MOV TH1,#0
  49. MOV FRETMP,#0
  50. INTDONE:RETI
  51. ;*********************************
  52. INT_T1: INC FRETMP ;溢出,则给频率高位计数器+1
  53. RETI
  54. ;*********************************
  55. SEARCHTAB:mov r0,#BCDH ;压缩BCD码拆位查表送缓冲区
  56. MOV R1,#DISPBUF
  57. mov R7,#4
  58. AAA: MOV A,@R0
  59. SWAP A
  60. ANL A,#00001111B
  61. MOVC A,@A+DPTR
  62. MOV @R1,A
  63. DEC R1
  64. MOV A,@R0
  65. ANL A,#00001111B
  66. MOVC A,@A+DPTR
  67. MOV @R1,A
  68. DEC R1
  69. DEC R0
  70. DJNZ R7,AAA
  71. RET ;到这里,显示缓冲区已经是7段码了
  72. ;*********************************
  73. ;输出显示子程序
  74. DISP: MOV R0,#DISPBUF
  75. MOV R1,#8
  76. MOV A,#01111111B
  77. DISP1: MOV P2,#0FFH ;关闭位选
  78. MOV P1,@R0
  79. MOV P2,A
  80. DEC R0
  81. RR A
  82. ACALL DELY1MS
  83. DJNZ R1,DISP1
  84. RET
  85. ;*********************************
  86. DELY1MS:MOV R6,#10
  87. D1: MOV R7,#49
  88. DJNZ R7,$
  89. DJNZ R6,D1
  90. RET
  91. ;**********************************
  92. ;2位半16进制转4位压缩BCD码,用的是非标准方式,线性执行未用任何转移指令,感兴趣的自行分析,本程序效率可以比经典BCD转码程序提高65%
  93. BCD:
  94. CLR A
  95. MOV BCDH,A
  96. MOV BCDM1,A
  97. MOV BCDM0,A
  98. MOV BCDL,A
  99. MOV C,FREH.3
  100. ADDC A,ACC
  101. MOV C,FREH.2
  102. ADDC A,ACC
  103. MOV C,FREH.1
  104. ADDC A,ACC
  105. MOV C,FREH.0
  106. ADDC A,ACC
  107. DA A
  108. MOV C,FREM.7
  109. ADDC A,ACC
  110. DA A
  111. MOV C,FREM.6
  112. ADDC A,ACC
  113. DA A
  114. XCH A,BCDL
  115. ADDC A,ACC
  116. XCH A,BCDL
  117. MOV C,FREM.5
  118. ADDC A,ACC
  119. DA A
  120. XCH A,BCDL
  121. ADDC A,ACC
  122. XCH A,BCDL
  123. MOV C,FREM.4
  124. ADDC A,ACC
  125. DA A
  126. XCH A,BCDL
  127. ADDC A,ACC
  128. XCH A,BCDL
  129. MOV C,FREM.3
  130. ADDC A,ACC
  131. DA A
  132. XCH A,BCDL
  133. ADDC A,ACC
  134. DA A
  135. XCH A,BCDL
  136. MOV C,FREM.2
  137. ADDC A,ACC
  138. DA A
  139. XCH A,BCDL
  140. ADDC A,ACC
  141. DA A
  142. XCH A,BCDM0
  143. RLC A
  144. XCH A,BCDL
  145. MOV C,FREM.1
  146. ADDC A,ACC
  147. DA A
  148. XCH A,BCDM0
  149. ADDC A,ACC
  150. DA A
  151. XCH A,BCDL
  152. RLC A
  153. XCH A,BCDM0
  154. MOV C,FREM.0
  155. ADDC A,ACC
  156. DA A
  157. XCH A,BCDL
  158. ADDC A,ACC
  159. DA A
  160. XCH A,BCDM0
  161. RLC A
  162. ;***********************
  163. XCH A,BCDL
  164. MOV C,FREL.7
  165. ADDC A,ACC
  166. DA A
  167. XCH A,BCDM0
  168. ADDC A,ACC
  169. DA A
  170. XCH A,BCDL
  171. ADDC A,ACC
  172. DA A
  173. XCH A,BCDM0
  174. MOV C,FREL.6
  175. ADDC A,ACC
  176. DA A
  177. XCH A,BCDL
  178. ADDC A,ACC
  179. DA A
  180. XCH A,BCDM0
  181. ADDC A,ACC
  182. DA A
  183. MOV C,FREL.5
  184. XCH A,BCDL
  185. ADDC A,ACC
  186. DA A
  187. XCH A,BCDM0
  188. ADDC A,ACC
  189. DA A
  190. XCH A,BCDL
  191. ADDC A,ACC
  192. DA A
  193. XCH A,BCDM0
  194. MOV C,FREL.4
  195. ADDC A,ACC
  196. DA A
  197. XCH A,BCDL
  198. ADDC A,ACC
  199. DA A
  200. XCH A,BCDM0
  201. ADDC A,ACC
  202. DA A
  203. XCH A,BCDM1
  204. ADDC A,ACC
  205. DA A
  206. XCH A,BCDL
  207. MOV C,FREL.3
  208. ADDC A,ACC
  209. DA A
  210. XCH A,BCDM0
  211. ADDC A,ACC
  212. DA A
  213. XCH A,BCDM1
  214. ADDC A,ACC
  215. DA A
  216. XCH A,BCDL
  217. ADDC A,ACC
  218. DA A
  219. XCH A,BCDM0
  220. MOV C,FREL.2
  221. ADDC A,ACC
  222. DA A
  223. XCH A,BCDM1
  224. ADDC A,ACC
  225. DA A
  226. XCH A,BCDL
  227. ADDC A,ACC
  228. DA A
  229. XCH A,BCDM0
  230. ADDC A,ACC
  231. DA A
  232. XCH A,BCDM1
  233. MOV C,FREL.1
  234. ADDC A,ACC
  235. DA A
  236. XCH A,BCDL
  237. ADDC A,ACC
  238. DA A
  239. XCH A,BCDM0
  240. ADDC A,ACC
  241. DA A
  242. XCH A,BCDM1
  243. ADDC A,ACC
  244. DA A
  245. XCH A,BCDL
  246. MOV C,FREL.0
  247. ADDC A,ACC
  248. DA A
  249. XCH A,BCDM0
  250. ADDC A,ACC
  251. DA A
  252. XCH A,BCDM1
  253. ADDC A,ACC
  254. DA A
  255. XCH A,BCDL
  256. ADDC A,ACC
  257. DA A
  258. MOV BCDH,A
  259. MOV A,BCDL
  260. XCH A,BCDM1
  261. XCH A,BCDM0
  262. MOV BCDL,A
  263. RET ;嘿嘿调试通过
  264. ;======================================
  265. TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
  266. END
复制代码
此帖出自51单片机论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表