打造自己的专属鼠标——鼠标DIY教程(四)

作者:论坛管理员|发布时间:2014-12-02 12:03:00
[摘要]之前3期,简单讲解了单片机的程序编写以及如何使用ADNS-3080, 这期我们来规划一下,怎么把18f14k50和ADNS-3080凑在一起。
之前3期,简单讲解了单片机的程序编写以及如何使用ADNS-3080, 这期我们来规划一下,怎么把18f14k50ADNS-3080凑在一起。 五、合体!18f14k50ADNS-3080[size=10.5pt] [size=10.5pt][img]http://pldzgq.blu.livefilestore.com/y1p8hRaLKezgLC_ZzXDOcXG5-GEOh0FCLP9GRwWOS8rSxbP91o8sKecVP4OaYz6f_9YnR7ShRSjDjwaK3IRzvSTyjycSGYDLWYZ/T41.jpg?psid=1[/img] 上图忽略了它们各自的工作电路,只指示出它们应该通过哪些脚连在一起。其中:连接A3080 234脚的18f4k50的脚是固定的,因为只有这几个脚是SPI的功能端口,其余的可以灵活处理。 在这里有一个电压的问题, 我们将使18f14k50工作在5v下, 因为5v可以直接从USB取电。在5v下,18f14k50端口输出的高状态大概有4.5v。然而,ADNS-3080是工作在3.3v下的,它端口接收的高状态最高只能是3.3v左右! 如果按上图直接连接那些红色线的端口, 很有可能会把A3080的端口给烧坏。 在这个时候我们用简单的分压电路就能避免这种情况。下图中的箭头表明电压信号是从18f14k50流向A3080[size=10.5pt] [size=10.5pt][img]http://public.blu.livefilestore.com/y1plRX2035YEI_VC7I65_EcwP-r5Wrw3FDoHbbMMTfmG0AtcPLtFSoNZQ3sRL-7nE23ErXCAHvhd-cY-IV9gTcb8A/T42.jpg?psid=1[/img] 注意,A3080 MISO是输出到单片机的,所以不用分压,因为18f14k50的输入可以兼容3.3v的电压。 另外18f14k50可以工作在3.3v下,在这个时候,就没有必要用分压电路了。我在改金环蛇的时候,只想直接USB取电,其实加一个稳压电路就可以省下这些电阻。 单片机的按键输入是有一些要注意的地方的,我们不能直接就把一个开关一端连到单片机的输入脚,一端接地,这样是不能正常工作的。开关的打开和闭合必须要有一个明确的高或者低电压,如下图:[size=10.5pt] [img]http://public.blu.livefilestore.com/y1pQ8EL6cMd-qHjjeFpWQbP4h4KbZIo_qlCljJetxsfS4nGihb-98OYF91nzzXafJZ1GVUvMlAOjH7UzQomChQWzQ/T44.jpg?psid=1[/img] 单片机输入的电流很小,所以5v电源通过这个电阻给单片机的端口提供了一个确定的高的逻辑状态,这种一端接电源的电阻用法称为上拉电阻。假如没有这个电阻,由于单片机内部的漏电等各种因素,输入端口的电压是随机的,很有可能会时高时低。当开关闭合接地,电压马上降到接近0,这就是低的状态。单片机就是靠这种对电压的高低来判断开关闭合与否。 18f14k50有些端口有内置的上拉电阻,比如前面图中蓝色线的中键,这个键是不需要额外的电阻上拉的,因为用了芯片内部的上拉电阻。另外机械滚轮编码器用的RB5RB7虽然也有内置上拉电阻,但是经过实践发现,该功能不能与interrupt-on-change一起正常工作,所以会用外部的上拉电阻。 另外,现实中的按键是机械运动的开关,在编程的时候要考虑到去抖动的问题。否则,就算一个好的微动用起来都像双击一样。在写固件的时候会有进一步解释。 [size=10.5pt] [size=10.5pt] [size=10.5pt]
[责任编辑:'']
标签
暂无标签
收藏 分享

相关阅读

暂无推荐内容

评论(2)

登录后参与评论

发表评论 还可以输入2000个字符 添加表情
*友情提示:首次回复增加5元发烧值,多次回复往后每次增加1元发烧值,前5次回复有效!
最新评论

