逍遥派掌门
发表于 2015-11-2 00:46
//处理接收到的数据
Procedure Do_receive;
var
number : byte;
checksum : byte;
begin
if (RX_right = True) then
begin
if ((RX_Buffer = Header) and (RX_Buffer = Address)) then {判断是否合法}
begin
checksum := 0;
for number := 1 to (RX_Length-1) do checksum:= checksum + RX_buffer; {计算校验和}
if (checksum = RX_buffer) then {校验通过}
begin
caseRX_buffer 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 := RX_buffer;
TX_Need := True; {发送应答}
TX_Buffer := (not Port_Get) and Port_Mask; { 获取LED控制脚的状态}
end;
end;
RX_Count := 1;
RX_right := False;
end;
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
//待发送数据的预处理
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; {计算校验和}
TX_Buffer := checksum;
TX_Count := 1;
TX_right := False;
TX_Need:= False ;
TI := True; {开启发送}
end;
end;
逍遥派掌门
发表于 2015-11-6 09:24
//主循环
begin
Init; {初始化单片机,此处略}
Repeat
Do_receive;
Do_send;
until False;
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 编辑
定义常量:const
Header = $7E; // 起始字
Address = $01; // 单片机地址
定义变量:
var
green_light,blue_light:boolean;
send_data:array of byte; // 发送缓冲区,这里和通信协议对应
receive_data:array of byte; // 接收缓冲区,这里定义为可变数组,通用性比较好
上一行绿色LED的代码:
green_light := not green_light; // 改变绿色LED的亮灭
上一行蓝色LED的代码:
blue_light := not blue_light; // 改变蓝 色LED的亮灭
发送的控制代码:
send_data:= Header;
send_data:= Address;
send_data := $00; // 暂时借用,省掉一个变量而已
if (green_light = true ) then send_data := send_data + $01; // 绿色LED的状态
if (blue_light = true )then send_data := send_data + $02; // 蓝色LED的状态
send_data := send_data + send_data + send_data; // 计算校验和
Comm1.WriteCommData(@send_data,4); // 发送4个字节到串口
逍遥派掌门
发表于 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; // 计算校验和
if (checksum = receive_data) then // 校验和合法,则进行接收后的处理
begin
case receive_data 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代码解析完毕。
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吗),谢谢!
有什么感触呢?
可以直接 “发消息”