您的位置:首页 > 编程语言 > C语言/C++

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

2020-01-11 07:28 302 查看

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

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

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

 

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

 

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

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

 

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

 

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

 

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

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

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

      

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

 

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

    

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

 

     

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

 

单片机点亮发光二极管

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

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
[code]#include<reg51.h>
voidmain()
{
while(1)
{
P1=1;
}
}

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

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

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

 

单片机让发光二极管闪烁

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

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
[code]#include<reg51.h>
voiddelay(intn)
{
inti=0;
intj=0;
for(i=n;i>0;i--)
{
for(j=110;j>0;j--)
{
;
}
}
}
voidmain()
{
P1=1;
while(1)
{
P1=1-P1;
delay(1000);
}
}


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

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

   

单片机让流水灯跑起来

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

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
[code]#include<reg51.h>
voiddelay(intn)
{
inti=0;
intj=0;
for(i=n;i>0;i--)
{
for(j=110;j>0;j--)
{
;
}
}
}
inta[8]={1,2,4,8,16,32,64,128};
voidmain()
{
inti=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(OperatingSystem),来看看下图:

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

 

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

 

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

 

    阅读本文的所有朋友,肯定用过软件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语言简介

 

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

 

 

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

 

 

    

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

 

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

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

  • 点赞 2
  • 收藏
  • 分享
  • 文章举报
stpeace 博客专家 发布了2203篇原创文章·获赞4500·访问量1931万+ 他的留言板 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