登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] C语言结束,转战单片机

[复制链接]
发表于 2018-2-11 23:00:09 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 51单片机的应用
学习安排: 以两天一章节的速度推进,在开学前将单片机的基础学完并利用单片机作出我的作品
开始时间: 2018-02-11
结束时间:
本帖最后由 Posion 于 2018-2-26 22:25 编辑

  单片机开发板镇贴 IMG_20180211_215650.jpg

    最近有点懒,其它的事也比较多,所以大概有一个星期没发贴了,但并不代表我这一周没有学习
    今天来电开社区转了转,发现我们这一届都很积极的在学习和发表自己的寒假笔记,以我现在拿的这本书来看的话,一些大神已经把我这本书的四分之三学过了,这样看来我必须要加快进度了。我们寒假笔记也正是起了这样一个互相激励,互相学习的作用吧。
    C语言的那本书基本上是看完了,后面指针和结构体共用体之类的没有细看,打算学单片机的时候用到了再学。但是前面C语言学习的深度也仅仅停留在书本上的习题和例题,一些复杂的程序我还是避免不了犯错。学习单片机的过程也算是对C语言的再次学习与巩固吧。


上学期的设计大赛的时候我就已经学了部分单片机的基础,不过隔了一两个月又忘了差不多了,前两天把之前看过的复习了一遍,这两天主要学了数码管,定时器以及中断的应用,今天就先总结一下这里的东西

数码管这东西我们在之前的电开作业里就用到过,那时是用一个HC138译码器来控制数码管的显示的,而有了单片机之后,可以把数码管的八个脚通过一个HC245直接接单片机的八个脚,使单片机可以分别控制。而245芯片的作用是缓冲电流,保护单片机。利用16进制得出的数码管真值表 IMG_20180211_222539.jpg (这是数码管接在P0口上的,我们的单片机是在P2上的)。
利用数组储存起来可以更加方便的运用———》》》
unsigned char code LedChar[]={
        2xC0,2xF9,2xA4,2xB0,2x99,2x92,2x82,2xF8,2x80,2x90,2x88,2x83,2xC6,2xA1,2x86,2x8E
}

使用定时器的几个步骤如图 IMG_20180211_223650.jpg
有关定时器,寄存器的有关信息 IMG_20180211_224200.jpg

利用数码管做一个计时器的原理看似简单,但实际上会出现很多问题,若用下面的程序————》》
,会出现所谓的“鬼影”,
#include<reg52.h>
#include <STC12C5A60S2.h>

sbit ADDR0=P2^0;
sbit ADDR1=P2^1;
sbit ADDR2=P2^2;

unsigned char code LedChar[]={
        2xC0,2xF9,2xA4,2xB0,2x99,2x92,2x82,2xF8,2x80,2x90,2x88,2x83,2xC6,2xA1,2x86,2x8E
};
unsigned char LedBuff[6]={
        2xFF,2xFF,2xFF,2xFF,2xFF,2xFF,2xFF
};
void main()
{
        unsigned char i=0;      
        unsigned int cnt=0;
        unsigned long sec=0;

        TMOD=0x01;
        TH0=0xFC;
        TL0=0x67;
        TR0=1;

        while(1)
        {
                if(TF0==1)
                {
                        TF0=0;
                        TH0=0xFC;
                        TL0=0x67;
                        cnt++;
                        if(cnt>=1000)
                        {
                                cnt=0;
                                sec++;


                                LedBuff[0]=LedChar[sec%10];
                                LedBuff[1]=        LedChar[sec/10%10];
                                LedBuff[2]=        LedChar[sec/100%10];
                                LedBuff[3]=        LedChar[sec/1000%10];
                                LedBuff[4]=LedChar[sec/10000%10];
                         LedBuff[5]=        LedChar[sec/100000%10];
                        }
                        if(i==0)
                        {ADDR2=0;ADDR1=0;ADDR0=0;i++0=LedBuff[0];}
                        else if(i==1)
                                {ADDR2=0;ADDR1=0;ADDR0=1;i++0=LedBuff[1];}
                        else if(i==2)
                                {ADDR2=0;ADDR1=1;ADDR0=0;i++0=LedBuff[2];}
                        else if(i==3)
                                {ADDR2=0;ADDR1=1;ADDR0=1;i++0=LedBuff[3];}
                        else if(i==4)
                                {ADDR2=1;ADDR1=0;ADDR0=0;i++0=LedBuff[4];}
                        else if(i==5)
                                {ADDR2=1;ADDR1=0;ADDR0=1;i++0=LedBuff[5];}
                        }
                }
        }
                取消这个鬼影的方法还算简单,只用把最后负责数码管动态扫描的if else语句改为switch case语句后在switch之前加上2xFF,及让所有的数码管先熄灭就行。

