打印
[51单片机]

51单片机的Pascal语言编程

[复制链接]
楼主: 逍遥派掌门
手机看帖
扫描二维码
随时随地手机跟帖
21
逍遥派掌门|  楼主 | 2015-11-2 00:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
//处理接收到的数据
Procedure Do_receive;
var
   number   : byte;
   checksum : byte;
begin
  if (RX_right = True) then
  begin
    if ((RX_Buffer[1] = Header) and (RX_Buffer[2] = Address)) then                  {判断是否合法}
    begin
      checksum := 0;
      for number := 1 to (RX_Length-1) do checksum:= checksum + RX_buffer[number];   {计算校验和}
      if (checksum = RX_buffer[RX_Length]) then                                      {校验通过}
      begin
        case  RX_buffer[3] of     {判断命令}
          $01:                    
              begin
                LED_green := False;     {亮绿色LED}
                LED_blue  := True;      {灭蓝色LED}
              end;
          $02:
              begin
                LED_green := True;     {灭绿色LED}
                LED_blue  := False;    {亮蓝色LED}
              end;  
          $03:
              begin
                LED_green := False;   {亮绿色LED}
                LED_blue  := False;   {亮蓝色LED}
              end;  
          $00:
              begin
                LED_green := True;     {灭绿色LED}
                LED_blue  := True;     {灭蓝色LED}
              end;        
        end;
        TX_Buffer[3] := RX_buffer[3];
        TX_Need := True;                           {发送应答}
        TX_Buffer[4] := (not Port_Get) and Port_Mask;    { 获取LED控制脚的状态}
      end;           
    end;

    RX_Count := 1;         
    RX_right := False;         
  end;  
end;


使用特权

评论回复
22
大道至简| | 2015-11-3 10:59 | 只看该作者
逍遥派掌门“:
没有收入,研发还能保持持续的兴趣的耐力,是小概率事件

使用特权

评论回复
23
逍遥派掌门|  楼主 | 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、当然,作者也不拒绝善意的收入,甚至提供了捐赠的帐号。相信他并不能从中发财。

基于个人兴趣爱好的事情,完全可能持续长久,相信每个人都有那么一点。

使用特权

评论回复
24
大道至简| | 2015-11-4 10:30 | 只看该作者
好吧,这种大侠是要敬佩的

使用特权

评论回复
25
hdwgt| | 2015-11-5 18:33 | 只看该作者
确实不错。可惜停止更新了!

使用特权

评论回复
26
逍遥派掌门|  楼主 | 2015-11-6 09:24 | 只看该作者
//待发送数据的预处理
Procedure Do_send;
var
   number  : byte;
   checksum: byte;
begin
  if  (TX_Need = True) then
  begin
    checksum := 0;
    for number := 1 to (TX_Length -1) do checksum := checksum + TX_Buffer[number];    {计算校验和}
    TX_Buffer[TX_Length] := checksum;
    TX_Count := 1;
    TX_right := False;
    TX_Need  := False ;   
    TI       := True;                      {开启发送}
  end;
end;   

使用特权

评论回复
27
逍遥派掌门|  楼主 | 2015-11-6 09:24 | 只看该作者
//主循环
begin
  Init;          {初始化单片机,此处略}

  Repeat
    Do_receive;
    Do_send;
  until False;
end.

单片机部分就此完成。

使用特权

评论回复
28
ddllxxrr| | 2015-11-6 09:45 | 只看该作者
大家都用Keil C51,就可以完成任务,不想再用别的因为工作还有别的事要处理,不过谢谢楼主的分享

使用特权

评论回复
29
逍遥派掌门|  楼主 | 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 里的控件是完全一样的。


使用特权

评论回复
30
逍遥派掌门|  楼主 | 2015-11-26 23:21 | 只看该作者
为了和前一节的单片机电路对应,设置如下界面:

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

使用特权

评论回复
31
逍遥派掌门|  楼主 | 2015-11-26 23:25 | 只看该作者
本帖最后由 逍遥派掌门 于 2015-11-26 23:34 编辑

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


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


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


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


发送的控制代码:
 send_data[1]:= Header;
  send_data[2]:= Address;
  send_data[3] := $00;                                            // 暂时借用,省掉一个变量而已
  if (green_light = true ) then send_data[3] := send_data[3] + $01;      // 绿色LED的状态
  if (blue_light = true )  then send_data[3] := send_data[3] + $02;       // 蓝色LED的状态
  send_data[4] := send_data[1] + send_data[2] + send_data[3];         // 计算校验和
  Comm1.WriteCommData(@send_data,4);                                         // 发送4个字节到串口  

