亿万先生论坛

 找回密码
 快速注册
QQ登录 只需一步,快速开始
搜索
下载方法|用单线程|避免多扣帖子规范|求助必读|发帖建议积分策略|勋章介绍|新人必读获取金币|推广论坛|出售帖子基本礼节|致会员信|版规总则
禁涉政治|反对低俗|举报专帖征集相片|留下足迹|推荐精华上传附件|制作分卷|使用网盘禁发qq群|恶意灌水|纯表情帖加入团队|监督机制|安全上网
楼主: jimsboy
打印 上一主题 下一主题

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

    [复制链接]
31#
发表于 2016-5-9 17:15:33 来自手机 | 只看该作者
楼主讲解的很通俗易懂
回复 使用道具 举报
32#
 楼主| 发表于 2016-5-10 21:41:47 | 只看该作者
今天又要给大家增加一个新的内容。那就是定时器(或者叫计数器)。

这个本来不属于单片机的内容,但它在常见的单片机里都集成了这个功能,所以也讲一下。
这里的定时器,在单片机里边只是一个会自动加1的寄存器,但是有了它,又可以玩更多的花样了。

已经说了,这是一个会自动加1的寄存器,那么你可能会问了,它什么时候会加1?嗯,这就是我们要讲的内容。它什么时候加1是可以设置的,方法也是设置另一个寄存器。通过设置不同的值,单片机就可以知道你希望它什么时候自动加1。可以选择当某个管脚上出现一个脉冲的上升沿(或下降沿时)加1,也可以选择系统时钟的整数倍时加1。假设它是在管脚脉冲的上升沿时加1的,我读取这个计数结果,就可以知道这个管脚上收到了多少个脉冲。这相当于在计数。所以这时习惯称之为计数器。如果它是在系统时钟的整数倍时加1,系统的时钟是我们自己选的,它的频率我们是已知的,收到了多少个计数,就知道过去了多长时间,所以这时我们习惯称之为定时器。这里也可以让你看出,同样是一个简单的加1功能,它计数的东西不同,就实现了不同的功能。所以单片机能做什么,全看你怎么用它。

计数功能很简单,没什么要多说的了。我们主要说说计时功能。既然叫它定时器,那么就应该有到了时间提醒你的功能。的确,它是具有这个功能的。
比如我们的系统时钟为1M,那么计数加1就需要1微秒(当然,也可以设为N个时钟计数加1).比如我需要它在1000us(等于1ms)后提醒我,那么我可以设置计数的值为1000,然后让它开始计数.当1000us过去之后,它会产生一个中断.前面说了,当中断之后,程序会打断当前执行的内容去执行这段处理程序.所以单片机可以去做其他的事,当时间到了,它会自动跳过去执行中断处理程序.

我们现在用的电脑,它里边只有一个CPU,它的运行速度很快,都是以G为单位.虽然只有一个CPU,你会发现你的电脑可以一边聊QQ一边看网页,还能一边听听歌,看上去好像是多个程序都在同时执行,而实际上,它们并不是同时执行的,因为CPU同一时间只能执行一个程序.所以电脑的CPU会每过10ms产生一次中断,中断之后就执行另一个程序,由于每秒切换100次,所以你感觉到的就是所有的程序都在同时运行.这就是定时器一个强大的应用:实现任务的切换,让一个CPU完成多个事情的处理.

这部分由于需要对单片机深入接触之后才能感觉得到,所以这里只是提一下,等你们在使用过程中去感受它.





回复 支持 反对 使用道具 举报
33#
发表于 2016-5-11 16:18:49 来自手机 | 只看该作者
感谢老师的辛勤劳动,老师水平高,请问我们一般都要买51学习板开始实践吗?
回复 使用道具 举报
34#
 楼主| 发表于 2016-5-11 16:46:28 | 只看该作者
宜城水岸 发表于 2016-5-11 16:18
感谢老师的辛勤劳动,老师水平高,请问我们一般都要买51学习板开始实践吗?

