[8/16位单片机] pic10F单片机可穿戴闪灯DIY(开源)

[复制链接]
3494|55
 楼主 | 2019-12-23 09:49 | 显示全部楼层 |阅读模式
本帖最后由 mzb2012 于 2020-1-2 14:56 编辑

1.背景:

准备DIY一个闪灯给小朋友玩,练习一下动手能力,同时活跃一下节日的气氛。主控采用microchip公司的最最精简的单片机pic10F200

2.系统组成:

  • 主控芯片pic10f200(其他202,204,206,也可)

无标题.jpg
  • CR2032电池  X1

无标题1.jpg
  • 直插草帽LED  X3

无标题111.png
  • 独立按键  X1

无标11题.png
  • CR2032电池座  X1

无ff标题.png


3.系统原理:
162035v81pprpvf8t9t518.jpg

使用特权

评论回复

评论

朱倪 2020-1-16 17:34 回复TA
朋友 看你分析技术问题很赞!我们需要你这样的人才,撰写技术心得体会拿稿酬 请加我微信 kuaibao52 备注来自21ic 
| 2019-12-23 23:29 | 显示全部楼层
MARK一下。

使用特权

评论回复
| 2019-12-23 23:30 | 显示全部楼层
可以作为高级的那个啥,演唱会用的那个灯。。。

使用特权

评论回复
| 2019-12-23 23:31 | 显示全部楼层
荧光棒。。。。。。。。。。。。。。。。

使用特权

评论回复
 楼主 | 2019-12-24 21:09 | 显示全部楼层
4.画原理图和PCB Layout
使用开源软件绘图和走线,元器件比较少,很快就搞定

000.gif


无标题.jpg


无标题3.jpg


使用特权

评论回复
 楼主 | 2019-12-25 09:04 | 显示全部楼层
yiy 发表于 2019-12-23 23:30
可以作为高级的那个啥,演唱会用的那个灯。。。

哈哈,好主意

使用特权

评论回复
 楼主 | 2019-12-25 16:11 | 显示全部楼层
本帖最后由 mzb2012 于 2019-12-25 23:08 编辑

5.开发环境
1)MPLABX IDE + XC8编译,使用ASM语言编写
无标题.jpg   + 无0标题.jpg



(2)调试器采用ICD4
u=3203252324,4200907518&fm=15&gp=0.jpg


先熟悉下,pic10F系列单片机的汇编35条指令
无标题.png
无标2题.png


使用特权

评论回复
| 2019-12-26 09:27 | 显示全部楼层
这个要点赞

使用特权

评论回复
 楼主 | 2019-12-26 10:45 | 显示全部楼层
6.新建工程
具体操作看图,新建一个汇编工程,使用芯片pic10F200

demo.gif

使用特权

评论回复
 楼主 | 2019-12-26 10:46 | 显示全部楼层

谢谢关注

使用特权

评论回复
 楼主 | 2019-12-26 21:52 | 显示全部楼层
本帖最后由 mzb2012 于 2019-12-26 21:54 编辑

7.程序流程图
长按按键用于切换工作状态,短按按键用于切换运行模式

无标题.png

使用特权

评论回复
| 2019-12-27 08:55 | 显示全部楼层
以前我也做过一个给小孩玩,用PIC12F508。
用红绿蓝三个灯,外加一个震动开关,装在一个透明小瓶子里。用力拍一下或甩一下就开始各种颜色变换,延时一段时间后关灯休眠。

使用特权

评论回复
 楼主 | 2019-12-27 09:19 | 显示全部楼层
chongdongchen 发表于 2019-12-27 08:55
以前我也做过一个给小孩玩,用PIC12F508。
用红绿蓝三个灯,外加一个震动开关,装在一个透明小瓶子里。用力 ...

创意不错

使用特权

评论回复
 楼主 | 2019-12-27 10:23 | 显示全部楼层
本帖最后由 mzb2012 于 2019-12-28 08:09 编辑

