搜索
bottom↓
回复: 34

用M8、四位LED数码管和废鼠标做了个多功能电子表(说明和源程序)

[复制链接]

出0入0汤圆

发表于 2006-5-11 01:38:49 | 显示全部楼层 |阅读模式
做饭总是忘了时间,结果经常吃糊饭,就用M8、四位LED数码管和废鼠标做了个电子表。

************请版主删除无源码的那个同名贴子,谢谢!**************

1.BASCOM编程,有电子表、闹钟、倒计时闹响功能(煮饭时用这个功能,哈哈)

2.四位LED显示时间,蜂鸣器闹响

3.废鼠标做外壳,保留鼠标三个键做模式转换、时间、闹钟调整

4.由于接线少,没有做PCB板,用导线直接连线,用热溶胶固定、绝缘。











'(

现在用的这个机器没装protel,没时间画电路图了,作个简单硬件说明:

1、M8(1片),电阻8只(可选1-3k),四位7段led数码管1只(共阳),废鼠标1个,28IC座1个,电池1块,蜂鸣器1只 , 导线若干

2、portd口0-7顺序接led的A-G和DP,中间串8只电阻,led四个阳脚分别接portc口的1-4

3、portc.0接speaker;portb的0-2分别接鼠标中、左、右的微动开关,开关共地

4、我没有做pcb板,用热溶胶绝缘固定,防止短路。



几点说明:

1、使用内振,稳定性难以保证,若要高精度,建议用外振。

2、TCNT1的值可根据试验误差重新计算,此程序的是理论值。

3、LED数码管耗电较大,可选用lcd数码管

4、本来只想做个倒计时表放在厨房里,补来补去补成这个程序

5、程序由bascom-avr1.11.7.7编译通过,编译大小5.14K

6、刚学单片机很短时间,错误和遗漏请批评指点,谢谢!





功能说明:

1、电子表、闹钟、倒计时闹响(以分钟为单位)

2、中键选择模式,切换电子表和倒计时

3、倒计时模式时,左键增加时间,右键减少时间,闹响时按键停止,重新倒计时,按中间键切换到电子表模式

4、电子表模式时,按先左后右键进入调整闹钟时间,小时闪烁,左加右减,按中间键切换到调整分钟,分钟闪烁,左加右减,再按中间键退出返回电子表模式

5、电子表模式时,按先右后左键进入调整时间状态,方法同上。

')



$regfile = "m8def.dat"

$crystal = 8000000



Config Portb = Input

Config Portc = Output

Config Portd = Output



Config Timer1 = Timer , Prescale = 64                       '8-1us  64-8us 256-32us  1024-128us





Declare Sub Countdown()

Declare Sub Disptime(byval Hh As Byte , Byval Mm As Byte)

Declare Sub Settime()

Declare Sub Playmusic()



Dim Leddig(10) As Byte



Dim Bsecond As Byte , Timecounter As Bit

Dim Set_minutes As Byte

Dim S As Single

Dim I As Integer , P As Integer , N As Integer

Dim K As Bit , Dotflash As Bit , Countmark As Bit , Enalarm As Bit



Dim Timeflash As Byte



Dim Myhour As Byte , Myminute As Byte

Dim Alarmhour As Byte , Alarmminute As Byte



Dim H As Byte , M As Byte





Portb = &HFF

Portd = &HFF

Portc = 0



'Tcnt1h = &H0B                                              '赋定时器初始值   '3036

'Tcnt1l = &HDC

Counter1 = &H0BDC



Osccal = &HB8                                               '各芯片有不同校验值



Readeeprom Set_minutes , 0                                  '读已存的倒计时设定分钟



Restore Leddata                                             '读LED 显示位码(0-9)

For P = 1 To 10

   Read Leddig(p)

Next





Myhour = 11

Myminute = 11

Timeflash = 2





On Timer1 Tim1_isr

Enable Timer1

Enable Interrupts







