[51单片机] 51单片机的Pascal语言编程

[复制链接]
7814|53
 楼主| 逍遥派掌门 发表于 2015-11-2 00:46 | 显示全部楼层
//处理接收到的数据
  1. Procedure Do_receive;
  2. var
  3.    number   : byte;
  4.    checksum : byte;
  5. begin
  6.   if (RX_right = True) then
  7.   begin
  8.     if ((RX_Buffer[1] = Header) and (RX_Buffer[2] = Address)) then                  {判断是否合法}
  9.     begin
  10.       checksum := 0;
  11.       for number := 1 to (RX_Length-1) do checksum:= checksum + RX_buffer[number];   {计算校验和}
  12.       if (checksum = RX_buffer[RX_Length]) then                                      {校验通过}
  13.       begin
  14.         case  RX_buffer[3] of     {判断命令}
  15.           $01:                    
  16.               begin
  17.                 LED_green := False;     {亮绿色LED}
  18.                 LED_blue  := True;      {灭蓝色LED}
  19.               end;
  20.           $02:
  21.               begin
  22.                 LED_green := True;     {灭绿色LED}
  23.                 LED_blue  := False;    {亮蓝色LED}
  24.               end;  
  25.           $03:
  26.               begin
  27.                 LED_green := False;   {亮绿色LED}
  28.                 LED_blue  := False;   {亮蓝色LED}
  29.               end;  
  30.           $00:
  31.               begin
  32.                 LED_green := True;     {灭绿色LED}
  33.                 LED_blue  := True;     {灭蓝色LED}
  34.               end;        
  35.         end;
  36.         TX_Buffer[3] := RX_buffer[3];
  37.         TX_Need := True;                           {发送应答}
  38.         TX_Buffer[4] := (not Port_Get) and Port_Mask;    { 获取LED控制脚的状态}
  39.       end;           
  40.     end;

  41.     RX_Count := 1;         
  42.     RX_right := False;         
  43.   end;  
  44. end;


大道至简 发表于 2015-11-3 10:59 | 显示全部楼层
逍遥派掌门“:
没有收入,研发还能保持持续的兴趣的耐力,是小概率事件
 楼主| 逍遥派掌门 发表于 2015-11-3 16:40 | 显示全部楼层


既然大道至简版主对Turbo51的研发和收入感兴趣,那就多聊几句吧。

1、Turbo51的作者不是天朝人,所以,事情可能和版主的意识有出入。

2、作者是在工作中感觉有自己做Turbo51的需求,所以动手做了。他并没有交代是否全职搞Turbo51,纯业余搞也是可能的,这样的话,他无须担忧衣食。

3、作者的持续兴趣还真是挺令人佩服的,从2000年开始做,到2013年仍更新版本。这种持续,版主认为如何?

4、在我开了这个帖子的时候,就有人说既有优秀的C编译器了,根本不需要玩具的Turbo51。对于这个问题,在作者的网站里已经明确说了,现贴出来:

  Since there many excellent C compilers for 8051 you might ask why Pascal ?    I just like it.


5、从作者的网站来看,他似乎真的不是很在乎赢利,原因一是软件是免费使用的,原因二,他说了一句话:

  I am very happy to see that Pascal programming language is still alive and has many users.


     那是一种情结,以及心灵的享受,超脱于金钱的世俗。

6、当然,作者也不拒绝善意的收入,甚至提供了捐赠的帐号。相信他并不能从中发财。

基于个人兴趣爱好的事情,完全可能持续长久,相信每个人都有那么一点。
大道至简 发表于 2015-11-4 10:30 | 显示全部楼层
好吧,这种大侠是要敬佩的
hdwgt 发表于 2015-11-5 18:33 来自手机 | 显示全部楼层
确实不错。可惜停止更新了!
 楼主| 逍遥派掌门 发表于 2015-11-6 09:24 | 显示全部楼层
