前言:
此刻我们对“单片机取反指令编程怎么写”大约比较着重,兄弟们都需要剖析一些“单片机取反指令编程怎么写”的相关资讯。那么小编也在网摘上搜集了一些关于“单片机取反指令编程怎么写””的相关资讯,希望朋友们能喜欢,各位老铁们快快来学习一下吧!51单片机的另类入门方式与编程思想
\\\插播一条:
自己在今年整理一套单片机单片机相关论文800余篇
论文制作思维导图
原理图+源代码+开题报告+正文+外文资料
想要的同学私信找我。
在写之前我先说一下为什么写这篇文章,其实主要是出于这么一些考虑:
一、如何学习单片机
发表一下个人的观点:书要看,但是不要过多的看,把它作为一个知识的补充,我们读了这么多年的书,其实只有在自己静下心来看书的时候效率才最高。
首先,我们不能像以往学习其他课程一样,又是背,又是拿笔计算,学什么寄存器,从那难懂的汇编语言入手....我直接告诉大家,这样是达不到效果的,反而会丧失学习单片机的兴趣。那该如何去学呢,我们要充分利用自己的兴趣去学,去“玩”单片机,而不是被它所“玩”,在此过程中切记浮躁,不要跟着自己的情绪走,想学就学一下,不想学就不学,要持之以恒。
①刚开始可以对照着别人的代码抄写,但是后期只能借鉴别人的,不要一味的CTRL+C,CTRL+V,我晓得大家这两个东西用的很熟,多借鉴别人的编程方法,用自己的思路去写;
②不要蜻蜓点水,得过且过,细微之处体现实力;
③把时髦的技术挂在嘴边,不如把过时的技术记在心里;
④经典的书时不时的去重新看一遍,多看国外的书;
⑤网上的资源要多利用,但是不要瞎逛,要有目的;
⑥单片机十天是学不会的,只能入门,要打持久战;
⑦思想很重要,方法很重要!!
二、学习的一个基本流程
1、了解单片机是个什么东西,主要出现在那些领域,弄清自己为什么要学?
2、基本开发软件安装,代码下载(Keil是最基本的);
3、跟着教程从零开始建立第一个工程,一次不会多试几次:跟着教程把代码一个一个的敲上去,然后编译,出现错误不要立马询问他人,先自行尝试去解决,实在搞不懂再去问别人,当控制了LED的亮灭工作后,就要去分析一下这个LED到底是怎么点亮的,里面相应的代码又是怎么回事,都要去了解一遍;
4、到了这个阶段,就可以学习单片机的其他东西,对照着代码一个一个字母的抄,不要觉得繁琐,没抄完一个功能,正确无误后,先做好备份,然后再去修改,看是否与你的预期相符,抄着抄着你就有感觉了,有了感觉就可以尝试着不参考别人的程序自己从零去建立自己想要实现的功能,从最简单的开始,哪怕是点亮一颗LED灯,这个很重要!!!;
5、当把单片机的基本功能都学完后,就可以以工程的形式进一步学习了;用单片机实现一个电子钟,用单片机控制一辆小车.....在做这种工程的过程中我们会发现很多问题,解决很多问题,这样我们就上升了一个层次了;
6、编程规范,本来想将编程规范放在最前面,考虑到可能会让大家丧失学习单片机的热情。这阶段就要看人家写的代码,为什么看上去那么舒服,并且很容易阅读,函数一看就知道它用来干嘛......从规范着手,编写能重复利用,便于维护的代码;
7、工程也做了,规范也有了,是不是有点感觉单片机不怎么好玩了?其实还有大把的东西需要你了解,随着工程一个比一个大,我们就要从全局开始思考这些问题了。要对一个复杂的工程分成一个个的模块,比如说在电子钟工程里,我们可以尝试着把它分为按键模块,显示模块,时钟模块......
Keil:软件不要汉化,英语没有那么可怕,它本身也自带了说明书,遇到有些问题可以去看它
(二维码自动识别)
Pretous:个人建议只用来做一些功能性的检验,像算法类型的,切不可在实际硬件中用其作为真实参考
Notepade++
Notepade++:平时查看,编写代码非常方便
Notepad++软件截面
三、了解51单片的的基本东西及C语言
单片机:硬件设施,躯壳首先要了解基本的51单片机知识,实验室一般以国产宏晶公司的STC89C52RC为例,要知道怎么给单片机供电,有哪些基本的I/O口,I/O口的基本内部结构,串口登(这些东西只做基本了解,不需要刻意去记住,在后续的练习过程中,大家会慢慢记住的);
C语言:灵魂对于学习单片机C语言,个人建议刚开始可以直接跟着抄写代码就行了,至于为什么是那样写的不必纠结太多,练习一段时间后再去看那些单片机的C语言书籍,这样大家更深刻些。
四、Keil软件的安装以及怎么用ISP软件下载
① Keil软件怎么安装,以及怎么破解,基本的设置,怎么使用,大家网上去搜索,如果这一点都做不到,不要说你会用电脑(关于使用这一块了解就行,后面在写代码的过程中会反反复复的用到的,不必刻意去记)
keil软件图标keil软件界面截图
②程序烧写ISP(ISP--In System Programming是在线编程的意思)软件可直接下载STC-ISP,这里面也有很多值得参考的东西,有事没事可以去看看,也可以百度,怎么安装USB转串口的驱动(USB转串口常用芯片:CP2102,PL2303,CH341),它的功能也就是将我们编写好的代码下载到我们的单片机当中,怎么从ISP软件中找相应单片机的型号进行代码的下载
STC单片机烧写软件图标ISP烧写截图
烧写步骤:
(1)、在烧写前先断开单片机的电源(注意)
(2)、首先选中单片机的型号,根据自己用的单片机选定,我这里是STC89C52RC
(3)、打开要烧写的文件:如LED.HEX
(4)、选择当前有效的串口
(5)、点击下载按钮。
(6)、接通单片机的电源
关于下载我总结了一下,如果要重复下载的话,最好装个那种自锁的开关,然后每次去点击下载,直接按开关
③将别人验证成功简单功能(etc:LED灯闪烁)HEX文件下载进单片机以便验证自己的思路是否正确
五、点亮一颗LED灯
LED灯实物(摘自爱上单片机)
LED灯其实我们平时到处都可以看到,不同的LED灯的驱动电压有区别,这个我就不多说了,百度上一大堆,大家只要记住一点LED灯的那个限流电阻的值是怎么来的就行了,比如说红色LED灯的驱动电压是3V,电源是5V,一般的驱动电流大约10mA就足够了 R = (5V-3V)/10mA*1000 = 200Ω,我这只是举个例子,其他的大家都可以根据数据手册,或者某宝卖家提供的参数进行电阻的计算。
硬件部分
如图所示D1连接在P0.0端口,我们为什么要采用这种方式连接呢?可不可以将LED灯反向呢?对于这个问题我给出的回答是,有些可以,有些不可以。为什么是这样呢?
这个我们就要了解STC89C52RC这款单片机的GPIO内部的基本结构了,在本实验中所使用的端口为P0口,内部为开漏输出,什么是开漏输出?度娘.....因为在这个教程中我只教大家学习单片机知识,其它的不过多的说,以免牵扯太多,大家消化不了。P1~P3口是准双向上拉,这款单片机(5V)I/O口的驱动能力的灌电流20mA;弱上拉时,拉电流能力是200uA,设置成强推挽时,拉电流能力也可达20mA。
灌电流:即MCU被动输入电流。
拉电流:即MCU主动输出电流。
那下图就不用多解释了.....
点亮一颗LED灯实验原理图
代码:
/************ (C) COPYRIGHT 2016 wllis ************** * *文件名: LED.C *描述:点亮一颗LED *作者: wllis *日期: 2016/01/15 * ****************************************************/
#includetypedefunsignedcharUINT8;
typedefunsignedintUINT16;
sbitLED=P0^0;/* *函数名:void DelayMS( UINT16 n ) *描述:延时 *输入:UINT16 *输出:无 */
voidDelayMS(UINT16n)
{
UINT8a;
while(--n)
{
for(a=114;a>0;a--);}
}/* *函数名:void main() *描述:主函数 *输入:无 *输出:无 */
voidmain()
{
P0=0XFF;//将P0端口全部初始化为高电平while(1)
{
LED=1;// LED灭DelayMS(500);//延时500毫秒LED=0;// LED亮DelayMS(500);//延时500毫秒}
}
/********************end of file ***********************/
代码分析:
首先我们看下我们要点亮的LED怎么实现,先在代码中定义[图片上传失败sbit LED0 = P0^0;也就是P0口的最低位,这句代码大家可能是初次接触,不怎么好懂,sbit是Keil开发环境中的关键字,是直接用来进行位定义的,它的用法大家参考我后面给出的书籍。这么P0又是怎么来的呢?我们来看下REG52.H这个头文件
REG52.H头文件
在里面是不是看到有关于P0的定义,再看下那个英文单词BYTE Registers字节寄存器,一个字节是多少位?八位。sfr又是怎么回事呢?它的全称是Special Function Register这个是Keil软件规定的用来定义特殊寄存器的,这是规定,大家也没必要了解为什么了,感兴趣的话自行去了解。然后再来看下P0后面的0X80是什么意思?,这个其实就是P0端口的地址,讲到这里大家可能又会问,地址又是怎么回事?这个问题我给大家打个比方,比如说你到宾馆去住宿,你上服务台那边花钱开了一间房,服务员告诉你的房间在112号,这个112号也就是宾馆房间的一个地址,有了这个地址你就可以在你的房间自由进出了,看电视,睡觉等等。如果说没有地址那岂不是乱了套了,大家到处乱走,很容易走错别人的房间。单片机也是如此,有了这个地址我们就可以对它里面的东西进行操作,变换高低电平,读取高低电平,这个地址是怎么来的,从单片机的数据手册上可以找到,这个就不要问为什么了,当初造这块单片机的时候就早已经固定好了。
特殊功能寄存器映像(摘自STC80C52RC数据手册)
大家看下最下面的80h是不是有个P0 .....,功能越强大的单片机,它的寄存器就越多,以至于它们的数据手册写了厚厚的一本书,像STM32、S3C2410大家可以去找它们的数据手册看看。再来看看当中的延时函数,如果我们把它进行拆解,外面一个500次的循环,内部一个114次的循环,500*114我的天呐,500多万次的减法,不停的对其中的数进行减法运算,一直到运算条件不成立为止,也就是CPU每运行一个指令都要花费一点时间,将这些时间全部加起来达到我们需要时间。说道这里,大家是不是感觉太TM浪费了,一个小小的延时,这么占用MCU的资源,以至于如果还有其他的东西需要运行的话都有困难,那有没有别的方法可以将这种方式的延时资源占用释放出来呢?答案肯定是有的,只要大家坚持往下看就会学到自己想学的东西....
六、流水灯实验
流水灯实验原理图
代码1:
/************ (C) COPYRIGHT 2016 wllis ************** * *文件名: Flow_LED.C *描述:LED流水灯实验 *作者: wllis *日期: 2016/01/21 * ****************************************************/
#includetypedefunsignedcharUINT8;
typedefunsignedintUINT16;/* *函数名:void DelayMS( UINT16 n ) *描述:简单的延时 *输入:UINT16 *输出:无 */
voidDelayMS(UINT16n)
{
UINT8a;
while(--n)
{
for(a=114;a>0;a--);
}
}/* *函数名:void main() *描述:主函数 *输入:无 *输出:无 */
voidmain()
{
UINT8i=0;
P0=0XFF;//将P0端口全部初始化为高电平 0XFF化为二进制为 1111 1111while(1)
{
for(i=0;i<8;i++)
{
P0=0XFE;// 1111 1110DelayMS(100);//延时100毫秒P0=0XFD;// 1111 1101DelayMS(100);//延时100毫秒P0=0XFB;// 1111 1011DelayMS(100);//延时100毫秒P0=0XF7;// 1111 0111DelayMS(100);//延时100毫秒P0=0XEF;// 1110 1111DelayMS(100);//延时100毫秒P0=0XDF;// 1101 1111DelayMS(100);//延时100毫秒P0=0XBF;// 1011 1111DelayMS(100);//延时100毫秒P0=0X7F;// 0111 1111DelayMS(100);//延时100毫秒}
}
}
代码2:
/************ (C) COPYRIGHT 2016 wllis ************** * *文件名: Flow_LED.C *描述:LED流水灯实验 *作者: wllis *日期: 2016/01/21 * ****************************************************/
#includetypedefunsignedcharUINT8;
typedefunsignedintUINT16;/* *函数名:void DelayMS( UINT16 n ) *描述:简单的延时 *输入:UINT16 *输出:无 */
voidDelayMS(UINT16n)
{
UINT8a;
while(--n)
{
for(a=114;a>0;a--);
}
}/* *函数名:void main() *描述:主函数 *输入:无 *输出:无 */
voidmain()
{
UINT8i=0;
P0=0XFF;//将P0端口全部初始化为高电平 0XFF化为二进制为 1111 1111while(1)
{
for(i=0;i<8;i++)
{
P0=~(0X01<<i);// 1111 1110DelayMS(100);//延100ms}
}
}
/********************end of file ***********************/
比较一下代码1及代码2,实现的功能是一样的,但是代码2精简了很多,到后面讲到定时器时我还将给大家介绍另外一种实现该功能的代码。
代码分析:
首先将P0全部初始化为高电平,这么做的目的主要是为了方便后面的操作,打个简答的比方,如果我们起跑没有起跑线的话,那么我们在100米赛跑中怎么确定终点线呢,同样在这里我们只有初始化了,后面我们才晓得哪个位为高电平,怎么去操作,以免导致误触发,影响我们想要的结果。这个东西这么做大家现在可能不理解,但是慢慢的随着大家经历的多了,就能理解了。
流水的核心思想就是每个端口开启一段时间的低电平,然后把它关掉,在下一个位开启低电平这么循环操作,从而达到我们想要的效果,我给大家画个框图解释下。代码二用的相当简洁,我们首先来分解下(0X01<<>,变成二进制就是(0000 0001<<>,如果此时i等于0的话,取反后得到1111 1110,赋值给P0端口,P0.0输出低电平,LED1亮,其余全灭;i等于1,则移动一位变成000 0010,取反得到1111 1101,赋值给P0端口,P0.1输出低电平,LED2亮,其余全灭;以此类推,达到我么想要的效果,大家在以后的编程中可充分利用位操作去解决一些问题。
P0端口 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
~(0X01)<
~(0X01)<
~(0X01)<
~(0X01)<
~(0X01)<
~(0X01)<
~(0X01)<
~(0X01)<
标签: #单片机取反指令编程怎么写