不要买开发板。
整个过程完全自己弄。芯片得买。
一步一步地来,我会在过程中故意挖坑,让大家去踩。开发板学习的只是编程。

回复 支持 反对 使用道具 举报
35#
发表于 2016-5-12 16:11:08 来自手机 | 只看该作者
谢谢老师的奉献
回复 使用道具 举报
36#
发表于 2016-5-12 17:11:40 | 只看该作者
讲得不错,数字电路通俗化!
回复 使用道具 举报
37#
发表于 2016-5-17 08:53:43 | 只看该作者
记得我那时候弄过设备上的单板机Z60,用于检测设备转速 时间 故障等功能
回复 使用道具 举报
38#
发表于 2016-5-17 21:15:46 | 只看该作者
谢谢楼主讲解。学习中。
回复 使用道具 举报
39#
 楼主| 发表于 2016-5-18 13:05:07 | 只看该作者
今天我们说一下串口
为什么要说它,因为它对我们玩单片机很有帮助。
老一点的台式机上,一般都会有一个9针的插口。那就是串口。在电脑附件里有一个超级终端的小软件,它可以和这个口通信。
我们常见的单片机里,一般都带串口这个功能,这个意味着通过这个接口就可以实现电脑与单片机的通信。这是与电脑通信最简单快捷的一条路!

为什么要与电脑通信?我们要玩单片机,必须要把程序给加到芯片里去才行。把程序烧到单片机通常的做法是用烧录器。买一个编程器,然后把芯片夹在编程器的烧录座上,打开电脑上的烧录软件,把单片机的程序加载进来,点写入,这就完成了。你可以发现,要想这样做,首先你得拥有一个编程器。第二如果你想改变程序,你还得把芯片拆下来,这是很麻烦的事。所以现在出的单片机就改进了这一点,你可以采用一个“下载线”对单片机编程,下载线实际上也是一种编程器。基本都可以自制,如果不想动手的话,买一个也很便宜,一二十块钱就搞定了。除了便宜,它最大的好处是可以在线更改单片要的程序而不要把芯片拆下来。这比使用编程器进了一步,但毕竟还得准备一个工具才能对单片机编程,再后来就可单片机可以直接从串口加载程序,连下载线都不要了。这样就让单片机使用更加简便了。

串口除了可以作为部分单片机的加载程序的接口,更重要的是我们在程序里可以写一些内容让它上报给电脑。因为程序写出来,能100%没问题的可能性基本为0,肯定会遇到这里或那里的错误,如果程序有错,它可能就不按你的思路走了。这时你必须找出我的程序哪里写得不对。如果没有任何提示,你只能抓瞎,所以在编程时我们会在一些位置上多加几句代码,让它通过串口上报一些信息,当它出现异常时,我们就可以根据这个信息来推断是哪里的问题。这样就可以方便地找出程序哪里写错了。

那好,我们看看串口是怎么工作的?
先看一个实例,你打开电脑上的记事本,然后你按A,则记事本上就出现一个字母A,你按B它就出B。你感觉这是理所当然的事,实际上这个过程并不是这么直接的。如果你的键盘出了点问题,完全可能你按A,而电脑上显示的内容却是B。我们先了解一下电脑和键盘是怎么配合工作的。实际上,你按一个键,它就会送出一组数据,每个键对应的数据都不一样。当然,哪个数字代码哪个键,它们都约定好的。比如0的编码是48 1的编码是是49 a的编码是97 b的编码是98 A的编码是65等等。每个都有一个对应的码。当你在键盘上按下大写字母A,键盘会发送65给电脑,电脑就知道键盘上A被按下了,于是就在显示屏上画一个A这样的符号。键盘上每个字符的编码都可以在网上查到,这张表叫ASCII码表,包括回车,退格键,都有各自的编码。

困了,先休息一下再写