//待发送数据的预处理
  1. Procedure Do_send;
  2. var
  3.    number  : byte;
  4.    checksum: byte;
  5. begin
  6.   if  (TX_Need = True) then
  7.   begin
  8.     checksum := 0;
  9.     for number := 1 to (TX_Length -1) do checksum := checksum + TX_Buffer[number];    {计算校验和}
  10.     TX_Buffer[TX_Length] := checksum;
  11.     TX_Count := 1;
  12.     TX_right := False;
  13.     TX_Need  := False ;   
  14.     TI       := True;                      {开启发送}
  15.   end;
  16. end;   
 楼主| 逍遥派掌门 发表于 2015-11-6 09:24 | 显示全部楼层
//主循环
  1. begin
  2.   Init;          {初始化单片机,此处略}

  3.   Repeat
  4.     Do_receive;
  5.     Do_send;
  6.   until False;
  7. end.

单片机部分就此完成。
ddllxxrr 发表于 2015-11-6 09:45 | 显示全部楼层
大家都用Keil C51,就可以完成任务,不想再用别的因为工作还有别的事要处理,不过谢谢楼主的分享
 楼主| 逍遥派掌门 发表于 2015-11-13 00:09 | 显示全部楼层
本帖最后由 逍遥派掌门 于 2015-11-13 00:12 编辑

(九) 计算机端串行通信的Lazarus代码   

       前面的单片机代码已经完成,该到计算机端的软件登场了。

       在计算机端依然选用pascal语言的编程软件,这样两端的编程语言都统一了,语法上完全兼容,实现无缝接轨。

       本使用的编程软件是:Lazarus 。 一款开源的、跨平台的pascal语言编程软件,是Delphi 7.0的浴火重生。有兴趣者,可访问Lazarus的中文社区:www.fpccn.com
      
       可用于Lazarus的串行通信控件有不少,各有特点,在本节里,选用的控件是从Delphi移植过来的SPCOMM控件。

       控件的设置如下


     从图中可以看到,该控件和Delphi 7.0 里的控件是完全一样的。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 逍遥派掌门 发表于 2015-11-26 23:21 | 显示全部楼层
为了和前一节的单片机电路对应,设置如下界面:

上面一行的LED是需要的状态,由操作者来改变;
下面一行的LED用于反映单片机的实际状态,根据接收的数据来控制。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 逍遥派掌门 发表于 2015-11-26 23:25 | 显示全部楼层
本帖最后由 逍遥派掌门 于 2015-11-26 23:34 编辑

定义常量:
  1. const
  2.    Header             = $7E;            // 起始字
  3.    Address            = $01;           // 单片机地址


定义变量:
  1. var
  2.   green_light,blue_light:boolean;
  3.   send_data:array [1..4] of byte;                      // 发送缓冲区,这里和通信协议对应
  4.   receive_data:array of byte;                           // 接收缓冲区,这里定义为可变数组,通用性比较好


上一行绿色LED的代码:
  1.   green_light := not green_light;         // 改变绿色LED的亮灭  


上一行蓝色LED的代码:
  1. blue_light := not blue_light;              // 改变蓝 色LED的亮灭  


发送的控制代码:
  1. send_data[1]:= Header;
  2.   send_data[2]:= Address;
  3.   send_data[3] := $00;                                            // 暂时借用,省掉一个变量而已
  4.   if (green_light = true ) then send_data[3] := send_data[3] + $01;      // 绿色LED的状态
  5.   if (blue_light = true )  then send_data[3] := send_data[3] + $02;       // 蓝色LED的状态
  6.   send_data[4] := send_data[1] + send_data[2] + send_data[3];         // 计算校验和
  7.   Comm1.WriteCommData(@send_data,4);                                         // 发送4个字节到串口  
 楼主| 逍遥派掌门 发表于 2015-11-29 11:41 | 显示全部楼层
