单片机流水灯的proteus仿真及C语言简介

     原文发表于我的微信公众号"涛歌依旧",可以点击如下红色文字链接阅读:

  单片机流水灯的proteus仿真及C语言简介(链接)
 
     

     从微信公众号把原文直接复制过来,内容如下(图片和表格可能丢失,格式可能错乱,故建议直接点击上述红色链接阅读):

      明天就是元旦了,老板让我们提前下班跑路,挺好的。

      年末感言,新年展望,也没啥可说的。

      喜欢曾国藩的名言:物来顺应,未来不迎,当时不杂,既过不恋。

      来说正事。在前面的文章中,我们已经对CPU和汇编语言有了基本的认识。以8086CPU为例,它只是一个微处理器,并不能存储程序(没ROM没RAM):

      那么,有没有一款芯片能把CPU和ROM/RAM全部集成在一起呢?当然有,这些东西集成在一起后,就是一台完整意义的计算机了,单片机就是这样的。关于单片机的历史,我们就不过多讲述了,单片机本质上就是计算机。

单片机与我的工作无关,偶尔玩下而已

      虽然,我的工作与单片机硬件软件完全无关,却喜欢偶尔搞下这些玩意儿,体会下程序直接(无操作系统)运行在硬件上的感觉。

      下图是我曾经的单片机,其型号是STC89C52,有点爱不释手的感觉,每次整理房间都要去擦擦它的灰尘,然后观摩一番:

          

      下图是我曾经的单片机开发板,好久不玩这些东西了:

       Keil公司在2005年被ARM公司收购,其Keil软件,真是业界良心之作,各种调试工具很齐全,它可以把C语言程序编译为hex文件:

      

       Lab Center Electronics公司,居然做出了proteus这么好的软件,可以仿真和调试单片机。用Keil软件生成hex文件后,直接导入到单片机中。注意:8051单片机是一个系列,包括很多型号,比如上面提到的STC89C52,比如下面的AT89C51:

        

       在之前的文章中,我们学习了汇编语言,也体会到了汇编语言编程的缺点。所以,用高级语言(比如C语言)是势在必行的。

单片机点亮发光二极管

       下面,我们用C语言编写程序,来控制8051单片机。先来看如何用单片机点亮一个发光二极管,C语言程序如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#include<reg51.h>
void main(){    while(1)    {        P1 = 1;    }}

      这个C语言程序很好理解,不需要过多解释。       

     用Keil软件编译后,生成hex文件,然后塞入到如下的单片机中,proteus仿真结果如下:

      D1的右端被程序设置为高电平,而左边是低电平,D1自然就亮了。用单片机点亮一个发光二极管,是学习单片机的起点。

单片机让发光二极管闪烁

      我们来写C语言程序,让发光二极管闪烁起来,程序如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#include<reg51.h>
void delay(int n){    int i = 0;    int j = 0;    for(i = n; i > 0; i--)     {        for(j = 110; j > 0; j--)          {                ;          }      }}
void main(){      P1 = 1;    while(1)      {            P1 = 1 - P1;            delay(1000);      }} 

       delay函数的作用是延时,  main函数中 P1 = 1 - P1 的作用是让D1右边的电平在0和1这两个值中轮流变化。      

       用Keil编译上述程序,生成hex文件,塞到如下的单片机中。显然,由于P1循环地在0和1这两个值中轮流变化,所以发光二极管会闪烁:

    

单片机让流水灯跑起来

      下面,我们来玩更多的花样, 让一系列的发光二极管循环亮起来,也就是所谓的流水灯,大家在街道上应该见过。元旦节假日,街头流水灯多得很,可以去看看。来看看实现流水灯的C语言程序:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#include<reg51.h>
void delay(int n){    int i = 0;    int j = 0;    for(i = n; i > 0; i--)    {        for(j = 110; j > 0; j--)        {            ;        }    }}
int a[8] = {1, 2, 4, 8, 16, 32, 64, 128};
void main(){    int i = 0;    P1 = 1;    while(1)    {        P1 = a[i++];        delay(1000);              if(i == 8)        {            i = 0;        }    }}

      delay函数是为了延时, while中那段代码是为了让8个发光二极管循环亮,这应该很好理解。

      我们用Keil软件编译上述C语言程序,生成hex文件,然后塞入到如下的单片机中,proteus的仿真结果如下:

       我们已经写了流水灯的C语言程序,下面,我们来看看其对应的机器语言程序(以十六进制显示)和汇编语言程序:

      看了这幅图,我们再次见识了天书般的机器语言,也看到了汇编语言的冗杂和繁琐。熟悉了C语言的朋友,再也不想回到汇编语言了,更不用说机器语言了,更更更不用说去掰弄开关了。

      再来说单片机,它可不止点亮发光二极管这点作用,事实上,在很多电器和电子设备中,都有单片机的身影,比如:

       曾经,听某师兄对某师弟说,单片机这种板级开发太简单了,应该多去搞搞其它的东西。当时还不太懂这话的意思,现在算是理解师兄的用意了。