8.开始代码编写
最开始先使用伪指令定义若干变量和宏。
(1)cblock/endc                                           
作用:
它是变量块连续定义指令。
方法:
cblock指令声明变量块的起始地址;
endc指令声明变量块的定义结束;
它们之间可以插入任意多的变量声明,其地址编排由编译器自动计算;第一个变量地址分配从起始地址开始,然后按所声明变量保留的字节数自动分配后面变量的地址,变量所需保留的字节数用“:”冒号后面的数字表示,如果只有1个字节“:1”可以省略不写。

(2)equ
作用:
给数字变量起个别名
方法:
可以直接替换立即数
例如:Temp equ 20,  符号Temp替换立即数20
如果要替换一个符号名字,则此符号名必须已经使用#defineequ伪指令替换了一个立即数。

(3)macro/endm
作用:定义自己的宏,提高程序的可读性、可移植性
方法:宏指令的定义由“宏指令名”开始,后跟关键词“macro”,其后可以带若干宏参数,也可以不跟任何宏参数;然后从下一行起开始写基本的汇编指令或已被认可的其他宏指令;指令可以任意多行,最后以关键词“endm”结束整个宏定义。

(4)附上代码
  1. ;
  2. ;项目说明:这是一个开源的基于pic10F200的闪灯DIY
  3. ;作   者 : mzb2012
  4. ;时   间 : 2019-12
  5.    
  6. ; PIC10F200 Configuration Bit Settings
  7. ; Assembly source line config statements
  8. #include "p10f200.inc"
  9. ; CONFIG
  10. ; __config 0xFFEB
  11. __CONFIG _WDTE_OFF & _CP_OFF & _MCLRE_OFF

  12. ;***************变量定义*****************************************
  13. ;对于10F200单片机,GPR寄存器从0x10地址开始,范围0x10-0x1F共16bytes
  14. ;****************************************************************
  15. ;变量块定义
  16. cblock 0x10
  17.     delay.loop.in
  18.     delay.loop.out
  19.     switch.timer
  20.     hold.timer
  21.     led.state
  22.     mode
  23.     index
  24.     index.base
  25.     mask
  26. endc
  27.    
  28. ;位变量定义
  29. pb.swtich equ 3                ;按键端口   
  30. pb.led1 equ 0                ;LED1端口
  31. pb.led2 equ 1                ;LED2端口
  32. pb.led3 equ 2                ;LED3端口
  33. multiplex equ 7                ;multiplex标志变量
  34. pson equ 1<<multiplex        
  35. psoff equ 0
  36. led1on equ 1<<pb.led1
  37. led1off equ 0
  38. led2on equ 1<<pb.led2
  39. led2off equ 0
  40. led3on equ 1<<pb.led3
  41. led3off equ 0

  42. ;宏定义
  43. ledstep MACRO        hold,pwrsave,led1,led2,led3
  44.             retlw hold
  45.             retlw pwrsave|led1|led2|led3
  46.         ENDM
  47. restart MACRO
  48.             retlw 0
  49.         ENDM


复制代码



使用特权

评论回复
 楼主 | 2019-12-28 08:55 | 显示全部楼层
本帖最后由 mzb2012 于 2019-12-29 11:51 编辑

