电子技术论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
下载方法|用单线程|避免多扣帖子规范|求助必读|发帖建议积分策略|勋章介绍|新人必读获取金币|推广论坛|出售帖子基本礼节|致会员信|版规总则
禁涉政治|反对低俗|举报专帖征集相片|留下足迹|推荐精华上传附件|制作分卷|使用网盘禁发qq群|恶意灌水|纯表情帖加入团队|监督机制|安全上网
查看: 12847|回复: 21

讲讲单片机吧,给想了解它的人作为启蒙吧(二)

[复制链接]
发表于 2016-7-6 10:38:46 | 显示全部楼层 |阅读模式

注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
本来是要接在原来的帖子后面的,但是发现老的帖子只能看到第9页,后面的就看不到了。因此重开新帖继续讲。

昨天晚上花了点时间把电路焊出来了。用洞洞板焊的。因为器件很少,所以焊起来也快,不过全都是飞线,因此很丑。

1.JPG
正面的,看上去还不那么丑。
背面的就有点要命了
2.JPG
只要看正面吧。
左上角是驱动继电器的三极管,8050.我没有把继电器焊上去,一是继电器的脚不能准确地插到板子上的洞里。第二是继电器是否工作不容易看出来。
因此我在三极管的基极多串了一个发光二极管,当三极管导通时,二极管就会亮,这是我临时改进的。

三极管下面是一个2X5的排针。那是加载用的。看老帖里边有这个加载口的接线图,只需要将MISO MISO SCK RESET 地引过去就行了,如果把电源也引过去,就可以直接使用加载线给它供电(前提是板子上没有大的耗电,否则带不起)。我这里就把它引过去了,这样板子就不需要额外供电就能工作了。

再下面有一排四脚的排针,这排排针引出串口的TXD和RXD 另外还要有一个地。图片的最左边,有排针的功能定义。这样在使用的时候就不容易弄错了。
紧挨着单片机的左边,有一个100uF电解电容。是给单片机供电的。其实除了这个电容,在板子背面,还有一个0.1uF的贴片电容并在上面。为什么要放两个电容呢?你别看单片机的耗电量不大,但是他们的瞬间电流是很大的,这些数字电路在状态改变的一瞬间,都有非常大的电流,但是持续的时间非常短,所以整体电流并不大。但是如果你没有这个电容,它需要改变状态时,电源电压就会跌落,如果电压跌得过份厉害,则可能引起各种意想不到的情况。所以我们必须给它一个电容,让它在状态发生翻转时能给它提供一个瞬间的能量支持。

最右边,一个10k的电阻和一个温敏电阻串联后接到了电源上,中间抽头接到了单片机的第40脚,也就是AD采样的管脚。

电路硬件到此结束。下面要试一下焊好的东西是否能工作。把下载线的插头插到2X5的排针上,注意方向。USB连电脑。
3.JPG
打开下载线的软件,如果是第一次使用还需要下载驱动。我用的下载软件是 progisp1.67,这个软件里边包含它的驱动的。如果没有找到驱动,就向卖家要一个就行了。
这是界面
4.JPG
注意红框里的内容。别选错了。点一下读出Flash或软件最左边偏下一点的那个“读出”


只要出现红圈里那种succesfully 就说明它和单片机通信成功了。
5.JPG

通信成功,硬件工作基本可以说是完成了一大半了,余下的需要配合软件来完成了。

评分

参与人数 2威望 +5 收起 理由
gf2133 + 2 赞一个!
yuyangan + 3 向你学习了

查看全部评分

发表于 2016-7-6 10:55:07 | 显示全部楼层
感谢楼主的付出,相信对于想学单片机的人有很大帮助。
发表于 2016-7-6 11:02:24 | 显示全部楼层
单片机我也是一直没哟弄明白
发表于 2016-7-6 11:35:11 | 显示全部楼层
单片机  好像 比 PLC   低一个等级 吧
发表于 2016-7-6 11:56:06 | 显示全部楼层
运城向荣电子 发表于 2016-7-6 11:35
单片机  好像 比 PLC   低一个等级 吧

只知道有PLC是单片机做的。

只熟悉单片机,不懂PLC。
发表于 2016-7-6 11:57:14 | 显示全部楼层
啊哈哈,MEGA16 ,,,LZ是前辈吧。
 楼主| 发表于 2016-7-6 21:53:23 | 显示全部楼层
沉默胜过白金 发表于 2016-7-6 11:57
啊哈哈,MEGA16 ,,,LZ是前辈吧。

我看来看去,只有AVR的比较好学一点。
标准的51太老了,准IO口不好理解。没有中文资料
51里有中文资料的是STC的,但是那个资料太山寨了。
PIC的需要编程器,而且还要装破解软件,麻烦。
ST的不错,但是脚太密,不适合初学。
没办法,把我“珍藏”了至少10年的AVR拿出来给大家学习之用吧。
这颗单片机我买回来至少10年了。
发表于 2016-7-7 11:41:52 来自手机 | 显示全部楼层
学习了,楼主辛苦了
发表于 2016-7-7 18:03:33 来自手机 | 显示全部楼层
谢谢楼主分享,辛苦了。
 楼主| 发表于 2016-7-11 11:20:44 | 显示全部楼层
