专栏首页机器人课程与技术51单片机在Ubuntu下程序开发和下载

51单片机在Ubuntu下程序开发和下载

这学期有51单片机课程,平时调试代码不用windows,查阅了一些资料,不太能用,现在将51单片机在ubuntu下(Linux通用)开发和下载说明一下:需要用到SDCCstcgal

已测试Linux通用,Ubuntu16.04,18.04.20.04均可。

资源下载:https://download.csdn.net/download/ZhangRelay/12820423

什么是SDCC?

SDCC是可重定目标的,优化的标准C(ANSI C89,ISO C99,ISO C11)编译器套件,针对的是基于Intel MCS51的微处理器(8031、8032、8051、8052 等), Maxim(以前为Dallas),DS80C390, 飞思卡尔(以前基于Motorola)基于HC08 (hc08,s08), 基于Zilog Z80的MCU (z80,z180,gbz80,Rabbit 2000/3000,Rabbit 3000A,TLCS-90)Padauk(pdk14,pdk15)和 STMicroelectronics STM8。支持Padauk(pdk13)Microchip PIC16PIC18 目标的工作正在进行中 。可以将其重新定位为其他微处理器。

SDCC套件是从具有不同FOSS许可证的不同来源派生的几个组件的集合。SDCC编译器套件包括:

  • SDASsdld,一个retargettable汇编程序和连接,基于ASXXXX,由Alan鲍德温写入; (GPL)。
  • sdcpp 预处理器,基于GCC cpp ; (GPL)。
  • ucsim 模拟器,最初由Daniel Drotos编写;(GPL)。
  • sdcdb 源代码级调试器,最初由Sandeep Dutta编写;(GPL)。
  • sdbinutils 库归档实用程序,包括从GNU Binutils派生的sdar,sdranlib和sdnm;(GPL)
  • SDCC运行时库;(GPL + LE)。Pic设备库和头文件来自Microchip头文件(.inc)和链接程序脚本(.lkr)文件。Microchip要求“头文件应声明它们仅可与可靠的Microchip设备一起使用”,这使它们与GPL不兼容。
  • gcc-test 回归测试,源自 gcc-testsuite;(未明确指定许可,但由于它是GCC的一部分,因此可能是GPL许可)
  • packihx ; (公共区域)
  • makebin ; (zlib / libpng许可证)
  • sdcc C编译器,最初由Sandeep Dutta编写;(GPL)。一些功能包括:
    • 广泛的MCU特定语言扩展,可有效利用基础硬件。
    • 一系列标准优化,例如全局子表达式消除,循环优化(循环不变式,归纳变量的强度降低和循环反转),恒定折叠传播,复制传播,死代码消除以及“ switch”语句的跳转表。
    • MCU特定的优化,包括全局寄存器分配器。
    • 适用于MCU的自适应后端,应该非常适合其他8位MCU
    • 基于独立规则的窥视孔优化器。
    • 完整的数据类型范围:char8位,1字节),short16位,2字节), int16位,2字节),long32位,4字节),long long64位,8位元组),浮点数(IEEE 4位元组)和 _Bool / bool
    • 在函数中任何地方添加内联汇编代码的能力。
    • 报告功能复杂性的能力,以帮助确定应在汇编器中重写的内容。
    • 很好的自动回归测试选择。

SDCC最初由Sandeep Dutta编写,并根据GPL许可发布。自最初发布以来,已经进行了许多错误修复和改进。自1999年12月起,代码已移至SourceForge,所有“用户都变成开发者”都可以访问同一源树。SDCC会不断更新所有用户和开发人员的输入。

安装

简要介绍一下吧:

解压sdcc压缩文件(这里使用最新4.0.0版本),全部文档在sdcc-4.0.0/share/sdcc/doc

    cd sdcc-4.0.0     cp -r * /usr/local

编译

sdcc -mmcs51 xxx.c

最简单安装方法:

sudo apt install sdcc


stcgal-STC MCU ISP闪存工具

stcgal是用于STC MCU Ltd的命令行闪存编程工具。8051兼容的微控制器。

