网站导航: 首页 > 设计参考 > 正文 文章搜索
用basic语言编写的时钟
 
文章编号:
090113203855
文章分类: 单片机 AVR
点 击:
...
关 键 词: basic,时钟
文章来源:
网络
摘 要:
这个制作有点逗。 有趣之一它是使用一台坏仪表的米字管来作显示; 有趣之二是计时的频率用交流的60Hz(国内是50Hz); 有趣之三是用Basic语言编写的。(终于见识到开发AVR的第三种语言了)。

介绍:

这个制作有点逗。
有趣之一它是使用一台坏仪表的米字管来作显示;
有趣之二是计时的频率用交流的60Hz(国内是50Hz);
有趣之三是用Basic语言编写的。(终于见识到开发AVR的第三种语言了)。

实物图:

 

电路图:(点击可以放大)

 

源代码如下:

 
  1. ' Andy Maxwell   
  2. ' A 12-hour clock driven by 60hz from the wall.   
  3. ' 13 Feb 2002   
  4. ' Going to drive some numitron tubes in a scale head   
  5. ' I found at a a government surplus place.   
  6. ' Made for Royal Hutchinson because it's so perfect for his office   
  7.   
  8. ' BASCOM-AVR basic source for the Atmel 90AT2313 microcontroller   
  9.   
  10. ' Also, there is a 7404 inverter with a diode to clean up   
  11. ' the 60hz from a 9v AC input.   
  12. ' the 9vAC is from an old TRS-80 powersupply I opened up,   
  13. ' took out the 1/2-wave rectifier and capacitor, left the fuse in,   
  14. ' and closed back up.   
  15. ' The input for the 7404 is taken from before the rectifier/7805   
  16. ' powersupply, with a signal diode pointing back towards the powersupply   
  17. ' and connected to an input.   
  18.   
  19.   
  20. Dim Clock_t As Integer                  ' count ticks for a hole second   
  21. Dim Clock_s As Byte                     ' seconds   
  22. Dim Clock_m As Byte                     ' Minutes   
  23. Dim Clock_h As Byte                     ' hours   
  24.   
  25. ' A flag to alert when a new second has passed   
  26. Dim Clock_newsec As Bit   
  27. ' This cycles at 120Hz (set on each transition from high to low)   
  28. Dim Clock_ticker As Bit   
  29.   
  30. ' last level of the 60Hz input, used to determine when it changes   
  31. Dim Lastlevel As Bit   
  32.   
  33. ' clear the clock.   
  34. Clock_h = 0   
  35. Clock_m = 0   
  36. Clock_s = 0   
  37. Clock_t = 0   
  38.   
  39. ' this is a temp variable   
  40. ' that will hold the hour in either 12 or 24-hour format   
  41. ' used by the display   
  42. Dim Temp_h As Byte  
  43.   
  44.   
  45. ' variables for the display routine   
  46. Dim Tempstr As String * 4   
  47. Dim Y As Byte  
  48. Dim Z As Byte  
  49. Dim Tempbyte As Byte  
  50. ' This one holds which digit is being shown right now   
  51. Dim Digit As Byte  
  52. ' what goes out to the Numitron tubes   
  53. Dim Fourdigitdisplay As String * 4   
  54.   
  55.   
  56. ' Okay, set all of port B (pins 12 - 19) to high   
  57. Ddrb = &B11111111   
  58.   
  59.   
  60.   
  61. ' ------   
  62. ' Here's stuff to set the clock with   
  63. '   
  64.   
  65. ' Minutes   
  66. ' set the pin to be an input   
  67. Reset Ddrd.4   
  68. ' If you set a pin to be an input and set the output to be 1   
  69. ' it turns on the internal pullup   
  70. Set Portd.4   
  71.   
  72. ' Hours   
  73. ' set the pin to be an input   
  74. Reset Ddrd.5   
  75. ' internal pullup   
  76. Set Portd.5   
  77.   
  78. ' diagnostic output   
  79. ' no longer used   
  80. ' Set Ddrd.3   
  81. ' Reset Portd.3   
  82.   
  83.   
  84. ' Military time switch   
  85. ' set the pin to be an input   
  86. Reset Ddrd.2   
  87. ' If you set a pin to be an input and set the output to be 1   
  88. ' it turns on the internal pullup   
  89. Set Portd.2   
  90.   
  91.   
  92. ' --- 60Hz square wave (cleaned up by the 7404)   
  93. ' set this guy to be an input,   
  94. Reset Ddrd.6   
  95. ' no pullup resistor   
  96. Reset Portd.6   
  97.   
  98.   
  99.   
  100. Reset Lastlevel   
  101.   
  102. ' *** Main Program Loop   
  103. Do  
  104.    ' See if the 60Hz input is different from the last time   
  105.    ' we came through   
  106.    If Lastlevel <> Pind.6 Then  
  107.       ' We have a state change in the AC   
  108.       ' Set the ticker so the clock subroutine can do it's gig   
  109.       ' and toggle Lastlevel so we can notice it next time   
  110.       Toggle Lastlevel   
  111.       Set Clock_ticker   
  112.       'Toggle Portd.3  ' Diagnostic 60hz output   
  113.    End If  
  114.   
  115.   
  116.    ' Go check to see if it's a new second, and update all the   
  117.    ' clock_? variables.   
  118.    Gosub Check_clock   
  119.   
  120.    ' This is the hour value. Fine if we're in 24-hour military mode   
  121.    Temp_h = Clock_h   
  122.   
  123.   
  124.    If Pind.2 = 0 Then  
  125.       ' we are in 12-hour mode   
  126.       ' figure out what the 12-hour equivelent is   
  127.   
  128.       Temp_h = Clock_h   
  129.       If Temp_h > 12 Then  
  130.          Temp_h = Temp_h - 12   
  131.       End If  
  132.   
  133.       ' there ain't no zero hour in normal 12-hour clocks   
  134.       ' I didn't realize this until I started building   
  135.       ' a Nixie clock and Michele pointed it out.   
  136.       If Temp_h = 0 Then  
  137.          Temp_h = 12   
  138.       End If  
  139.   
  140.    End If  
  141.   
  142.    ' format the display. pad with zeros,   
  143.    ' and concatenate the hours and minutes   
  144.    Fourdigitdisplay = Format(str(temp_h) , "00") + Format(str(clock_m) , "00")   
  145.   
  146.    '' ************ Start OF DISPLAY CODE   
  147.   
  148.    ' each pass through the main do loop, show a different digit   
  149.    Incr Digit   
  150.    ' wrap around if it's 4.   
  151.    If Digit = 4 Then : Digit = 0 : End If  
  152.   
  153.    ' add 1 to the digit count 'cause MID is 1 based   
  154.    Y = Digit + 1   
  155.    ' and get the digit that we want   
  156.    Tempstr = Mid(fourdigitdisplay , Y , 1)   
  157.   
  158.   
  159.    ' Okay, this is confusing, so pay attention.   
  160.    ' The low nibble (4-bits) of portb is connected to the 7448   
  161.    ' 7-segment display driver on the old display subboard   
  162.    ' Send it Binary Coded Decimal (BCD) and it lights up the right   
  163.    ' segments on all the lit tubes.  That's the val(tempstr) you see.   
  164.    '   
  165.    ' The high nibble of portb is connected to the switching   
  166.    ' transistors that power the individual digits.   
  167.    ' So, we want to power-up digit 1, and send BCD for digit 1   
  168.    ' To get just one line high, I raise 2 to the Digit power   
  169.    ' and get 1, 2, 4, or 8 (check it out in binary)   
  170.    ' then I multiply it by 16 to shift it up to the high nibble.   
  171.    '   
  172.    ' Then, I add the BCD value of the digit to set the low nibble   
  173.    '   
  174.    ' Trust me, it works.   
  175.   
  176.    Tempbyte = 2 ^ Digit                 ' and light up the one line for the common cathode   
  177.    Tempbyte = Tempbyte * 16             ' move it up to the high nibble   
  178.    Tempbyte = Tempbyte + Val(tempstr)   ' add low byte number..   
  179.   
  180.    ' and send it to portb (pins 12-19)   
  181.    Portb = Tempbyte   
  182.   
  183.    '' ************ END OF DISPLAY CODE   
  184.   
  185.    ' this is left over from the serial testing   
  186.    'Print Clock_h ; ":" ; Clock_m ; ":" ; Clock_s ; ":"   
  187.   
  188.   
  189.    ' **** CLOCK SETTING ***   
  190.   
  191.    ' Now, this is the clock setting routine   
  192.      If Clock_newsec = 1 Then  
  193.      ' we've got ourselves a new second!   
  194.   
  195.       ' clear the flag.   
  196.       Reset Clock_newsec   
  197.   
  198.   
  199.       ' see if they've pressed the Minute set button   
  200.       If Pind.4 = 0 Then  
  201.          ' if so, increment the minute counter   
  202.          Incr Clock_m   
  203.          ' reset the seconds   
  204.          Clock_s = 0   
  205.          ' if we're over 60 minutes, set it back to zero   
  206.          If Clock_m = 60 Then Clock_m = 0   
  207.       End If  
  208.   
  209.   
  210.       'ditto for the hours button   
  211.       If Pind.5 = 0 Then  
  212.          Incr Clock_h   
  213.          Clock_s = 0   
  214.          If Clock_h = 24 Then Clock_h = 0   
  215.       End If  
  216.   
  217.   
  218.    End If                               ' clock_newsec = 1   
  219.   
  220.   
  221. Loop                                    ' go back to the loop   
  222.   
  223.   
  224.   
  225. '---------------------------------------   
  226. Check_clock:   
  227. '---------------------------------------   
  228.   
  229. 'output: Clock_t,h,m,s   
  230.   
  231. If Clock_ticker = 0 Then  
  232.    ' we haven't seen a change in the 60Hz line   
  233.    Return  
  234. End If  
  235.   
  236. ' If we're here, we have seen a change in the 60hz line   
  237. ' either up or down   
  238.   
  239. ' reset the flag so we'll notice it next time   
  240. Reset Clock_ticker   
  241.   
  242. ' and increment the sub counter   
  243. Incr Clock_t   
  244.   
  245. ' this is 120Hz because it's counting -transitions-.   
  246. ' the up and the down of the 60hz wave each count as one   
  247.   
  248. If Clock_t = 120 Then  
  249. ' Woo!  It's been a full second!   
  250. Clock_t = 0   
  251.   
  252. ' this is the flag for the time setting routine   
  253. Set Clock_newsec   
  254.   
  255.   
  256. ' Now, increment each unit counter by one and see if we've overflowed   
  257.   
  258. ' TICK   
  259. Incr Clock_s   
  260.   
  261. ' Did we overflow the seconds?   
  262. If Clock_s = 60 Then  
  263. ' reset the seconds to zero   
  264. Clock_s = 0   
  265.   
  266. ' and bump up the minutes counter   
  267. Incr Clock_m   
  268.   
  269. ' and so forth...   
  270. If Clock_m = 60 Then  
  271. Clock_m = 0   
  272. Incr Clock_h   
  273.   
  274. If Clock_h = 24 Then  
  275. Clock_h = 0   
  276.   
  277. ' here are all the end ifs from the incrementers   
  278.   
  279. End If  
  280. End If  
  281. End If  
  282. End If  
  283.   
  284. ' and return to the main loop   
  285. Return  
  286.   
  287. ' **** END OF PROGRAM  

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4