完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
本帖最后由 harryrobot 于 2012-11-3 10:22 编辑
首先感谢活动的主办方,给予广大单片机爱好者这样一个实践的机会。 进入正题:单片机的最小系统和下载线的制作(DIY)。 (一)单片机最小系统电路 我也是刚刚才渡过了51初学者的阶段,对我来说,我所需要的电路图不是最好的,也不见得是最简单的,而是我最容易实现的。以下载线为例。用PC的并口输出可以直接通过一个74HC373把程序烧写到单片机上,但现在笔记本电脑连串口都木有,你让我怎么“并”。所以这里就要果断选择成品的USB转串口的线缆。我的第一条USB转串口线用了1年多,后来不知道怎么就坏掉了。我也曾想过自己做一条,但看了网上的很多帖子后,觉得花10几块买一条还是很划算且实用的。 这部分原理图上P1.0口外接的LED本不是单片机最小系统范围,但电路完成后,总要看看它到底能不能正常工作,所以在这里加了一个检验的二极管。
评分
|
||
相关推荐
13 个讨论
|
||
|
|
|
|
|
|
|
加油
|
|
|
|
|
|
|
|
|
本帖最后由 harryrobot 于 2012-11-3 21:01 编辑
(二)8位流水灯模块 首先是原理图 理论上,这里的led应该不必接限流电阻,因为从电源到led中间有上拉电阻已经解决了限流的问题,但通常情况下,我还是喜欢在这里很欠的再限流一次,没办法,学生没钱,每个led都要谨慎地使用,以免烧坏,“虽一毫而莫取”,烧管子就是烧钱,真心是烧怕了啊。 然后是代码,老实说,汇编自己学的不怎么样,所以只有c语言编写的,首先是最基本的逻辑左移循环: #include void delay(unsigned int i) { unsigned j; while(i--) { for(j=0;j<125;j++); //1ms } } void main() { while(1) { P0=1; delay(100); //延时100ms while(P0!=0) { P0=P0<<1; //逻辑左移指令 delay(100); } } } 单单实现这样的功能好像也没什么意思,那么在P1.0和地之间接入一个轻触开关,作为控制:当按键按下的时候,流水灯做完本次循环后开始作反方向循环;当再次按下的时候则又恢复原来的循环方向。代码如下: #include unsigned int result; unsigned int sign; ***it key=P1^0; //P1.0作开关 void delay(unsigned int i) { unsigned j; while(i--) { for(j=0;j<125;j++); //1ms } } void choose() { if(key==0&sign==0) {result=1-result; //按键若被按下,令result取反保存 sign=1;} if(key==1&sign==1) {result=result; sign=0;} else result=result; } void main() { sign=0; result=0; while(1) { do { P0=1; delay(100); //延时100ms while(P0!=0) { choose(); P0=P0<<1; //逻辑左移指令 delay(100); } } while(result==0) ; do { P0=0x80;; delay(100); //延时100ms while(P0!=0) { choose(); P0=P0>>1; //逻辑右移指令 delay(100); } } while(result==1) ; } } /*注:本方案关于按键防抖的思路来源于《爱上arduino》一书,详见其46页*/ 效果展示: http://www.tudou.com/programs/view/Rl16sl_HzmI/?resourceId=0_06_02_99
|
|
|
|
|
|
|
|
|
本帖最后由 harryrobot 于 2012-11-4 19:43 编辑
(三)4位数码管(共阴极)驱动--99秒秒表设计方案 注:(二)部分流水灯那个原理图51的30号引脚要接高电位,图中没画,不好意思。 这部分电路和软件刚好在前一段时间刚刚搞过,但倒计时的或并没有用定时器的功能来实现,只是用了个do-while语句就搞定了。既然组委会要求要用定时器的功能来做,所以这回也是好好学习一下,毕竟当时在学校学的时候就没怎么明白^_^可以算是温故而知新了。 首先是用do-whle来实现的方法: #include unsigned int a0,a1,a2,a3,a; int t; ***it key=P0^2; void showit();//用于在数码管上显示的子程序 void delay_n40us(unsigned int n); void delay_n40us(unsigned int n) { unsigned int i; unsigned char j; for(i=n;i>0;i--) for(j=0;j<2;j++) ; } void showit() { t=10; while(t--) { a3=a/1000; a2=(a00)/100; a1=(a0)/10; a0=a; P1=0xe0+a0; delay_n40us(200); P1=0xd0+a1; delay_n40us(200); P1=0xb0+a2; delay_n40us(200); P1=0x70+a3; delay_n40us(200); } } void main() { a=6999; while(1) { if(key==1) { a=a-1; showit(); } else showit(); } } 然后简单介绍一下这个方案的硬件和软件方面。 这个电路是一个8线驱动4位数码管的方法。相对51单片机来说,8个引脚应该还不算奢侈吧。关键是我觉得这个思路很容易理解。这个电路我也并没有特意去看什么论坛或者什么人曾经用过,纯粹是自己想出来的。但肯定别人曾经用过这个方法。 我觉他一个是它比较好理解,另一个是它比常见的驱动方法少用了4个驱动用的晶体管。当然这里我也不太懂,为什么很多单片机玩家要用三极管来驱动,直接用单片机的接口输出低电平去驱动数码管对应的“位”不就可以吗? 同时,这个电路又很鸡肋地加了一个开关进去,当开关按下的时候计时器停止工作。此功能纯属娱乐。
|
|
|
|
|
|
|
|
|
不好意思 今天才看到 视频是要链接 但不是直接插入 在编辑帖子里面有 不会弄得话 你把链接告诉我 我给你弄 嘿嘿
|
|
|
|
|
|
|
|
|
本帖最后由 harryrobot 于 2012-11-14 11:36 编辑
现在来说说用内部定时器寄存器做延时来实现99秒倒计时功能的实现方法。 其实个人觉得,自己编写一段延时子程序和使用内部定时器并没有本质的差别,都是通过计数来消耗时间。至于实际应用时用哪种方法,我觉得完全是自己的喜好问题。当然如果你够狠,也可以两者混用。但也并没什么新意。我个人还是倾向用C语言来写延时函数的方法。因为总觉得用内部定时器就是在使用汇编语言一样。 两种方法的效果自然也是一样的。硬件电路也不用做任何改变。 下面是用内部定时器做延时的C语言代码(话说内部定时器的延时时间我并没精确地计算,因为觉得各种数制来回转换实在麻烦,没办法,谁让当时没好好学呢):
|
|
|
|
|
|
|
|
|
(四)串口通信
前段时间给学校做一个抢答器,里面用到了串口通信的部分。 所谓通信,自然是有发有收的,如果是和电脑连接的话,其实上位机软件的编写还是很重要的。
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 04:41 , Processed in 3.373285 second(s), Total 97, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
18227