Do





   '============显示时间========  此部分不要用DIDPTIME子程序,容易出现闪烁感

   P = Myminute Mod 10

   P = P + 1

   Portc = &B00010

   Portd = Leddig(p)                                        '显示分钟个位

   Waitms 5



   S = Myminute / 10

   P = Fix(s)

   P = P + 1

   Portc = &B00100

   Portd = Leddig(p)                                        '显示分钟十位

   Waitms 5







   P = Myhour Mod 10

   P = P + 1

   Portc = &B01000

   Portd = Leddig(p)                                        '显示小时个位



   If Dotflash = 1 Then                                     '闪烁小时和分钟中间两个分位点

         Set Portd.7                                        '1秒钟亮灭1次

      Else

         Reset Portd.7

   End If

   Waitms 5





   S = Myhour / 10

   P = Fix(s)

   P = P + 1

   Portc = &B10000

   Portd = Leddig(p)                                        '显示小时十位

   Waitms 5







   '========== 切换倒计时 ========

   If Pinb.0 = 0 Then                                       '转换键(鼠标中间键)按下切换倒计时

      Do

      Loop Until Pinb.0 = 1

      Call Countdown

   End If







   '===========闹时设置=============

   If Pinb.1 = 0 Then                                       '先左后右两键同时按下



      Do

         Call Disptime(myhour , Myminute )

      Loop Until Pinb.1 = 1 Or Pinb.2 = 0



      If Pinb.2 = 0 Then



         Do

         Loop Until Pinb.1 = 1 And Pinb.2 = 1               '等待都抬起



         Readeeprom Alarmhour , 1                           '读存储的设定闹时

         Readeeprom Alarmminute , 2



         H = Alarmhour : M = Alarmminute



         Call Settime()                                     'alarmhour , Alarmminute )



         Alarmhour = H : Alarmminute = M



         Writeeeprom Alarmhour , 1                          '存储闹时

         Writeeeprom Alarmminute , 2



      End If



   End If





   '===========时间设置=============

   If Pinb.2 = 0 Then



      Do

         Call Disptime(myhour , Myminute )

      Loop Until Pinb.1 = 0 Or Pinb.2 = 1



      If Pinb.1 = 0 Then                                    '先右后左两键同时按下



         Do

         Loop Until Pinb.1 = 1 And Pinb.2 = 1               '等待都抬起



         H = Myhour : M = Myminute



         Call Settime()                                     'myhour , Myminute )



         Bsecond = 0                                        '重置时间

         Myhour = H : Myminute = M



      End If



   End If





   '==============闹钟响============

   If Alarmhour = Myhour And Alarmminute = Myminute Then

      If Alarmhour <> 0 And Alarmminute <> 0 Then

         If Enalarm = 0 Then                                '若按键退出,防止在本分钟内重复播放

            Call Playmusic

            Enalarm = 1

         End If

      End If

   End If







Loop



End













Sub Disptime(h As Byte , M As Byte)





   If Timeflash = 0 Or Timeflash = 2 Then                   'TIMEFLASH是时间闪烁设定特征值



      P = Mm Mod 10

      P = P + 1

      Portc = &B00010

      Portd = Leddig(p)                                     '显示分钟个位

      Waitms 5



      S = Mm / 10

      P = Fix(s)

      P = P + 1

      Portc = &B00100

      Portd = Leddig(p)                                     '显示分钟十位

      Waitms 5



   End If











   If Timeflash = 1 Or Timeflash = 2 Then



      P = Hh Mod 10

      P = P + 1

      Portc = &B01000

      Portd = Leddig(p)                                     '显示小时个位

      If Dotflash = 1 Then                                  '闪烁 两个点

            Set Portd.7

         Else

            Reset Portd.7

      End If

      Waitms 5





      S = Hh / 10

      P = Fix(s)

      P = P + 1

      Portc = &B10000

      Portd = Leddig(p)                                     '显示小时十位

      Waitms 5



   End If





End Sub













