标签 Elec 下的文章

SDCC(Small Device C Compiler)是一个优化的 ANSI - C交叉编译器,目标CPU为基于Intel 8051, Maxim 80DS390, Zilog Z80 和Motorola 68HC08 的单片机。

安装

在Debian/Ubuntu下很容易通过Apt来安装:

sudo apt-get install sdcc sdcc-doc

SDCC使用与编译

SDCC到此就安装完了,我们来简单点个灯:

#include "reg51.h"
#define LED P3_0
void Delay1000ms(){             //@11.0592MHz
        unsigned char i, j, k;
        i = 43;
        j = 6;
        k = 203;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void main(){
        while(1){
                LED = 0;
                Delay1000ms();
                LED = 1;
        }
}

编译:

sdcc led.c

编译完后看到目录下生成了许多东西:

# ls
led.asm  led.ihx  led.lst  led.mem  led.rst
led.c    led.lk   led.map  led.rel  led.sym

这里我们只关心led.ihx这个文件,我们需要将它转为hex来烧录:

packihx led.ihx > led.hex

在Linux下可以通过stcflash来烧录它:

sudo apt-get install git python python-serial
git clone https://github.com/laborer/stcflash.git
cd stcflash
python stcflash.py [--port /dev/ttyUSB0] <filename.ihx>
//由于我没有支持的单片机,所以无法演示,stcflash的支持列表和更多使用方法详情请看项目的README

SDCC的多文件编译

例如:

//main.c 引用了 test.c中的函数方法
main.c test.c test.h

这样来编译成为一个HEX:

sdcc -c main.c
sdcc -c test.c
sdcc main.rel test.rel

批判一番

手头上只有几片STC15F104E,就是那个定时器有问题的片子,下载只能通过几个特定版本的STC-ISP来下载的刁端货。

电路图:

418_0.png

原理:

其他电路不讲了,主要讲一下下面的部分:

418_1.png

上图是一个简单的反向器,在IN输入一个高电平,使三极管导通,由于电流向电阻小的方向流动,所以这时没有电流流向A,所以A点为低电平,当IN没有输入(低电平)时,由于三极管没有导通,所以电流通过10K电阻流向A,于是在A处就产生了高电平。

把Q3的LED和500欧姆电阻去了,接入负载,就可以当做简单的UPS来使,大电流把Q3换成MOS就行了。

防烤糊必备

import os
import time
from pyA20.gpio import gpio
from pyA20.gpio import port
#GPIO:https://github.com/duxingkei33/orangepi_PC_gpio_pyH3
#适用于全H3系列和H2+
Pin = port.PA10
gpio.init() #初始化
gpio.setcfg(Pin, gpio.OUTPUT) #输出
while 1:
    output = os.popen('cat /sys/devices/virtual/hwmon/hwmon1/temp1_input') 
    #读取温度,来自CPU的温度传感器
    #初版Zero由于基准电压的原因,可能偏高
    wd = output.read()
    print int(wd)
    if(int(wd)>50): #大于50度开启
        gpio.output(Pin, 1)
        time.sleep(1)
    if(int(wd)<50):
        gpio.output(Pin, 0)
        time.sleep(1)