STC微控制器具有基于UART/USB的引导加载程序(BSL)。它利用基于数据包的协议通过串行链路刷新代码存储器和IAP存储器。这称为系统内编程(ISP)。BSL还用于配置各种(类似保险丝的)设备选项。不幸的是,该协议没有公开记录,STC仅提供(粗略的)Windows GUI应用程序进行编程。

stcgal是STC的Windows软件的功能全面的开源替代品;它支持多种MCU,非常便携,适合自动化。

特征

  • 支持STC 89/90/10/11/12/15/8系列
  • UART和USB BSL支持
  • 显示零件信息
  • 确定工作频率
  • 程序闪存
  • 程式IAP / EEPROM
  • 设置设备选项
  • 读取唯一的设备ID(STC 10/11/12/15/8)
  • 修整RC振荡器频率(STC 15/8)
  • 使用DTR切换键或自定义Shell命令自动重启电源
  • 自动UART协议检测

快速开始

安装stcgal(可能需要root /管理员权限):

pip3 install stcgal
Collecting stcgal
  Downloading https://files.pythonhosted.org/packages/b0/68/4924bd584b9e47639b28a1900cbced4e90deac7905fd996108ee2fcf975c/stcgal-1.6-py3-none-any.whl
Collecting tqdm>=4.0.0 (from stcgal)
  Downloading https://files.pythonhosted.org/packages/28/7e/281edb5bc3274dfb894d90f4dbacfceaca381c2435ec6187a2c6f329aed7/tqdm-4.48.2-py2.py3-none-any.whl (68kB)
    100% |████████████████████████████████| 71kB 754kB/s 
Collecting pyserial>=3.0 (from stcgal)
  Using cached https://files.pythonhosted.org/packages/0d/e4/2a744dd9e3be04a0c0907414e2a01a7c88bb3915cbe3c8cc06e209f59c30/pyserial-3.4-py2.py3-none-any.whl
Installing collected packages: tqdm, pyserial, stcgal
Successfully installed pyserial-3.4 stcgal-1.6 tqdm-4.48.2

如果网络问题,请尝试如下命令:

pip3 install stcgal -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

调用stcgal并显示用法:

stcgal -h
usage: stcgal [-h] [-a] [-r RESETCMD]
              [-P {stc89,stc12a,stc12b,stc12,stc15a,stc15,stc8,usb15,auto}]
              [-p PORT] [-b BAUD] [-l HANDSHAKE] [-o OPTION] [-t TRIM] [-D]
              [-V]
              [code_image] [eeprom_image]

stcgal 1.6 - an STC MCU ISP flash tool
(C) 2014-2018 Grigori Goronzy and others
https://github.com/grigorig/stcgal

positional arguments:
  code_image            code segment file to flash (BIN/HEX)
  eeprom_image          eeprom segment file to flash (BIN/HEX)

optional arguments:
  -h, --help            show this help message and exit
  -a, --autoreset       cycle power automatically by asserting DTR
  -r RESETCMD, --resetcmd RESETCMD
                        shell command for board power-cycling (instead of DTR
                        assertion)
  -P {stc89,stc12a,stc12b,stc12,stc15a,stc15,stc8,usb15,auto}, --protocol {stc89,stc12a,stc12b,stc12,stc15a,stc15,stc8,usb15,auto}
                        protocol version (default: auto)
  -p PORT, --port PORT  serial port device
  -b BAUD, --baud BAUD  transfer baud rate (default: 19200)
  -l HANDSHAKE, --handshake HANDSHAKE
                        handshake baud rate (default: 2400)
  -o OPTION, --option OPTION
                        set option (can be used multiple times, see
                        documentation)
  -t TRIM, --trim TRIM  RC oscillator frequency in kHz (STC15+ series only)
  -D, --debug           enable debug output
  -V, --version         print version info and exit

stcgal -P stc89 xxx.ihx


程序需要做一些修改的,以LED灯为例吧:

#include <reg52.h>       	//52系列单片机头文件

sbit LSA = P1^5;  			//LED位选译码地址引脚A
sbit LSB = P1^6;  			//LED位选译码地址引脚B
sbit LSC = P1^7;  			//LED位选译码地址引脚C
int  main(void)			
{
	while(1)				//主程序中设置死循环程序,保证周而复始运行
	{				
		//使LED灯的总开关三极管Q6导通,+5V加到LED灯组
		LSA = 0;
		LSB = 0;
		LSC = 0;
		P0 = 0xfe;         	//点亮一个发光二极管
	}
}