Sub Settime()





   Do



      If Pinb.1 = 0 Then                                    '设置小时

         Waitms 200

         H = H + 1

         If H > 23 Then                                     '左键加,右键减。

             H = 0

         End If

      End If



      If Pinb.2 = 0 Then

         Waitms 200

         If H = 0 Then

             H = 24

         End If

         H = H - 1

      End If





      If Dotflash = 1 Then                                  '设定小时闪烁

           Timeflash = 0

         Else

           Timeflash = 2

      End If





      Call Disptime(h , M)





      If Pinb.0 = 0 Then                                    '按中间键转换为设置分钟

         Do

         Loop Until Pinb.0 = 1

         Waitms 200



         Do



            If Pinb.1 = 0 Then                               '左键加,右键减。

               Waitms 200

               M = M + 1

               If M > 59 Then

                   M = 0

               End If

            End If



            If Pinb.2 = 0 Then

               Waitms 200

               If M = 0 Then

                   M = 60

               End If

               M = M - 1

            End If





            If Dotflash = 1 Then

                 Timeflash = 1

               Else

                 Timeflash = 2

            End If





            Call Disptime(h , M)





            If Pinb.0 = 0 Then                              ' 退出

               Do

               Loop Until Pinb.0 = 1

               Waitms 200

               Timeflash = 2

               Exit Sub

            End If



         Loop



      End If





   Loop





End Sub













Sub Countdown()                                             '倒计时子程序

                                                            '以分为单位

   Readeeprom Set_minutes , 0                               '本程序设置最大值为99分钟

                                                            '可根据自己喜好自行修改

   Portc = 0

   Portd = 1



   Countmark = 1





   Do



      Portc.2 = 0

      Portc.1 = 1

      P = Set_minutes Mod 10                                '取余  显示个位

      P = P + 1

      Portd = Leddig(p)

      Waitms 10



      Portc.1 = 0

      S = Set_minutes / 10                                  '取整  显示十位

      S = Fix(s)

      P = Sgn(s)

      Portc.2 = P

      P = S + 1

      Portd = Leddig(p)

      Waitms 10



      If Pinb.1 = 0 Then

         Waitms 200

         Set_minutes = Set_minutes + 1

         If Set_minutes > 99 Then

             Set_minutes = 1

         End If

         Writeeeprom Set_minutes , 0

      End If



      If Pinb.2 = 0 Then

         Waitms 200

         Set_minutes = Set_minutes - 1

         If Set_minutes = 0 Then

             Set_minutes = 99

         End If

         Writeeeprom Set_minutes , 0

      End If



      If Pinb.0 = 0 Then                                    '按中间键退出切换到时间模式

         Do

         Loop Until Pinb.0 = 1

         Countmark = 0

         Exit Sub

      End If



      If Set_minutes = 0 Then



         K = 1



         Call Playmusic                                     '到时后音乐闹响



         Readeeprom Set_minutes , 0

         Portc = 0

         K = 0



      End If



   Loop



End Sub















Sub Playmusic()                                             '闹向音乐子程序





   For N = 1 To 100



      Restore Musicdata



      Do



         Read I : I = I * 3                                 '调整两参数使音乐听起来舒服些

         Read P : S = P * 0.32 : P = Fix(s)



         If I = 0 And P = 0 Then

            Exit Do

         End If



         If Pinb.1 = 0 Or Pinb.2 = 0 Then                   '按左或右键退出

            Do

            Loop Until Pinb.1 = 1 And Pinb.2 = 1

            Waitms 200

            Exit For

         End If



         Sound Portc.0 , I , P

         Waitms 100



         If Countmark = 0 Then

            Call Disptime(myhour , Myminute)

         End If



      Loop



      Wait 2



   Next N





End Sub











Tim1_isr:                                                   '中断程序 0.5秒



'   Tcnt1h = &H0B                                           '3036

'   Tcnt1l = &HDC

   Counter1 = &H0BDC



   Dotflash = Not Dotflash



   Timecounter = Not Timecounter



   If Timecounter = 0 Then



      Incr Bsecond



      If Bsecond = 60 Then



         If Countmark = 1 Then

            Decr Set_minutes

         End If



         Bsecond = 0



         Myminute = Myminute + 1

         If Myminute = 60 Then

            Myhour = Myhour + 1

            Myminute = 0

         End If



         If Myhour = 24 Then

            Myhour = 0

         End If



         Enalarm = 0



      End If





   End If





   If K = 1 Then

      Portc.1 = Not Portc.1

      Portc.2 = Not Portc.2

      Portc.3 = Not Portc.3

      Portc.4 = Not Portc.4

   End If