回复 支持 反对 使用道具 举报
40#
 楼主| 发表于 2016-5-18 16:54:30 | 只看该作者
继续写

不光键盘是通过数字编码的方式将你的动作告诉电脑主机。鼠标也是通过数字编码来报告它的行为的。在电脑里,所有的内容都是用数字来表示的。不同的地方,数字代表的含义不一样。摄像头也是通过一堆数据来告诉电脑它拍到的内容,你正在打开的网页也是一堆数据。还有电脑硬盘上存的内容,全都是一堆数字的编码。除了电脑,我们常见的手机,U盘,数码相机,MP3,它们全部都是使用数字编码来代表各种各样的内容的,所以它们都被称为数码产品。

扯得有点远了。回主题,串口是怎么来表示一个数据的?1用1V的电压?2用2V的电压?用不同的电压的确可以传递信息,我们的老式电视,收音机都是利用不同频率不同电压的信号来还原声音和图像的。这种做法看上去很直观易懂,但是它有一个缺点,那就是容易受干扰。比如我用0-5V表示0-50。0.1V表示1 0.2V表示2,这个看上去没有任何问题。但是,信号在传输的过程中总会遇到干扰,如果干扰的电压超过0.1V,原来0.1V的电压现在变成0.2V,那么所表示的内容就出错了,但是如果你用这种简单的方式来传数据,那么出错的概率就会很高。电脑里的数据并不是这样表示的,0-5V只表示两个数据,比如低于2V表示0.高于3V表示1。中间的不认。发送这一端想告诉对方是0,那么送出0V,如果想告诉对方这里是1,则送出5V。要想把它干扰得不能识别,干扰在信号线上产生的电压要超过2V才行,这是比较困难的。

比如发送端送出来的信号想传送的数据为1,因此它会送出5V的电压,在传输的过程中,它被干扰变成了4V,对端收到4V的电压,它就知道发送那端送给我的数据是1,当它再次将这个数据送给下家的时候,它仍然会发送5V的电压而不是4V的电压,因此这个干扰就被消除了。对来传统的方式,我想发送1,那么送出的信号是0.1V,干扰之后变成1.1V,接收端认为发过来的数据是11,那么它传给下家时,仍然是1.1V。如果下次再受个干扰,数据又变了。所以传统的方式传信号,遇到干扰就会很头大。

你可能会说,我用0V和5V来表示0和1,我想表示22,你不就傻眼了吗?而我用传统方式,发送个2.2V就行了。那这个只能表示0和1的货,怎么表能表示22呢?这个问题嘛,我们得换个思路。其实,这个不难。你看我们常用的数。中文一千,写成数字1000,中文五千三百二十一,写成数字,5321,看出点什么了吗?阿拉后数字里边只有0-9,如果不限制它的位数,它可以表达任意大小的数值。那么仅有0和1,如果你不限定它的位数,它是否也能表达任意大小的数值呢?当然可以! 先看阿拉伯数字,1位,可以0-9,10种值。两位0-99,100种值,可以写成10的2次方种。3位就是10的3次方种。对于只有0和1的数据,1位可以表示0和1,只有两种,很可怜。两位可以表示4种,即2的2次方种。3位就可以表示8种。4位就能到16种。你不限定它的位数,用阿拉伯数能表示的值,它也能,只不过位数多了很多而已。阿拉拍数,每数到10就进一位,我们称为10进制。而它,每数到2就得进行位,所以它称为2进制。你看那些科幻片,只要提到黑客在破解什么,满屏都是0和1在那里乱跑。为什么用0和1作画面就是这个原因。

所以 那么我们看一下,它怎么表示不同的数。
10进制    2进制          10进制       2进制
0           0             8           1000
1           1             9           1001
2          10            10           1010
3          11            11           1011
4         100            12           1100
5         101            13           1101
6         110            14           1110
7         111            15           1111