在sdcc下需修改为:

#include <8052.h>       	

#define LSA P1_5  			
#define LSB P1_6  			
#define LSC P1_7 
 			
int  main(void)			
{
	while(1)				
	{
		LSA = 0;
		LSB = 0;
		LSC = 0;
		P0 = 0xfe;
	}
}

Linux下无需安装驱动!!!

sdcc -mmcs51 led.c

stcgal -P stc89 led.ihx

闪烁:

#include <8052.h> 
     
#define LSA  P1_5  			//LED位选译码地址引脚A
#define LSB  P1_6  			//LED位选译码地址引脚B
#define LSC  P1_7  			//LED位选译码地址引脚C
#define Led10 P0_7          	//定义P0.7名字为led10

int  main(void)		
{
	 unsigned int a;    	//定义无符号的整型变量a
     while(1)				
     {				
		//使LED灯的总开关三极管Q6导通,+5V加到LED灯组
		LSA = 0;
		LSB = 0;
		LSC = 0;   
	  	Led10 = 0;          //点亮LED10
		a = 50000;
		while(a--); 		//50000次的循环,通过消耗时间以达到延时的目的
	 	Led10 = 1;;         //熄灭LED10
		a = 50000;
		while(a--); 		//延时
     }
}

呼吸灯:

#include <8052.h>

#define LSA   P1_5  			//LED位选译码地址引脚A
#define LSB   P1_6  			//LED位选译码地址引脚B
#define LSC   P1_7  			//LED位选译码地址引脚C
#define Led10 P0_7          	//定义P0.7名字为led10

int atime=64;

void delay(unsigned int pms)	//延时函数
{
  unsigned int x;
  unsigned int y;
  for(x=pms;x>0;x--)
	for(y=11;y>0;y--)
	  ;
}

void ledfade(unsigned int i)	//呼吸灯
{
   Led10 = 0;
   delay(i);
   Led10 = 1;
   delay(atime-i);

}
int  main(void)		
{
	 int a;    	//定义无符号的整型变量a
     while(1)				
     {				
		//使LED灯的总开关三极管Q6导通,+5V加到LED灯组
		LSA = 0;
		LSB = 0;
		LSC = 0;
		for(a=0;a<atime;a++)
		{
			ledfade(a);
		}
		for(a=atime;a>0;a--)
		{
			ledfade(a);
		}   
        
     }
}

呼吸跑马灯???(需改进优化哦!)

#include <8052.h>

#define LSA   P1_5  			//LED位选译码地址引脚A
#define LSB   P1_6  			//LED位选译码地址引脚B
#define LSC   P1_7  			//LED位选译码地址引脚C
#define Led10 P0_0          	//定义P0.0名字为led10
#define Led11 P0_1          	//定义P0.0名字为led11
#define Led12 P0_2          	//定义P0.0名字为led12
#define Led13 P0_3          	//定义P0.0名字为led13
#define Led14 P0_4          	//定义P0.0名字为led14
#define Led15 P0_5          	//定义P0.0名字为led15
#define Led16 P0_6          	//定义P0.0名字为led16
#define Led17 P0_7          	//定义P0.0名字为led17

int atime=64;

void delay(unsigned int pms)	//延时函数
{
  unsigned int x;
  unsigned int y;
  for(x=pms;x>0;x--)
	for(y=11;y>0;y--)
	  ;
}