Return











Leddata:                                                           'LED数字码 (0-9)

Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001

Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000





Musicdata:                                           '两只老虎的音乐,摘自张茂清那本书P166

Data 100% , 956% , 100% , 865% , 100% , 759% , 100% , 956%

Data 100% , 956% , 100% , 865% , 100% , 759% , 100% , 956%

Data 100% , 759% , 100% , 717% , 200% , 638%

Data 100% , 759% , 100% , 717% , 200% , 638%

Data 50% , 638% , 50% , 568% , 50% , 638% , 50% , 717%

Data 100% , 759% , 100% , 956%

Data 50% , 638% , 50% , 568% , 50% , 638% , 50% , 717%

Data 100% , 759% , 100% , 956%

Data 100% , 865% , 100% , 1276% , 200% , 956%

Data 100% , 865% , 100% , 1276% , 200% , 956% , 0% , 0%

出0入4汤圆

发表于 2006-5-11 09:31:44 | 显示全部楼层
很好玩!

出0入0汤圆

发表于 2006-5-11 10:09:57 | 显示全部楼层
好东西,加裤子,没话说!!

出0入0汤圆

发表于 2006-5-11 11:35:31 | 显示全部楼层
太帅了!!!!!



那个电池是手机电板吗?

出0入0汤圆

 楼主| 发表于 2006-5-11 12:02:20 | 显示全部楼层
是的,找了一块废手机锂电,外壳都碎了,用透明胶绑了一下,反正在里面,丑就丑吧,哈哈。

相信大家手里肯定有一些手机废电池,用来给AVR供很好,还可以充电。

我这个电子表就从底下滚轮口引出了两根线,可以接充电器给电池充电。

出0入0汤圆

 楼主| 发表于 2006-5-11 21:42:23 | 显示全部楼层
空闲时画了个SCH简图,供大家参考。

出0入0汤圆

发表于 2006-5-13 13:31:23 | 显示全部楼层
楼主:

看到你那个扬声器,似乎有点问题,应该接上电容隔直流输出比较好,否则扬声器容易烧毁,一般串联一个100uF电容,正极与I/O端口相连,负极与扬声器相连,这样比较安全。

出0入0汤圆

 楼主| 发表于 2006-5-13 14:58:36 | 显示全部楼层
呵呵,谢谢JAMESKING指正。你说得对,一般扬声器前要接一个几十到百uF的电容。这是个简单示意图,就省了。不过个电路中C.0平时一直是低电平,应该没事。

那个SPK的选择可以根据自己的喜好,如果选那种常响的就可以省掉电容,分时给C.0赋1,产生象BP机的叫声也可以,这样还可以把后面那堆DATA给省掉。

另外,又翻了程序大概看了看,有不少赘句和要优化的地方,比如开始时的“Readeeprom Set_minutes , 0”,这句多余,有的是没仔细考虑,比如countdown中Portd = 1,这句又是多余的又是赋值错误,呵呵,应该还有不少这样的情况。

我在后来的程序中把====闹时设置===中的

      Do

         Call Disptime(myhour , Myminute )

      Loop Until Pinb.1 = 1 Or Pinb.2 = 0



修改为

      Do

         Call Disptime(Alarmhour , Alarmminute )

      Loop Until Pinb.1 = 1 Or Pinb.2 = 0

这样可以只按左键时显示设定的闹钟时间。



另:我看到了你留的QQ,我已申请加你为好友,我的是491787702。还有你留的EM是不是写错了?应该是king0077@sina.com吧?我的是gaoguosheng@126.com。有机会多向你学习。

出0入0汤圆

发表于 2006-5-14 10:22:31 | 显示全部楼层
好东东 ,  收藏了~~~!