看见了吧,如果继续向上数,你也应该能继续写,16就得用5位来表示了,变成10000。再看规律,我们平时计数,计到9就进一位,它呢0上面是1,1再上面没有了,就行进位,变成10。规则和十进制的没什么区别,就是位数太多,看得眼花。才到16就已经5位数了。比如一个电阻1亿欧,写成阿拉伯数100000000欧,二进制表示一下101111101011110000100000000欧,估计你看到这么长的数字都快疯,眼睛是直接罢工。那怎么办?刚才100000000读起来也费眼,所以我们会给它加上空格 1 0000 0000,四个一组,一组是万,两组是亿,这读起来就舒服多了。老外喜欢三个一组,写成100 000 000,一组是k两组是M 三组是G,所以这个电阻你不会叫它1亿欧,而是习惯叫它100M欧。所以作为一个搞家维中国人,你既要习惯于四个一组的中式分法,还要习惯于3个一组的老外分法,比较辛苦啊。

对于刚才二进制表示的一个亿101111101011110000100000000,我们也可以给它加上空格,但这次是老外投降了,也是用四个一组 变成101 1111 0101 1110 0001 0000 0000。分开之后看上去舒服一点了,虽然不会读它。这次老外按4个一组不是因为吸取了中国人的经验,而是在电脑发明的时候,大家规定了,8位二进制记为1个字节,分成4个一组最方便。
现在虽然分了组,但是记忆这么长一的串数字还真不容易。它的长度达27位。比起只有9位的阿拉伯数来说,难了太多了。为了方便记忆,我们四个一组四个一组地记,前面我列举了四位长度能表示的各种值,共有16种。比如22这个值,二进制1 0110 你根据那个表就可知道,第一组是1,第二组是6,因因此你可以记为16,但为了防止和阿拉伯数里的16混淆,我们习惯写成16H或者0x16。22可以表示为16H,那么30怎么办?30用二进制就是1 1110,1110对应于14,你记作114H?那么怎么区分于二进制1 0001 0100呢(相当于阿拉伯数276)?这个按这种写法也是114H啊。办法总是有的,0-9是几个符号,我再多加几个符号进来凑足16种就行啦。于是有人用A-F表示上表的10-15 这样就好办了。一位表示4位,所以30写成二进制变成1 1110,现在就可以记为1EH或者0x1E了。
那好,我们现在开始数数,0-35 ,用这种计法写出来就是0 1 2 3 ...9 A B C D E F 10 11 12.....19 1A 1B 1C 1D 1E 1F 20 21 22 23
看见了吗,和我们原来10进制时数起来也差不多,只不过原来我们数到9后面就得进一位,现在是数到F后才进位,所以每16才进1,所以这种计数又称为16进制,简写HEX,为什么要在原有数字后面加H,就是这里来的。
16进制    2进制          16进制       2进制
0           0             8           1000
1           1             9           1001
2          10             A           1010
3          11             B           1011
4         100             C           1100
5         101             D           1101
6         110             E           1110
7         111             F           1111
呵呵,不知不觉我。 们把二进制 16进制与10进制的关系给讲完了。你可能会问,为什么搞这么复杂的过程,弄得我晕晕的。100 200 这种数字看上去多省力啊。非要搞什么1E 3DF之类的数字,我看到它们还得换算成10进制才能知道它是多少,太不给力了。我要10进制~~~。很遗憾的是,这种你看上去很费劲的数据,对于电脑来说,就像你看100 200 这种10进制数一样舒服。毕竟你是需要用它,你得将就着一点。就像你想和老外交流,你得学外语一样。让老外讲中文也不是不可能。比如你问老外,十加十是多少?他要先将这句话翻译成what is ten plus ten ,然后思考:ten plus ten euqals twenty,然后twenty翻译成中文是二十,然后再用不流利的中文和你说:二时~~(20)。同样,如果你需要让电脑来计算100+100是多少,它要先将100翻译成二进制 110 0100 + 110 0100 ,你可以尝试着用我们10进制的思路来加它,0+0=0 1+0=1 1+1=0 并进位。你可以计算出结果是1100 1000,再换算出我们的10进制变成200。你可以发现这这个规则还能再简化一下,不看进位部分,有两种:相同的变成0,不同变成1。反过来看我们10进制计算,1+1 1+2 ..1+9,2+1,2+2...2+9.....8+9 9+9,有几十种。所以二进制的加法规则要比10进制的简单不知道多少倍,实现这个功能的电路就会很简单,所以它的计算速度非常快。所以你想电脑帮你计算,它要先将10进制转成2进制,算好之后再换成10进制让你容易看懂。