9.编写LED闪烁查表
(1)radix伪指令
作用:用于设置进制格式,dec=10进制,hex=16进制,oct=8进制
例如:radix dec   ;设置10进制
(2)org伪指令
作用:定义程序代码的起始地址,这个指令可以把程序定位到任何可用的程序空间,它实现的是代码的绝对定位。例如:org 0x0000;定义代码的复位地址,以下指令从地址0x0000开始goto main;

  1. ;***********************************************************
  2. ;对于pic10F200芯片,内部晶振校准值参数在0xFF地址存储的
  3. ORG 0x0000
  4. movwf OSCCAL
  5. goto start
  6. ;**********************************************************
  7. ;LED闪烁模式查找表
  8. ;对于每一种闪烁模式,必须在有一个相应的分支入口
  9. ;返回值max.mode同样必须设置
  10. radix dec
  11. select.mode movfw mode
  12.              addwf PCL,f
  13.              retlw mode.1
  14.              retlw mode.2
  15.              retlw mode.3
  16.              retlw mode.4
  17.              retlw mode.5
  18.              retlw mode.6
  19.              retlw mode.7
  20. max.mode retlw 7        ;模式最大种类数
  21. ;定义闪烁序列
  22. ;ledstep hold_time,power_save,LED1_state,LED2_state,LED3_state
  23. ;hold_time是1-255的数值,没计一个数单位20ms,所以当hold_time=50时,就是1000ms
  24. ;power_save定义了省电模式,开启后LED亮度略暗,更省电
  25. ;psoff---省电模式关闭,全功率运行
  26. ;pson---省电模式开启,节电运行
  27. ;LEDx_state 定义灯的亮或灭
  28. ;模式1,常量,节电模式
  29. mode.1 ledstep 50,pson,led1on,led2on,led3on
  30.        restart
  31. ;模式2,常量,正常模式
  32. mode.2 ledstep 50,psoff,led1on,led2on,led3on
  33.        restart  
  34. ;模式3,所有闪烁,节电模式
  35. mode.3 ledstep 18,pson,led1on,led2on,led3on
  36.        ledstep 18,pson,led1off,led2off,led3off
  37.        restart
  38. ;模式4,单个LED亮,正常模式
  39. mode.4 ledstep 12,psoff,led1on,led2off,led3off
  40.        ledstep 12,psoff,led1off,led2on,led3off
  41.        ledstep 12,psoff,led1off,led2off,led3on
  42.        ledstep 12,psoff,led1off,led2on,led3off
  43.        restart
  44. ;模式5,所有LED频闪,正常模式
  45. mode.5 ledstep 2,psoff,led1on,led2on,led3on
  46.        ledstep 30,psoff,led1off,led2off,led3off
  47.        restart
  48. ;模式6,所有LED短灭长亮,正常模式
  49. mode.6 ledstep 2,psoff,led1on,led2off,led3off
  50.        ledstep 10,psoff,led1off,led2on,led3off
  51.        ledstep 60,pson,led1on,led2on,led3on
  52.        ledstep 10,psoff,led1off,led2on,led3off
  53.        restart
  54. ;模式7,所有LED短灭长亮,正常模式
  55. mode.7 ledstep 1,psoff,led1on,led2off,led3off
  56.        ledstep 3,psoff,led1off,led2on,led3off
  57.        ledstep 1,psoff,led1on,led2off,led3off
  58.        ledstep 3,psoff,led1off,led2on,led3off
  59.        ledstep 1,psoff,led1on,led2off,led3off
  60.        ledstep 3,psoff,led1off,led2on,led3off
  61.        ledstep 1,psoff,led1on,led2off,led3off
  62.        ledstep 3,psoff,led1off,led2on,led3off
  63.        ledstep 1,psoff,led1on,led2off,led3off
  64.        ledstep 3,psoff,led1off,led2on,led3off
  65.        ledstep 1,psoff,led1on,led2off,led3off
  66.        ledstep 50,psoff,led1off,led2on,led3off
  67.        restart
  68. ;结束LED闪烁模式查找表
复制代码






使用特权

评论回复
| 2019-12-28 19:26 | 显示全部楼层
路过看看!楼主费心了!支持一下!

使用特权

评论回复
 楼主 | 2019-12-28 23:13 | 显示全部楼层
kavent 发表于 2019-12-28 19:26
路过看看!楼主费心了!支持一下!

谢谢支持和关注

使用特权

评论回复
 楼主 | 2019-12-29 11:36 | 显示全部楼层
本帖最后由 mzb2012 于 2019-12-29 14:35 编辑

10.PCB板子和元件

打样的小板子收到啦,颜色很红火
121212.jpg



使用特权

评论回复
| 2019-12-29 17:11 | 显示全部楼层
竟然是汇编,牛。

使用特权

评论回复
 楼主 | 2019-12-29 21:52 | 显示全部楼层
yiy 发表于 2019-12-29 17:11
竟然是汇编,牛。

汇编和C差不多,实时性高一点,只不过移植性差一些,对于pic10这种空间资源有限,杀鸡就不用牛刀了吧

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表