关键的接收代码(双击SPCOMM控件的ReceiveData事件):
  1. procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  2.   BufferLength: Word);
  3. var
  4.    checksum:byte;
  5.    number:byte;
  6. begin
  7.   setlength(receive_data,BufferLength);                               // 根据接收的长度,设置数组大小
  8.   receive_data := Buffer;                                                     //  取得数据
  9.   checksum := 0;
  10.   for number:=0 to (bufferlength -2) do checksum:=checksum + receive_data[number];    // 计算校验和
  11.   if (checksum = receive_data[bufferlength -1]) then                                                            // 校验和合法,则进行接收后的处理
  12.   begin
  13.     case receive_data[3] of
  14.      $00:
  15.          begin
  16.            BitBtn3.Glyph.LoadFromFile(green_dark_file);                      // 下一行的绿色LED 灭
  17.            BitBtn4.Glyph.LoadFromFile(blue_dark_file);                        // 下一行的蓝色LED 灭
  18.          end;
  19.      $01:
  20.          begin
  21.            BitBtn3.Glyph.LoadFromFile(green_light_file);                     // 下一行的绿色LED亮
  22.            BitBtn4.Glyph.LoadFromFile(blue_dark_file);                       // 下一行的蓝色LED 灭
  23.          end;
  24.      $02:
  25.          begin
  26.            BitBtn3.Glyph.LoadFromFile(green_dark_file);                   // 下一行的绿色LED 灭
  27.            BitBtn4.Glyph.LoadFromFile(blue_light_file);                      // 下一行的蓝色LED 亮
  28.          end;
  29.      $03:
  30.          begin
  31.            BitBtn3.Glyph.LoadFromFile(green_light_file);                  // 下一行的绿色LED亮
  32.            BitBtn4.Glyph.LoadFromFile(blue_light_file);                     // 下一行的蓝色LED 亮
  33.          end;
  34.     end;
  35.   end;
  36.   setlength(receive_data,0);                                                      // 释放资源
  37. end;
这里接收后的处理仅是作为例证。


绿色LED 灭,蓝色LED 灭



绿色LED亮,蓝色LED 灭


绿色LED 灭,蓝色LED 亮



绿色LED亮,蓝色LED 亮



到此,串行通信的Lazarus代码解析完毕。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
supertankhzt 发表于 2016-6-30 16:51 | 显示全部楼层
只能说**下去精神可嘉,然而事实上走偏门路线就是比大路要坎坷,好比黑猫抓到老鼠只需3步,而白猫要追三条街,都是好猫,我选择黑猫
 楼主| 逍遥派掌门 发表于 2016-7-6 16:01 | 显示全部楼层
supertankhzt 发表于 2016-6-30 16:51
只能说**下去精神可嘉,然而事实上走偏门路线就是比大路要坎坷,好比黑猫抓到老鼠只需3步,而白猫要追三 ...

你说偏门,不过是你见识少,接触少而已。世界不是井口那么大。
lihuasoft 发表于 2017-2-5 08:00 | 显示全部楼层
见到这个贴子,激动~求楼主联系方式(有QQ吗),谢谢!
大道至简 发表于 2017-2-5 19:46 | 显示全部楼层
supertankhzt 发表于 2015-9-24 07:05
本人以前也是这样比较偏执,而现在认为钻这些墙缝还不如转语言走大门,更容易搜索资料获得帮助。 ...

附议
大道至简 发表于 2017-2-5 19:47 | 显示全部楼层
c语言要一统江湖了,楼主,认清趋势,回头是岸啊。。。。。
咪木 发表于 2017-2-6 16:38 | 显示全部楼层
作为一名学生,很是佩服您。
 楼主| 逍遥派掌门 发表于 2017-3-16 17:48 | 显示全部楼层
大道至简 发表于 2017-2-5 19:47
c语言要一统江湖了,楼主,认清趋势,回头是岸啊。。。。。

当对某个产品已经很熟悉的时候,用什么语言已经不重要了。
对产品的控制、编程的思路已经透彻了,用什么语言编程都能实现目的。
另外也看个人的喜好,走自己的路,不一定要大路货,别人的路,可能自己走不通。
 楼主| 逍遥派掌门 发表于 2017-3-16 17:53 | 显示全部楼层
lihuasoft 发表于 2017-2-5 08:00
见到这个贴子,激动~求楼主联系方式(有QQ吗),谢谢!

有什么感触呢?
可以直接 “发消息”

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部