今天好像思路老是发飘,不旦讲了二进制,还讲了为什么要用二进制。继续聚焦串口上来

前面说了,电脑发明时规定了8个二进制为1个字节。串口每次都是传一个字节,所以多于8位的,拆成多组,每次传8位,不足8位的,前面用0补足,这也不影响结果。8个进制,最多能表示1111 1111 换算出来就是255,0-255共有256种值。

比如单片机串口发送数据35H(10进制就是53)给电脑,表示为二进制 11 0101凑足8位 0011 0101。那么串口会怎么弄?单片机串口平时的电压是5V,这表示1,然后它会变成0,告诉电脑,我开始发数据了。电脑那边发现数据线上的电压由5V变成0V,就知道串口要发数据了,然后就进入警觉状态,密切关注线路上电压的变化,在一定的时间之后,单片机送出第一位1(从最低位开始),所以这时线上面的电压就从0V变成了5V,持续一段时间之后,送下一位0,因于线路上电压又变成了0,这样连续8次之后,就把8个数据送出去了。送完数据之后,它还要再送一个5V,让线路上恢复初始的5V,以便下一次传输。对于电脑那边,它发现平时处于高电平(5V)的线上突然变成了低电平(0V),那么就知道马上有数据来了,然后就开始按预定的时间去一位一位地读,读完8个数据之后就知道对方发过来的数据是什么了,也就知道这是什么意思了。比如这次我们举例的数据是35H,电脑收到之后,它会去查表,这个35H表示的是什么,一查ASCII表就知道,这个值表示数字5,它就会在显示屏上显示一个5.

你可能会问,它怎么知道要等多久呢?我发送的时候是1ms/位 它却按2ms/位的速度去收,那不就错了吗?的确,这样就错了,所以我们要规定好速度。这个速度有个专有名词叫波特率,你打开超级终端,你会发现,它个值不是想设多少就设多少的,只有 1200 2400 4800 9600 19200 38400 115200等有限的几种可选。波特率就是每秒的位数。换算一下就知道每个位持续的时间了。比如9600的波特率 每个位持续时间为1/9600秒。一个字节有8个位,还要额外开销一个位用于通知对端开始传送(这叫起始位),还要开销一个位用于通知对端传送结束(这叫停止位)所以发送一个字节需要10个位,每秒9600个位,只能发送960个字节。如果想发送更多数据,只能提高波特率。使用19200或其他更快的,但必须选用那几种可选的。否则无法正确通信
回复 支持 反对 使用道具 举报
您需要登录后才可以回帖 登录 | 快速注册
本版积分规则
手机版|APP|亿万先生技术论坛 ( 鄂ICP备 09003585号-1 )   GMT+8, 2018-1-16 15:33 , Processed in 0.172092 second(s), 9 queries , Gzip On, Memcache On.
Powered by Discuz! X3.2 © 2001-2013 Comsenz Inc.
CopyRight © 亿万先生论坛
电子邮箱:admin@jdwx.info | 联系 QQ:3081868839 | 官方网址:www.jdwx.info
Qiji. All Rights Reserved
服务条款 | 隐私声明
Wuhan Qiji Technology Co., Ltd.武汉奇迹科技有限公司版权所有
鄂ICP备09003585号-1鄂公网安备42010602000420号
快速回复 返回顶部 返回列表
亿万先生官网欢迎您