但是数码管抖动就需要用到中断的方法去处理了。
》》》》》》》》》》》》》》》》敲了一小时才敲了这么点字,今天太晚就先到这,明天再补上》》》》》》》》》》》》》》》》》》》》》》》》》》》》
更新
单片机的中断
抄一段网上对于中断的说法
中断是什么?说白一点就是,比如你正在家里看电视,然后准备用电磁炉煮水来喝茶。水还没有开的时候当然你还在看电视对不对,等到水开了,当然一般水开了都会有个信号让你知道,那么你就要想着要关掉电磁炉。这个关掉电磁炉的动作就是所谓的中断。而关掉电磁炉之后你进而就要喝茶,然后在看电视或者做其它事情,那么中断以后的这个过程就是我们上面问题的第三点:你希望在中断之后干什么?
我觉得这个解释很容易看懂中断到底是什么这个问题。
而数据手册的解释是这样的 Y@C$HPJ]061R@2[GJBO8FYF.png
标准的51单片机中断控制寄存器有两个,中断使能寄存器和中断优先寄存器

书上的一些数据。 IMG_20180226_215656.jpg
而中断还是应用最重要,一般都是通过定义一个中断函数去实现中断的功能的。例如在定时器的中断函数中
void InterruptTimer0() interrupt1
{
}
interrupt1是关键字,不能随意更改,前面的函数名可以替换,而中断是怎样触发的呢,就用到下表的东西了。
IMG_20180226_220746.jpg
例如要用T0中断的话,现将终端是能位ET0置1,当后面它的标志位TF0变为1时 ,T0中断便触发了,随后便开始执行中断函数。


好懒~~不想说~~~
 楼主| 发表于 2018-2-26 23:36:41 | 显示全部楼层
    当时写C语言程序的时候,有很多错误都是由变量的范围和属性造成的,这本单片机书的这一章开头正好有介绍了C语言中变量的一些知识,看了之后我对全局变量和局部变量有了更深的了解,其中全局变量虽然方便但有很多的缺点,所以在编程上应尽量减少全局变量的使用,能用局部变量代替的就不用全局变量。而变量又分为静态变量和动态变量,动态变量的auto关键字一般可以省略,但如果想用静态变量,statis这个关键字就必须要加上了。这个变量的好处就是在多次执行某一函数的过程中,他的值都是上一次函数执行结束之后的值,即他可以保持前次的执行结果。



好懒~~不想说~~~
 楼主| 发表于 2018-2-27 21:58:10 | 显示全部楼层
点阵LED
因为我买的点阵led还没到货(不得不吐槽一下春节的快递)所以我就先简单看了看关于点阵led的一些知识点,等点阵led到了之后再打程序实验。
一个8*8的点阵led电路图,
1-14031F05541a7.png
就像这个电路图一样,点阵led的原理其实和数码管差不多,就是程序有些复杂,还要用到一些软件去提取汉字或图案。刚开始我看到这个图的时候,以为要用到单片机的十六个引脚,然后每两个引脚组合控制一个灯的亮灭,这种方法控制8*8的可能还可以,但生活中我们见到的大多数都是比16*16还要大的,因为16*16才能最基础的显示出一个汉字,这时的单片机引脚就明显不够用了。所以控制点阵LED可以像控制数码管一样,把八个一排的LED当作一个数码管,还利用人的视觉暂留,循环点亮每一排LED,这样便可以实现用少数的数码管去控制16*16乃至更大的点阵LED了。
和数码管有其真值表一样,每个汉字或图形也可以有自己的真值表,自己一个个去算肯定是不可能的,寒假包里就有几个软件可以迅速提取出汉字或图形在点阵中的值了 8)UWZBEDK}QLSOQ`A`2%G}R.png 个人觉得这个比较好用,而且之后做lcd也能用。


好懒~~不想说~~~
 楼主| 发表于 2018-2-27 22:29:15 | 显示全部楼层
emmmmm,这个和单片机无关前一段时间学单片机学到想吐,看到网上有大神用python做出了跳一跳的外挂,感觉甚是神奇,照着他的教程,花了将近两个小时,一个从没接触过python的我在连上手机之后跳一跳果然自己跳了起来,怀着欣喜又激动的心情看着手机上几乎每次都落到中间的小东西,我不禁对python这个神奇的语言提起了兴趣。 Screenshot_2018-02-27-22-14-05.png (刚刚又试了试那个程序,随手一跳就是九百多,可能是这一次更新的缘故,微信居然能检测出我开挂了
今天闲来无事,又看了看有关Python这个语言,摘录出了Python的十大优点。
    ⑴作为初学python的科班出身的小白,python非常简单,非常适合人类阅读。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。
  ⑵易学。python虽然是用c语言写的,但是它摈弃了c中非常复杂的指针,简化了python的语法。
  ⑶Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。Python希望看到一个更加优秀的人创造并经常改进。
  ⑷可移植性————由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就可以在下述任何平台上面运行。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台!
   ⑸在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。
   ⑹Python既支持面向过程的函数编程也支持面向对象的抽象编程。在面向过程的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在面向对象的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。
   ⑺ 可扩展性和可嵌入性。如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。
  ⑻丰富的库。Python标准库确实很庞大。python有可定义的第三方库可以使用。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。
   ⑼ Python确实是一种十分精彩又强大的语言。它合理地结合了高性能与使得编写程序简单有趣的特色。
   ⑽规范的代码。Python采用强制缩进的方式使得代码具有极佳的可读性。
这门语言和我刚刚学了个皮毛的C语言有很大的不同,它可以做很多C语言做不到的事情,所以我有打起了学习python的计划(算了还是先把单片机学完再说吧)。
最后附上那个神奇的网址,有兴趣的可以自己去玩玩http://blog.csdn.net/LittleBeautiful/article/details/78955792

好懒~~不想说~~~
 楼主| 发表于 2018-2-28 18:24:24 | 显示全部楼层
C语言的位操作在学习循环点亮LED的时候,就用过取反~和移位<<这两个位操作,今天在看步进电机的程序时又发现了&和|这两个操作,刚看到的时候感觉很蒙,感觉这操作也太神奇了吧,就这样简单的控制了单片机四个IO口,于是便索性直接把位操作学了一遍,看完之后感觉位操作很简单,处理二进制的代码也很简洁。我做了如下笔记 IMG_20180228_182252.jpg
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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