打印
[51单片机]

51单片机的Pascal语言编程

[复制链接]
6835|53
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 逍遥派掌门 于 2015-9-23 23:56 编辑

(一) 初识Turbo51


在51单片机的编程语言里,pascal语言虽然属于比较少人使用的一种,但也不乏比较好的编译器,Turbo51就是比较引人注目的一个。

Turbo51的官网是 www.turbo51.com,有关Turbo51的详细信息可从该网站获得。

Turbo51是针对51单片机的编译器,它是可免费使用的(不是开源的),主要特点:



  • Turbo51是W32环境的行编译程序;
  • 包含了快速、优化的编译器;
  • 兼容 Borland Turbo Pascal 7 语法;
  • 支持浮点数运算;
  • 支持pascal语言 和汇编语言的混合编程;
  • 包含了智能化的链接器;
  • 编译后的输出格式有:BIN,HEX,OMF。


相关帖子

沙发
supertankhzt| | 2015-9-24 07:05 | 只看该作者
本人以前也是这样比较偏执,而现在认为钻这些墙缝还不如转语言走大门,更容易搜索资料获得帮助。

使用特权

评论回复
板凳
逍遥派掌门|  楼主 | 2015-9-24 10:32 | 只看该作者
supertankhzt 发表于 2015-9-24 07:05
本人以前也是这样比较偏执,而现在认为钻这些墙缝还不如转语言走大门,更容易搜索资料获得帮助。 ...

能用自己熟悉的语言来解决问题是最好的选择,没有必要什么都去选大路货。

黑猫,白猫,抓到老鼠就是好猫。

使用特权

评论回复
评论
autopccopy 2015-9-24 12:21 回复TA
选非主流的产品可能会遇到各种问题,而且交流和支持的信息都较少。微软的WP手机就是这样的。 
地板
沉思的牛| | 2015-9-24 11:32 | 只看该作者
其实一门语言学好了,学另一种语言是很快的。

使用特权

评论回复
5
autopccopy| | 2015-9-24 12:21 | 只看该作者
选非主流的产品可能会遇到各种问题,而且交流和支持的信息都较少。微软的WP手机就是这样的。

使用特权

评论回复
6
逍遥派掌门|  楼主 | 2015-9-24 16:28 | 只看该作者
autopccopy 发表于 2015-9-24 12:21
选非主流的产品可能会遇到各种问题,而且交流和支持的信息都较少。微软的WP手机就是这样的。 ...

51单片机没有手机那么复杂,估计这个世界上,就51单片机被摸得最透了,技术上的什么问题都没有了。
当年火爆的C51BBS 也因为51到了顶峰而功成身退,C51也就那样了。技术是通用的,语言可以不是唯一的选择。搞搞pas51或许还有点新意。
我们还可以查看生成的汇编代码,验证编译器的效率等,不怕,没有过不了的坑。

使用特权

评论回复
7
逍遥派掌门|  楼主 | 2015-9-25 00:11 | 只看该作者
本帖最后由 逍遥派掌门 于 2015-9-26 22:49 编辑

