加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

震撼!!!超强教程!!! 打造自己的专属鼠标——鼠标DIY教程(四)

(2011-01-19 17:42:33)
标签:

单片机

鼠标

diy

编程器

it

分类: 鼠标DIY教程

本套教程作者为外设天下论坛  超电磁侠 

声明:文章是版权所有,未经许可,请不要转载

 

之前3期,简单讲解了单片机的程序编写以及如何使用ADNS-3080, 这期我们来规划一下,怎么把18f14k50ADNS-3080凑在一起。


五、合体!18f14k50ADNS-3080
http://pldzgq.blu.livefilestore.com/y1p8hRaLKezgLC_ZzXDOcXG5-GEOh0FCLP9GRwWOS8rSxbP91o8sKecVP4OaYz6f_9YnR7ShRSjDjwaK3IRzvSTyjycSGYDLWYZ/T41.jpg?psid=1打造自己的专属鼠标——鼠标DIY教程(四)" />

上图忽略了它们各自的工作电路,只指示出它们应该通过哪些脚连在一起。其中:连接A3080 234脚的18f4k50的脚是固定的,因为只有这几个脚是SPI的功能端口,其余的可以灵活处理。
   在这里有一个电压的问题, 我们将使18f14k50工作在5v下, 因为5v可以直接从USB取电。在5v下,18f14k50端口输出的高状态大概有4.5v。然而,ADNS-3080是工作在3.3v下的,它端口接收的高状态最高只能是3.3v左右!
   如果按上图直接连接那些红色线的端口, 很有可能会把A3080的端口给烧坏。
   在这个时候我们用简单的分压电路就能避免这种情况。下图中的箭头表明电压信号是从18f14k50流向A3080

http://public.blu.livefilestore.com/y1plRX2035YEI_VC7I65_EcwP-r5Wrw3FDoHbbMMTfmG0AtcPLtFSoNZQ3sRL-7nE23ErXCAHvhd-cY-IV9gTcb8A/T42.jpg?psid=1打造自己的专属鼠标——鼠标DIY教程(四)" />

   注意,A3080 MISO是输出到单片机的,所以不用分压,因为18f14k50的输入可以兼容3.3v的电压。

   另外18f14k50可以工作在3.3v下,在这个时候,就没有必要用分压电路了。我在改金环蛇的时候,只想直接USB取电,其实加一个稳压电路就可以省下这些电阻。

单片机的按键输入是有一些要注意的地方的,我们不能直接就把一个开关一端连到单片机的输入脚,一端接地,这样是不能正常工作的。开关的打开和闭合必须要有一个明确的高或者低电压,如下图:
http://public.blu.livefilestore.com/y1pQ8EL6cMd-qHjjeFpWQbP4h4KbZIo_qlCljJetxsfS4nGihb-98OYF91nzzXafJZ1GVUvMlAOjH7UzQomChQWzQ/T44.jpg?psid=1打造自己的专属鼠标——鼠标DIY教程(四)" />

    单片机输入的电流很小,所以5v电源通过这个电阻给单片机的端口提供了一个确定的高的逻辑状态,这种一端接电源的电阻用法称为上拉电阻。假如没有这个电阻,由于单片机内部的漏电等各种因素,输入端口的电压是随机的,很有可能会时高时低。当开关闭合接地,电压马上降到接近0,这就是低的状态。单片机就是靠这种对电压的高低来判断开关闭合与否。
    18f14k50有些端口有内置的上拉电阻,比如前面图中蓝色线的中键,这个键是不需要额外的电阻上拉的,因为用了芯片内部的上拉电阻。另外机械滚轮编码器用的RB5RB7虽然也有内置上拉电阻,但是经过实践发现,该功能不能与interrupt-on-change一起正常工作,所以会用外部的上拉电阻。
    另外,现实中的按键是机械运动的开关,在编程的时候要考虑到去抖动的问题。否则,就算一个好的微动用起来都像双击一样。在写固件的时候会有进一步解释。

接下来,我们先来做一个人机互动的例子。

#include <18F14k50.h>



#fuses HS,NOFCMEN,NOBROWNOUT,NOWDT,BORV30,NOPUT,NOCPD,STVREN,
NOXINST,NOWRT,NOWRTD,NOWRTC,WDT32768,NOIESO,NOEBTR,NOEBTRB,
NOMCLR,NOPROTECT,NOCPB,NOWRTB,CPUDIV1,USBDIV1,PLLEN,NOHFOFST,
NOLVP

#use delay(clock=48000000)

#use rtos(timer=0,minor_cycle=10ms)

#task(rate=20ms, max=10ms)   //  让程序每20ms检查一次开关的状态
void LED();


void LED()
{


if(input(PIN_C1)==0){             // input函数,设置该端口为输入
                                 //并检查该端口的输入情况
      output_high(PIN_C0);
                }


if(input(PIN_C1)==1){
      output_low(PIN_C0);
                }


}

void main(void)
{


rtos_run();

}
编译出Hex文件,并在Proteus的单片机中载入。
Proteus中作如下修改,开关名字为switch 可以在元件库中搜索到,电源可以在右边工具条中的激励源中找到,放置好后双击那个符号,把电压设为5v

http://public.blu.livefilestore.com/y1pg3dxluuRGJwtgTicONYujy_7HTLd6eD6yOM4PoOklWTJ24Lfq1eT1JqBewd_chMjSsGcDopADPV8f8aIVx9-fg/T46.jpg?psid=1打造自己的专属鼠标——鼠标DIY教程(四)" />



按下图连接,


http://public.blu.livefilestore.com/y1pg3dxluuRGJxD2Z6rW2BFSZMjKpOpdXgzAADcLYM4i--3BH6JfWzexow8N-JGH6s-Zj1SR_jtxRdszh8MG3hG-A/T45.jpg?psid=1打造自己的专属鼠标——鼠标DIY教程(四)" />

开始仿真运行,每当点那个开关按下去的时候(仿真的时候可以互动),灯就会亮起! 这里的程序由于是仿真的,没有加入按键的去抖动。(debouncing google这个关键词会有很多相关的知识,时间所限,我先不扯远)



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有