查看所有评论>>

  • 会员头像
    quwei80  2017-03-22 16:35:14
    路过瞧瞧!
    点赞 (0) 回复
  • 会员头像
    zu7dao  2017-03-20 10:32:54
    路过帮顶
    点赞 (0) 回复
  • 会员头像
    victorjeff  2011-01-17 11:43:01
    刚看开头还以为终于遇到能看懂的东西了,哪知道后面还是晕乎。。。
    点赞 (0) 回复
  • 会员头像
    zqgzq  2011-01-17 09:21:36
    强贴支持一下
    点赞 (0) 回复
  • 会员头像
    wwq5536  2011-01-17 07:47:30
    表示不懂
    点赞 (0) 回复
  • 会员头像
    refire  2011-01-17 06:18:47
    顶{:1_
    点赞 (0) 回复
  • 会员头像
    超电磁侠  2011-01-17 02:48:13
    滚轮太难 , 一个是光学 一个是编码
    点赞 (0) 回复
  • 会员头像
    口袋诞生  2011-01-17 02:36:55
    技术贴啊看的我头晕...
    点赞 (0) 回复
  • 会员头像
    GuoAnNB  2011-01-17 01:12:02
    帮人 帮顶了
    点赞 (0) 回复
  • 会员头像
    aken  2011-01-17 01:03:51
    又见LZ技术贴,试问,我想把微软光学基础鲨的内脏换到XAI的壳子里用,可行否?
    点赞 (0) 回复
  • 会员头像
    ravenyuanye  2011-01-17 00:55:04
    难道是沙发?
    点赞 (0) 回复
  • 会员头像
    超电磁侠  2011-01-16 23:41:14
    [i=s] 本帖最后由 超电磁侠 于 2011-1-16 23:42 编辑 [/i][size=4][font=宋体] 接下来,我们先来做一个人机互动的例子。[/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][size=4][font=宋体]#include <18F14k50.h>[/font][font=宋体][/font][/size][size=4][font=宋体][/font][/size][size=4][font=宋体]#fuses HS,NOFCMEN,NOBROWNOUT,NOWDT,BORV30,NOPUT,NOCPD,STVREN,[/font][font=宋体][/font][/size][size=4][font=宋体]NOXINST,NOWRT,NOWRTD,NOWRTC,WDT32768,NOIESO,NOEBTR,NOEBTRB,[/font][font=宋体][/font][/size][size=4][font=宋体]NOMCLR,NOPROTECT,NOCPB,NOWRTB,CPUDIV1,USBDIV1,PLLEN,NOHFOFST,[/font][font=宋体][/font][/size][size=4][font=宋体]NOLVP[/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][size=4][font=宋体]#use delay(clock=48000000)[/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][size=4][font=宋体]#use rtos(timer=0,minor_cycle=10ms)[/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][size=4][font=宋体]#task(rate=20ms, max=10ms) // [font=宋体]让程序每[/font][font=Times New Roman]20ms[/font][font=宋体]检查一次开关的状态[/font][/font][font=宋体][/font][/size][size=4][font=宋体]void LED();[/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][font=宋体][size=4][/size][/font][size=4][font=宋体]void LED()[/font][font=宋体][/font][/size][size=4][font=宋体]{[/font][font=宋体][/font][/size][size=4][font=宋体][/font][/size][size=4][font=宋体] if(input(PIN_C1)==0){ // input[font=宋体]函数,设置该端口为输入[/font][/font][font=宋体][/font][/size][size=4][font=宋体] //[font=宋体]并检查该端口的输入情况[/font][/font][font=宋体][/font][/size][size=4][font=宋体] output_high(PIN_C0);[/font][font=宋体][/font][/size][size=4][font=宋体] }[/font][font=宋体][/font][/size][size=4][font=宋体][/font][/size][size=4][font=宋体] if(input(PIN_C1)==1){[/font][font=宋体][/font][/size][size=4][font=宋体] output_low(PIN_C0);[/font][font=宋体][/font][/size][size=4][font=宋体] }[/font][font=宋体][/font][/size][size=4][font=宋体][/font][/size][size=4][font=宋体]}[/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][size=4][font=宋体]void main(void)[/font][font=宋体][/font][/size][size=4][font=宋体]{[/font][font=宋体][/font][/size][size=4][font=宋体][/font][/size][size=4][font=宋体] rtos_run();[/font][font=宋体][/font][/size][font=宋体][size=4][/size][/font][size=4][font=宋体]}[/font][font=宋体][/font][/size][size=4][font=宋体]编译出[font=Times New Roman]Hex[/font][font=宋体]文件,并在[/font][font=Times New Roman]Proteus[/font][font=宋体]的单片机中载入。[/font][/font][font=宋体][/font][/size][font=宋体][size=4]Proteus[font=宋体]中作如下修改,开关名字为[/font][font=Times New Roman]switch [/font][font=宋体]可以在元件库中搜索到,电源可以在右边工具条中的激励源中找到,放置好后双击那个符号,把电压设为5v[/font][/size][/font][font=宋体][size=4][font=宋体][/font][/size][/font][font=宋体][size=4][font=宋体][img]http://public.blu.livefilestore.com/y1pg3dxluuRGJwtgTicONYujy_7HTLd6eD6yOM4PoOklWTJ24Lfq1eT1JqBewd_chMjSsGcDopADPV8f8aIVx9-fg/T46.jpg?psid=1[/img] [/font][/size][/font][font=宋体][size=4][font=宋体][/font][/size][/font][font=宋体][size=4][font=宋体][font=宋体]按下图连接,[/font][font=宋体][img]http://public.blu.livefilestore.com/y1pg3dxluuRGJxD2Z6rW2BFSZMjKpOpdXgzAADcLYM4i--3BH6JfWzexow8N-JGH6s-Zj1SR_jtxRdszh8MG3hG-A/T45.jpg?psid=1[/img] [/font][font=宋体][font=宋体]开始仿真运行,每当点那个开关按下去的时候(仿真的时候可以互动),灯就会亮起! 这里的程序由于是仿真的,没有加入按键的去抖动。([font=Times New Roman]debouncing [/font][font=宋体],[/font][font=Times New Roman]google[/font][font=宋体]这个关键词会有很多相关的知识,时间所限,我先不扯远)[/font][/font][/font][/font][/size][/font]
    点赞 (0) 回复

52篇 文章总数

334509 总阅读量