(二)构建Turbo51的编程环境

       Turbo51仅提供行编译工具,没有提供IDE。所以,想要舒服使用Turbo51,还得找个合适的IDE。

       在Turbo51的网站上(http://turbo51.com/8051-editor-ide),提供了几种构建的选择:
         1、通用的编辑器
              如 Code Blocks  ,PSPad  等。
              这类编辑器需要用户自己设置编译的参数,对用户的要求比较高,不太适合初学者。
         2、专门为Turbo51度身打造的IDE
               (1)MC-51
               (2)Turbo51 Studio
              这类IDE将编译的参数等设置好,用户直接一键编译,很方便;而且带有模拟器,方便程序的调试、跟踪。
             不论是初学者,还是有经验的老手,均能快速上手。

         (1)
         MC-51的下载链接: http://www.ieap.uni-kiel.de/?sur ... e/fpmc/index-e.html         
         我们从下面的图片、窥视MC-51:



       (2)
           Turbo51 Studio 的网站:   http://turbo51studio.orgfree.com
           下面是Turbo51 Studio 的运行界面

*****************************************************
        总结:
                 <1> 从界面的易用性看,MC-51更胜一筹;
                 <2> Turbo51 Studio 缺乏直观的编译后的提示,编译时一闪而过,无法看清什么信息;
                         而这方面,MC-51做得不错,编译后的信息基本显示出来了 。
                 <3> Turbo51 Studio 示波器控件,串口控件很有吸引力,这也是比MC-51做得好的地方。
                         试用了一下示波器控件,遗憾地发现:Turbo51 Studio 竟然死机了,看来还没有到可以使用的地步。
                <4> 在模拟器跟踪调试的界面上,MC-51做得比较好,大方得体,信息一目了然;
                        Turbo51 Studio 的显示字体太小,而且无法改动,让人失去兴趣。
                <5> MC-51 和 Turbo51 Studio 都提供了针对ATmel 单片机的ISP下载程序,这个对国外的用户或者有用;
                        对国内的用户来说,则是不必要了 ,因为我们有STC单片机,直接串口下载程序,完爆ATmel单片机。

       通过分析、比较,结论是:最合适的IDE仍属MC-51 。

使用特权

评论回复
8
逍遥派掌门|  楼主 | 2015-9-26 22:45 | 只看该作者
本帖最后由 逍遥派掌门 于 2015-9-26 22:52 编辑

(三) Turbo51 的语法
      有了MC-51这类IDE,我们不再需要花太多的精力去研究编译器的参数等问题,进而将注意力放在Turbo51的编程应用上。

      说到编程,不得不说语法的问题。在语法方面,Turbo51使用Borland Turbo Pascal 7的大部分语法,其中包括了OOP
并针对8051系列的单片机(MCS-51)的特性,增加了一些特定的指令和数据结构。Borland Turbo Pascal 7的语法手册,对
Turbo51也能起到帮助的作用。是不是可以说,学习Turbo51,有助于学习Borland Turbo Pascal ?

     下面是Turbo51所支持的保留字和特定指令:

     1、Turbo51的保留字(这部分和Borland Turbo Pascal 7是一致的)

         AND, ARRAY, ASM, BEGIN, CASE, CONST, CONSTRUCTOR, DESTRUCTOR, DIV, DO, DOWNTO, ELSE, END, FILE,
         FOR, FUNCTION, GOTO, IF, IMPLEMENTATION, IN, INHERITED, INTERFACE, LABEL, MOD, NIL, NOT, OBJECT, OF,
        OR, PACKED, PROCEDURE, PROGRAM, RECORD, REPEAT, SET, SHL, SHR, STRING, THEN, TO, TYPE, UNIT, UNTIL,
        USES, VAR, WHILE, WITH, XOR


    2、针对51单片机的特定指令

       ABSOLUTE, ASSEMBLER, BITADDRESSABLE, CODE, DATA, EXTERNAL, FORWARD, IDATA, INLINE, INTERRUPT,
      PRIVATE, PUBLIC, REENTRANT, USING, USINGANY, VIRTUAL, VOLATILE, XDATA

使用特权

评论回复
9
逍遥派掌门|  楼主 | 2015-10-6 16:06 | 只看该作者
本帖最后由 逍遥派掌门 于 2015-10-6 16:08 编辑

(四) 探索MC-51

市场上常见的51单片机,都是基于8031,然后扩展了某些特定的功能。

      在MC-51里面也体现了这种特征。

      我们来看看MC-51的目录结构:

      

      里面有两个需要着重研究的目录:Turbo-51  和 Units 。

      在 Turbo-51 的目录里,还有3个子目录:bin, manual,rtl 。

           目录 manual里有2个PDF文件,是Turbo51的说明文档,一个是英文版的,一个是德文版的。阅读这里的文档,可以
           深入了解Turbo51。强力推荐阅读。

           目录bin里,有Turbo51的编译器,和2个库文件,这2个库文件被编译成二进制文件,实际就是8031的基础库文件。
           可以简单理解为: Turbo51.l51 是给大、中型程序用的;Turbo51A.l51 是给小型程序用的。
           由于已经编译成二进制文件,因此它们是不可编辑的。 它们会被编译器调用。库文件的内容,可以浏览:
           http://turbo51.com/documentation/8051-pascal-system-unit

          目录rtl 里, 是8032的扩展库文件 I8032,这个库文件可以根据需要进行修改。

      Units 的目录里,都是 Sys_xxxx.pas 格式的文件,很显然是各种类型的51单片机的扩展库文件:

      
               
            这些库文件是可编辑的,可以根据硬件的需要进行修改,也可以参照其中文件的格式增加新的单片机种类。

          库文件里,是中断向量地址,特殊功能寄存器,位地址等定义。

使用特权

评论回复
10
逍遥派掌门|  楼主 | 2015-10-8 21:50 | 只看该作者
本帖最后由 逍遥派掌门 于 2015-10-8 21:58 编辑

(五)第一个程序

      在高级语言里,“Hello world"是经典的第一个程序;在与硬件密切相关的嵌入式编程里,点亮LED灯则更具有代表性。
下面的代码实现一个LED灯的明、暗循环,例子使用了状态机:
Program led_test;

const
   flash_time_limit_1=$A0;
   flash_time_limit_2=$FF;

var
  count : byte;
  LED_bit : Boolean absolute P1.1;      // 设置LED接到P1.1脚上
  flash_status : byte;  
  flash_delay_1,flash_delay_2,flash_delay_3 : byte;
   
begin
   flash_status := 0;
  
  repeat

    case flash_status of
    0:
      begin
          LED_bit := not LED_bit;          // 明、暗的转换
         flash_delay_1 := flash_time_limit_1;
         Inc(flash_status);      
     end;
   1:
     begin
         if (flash_delay_1 > 0) then
         begin
            Dec(flash_delay_1);         
         end
         else begin
                  flash_delay_2 := flash_time_limit_2;
                  Inc(flash_status);
               end;
     end;
   2:
    begin
        if (flash_delay_2 > 0) then
        begin
            Dec(flash_delay_2);
        end
        else begin
                  flash_status := 0;    // 重新开始
               end;
     end;
   end;

  until False;  
  
end.

编译成功:

使用特权

评论回复
11
逍遥派掌门|  楼主 | 2015-10-13 23:59 | 只看该作者
(六)验证第一个程序
       前面的列举的一个LED的例子,现在我们来验证那个例子的代码是否正确。

      首先,我们选用 PROTEUS 来搭建虚拟的模拟电路,电路图见图1:


                                         图1

     接着,设置MCU的参数,主要是目标文件的选择和时钟频率是设置,为配合前面的例子,
特意将时钟频率设置为100KHz,见图2:



                                        图2



  最后就是进行模拟了。 图3是亮灯状态,图4是灭灯状态。



                                       图3



                                       图4

     从模拟的效果来看,达到了LED灯明、暗循环的效果。因此可以说,前面例子的代码是正确的。

使用特权

评论回复
12
ningling_21| | 2015-10-14 08:27 | 只看该作者
51再专门搞一个语言,有点繁琐

使用特权

评论回复
评论
逍遥派掌门 2015-10-14 14:41 回复TA
百花齐放,才会有欣欣向荣。 
13
逍遥派掌门|  楼主 | 2015-10-14 22:00 | 只看该作者
(七) 晒应用的图片

1、这个彩色LCD用STC单片机控制的。


  2、手工焊接的STC单片机板


3、双电路板组合工作,STC 和 Atmel 的MCU

使用特权

评论回复
14
逍遥派掌门|  楼主 | 2015-10-19 22:25 | 只看该作者
(八) 51单片机端的串行通信代码
   
    在不同设备上进行数据交换,最价廉物美的莫过于串行通信(RS232)了,有关串行通信的点滴可自行去百度搜索。

    在以下的篇幅里,展示51单片机如何与计算机进行通信,本节解析51单片机的Turbo51代码

    先上51单片机的硬件电路图:


    在通信之前,必须约定一个握手的协议,以保证通信的正确无误。此工作非常重要。

    通信协议可采用各种流行的协议,也可以自行约定。为了简化代码,自设定如下的通信协议:

    1、  上位机 ==> 单片机  
      格式:  起始字  + 单片机地址  +  命令  +  校验
              1byte       1byte        1byte    1byte     =  4 byte
         
      其中:
           起始字,固定为:     $7E
           单片机地址,固定为: $01
           命令,控制单片机的动作:
                   = $00     同时灭两个LED
                   = $01     亮绿色LED,灭蓝色LED
                   = $02     灭绿色LED,亮蓝色LED
                   = $03     同时亮两个LED
           校验,为前面3个字节的累加和

    2、  单片机 ==> 上位机   
      格式:  起始字  + 单片机地址  +  命令  +  参数  +  校验
              1byte       1byte        1byte    1byte    1byte    =  5 byte
              
      其中:
           起始字,固定为:     $7E
           单片机地址,固定为: $01
           命令,来自计算机端:
                   = $00     同时灭两个LED
                   = $01     亮绿色LED,灭蓝色LED
                   = $02     灭绿色LED,亮蓝色LED
                   = $03     同时亮两个LED
           参数,将当前单片机的控制状态反馈给计算机
                   = $00     两个LED都灭
                   = $01     绿色LED亮,蓝色LED灭
                   = $02     绿色LED灭,蓝色LED亮
                   = $03     两个LED都亮
           校验, 为前面4个字节的累加和
   
   

使用特权

评论回复
15
逍遥派掌门|  楼主 | 2015-10-19 22:27 | 只看该作者
//定义用到的常量
Const 
      BaudRate            = 9600;           {通信用的波特率}
      Header                = $7E;             {起始字}
      Address               = $01;             {单片机地址}
      TX_Length          = 5 ;                 {按照协议,发送的字节数}
      RX_Length          = 4 ;                {按照协议,接收的字节数}         
      Port_Mask           = $03;              {这里与LED有关}

//定义用到的变量
var
      Port_Get : byte absolute P1;         
      LED_green: Boolean absolute P1.0;
      LED_blue : Boolean absolute P1.1;
      
      RX_Buffer: Array [1..RX_Length] of Byte;    {接收缓冲区}
      RX_Count : Byte;                           
      TX_Buffer: Array [1..TX_Length] of Byte;    {发送缓冲区}
      TX_Count : Byte;
      RX_right : Boolean;
      TX_right : Boolean;
      TX_Need  : Boolean;

使用特权

评论回复
16
cvlsam| | 2015-10-27 11:00 | 只看该作者
在lazarus中的中文论坛上已经看过了。

使用特权

评论回复
评论
逍遥派掌门 2015-10-29 10:54 回复TA
是的。因为是低层方面的东西,更适合这里。 
17
cuya| | 2015-10-27 11:02 | 只看该作者
51单片机的Pascal语言编程, 好奇者的玩具而已。如果真的要玩,还是 PC 更适合 Pascal.

使用特权

评论回复
评论
逍遥派掌门 2015-10-29 11:00 回复TA
好奇者是玩不动这个“玩具”滴。 
18
逍遥派掌门|  楼主 | 2015-10-29 10:57 | 只看该作者
51单片机的接收和发送都进入同一个串行中断,而且是接收或发送一个字节就产生一个中断,故此,关键的串行中断代码如下:
Procedure RS232; Interrupt Serial;
begin
    If (RI = True) then          {接收中断}
    begin
       RI := False;
       if (RX_right = False) then
       begin
           RX_Buffer[RX_Count] := SBUF;       {接收字节}
          inc(RX_Count);
          if (RX_Count > RX_Length) then  RX_right := True;   {判断是否接收完毕}
      end;
  end;

  If (TI =True) then          {发送中断}
  begin
     TI := False;
     if  (TX_right = False) then
    begin
        if TX_Count < (TX_Length + 1) then    {判断是否已经发送完毕}
       begin
          SBUF := TX_Buffer [TX_Count];       {发送字节}
          Inc (TX_Count);
      end
      else  TX_right := True;
    end;
end;

end;


使用特权

评论回复
19
大道至简| | 2015-10-29 14:38 | 只看该作者
做这个编译器的能够取得市场成功吗? 没有的话,他终归是做不好的

使用特权

评论回复
评论
逍遥派掌门 2015-10-30 10:17 回复TA
术业有专攻,没有必要强求人家搞技术的去弄市场。 
逍遥派掌门 2015-10-30 10:15 回复TA
市场是否成功,和他做不做得好,完全是两码事,8杆子打不到一起。 编译器做得好不好是搞技术的人来决定; 市场做不做得好,是销售的人来决定 
20
linqing171| | 2015-10-30 14:06 | 只看该作者
哎,delphi 都没有人用了,还有人在玩pascal. 转眼离最后一个delphi项目过去了6年了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

528

帖子

2

粉丝