谢谢楼主~~~~~~~~~~~~~~~~~~!

出0入4汤圆

发表于 2006-5-15 15:05:20 | 显示全部楼层
我很喜欢这种小而好玩的东西,尤其是用废旧原料加工的,改天我也做一个。



Cool~~~

出0入0汤圆

发表于 2006-5-18 22:06:04 | 显示全部楼层
有创意。

出0入0汤圆

发表于 2008-1-4 11:21:47 | 显示全部楼层
好玩
做一个玩玩

出0入0汤圆

发表于 2008-1-4 12:03:44 | 显示全部楼层
呵,真不错.

出0入0汤圆

发表于 2008-1-4 12:17:50 | 显示全部楼层
晕啊,你这个电子钟能持续运行1天吗?

出10入95汤圆

发表于 2008-1-4 16:39:57 | 显示全部楼层
有创意,竟然能找到这么合适得鼠标,楼主太有才了!顶。。。。

出0入0汤圆

发表于 2008-1-4 18:25:34 | 显示全部楼层
数码管的限流电阻可能有些偏大了

出0入0汤圆

发表于 2008-1-5 11:00:25 | 显示全部楼层
强烈要求楼主贴出.hex文件,以造福我等菜鸟,呵呵

出0入0汤圆

发表于 2008-1-5 13:50:27 | 显示全部楼层
比较有创意

出0入0汤圆

发表于 2008-1-5 14:41:59 | 显示全部楼层
不是我打击你~你这个东西用电池1,2天就把电耗光了~低功耗,低功耗...至少得几十微安才有的用的~

出0入0汤圆

发表于 2008-1-5 16:06:14 | 显示全部楼层
顶呀,真有创意!

出0入0汤圆

发表于 2008-1-11 16:16:14 | 显示全部楼层
ddddd

出0入0汤圆

发表于 2008-1-11 23:41:37 | 显示全部楼层
挺好的,我也发过一个用ICCAVR的,
楼主代码可以给那些用Basic的人参考的

出0入0汤圆

发表于 2008-1-12 12:09:36 | 显示全部楼层
下次lz用液晶的 数码管太费电了
还有这个鼠标是不是为你定做的?

出300入0汤圆

发表于 2008-1-12 15:53:28 | 显示全部楼层
lz动手能力强!强烈建议阿莫发裤子!


lz再给它加上一个太阳能电池,绝对牛!

出0入0汤圆

发表于 2008-1-13 11:35:10 | 显示全部楼层
请问 数码管是不是共阳的??

将MOUSE的线留下,如是USB口的,可以将它插在PC上,这样没事就可以自己充电啦。

出0入0汤圆

发表于 2009-12-28 13:09:14 | 显示全部楼层
mark~~

出0入0汤圆

发表于 2010-4-1 22:42:47 | 显示全部楼层
我都要找个玩玩

出0入0汤圆

发表于 2010-4-26 16:02:58 | 显示全部楼层
你好,作者能给我联系方式吗? 或者联系我:939968773
谢谢

出0入0汤圆

发表于 2010-4-26 16:42:30 | 显示全部楼层
创意太好了,有时间也做一个。

  给楼主点建议:你既然是放在厨房,一般都是做饭时用,为了省电,你可以在非做饭时间将数码管关闭,等做饭时间自动 打开。这样电池能用的长久些

出0入0汤圆

发表于 2010-4-26 16:47:27 | 显示全部楼层
在USB上取电也不错,要是鼠标还能用的话就更好了,哈哈

出0入0汤圆

发表于 2010-4-26 17:18:40 | 显示全部楼层
就地取材,因地制宜,楼主赞啊

出0入0汤圆

发表于 2010-4-26 17:34:51 | 显示全部楼层
用5110的屏幕来搞!

出0入0汤圆

发表于 2010-4-28 08:08:10 | 显示全部楼层
有创意。

出0入0汤圆

发表于 2010-5-3 15:53:40 | 显示全部楼层
a

出0入0汤圆

发表于 2010-5-5 12:59:40 | 显示全部楼层
有创意
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 21:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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