操作系统很重要

       我们用Keil编译C语言程序,生成了hex文件,导入到单片机后,在单片机中是机器语言程序,直接运行在硬件上。

      如果总是在这么底层的硬件细节上折腾,那就很累很低效。一个程序员,如果天天去操心硬件层面的东西,那就很傻很天真。这个世界需要操作系统OS(Operating System),来看看下图:

       操作系统对计算硬件进行管理和抽象,它是一种最重要最基础的软件。对于应用软件开发者和普通用户而言,再也不需要去操心硬件细节了,操作系统的这层抽象,真是太重要了。

       很多朋友最开始接触的操作系统是Windows, 那些美妙的图形,就是GUI(Graphical User Interface).

       很多朋友都用过Linux操作系统,肯定知道命令行,这就是CLI(Command Line Interface)

       阅读本文的所有朋友,肯定用过软件APP(Application),  这些APP是怎样开发出来的呢?它是软件开发人员调用操作系统的API来完成的。

       

       我们常见的Windows, Mac是常用的桌面电脑操作系统,Linux是常用的服务器操作系统, 而iOS, Android是常用的手机操作系统。对了,华为的鸿蒙操作系统(HarmonyOS)也呼之欲出, 期待ing. 操作系统动辄就有上亿行程序,再看看我们的流水灯那几行简单的程序,简直不值一提。

       我们后面会多次再聊操作系统,故暂且不表。

       有了操作系统后,我们几乎所有的操作,都是在操作系统的基础上进行的。我们写C语言程序,最后编译为可执行程序,被操作系统执行(当然,操作系统最终还是被硬件执行)。

       操作系统的出现,实现了计算机历史上最广泛、最深刻的变革。自从有了操作系统,程序员的面貌和处境也焕然一新

玩C语言的那些经历

       C语言是一门很重要但不难的计算机语言(我不想轻狂地说它简单),以前在TC中玩C语言(我是不是暴露年龄了呢)

       后来在VC++6.0中玩C语言:

       后来在Linux中玩C语言(编译器是gcc):

        

       用C语言计算1+2+3+...+100, 程序和结果如下:

       

       对于计算机编程的初学者,我个人建议把C语言作为第一门计算机语言。C语言很重要,学好C语言后,其它语言几乎就是一通百通了。

       自从体会到了C语言的好处后,我们再也不想掰弄开关或者使用机器语言和汇编语言了。从此,我们站到了更高的层次和更高的抽象度上,思维集中在问题域,而非机器域。

       到此为止,本文快接近尾声了,其内容还是相对简单的。让我们停下脚步思考一下:

       为了了解计算机历史,我们一起探讨了:

       古今计算机发展简史(链接)

       为了理解计算机的工作原理,我们又探讨了:

       编码的本质及计算机的工作原理(链接)

        

      为了弄清计算机底层究竟是如何实现的,我们以加法操作为例,探讨了:

      计算机加法的电路原理及proteus仿真(链接)

    

       为了深入理解计算机的硬件结构,并弄懂编程究竟是怎么回事,我们又探讨了:

      “冯诺依曼结构”计算机的proteus仿真及编程的初体验(链接)

        

       为了理解计算机存储器的基本原理,我们又探讨了:

       计算机存储器简介(链接)

       为了深入理解计算机CPU内部的工作原理,并入门汇编语言,我们又探讨了:

       计算机CPU工作原理及汇编语言简介(链接)

       

        终于,我们讲到了本文的内容:

        单片机流水灯的proteus仿真及C语言简介

       至此,我们应该算是基本入门计算机了(也仅仅是入门),对计算机的底层原理有了初步的了解。

       未来,我们会继续探讨一些计算机底层硬件相关的知识,但会把更多的精力放在自由度更高的计算机软件领域,比如:操作系统层、中间件层、应用软件层,也会介绍贯穿在其中的计算机通用理论(如数据结构、算法等) ,这是一个包罗万象的范畴,因此,不一定按照bottom up的方式来写。

      

        今天是2019年的最后一天了,先聊到这里,要去吃饭了

        2019年,生活,工作,学习,都满意。

        2020年,生活,工作,学习,会更好。

发布了2213 篇原创文章 · 获赞 4564 · 访问量 1977万+

猜你喜欢

转载自blog.csdn.net/stpeace/article/details/103898605