下面主要任务是写程序。
前面已经写了一个模板了。先点一下编译,看看是什么结果。点击红圈中第一个按钮就可以编译了。
编译的时候,它会提示你一些内容,就是图中下面有黄点红点的那些内容。黄点是警告,红点是错误。有红点,它就无法生成最终的bin文件。黄点有存在,一般是可以生成bin文件,但是功能上可能有问题。所以我们在写程序的时候,要把它们全部消除。

点击之后,出了不少红点和黄点。看来程序有问题。当然啦,我们程序都没有写完,只是一个框架,有错误也是正常的。
我们看看,那些错误说了什么。如果你看不懂英文,把它复制到百度里,下次你就知道是什么了。也就是认识几个关键的词,下次就好办了。
我们就一个个地看。先看红的
../wenkong.c:18: error: 'TCCR1B' undeclared (first use in this function)
这句话告诉你,在wenkong.c这个文件的第18行,有一个错误(error),错误的内容是TCCR1B 没有定义(undeclared)
这是什么意思呢,就是说它不认识TCCR1B是个什么东西。可能你知道,它就是一个寄存器的名子啊。但是编译器是不知道的,因为从来没有谁和它提过这个东西是个什么鬼。就像我对你说,你去帮我查一下3DD15的脚位,你听到3DD15,你就能明白,你要找的一个三极管的性能脚位。如果你对一个外行说,帮我查一下3DD15的脚位,他可能会问?什么是3DD15?。其实这个过程很有趣了。我没告诉你3DD15是三极管啊。你怎么就知道3DD15是三极管呢?因为你从事这个行业,在你的脑子里已经有了定义了,3DD15就是一个三极管。而对外行来说,他看到3DD15,它只认为这是一串字符。什么含义不知道,最多他能从生活经验中猜测,3DD15应该是一个东西的型号。 同理,当编译器看到TCCR1B时,它也认为这是一串字符。
那怎么办呢?你得让它知道这是什么才行啊。它又不会自己学习。所以你必须告诉他TCCR1B是什么。
我们看资料已经知道,MEGA16这个单片机里,有很多寄存器,它们都是类似这样的名子,因此你必须把这些内容告诉编译器。当然,人家其实早帮你想好了,你要做的只要写一句 #include <avr/iom16.h>
这一句要写在文件的开头处。
这一句是什么意思,那就是包含(include)一个叫iom16.h的文件,这个文件在编译软件目录下的AVR这个文件夹里。前面的#是C语言要求的。告诉编译器,这一句既不是指令,又不是注释,而是要编译器自己搞明白的内容。尖的括号就是表明这个文件在编译软件的目录下。那我们去看看这个文件里的内容吧。直接用电脑的查找功能,找iom16.h,发现它是我电脑C盘winavr目录里边,因为我们的编译器是用的winavr。里边有一个文件夹叫include。它里边有子文件夹avr,这个iom16.h就是这个文件夹里。与我们前面的解释一至。
再看这个文件里的内容,右键用记事本打开它,里边除了一些废话,还有很多#define xxx  yyyy 这种的东西。
我们查找到TCCR1B,就可以看到这样一句。
TCCR1B  _SFR_IO8(0x2E)
这就告诉编译器。TCCR1B是一个SFR(特殊功能寄存器),它的位置在0x2E。
有了这一句就好办了,编译器这时就能明白TCCR1B = 0x02的意思就是将特殊功能寄存器0x2E里的值设成0x02。
0x打头的是C语言里16进制的表示方法我们平时数数都是10进制的,1 2 3 4 5 6 7 8 9 10,过了9就进位了。它的数法是1 2 3 4 5 6 7 8 9 A B C D E F 10,过了9之后不进位,再往上面数,可是阿拉伯数字里最大就是9,再上去怎么办呢,你也得有一个符号啊。因此就借用英文字母A-F。
所以0x20就相当于10进制里的32了。这个转换你可以不去理解,直接用电脑上的计算器进行转换。

好了,再加主题,现在加了一句了。再编译一下吧。看看怎么样。结果它提示要你包含io.h。好吧,这样太烦了,我去人家里抄一段过来。
#include <stddef.h>
#include <avr/io.h>
先加这么两句,到时候缺什么再说。
再点,刚才的问题没了,现在遇到4个新问题
../wenkong.c:10: undefined reference to `cli'
它说它不认识cli,后面还有说不认识sei
这是关闭中断和打开中断的。所以我们要再包含一个#include <avr/interrupt.h> 这是中断相关的。
再编译。还有两个错误
../wenkong.c:15: undefined reference to `ResetGlobeVariable'
../wenkong.c:16: undefined reference to `cpu_init'

这两个函数是我自己打算写的。
前一个是初始化全局变量。我们目前没有,先把它注释掉。
后面一个cpu_init,是初始化CPU里一些功能的,比如设定哪个口输入,哪个口输出,ADC采样的速度这些都是要在这里边完成的。

下集我们写cpu_init。

图片弄丢了,图片补在这里
1.JPG


您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|家电维修技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2024-5-3 00:06 , Processed in 0.078046 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

CopyRight © 电子技术论坛
电子邮箱:8794149@qq.com | 联系 QQ:3081868839 | 官方网址:www.dzdu.com

Qiji. All Rights Reserved


服务条款 | 站长声明

Wuhan Qiji Technology Co., Ltd.武汉奇迹科技有限公司版权所有


鄂ICP备09003585号-2鄂公网安备42010602000420号

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