void ledfade0(unsigned int i)	//呼吸灯
{
   Led10 = 0;
   delay(i);
   Led10 = 1;
   delay(atime-i);

}
void ledfade1(unsigned int i)	//呼吸灯
{
   Led11 = 0;
   delay(i);
   Led11 = 1;
   delay(atime-i);

}
void ledfade2(unsigned int i)	//呼吸灯
{
   Led12 = 0;
   delay(i);
   Led12 = 1;
   delay(atime-i);

}
void ledfade3(unsigned int i)	//呼吸灯
{
   Led13 = 0;
   delay(i);
   Led13 = 1;
   delay(atime-i);

}
void ledfade4(unsigned int i)	//呼吸灯
{
   Led14 = 0;
   delay(i);
   Led14 = 1;
   delay(atime-i);

}
void ledfade5(unsigned int i)	//呼吸灯
{
   Led15 = 0;
   delay(i);
   Led15 = 1;
   delay(atime-i);

}
void ledfade6(unsigned int i)	//呼吸灯
{
   Led16 = 0;
   delay(i);
   Led16 = 1;
   delay(atime-i);

}
void ledfade7(unsigned int i)	//呼吸灯
{
   Led17 = 0;
   delay(i);
   Led17 = 1;
   delay(atime-i);

}
int  main(void)		
{
	 int a;    	//定义无符号的整型变量a
     while(1)				
     {				
		//使LED灯的总开关三极管Q6导通,+5V加到LED灯组
		LSA = 0;
		LSB = 0;
		LSC = 0;
		for(a=0;a<atime;a++)
		{
			ledfade0(a);
		}
		for(a=atime;a>0;a--)
		{
			ledfade0(a);
		}   
		for(a=0;a<atime;a++)
		{
			ledfade1(a);
		}
		for(a=atime;a>0;a--)
		{
			ledfade1(a);
		}  
		for(a=0;a<atime;a++)
		{
			ledfade2(a);
		}
		for(a=atime;a>0;a--)
		{
			ledfade2(a);
		}
		for(a=0;a<atime;a++)
		{
			ledfade3(a);
		}
		for(a=atime;a>0;a--)
		{
			ledfade3(a);
		} 
		for(a=0;a<atime;a++)
		{
			ledfade4(a);
		}
		for(a=atime;a>0;a--)
		{
			ledfade4(a);
		}  
		for(a=0;a<atime;a++)
		{
			ledfade5(a);
		}
		for(a=atime;a>0;a--)
		{
			ledfade5(a);
		}  
		for(a=0;a<atime;a++)
		{
			ledfade6(a);
		}
		for(a=atime;a>0;a--)
		{
			ledfade6(a);
		}  
		for(a=0;a<atime;a++)
		{
			ledfade7(a);
		}
		for(a=atime;a>0;a--)
		{
			ledfade7(a);
		}             
     }
}

如果需要将51接入机器人操作系统ROS,可以参考:



本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2017-2018-2学期本科智能机器人方向教学素材整理

    15年底工作进入正轨,如今已经18年了,时间好快,过去的2年多,用一个词概括就是“狂躁”,折腾新课,到处出差学习,18年开始要专注于智能机器人的教学与科研工作了...

    zhangrelay
  • 使用机器人操作系统ROS 2和仿真软件Gazebo 9行动进阶实战(九)- mobot区域巡逻

    行动(action)比服务更为灵活和复杂。在给出行动具体说明之前,先简要复习一下:

    zhangrelay
  • 使用Android手机APP查看ROS中RGB摄像头数据

    http://blog.csdn.net/zhangrelay/article/details/53495641

    zhangrelay
  • codeforces 1436C(二分+数学)

    由于二分是通过不断缩减寻找区间的操作,所以我们可以模拟二分操作,求出二分结束后位置停留在pos时的向左跳的次数left和向右跳的次数right,最后通过组合数来...

    dejavu1zz
  • C语言的原子操作

    Lucien168
  • Linux kernel中常见的宏整理

    替换列表和标识符列表都是将字符串 token 化以后的列表。区别在于标识符列表使用,作为不同参数之间的分割符。每一个参数都是一个 token 化的列表。在宏中空...

    233333
  • LeetCode 251. 展开二维向量

    请设计并实现一个能够展开二维向量的迭代器。该迭代器需要支持 next 和 hasNext 两种操作。、

    Michael阿明
  • 谷歌微软等科技巨头数据科学面试107道真题:你能答出多少?

    选自Learndatasci 机器之心编译 参与:李泽南 来自 Glassdoor 的最新数据可以告诉我们各大科技公司最近在招聘面试时最喜欢向候选人提什么问题。...

    机器之心
  • 「小程序JAVA实战」小程序视频处理工具ffmpeg(47)

    IT故事会
  • 字符串查找----查找算法的选择

    SuperHeroes

扫码关注云+社区

领取腾讯云代金券