使用特权

评论回复
32
逍遥派掌门|  楼主 | 2015-11-29 11:41 | 只看该作者
关键的接收代码(双击SPCOMM控件的ReceiveData事件):
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
   checksum:byte;
   number:byte;
begin
  setlength(receive_data,BufferLength);                               // 根据接收的长度,设置数组大小
  receive_data := Buffer;                                                     //  取得数据
  checksum := 0;
  for number:=0 to (bufferlength -2) do checksum:=checksum + receive_data[number];    // 计算校验和
  if (checksum = receive_data[bufferlength -1]) then                                                            // 校验和合法,则进行接收后的处理
  begin
    case receive_data[3] of
     $00:
         begin
           BitBtn3.Glyph.LoadFromFile(green_dark_file);                      // 下一行的绿色LED 灭
           BitBtn4.Glyph.LoadFromFile(blue_dark_file);                        // 下一行的蓝色LED 灭
         end;
     $01:
         begin
           BitBtn3.Glyph.LoadFromFile(green_light_file);                     // 下一行的绿色LED亮
           BitBtn4.Glyph.LoadFromFile(blue_dark_file);                       // 下一行的蓝色LED 灭
         end;
     $02:
         begin
           BitBtn3.Glyph.LoadFromFile(green_dark_file);                   // 下一行的绿色LED 灭
           BitBtn4.Glyph.LoadFromFile(blue_light_file);                      // 下一行的蓝色LED 亮
         end;
     $03:
         begin
           BitBtn3.Glyph.LoadFromFile(green_light_file);                  // 下一行的绿色LED亮
           BitBtn4.Glyph.LoadFromFile(blue_light_file);                     // 下一行的蓝色LED 亮
         end;
    end;
  end;
  setlength(receive_data,0);                                                      // 释放资源
end;
这里接收后的处理仅是作为例证。


绿色LED 灭,蓝色LED 灭



绿色LED亮,蓝色LED 灭


绿色LED 灭,蓝色LED 亮



绿色LED亮,蓝色LED 亮



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

使用特权

评论回复
33
supertankhzt| | 2016-6-30 16:51 | 只看该作者
只能说**下去精神可嘉,然而事实上走偏门路线就是比大路要坎坷,好比黑猫抓到老鼠只需3步,而白猫要追三条街,都是好猫,我选择黑猫

使用特权

评论回复
34
逍遥派掌门|  楼主 | 2016-7-6 16:01 | 只看该作者
supertankhzt 发表于 2016-6-30 16:51
只能说**下去精神可嘉,然而事实上走偏门路线就是比大路要坎坷,好比黑猫抓到老鼠只需3步,而白猫要追三 ...

你说偏门,不过是你见识少,接触少而已。世界不是井口那么大。

使用特权

评论回复
35
lihuasoft| | 2017-2-5 08:00 | 只看该作者
见到这个贴子,激动~求楼主联系方式(有QQ吗),谢谢!

使用特权

评论回复
36
大道至简| | 2017-2-5 19:46 | 只看该作者
supertankhzt 发表于 2015-9-24 07:05
本人以前也是这样比较偏执,而现在认为钻这些墙缝还不如转语言走大门,更容易搜索资料获得帮助。 ...

附议

使用特权

评论回复
37
大道至简| | 2017-2-5 19:47 | 只看该作者
c语言要一统江湖了,楼主,认清趋势,回头是岸啊。。。。。

使用特权

评论回复
38
咪木| | 2017-2-6 16:38 | 只看该作者
作为一名学生,很是佩服您。

使用特权

评论回复
39
逍遥派掌门|  楼主 | 2017-3-16 17:48 | 只看该作者
大道至简 发表于 2017-2-5 19:47
c语言要一统江湖了,楼主,认清趋势,回头是岸啊。。。。。

当对某个产品已经很熟悉的时候,用什么语言已经不重要了。
对产品的控制、编程的思路已经透彻了,用什么语言编程都能实现目的。
另外也看个人的喜好,走自己的路,不一定要大路货,别人的路,可能自己走不通。

使用特权

评论回复
40
逍遥派掌门|  楼主 | 2017-3-16 17:53 | 只看该作者
lihuasoft 发表于 2017-2-5 08:00
见到这个贴子,激动~求楼主联系方式(有QQ吗),谢谢!

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

使用特权

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

本版积分规则