So Tired !_! 逆水行舟, 不进则退!

8Jan/19

NodeMCU8266驱动8×8点阵max7219

Posted by Nick Xu

Since the awesome devsaurus recently fixed important SPI issues (#50 is from Christmas 2014!) in NodeMCU it’s now possible to run MAX7219 8×8 LED matrix displays with an ESP8266 and the NodeMCU firmware.

Connect NodeMCU with MAX7219 display

According to the pin layout for the NodeMCU dev kit v1 and v2 (see comparison) you need to connect the MAX7212 as follows:

MAX7219 ESP8266 NodeMCU devkit
VCC +3.3V 3V3
GND GND GND
DIN HSPID/HMOSI D7
CS HSPICS/HCS D8
CLK HSPICLK/HSCLK D5

In the second column I listed commonly found names on pin layouts and schemas. The values in the third column signify the actual pin numbers as printed on the NodeMCU development boards.

Drawing on the MAX7219

Writing and drawing on those 8×8 matrix displays took some getting used to for me. Interestingly the fact that you can rotate them whichever way you like made it more difficult rather than less difficult. There is a way to identify pin 1 but eventually it doesn’t really matter. However, you need to understand how “characters” are represented.

In font files (e.g. cp437.h) you’ll usually see one character per line as an array of 8 hex values. This could look as follows for ‘0’ (zero) :

{ 0x3E, 0x7F, 0x71, 0x59, 0x4D, 0x7F, 0x3E, 0x00 }

MAX7219 8x8 LED matrix displaying 0x3EThere is one byte per column of the 8×8 matrix i.e. 8 bytes. One byte signifies which of the 8 LEDs in a column should be turned on. 0x3E in binary form is 00111110 and every bit represents the state of one LED. So, the first LED and the last two will be OFF while the others will be ON. Again, the notion of “first” and “last” of course depends on the orientation of the matrix but as long as all characters are defined consistently it doesn’t matter. 0x3E on the matrix will look as shown on the left.

 

Moody, cycling through smilys

Moody is a simple program that declares 3 smilys and an array which contains all of them. It shows how to initialize NodeMCU SPI for the MAX7219 8×8 LED matrix and how to cycle through the smilys array and display one face after the other in a loop.

Showtime, please

 

 

Filed under: 单片机 Comments Off
3Jan/19

PWM波控制舵机总结

Posted by Nick Xu

一、关于舵机:

舵机(英文叫Servo):它由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。通过发送信号,指定输出轴旋转角度。舵机一般而言都有最大旋转角度(比如180度。)与普通直流电机的区别主要在,直流电机是一圈圈转动的,舵机只能在一定角度内转动,不能一圈圈转(数字舵机可以在舵机模式和电机模式中切换,没有这个问题)。普通直流电机无法反馈转动的角度信息,而舵机可以。用途也不同,普通直流电机一般是整圈转动做动力用,舵机是控制某物体转动一定角度用(比如机器人的关节)。

舵机的形状和大小多的让人眼花缭乱,大致可以分为下面这几种(如图所示)

最右边的是常见的标准舵机,中间两个小的是微型舵机,左边魁梧的那个是大扭力舵机。图上这几种舵机都是三线控制。
制作机器人常用的舵机有下面几种,而且每种的固定方式也不同,如果从一个型号换成一个型号,整个机械结构都需要重新设计。
第一种是MG995,优点是价格便宜,金属齿轮,耐用度也不错。缺点是扭力比较小,所以负载不能太大,如果做双足机器人之类的这款舵机不是很合适,因为腿部受力太大。做做普通的六足,或者机械手还是不错的。

第二种是SR 403,这款舵机是网友xqi2因MG995做双足机器人抖动太厉害,摸索找到的,经过测试。制作双足机器人不错~~~至少不抖了。优点是扭力大,全金属齿轮,价格也还算便宜。缺点嘛。。。做工很山寨。。。其他缺点等待反馈

第三种就是传说中的数字舵机AX12+,这个是久经考验的机器人专用舵机。除了价格高,使用RS485串口通信(控制板就得换数字舵机专用控制板),其他都是优点。
下图是一个普通模拟舵机的分解图,其组成部分主要有齿轮组、电机、电位器、电机控制板、壳体这几大部分。
电机控制板主要是用来驱动电机和接受电位器反馈回来的信息。电机嘛,动力的来源了,这个不用太多解释。电位器这里的作用主要是通过其旋转后产生的电阻的变化,把信号发送回电机控制板,使其判断输出轴角度是否输出正确。齿轮组的作用主要是力量的放大,使小功率电机产生大扭矩。
舵机底壳拆开后就可以看到,主要是电机与控制板
控制板拿起来后下方是与控制板连接的电位器
从顶部来看电机与电位器,与电机齿轮直接相连的为第一级放大齿轮。
经过一级齿轮放大后,再经过二、三、四级放大齿轮,最后再通过输出轴输出。
通过上面两图可以很清晰的看到,本舵机是4级齿轮放大机构,就是通过这么一层层的把小的力量放大,使得这么一个小小的电机能有15KG的扭力。

二、舵机控制方法:

舵机的伺服系统由可变宽度的脉冲来进行控制,控制线是用来传送脉冲的。脉冲的参数有最小值,最大值,和频率。一般而言,舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。舵机有最大转动角度,中间位置的定义就是从这个位置到最大角度与最小角度的量完全一样。最重要的一点是,不同舵机的最大转动角度可能不相同,但是其中间位置的脉冲宽度是一定的,那就是1.5ms。如下图:
角度是由来自控制线的持续的脉冲所产生。这种控制方法叫做脉冲调制。脉冲的长短决定舵机转动多大角度。例如:1.5毫秒脉冲会到转动到中间位置(对于180°舵机来说,就是90°位置)。当控制系统发出指令,让舵机移动到某一位置,并让他保持这个角度,这时外力的影响不会让他角度产生变化,但是这个是由上限的,上限就是他的最大扭力。除非控制系统不停的发出脉冲稳定舵机的角度,舵机的角度不会一直不变。
当舵机接收到一个小于1.5ms的脉冲,输出轴会以中间位置为标准,逆时针旋转一定角度。接收到的脉冲大于1.5ms情况相反。不同品牌,甚至同一品牌的不同舵机,都会有不同的最大值和最小值。一般而言,最小脉冲为1ms,最大脉冲为2ms。如下图:

三、小总结:

首先是舵机的引线,一般为三线控制(没有接触过不是三线的),红色为电源,棕色为地,黄色为信号。控制舵机的时候,需要不断的给PWM波才能使得舵机在某个角度有扭矩。

Filed under: 单片机 Comments Off
6Jun/16

mini osd 手动接isp引脚刷bootloader

Posted by Nick Xu

发现mini osd很容易出问题, 第一次刷了对应f3飞控的osd后用了几次就没有osd信息了, 只有图像, 后来又刷了一次, 结果还是用几次后又没了, 而且这次还无法用USB2TTL线刷系统, 听说只能用ISP线来刷单片机, 结果发现这MINI OSD根本没有接上ISP的引脚, 又不知道哪个才是ISP引脚, 找了N久, 在即将要放弃时, 终于找到了ISP引脚图(其实最重要的只是这张图, 其它都是次要)

 

MINI OSD ISP 引脚标注图, 触点很小, 接线时小心, 别短路了.

BOOTLOADER FLASH

下图是我的接线, 这是已经刷完BOOTLOADER后测试刷OSD系统了

IMG20160603223727

然后就是刷BOOTLOADER了, 当然你得先有ISP刷写器,我是USBasp刷写器, 装progisp1.72, 懒得打字了, 直接看图吧, 从论坛上找过来的

522F9946-4E0F-4922-991D-28FA57CDB229

第四步, 固件位置在 arduino-1.0.1\hardware\arduino\bootloaders\atmega\ATmegaBOOT_168_atmega328.hex ,根据自己的arduino安装目录找吧

刷完BOOTLOADER就回到 arduino 刷OSD系统吧.

貌似手动刷了BOOTLOADER后变稳定了, 不会出现用几次就无法显示osd信息的情况, 估计是出厂时预刷有问题或者是出厂BOOTLOADER有问题. 还有一种可能是我的USB2TTL前两次刷的时候是跳线到3.3v而不是5v, 虽然接线还是接到5v的位置, 不过目前已无法考究具体是哪个原因导致的了.

 

 

Filed under: 其它, 单片机 Comments Off
9Feb/14

Cubietruck 安装lubuntu笔记

Posted by Nick Xu

系统下载地址: http://dl.cubieboard.org/software/a20-cubietruck/lubuntu/

其它下载地址: http://cubieboard.org/download/

线刷工具: http://docs.cubieboard.org/downloads

默认用户名密码linaro:linaro

Configuration

Install tools and change default setting

#sudo passwd root
#sudo apt-get install -y bash-completion vim tmux
#sudo apt-get install -y build-essential make gcc g++ git-core x11vnc

#ls /sys/class/leds/*/brightness | xargs -i -n1 echo "echo 0 > {}" | sh
#locale-gen en_US.UTF-8
#dpkg-reconfigure locales
#echo "export LC_ALL=en_US.UTF-8" >> /etc/profile
#echo "auto eth0:1" >> /etc/network/interfaces
#echo "iface eth0:1 inet static" >> /etc/network/interfaces
#echo "address 192.168.2.123" >> /etc/network/interfaces
#echo "netmask 255.255.255.0" >> /etc/network/interfaces
#echo bcmdhd >> /etc/modules

 

VNC

#vi /etc/init/x11vnc.conf

start on login-session-start
script
x11vnc -display :0 -auth /var/run/lightdm/root/:0 -forever -bg -rfbport 5900
end script

#reboot

Set Time Zone/DateTime

1.Set time zone

  $sudo tzselect

Select the Asia , press Enter and chose China ,at last selet Beijing.

2. Cope file to /etc directory

  $sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

3. Update time

  $sudo ntpdate time.windows.com

Set keyboard language

To be defined ….

Flashplayer

Download the flashplayerarm,type:

$tar zxvf flashplayerarm.tar.gz  
$sudo cp libpepflashplayer.so /usr/lib/chromium-browser/plugins
$sudo cp default /etc/chromium-browser

Wifi

CB1 and CB2 do not integraed wifi chip on board ,but we can use USB WIFI. Make sure the wifi driver you use have been loaded. If not ,use

  $insmod /lib/modules/3.4.XX/kernel/drivers/net/wireless/XXX.ko

CB3(cubietruck) has Integrated wifi chip .

Type : modprobe bcmdhd to load the driver .

Add "bcmdhd" at the end of file /etc/modules to activate WiFi during boot. For ecample with Lubuntu Desktop:

  $sudo nano /etc/modules

Configure wifi at cubieboards and cubietruck the same way as descibed her:

  $apt-get install linux-firmware
  $reboot
  $ifconfig wlan0 up   //open the wifi ,maybe wlan1 ..
  $iwlist wlan0 scan   //scan the wifi signal
  $wpa_passphrase SSID passwd >> /etc/wpa_supplicant.conf  // the SSid is name of signal want to be used
  $vi /etc/network/interfaces

Add below configuration to /etc/network/interfaces

  auto wlan0
  iface wlan0 inet dhcp
  wpa-conf /etc/wpa_supplicant.conf

Add below configuration to /etc/resolv.conf

  nameserver 8.8.8.8

Reboot the cubieboard,auto gain the IP.

Setting CPU Frequency

Cubieboard CPU frequency can be adjusted in real time, , the following file save as shell file, or placed in / etc / rc.local before the exit 0 can be executed. Specific CPU frequency maximum and minimum values ​​can be set based on usage .

  #!/bin/sh
  echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
  echo 1000000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
  echo 600000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
  echo 25 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold
  echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor

After testing, Cubieboard single core version (A10) CPU frequency can be overclocked to 1.2GHz, stable operation (would be better to stick a CPU heatsink); Cubieboard dual-core version (A20) can also be overclocked to 1.2GHz

Developing

Using serial debug port

The tutorial how to use TTL cable: http://linux-sunxi.org/Cubieboard/TTL

Install the tool name minicom in your computer:

  $sudo apt-get install minicom

Set the minicom configuratiaon, TTL and cubieboard are connected ,then minicomin the terminal ,enter into the console.

Installing target Toolchains

  $sudo apt-get update
  $sudo apt-get upgrade
  $sudo apt-get install vim build-essential git libusb-1.0-0-dev pkg-config -y

Hardware Testing

The best way to test hardware is install the office firmware from http://dl.cubieboard.org and usr office fitting fromhttp://docs.cubieboard.org/addons,which can find the problem quickly you met. Of course ,you should save the data before reinstall firmware.

LEDs On Cubieboaed

These are blue LED1 meaning heartbeat and green LED2 on cb1 and cb2. LED1 - GPIO port PH21, LED2 - GPIO port PH20.
These are LED1~4 on cb3(cubietruck). LED1 - PH21, LED2 - PH20,LED3 - PH11,LED4 - PH07.Refer to FAQ about cubietruck 
For cb1 and cb2:

  $echo 1 > /sys/class/gpio/export   //open the PH20
  $echo 2 > /sys/class/gpio/export   //open the PH21

The directories /sys/class/gpio/gpio1_PH20 and/sys/class/gpio/gpio2_PH21 had been create .

  $cd /sys/class/gpio /gpio1_PH20
  $echo out > direction    //set PH20 as output
  $echo 1 > value          //set PH20 as high ,grenn LED is light
  $echo 0 > value          //set PH20 as low,turn off the LED

HDMI

It would be best way connect the HDMI cable before power on the cubieboard,becuse some cable maybe appear the promble of sequence in time.
If your have not full screen display, you can try the following commands

$fbset -left 10

1.If you are using lubuntu, try the following commands

$wget http://dl.cubieboard.org/software/tools/armhf/cb-display-tool
$chmod 777 cb-display-tool
$cb-display-tool -o 8 -m 11  //switch to VGA type
$cb-display-tool -o 4 -m 4  //switch to HDMI type

If you switch to other resolution, you need to restart your X after the modification

2.The default display configuration in script.bin of uboot partition of official desktop-firmware as :

;disp init configuration
;
;disp_mode            (0:screen0<screen0,fb0> 1:screen1<screen1,fb0> 2:two_diff_screen_diff_contents<screen0,screen1,fb0,fb1>
;                      3:two_same_screen_diff_contets<screen0,screen1,fb0> 4:two_diff_screen_same_contents<screen0,screen1,fb0>)
;screenx_output_type  (0:none; 1:lcd; 2:tv; 3:hdmi; 4:vga)
;screenx_output_mode  (used for tv/hdmi output, 0:480i 1:576i 2:480p 3:576p 4:720p50 5:720p60 6:1080i50 7:1080i60 8:1080p24 9:1080p50 10:1080p60 11:pal 14:ntsc)
;screenx_output_mode  (used for vga output, 0:1680*1050 1:1440*900 2:1360*768 3:1280*1024 4:1024*768 5:800*600 6:640*480 10:1920*1080 11:1280*720)
;fbx format           (4:RGB655 5:RGB565 6:RGB556 7:ARGB1555 8:RGBA5551 9:RGB888 10:ARGB8888 12:ARGB4444)
;fbx pixel sequence   (0:ARGB 1:BGRA 2:ABGR 3:RGBA) --- 0 for linux, 2 for android
;lcd0_bright          (lcd0 init bright,the range:[0,256],default:197
;lcd1_bright          (lcd1 init bright,the range:[0,256],default:197

[disp_init]
disp_init_enable = 1
disp_mode = 0
screen0_output_type = 3
screen0_output_mode = 4
screen1_output_type = 0
screen1_output_mode = 4
fb0_width = 1024
fb0_height = 768
fb0_framebuffer_num = 2
fb0_format = 10
fb0_pixel_sequence = 0
fb0_scaler_mode_enable = 0
fb1_width = 1024
fb1_height = 768
fb1_framebuffer_num = 2
fb1_format = 10
fb1_pixel_sequence = 0
fb1_scaler_mode_enable = 0

Modify the parameter according to the using HDMI displayer . You can get more information about display from Display and modify script.bin from edit_the_system_configuration

VGA

Refer to HDMI section.

USB Host

The quickly way to test the interface of USB is plug the U disk . The system will identify the U disk .Use fdisk -l can see its information which meaning the interface of USB is working.

IR

IR had beed add into the kernel .If not, use command to load the moudle:

  $insmnod /lib/modules/3.4.X/kernel/drivers/input/keyboard/sun4i-ir.ko
  $sudo cat /dev/input/event0 | hexdump

Press the key of IR remote control,the terminal will print the message as:

0000000 8415 525f 50cf 0003 0001 0094 0001 0000
0000010 8415 525f 50db 0003 0000 0000 0000 0000
0000020 8415 525f 22f7 0007 0001 0094 0000 0000
0000030 8415 525f 22ff 0007 0000 0000 0000 0000

The digital '0094' is keycode of the remote control .

Headphone Jack

There are two audio devices HDMI and headphone in the cubieboard.

  $sudo  alsamixer

There are two audio devices named sunxi-sndhdmi and sunxi-CODEC in the system. The sound output is send out from HDMI by default . You can adjust volume and other configuration ,use Ctrl + z to save it.
alsamixer GUI

To set sound care being sunxi-CODEC modify /etc/asound.conf to turn on the headphone.

  pcm.!default {
    type hw
    card 0    //If you want to set HDMI as output ,turn 0 to 1.
    device 0
  }
  ctl.!default {
    type hw
    card 0   //If you want to set HDMI as output ,turn 0 to 1.
  }

If Plug in the headphone and type:

  $speaker-test -twav -c2

The sound "sound left,sound right,sound left" will output from headphone.

Let cubieboard speak by package named espeak :

  $sudo apt-get install espeak
  $espeak "hello"            //say: hello
  $espeak "hello_cubieboar"  //say: hello cubieboard

Camera

Most of the camera driver has integrated in the kernel,so it is available insert usb-camera into the cubieboard.

$sudo apt-get install luvcview
$luvcview -s 1080x720 (can modify the resolution)
14Feb/13

Eclipse和单片机开发环境Keil的集成编译工具KeilMake源码

Posted by Nick Xu

Eclipse和单片机开发环境Keil的集成编译工具KeilMake

通过KeilMake可以在Eclipse上进行单片机开发且编译

这个东东是为了通用而到网上抄一些需要用到的代码做出来的东东,估计很多代码是可以换成一两句话可以解决问题的. 最近经常有人找我问这个工具的问题,但是我已经不搞单片机好多年,所以把源码放出来,让有心人来维护吧:)

代码已经更新到github上,有需要的请自行下载和修改吧,为了能造福更多人群,希望改进后的代码能继续更新到github上,让更多人一起学习和研究

https://github.com/qdog2012/keilmake

25May/10

使用Keil的命令行编译C51源码并生成HEX文件的示例

Posted by Nick Xu

参考KeilC51HLPC51.pdf以及A51.pdf文档,示例及说明如下:
set PATH=%PATH%;G:developkeilC51BIN;G:developkeilC51INC;G:developkeilC51LIB
set C51_LIB=G:developkeilC51LIB
(注:其中的G:developkeil目录要改成本机安装keil的位置)
set DST_NAME=objoutput (注:指定输出文件名)
set DIR=D:source (注:指定源文件所在目录)

echo 转向工作目录
d: (注:源文件所在区)
cd %DIR%

echo 编译文件...
c51 a.c
c51 b.c
c51 c.c
c51 d.c

md obj
echo 链接目标文件...
BL51 %C51_LIB%C51s.lib,a.obj,b.obj,c.obj,d.obj,EXTERN_LIB.obj TO %DST_NAME% RAMSIZE(256) CODE(?CO?c(FC00H), ?CO?d(FFD0H))
(注:EXTERN_LIB.obj文件是已经编译好的obj文件,用于编译部分模块只有目标代码的项目,RAMSIZE等是一些链接设置,详细信息请参 考C51HLPA51.pdf)

echo 生成HEX文件...
OH51 %DST_NAME%

echo 编译结束
cd

Tagged as: , , No Comments
25May/10

Eclipse和单片机开发环境Keil的集成编译工具KeilMake 使用详细教程

Posted by Nick Xu

Eclipse和单片机开发环境Keil的集成编译工具KeilMake
通过KeilMake可以在Eclipse上进行单片机开发且编译
使用方法:
配置Eclipse中项目Builder Settings的编译命令为
D:MyWorkSCMKeilMakeReleaseKeilMake D:MyWorkDevToolscommandkeilAT89S52.Uv2 ${ProjName} ${ProjDirPath} C:KeilUV2uv2.exe

红色部份修改为程序相应的路径即可,在Eclipse中写完程序后按Ctrl+B即可编译

AT89S52.Uv2 是Keil项目的模板文件,可根据个人需要进行修改,自带的模板配置是
AT89S52芯片,晶振为24Mhz,自动生成Hex文件

近期本人使用Keil进行单片机程序开发,感觉超不爽,在微软长期毒害下,我相信大部分跟着VS做开发的人们都对微软IDE的智能过于依赖。所以最 终我选择了Eclipse,虽然和微软的IDE相比还是有很大差距,不过对于我要做单片机开发的工作应该也可以满足了。在网上并没有找到Eclipse和 Keil可以很好集成在一起的插件,无而之下只好自己动手,搞搞科研了。

KeilMake就是这次的科研成果了,现与大家共同分享。

如果你的芯片和我现在用的一样是AT89S52,24Mhz,那么直接按照上面的方法即可使用,下面的内容可以略过。

如果是其它芯片,又和我一样想用Eclipse来进行单片机开发,那么请跟着我一步一步的操作。

环境安装,安装好Keil和Eclipse下面是我安装两个软件的版本

最新片Eclipse可以到这个地址 www.eclipse.org/downloads/ 下载C/C++版本的即可。

两个软件都安装好后我们就可以开始建立Keil模板了。

首先我们要知道自己的芯片的型号等信息,这里以举个AT89S52的例子,首先在Keil创建一个新项目

我们把项目文件保存为 stc89c52.Uv2 等会需要用到这个文件

CPU类型选择Atmel下面的AT89S52

新增加一个TEST.C的文件,内容空白就行了,因为我们不是在写代码,我们只是创建模板。

点击上面框框中的按钮对项目进行设置。

输入晶振的频率,我这块芯片是24MHz的。

设置生成时创建16进制文件,格式选择HEX-80

接下来用记事本打开刚才我们创建的项目文件 stc89c52.Uv2 留意红色框框的地方,这两个地方是我们需要修改的

File 1,1,<.test.c><test.c> 0x0  修改为 {CodeList}

stc89c52 修改为 {FileName}

完成上面步骤后,模板就创建完成了,我们把 stc89c52.Uv2 复制到别的地方,我放到D:MyWorkDevToolscommandkeil下

我把KeilMake.exe也放到这里了,这个不是必要的,我只是为了方便而已。

好了,现在到Eclipse了,如果在Eclipse上创建Keil项目呢?这里需要更正一个问题,我们不需要在Eclipse上创建Keil项 目,只要创建C项目就可以了,因为 KeilMake.exe 的工作就是把Eclipse上创建的C项目拿到Keil下去编译生成。

创建一个C项目

项目名称:testKeilProject

这里项目类型我选择Empty Project是因为我不需要用到MinGW GCC的类库,所以我选择空项目,然后Toolchains选择Other Toolchain,这一步我们可以直接点击Finish了。

现在到了最关键的设置时刻了,打开项目属性设置窗口。

Build command的值:D:MyWorkDevToolscommandkeilKeilMake.exe D:MyWorkDevToolscommandkeilstc89c52.Uv2 ${ProjName} ${ProjDirPath} C:KeilUV2uv2.exe

下面我们解释一下这行命令的意思

D:MyWorkDevToolscommandkeilKeilMake.exe KeilMake的路径。

D:MyWorkDevToolscommandkeilstc89c52.Uv2 我们刚才创建的Keil模板,以后只要是使用相同芯片做开发就可以使用这个模板。

${ProjName} 是Eclipse中的生成变量,是Eclipse里的项目名称,生成的HEX就是以这个值来命名。

${ProjDirPath} 是Eclipse中的项目目录

C:KeilUV2uv2.exe 是Keil的主程序路径

还有这里红色框框要留空,原值是all

点击File system按钮选择Keil目录下的c51inc目录

完成这一步后,基本上都完成了,我们来写一个程序测试一下。

Eclipse的自动完成功能

很简单的代码,来测试一下编译功能CTRL+B,记得要先保存再按CTRL+B,我刚开始时经常范这个错,所以代码没有编译到。

红色框框是编译生成输出的信息,看到

0 Error

creating hex file from "stc89c52"

这两行就是程序已经编译完成,在项目目录下会看到 stc89c52.hex 文件,把这个文件刷到单片机上试试看?

KeilMake是我学C语言的第一个程序,可能会存在一些BUG,如果使用过程中遇到什么问题,请随时和我联系,可发邮件到我的邮 箱:nick#workao.org 把#换为@

完。

附 KeilMake 下载地址:

KeilMake

25May/10

单片机 常用到的查询资料整理

Posted by Nick Xu

中断优先级及原理图

IE.0 0 外部中断0
IE.1 1 定时器0 溢出
IE.2 2 外部中断1
IE.3 3 定时器1 溢出
IE.4 4 串口中断
IE.5 5 定时器2 溢出

TCON

IT0(TCON.0),外部中断0触发方式控制位。
当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1),外部中断0中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
IE1(TCON.3),外部中断1中断请求标志位。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
TF1(TCON.7),定时/计数器T1溢出中断请求标志位。

SCON

RI(SCON.0),串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。
TI(SCON.1),串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。 CPU响应中断时,不能自动清除TI,TI必须由软件清除。

IE

EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断0允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7), CPU中断允许(总允许)位。

IP

PX0(IP.0),外部中断0优先级设定位;
PT0(IP.1),定时/计数器T0优先级设定位;
PX1(IP.2),外部中断0优先级设定位;
PT1(IP.3),定时/计数器T1优先级设定位;
PS (IP.4),串行口优先级设定位;
PT2 (IP.5) ,定时/计数器T2优先级设定位。

IPH

PX0(IPH.0),外部中断0优先级设定位;
PT0(IPH.1),定时/计数器T0优先级设定位;
PX1(IPH.2),外部中断0优先级设定位;
PT1(IPH.3),定时/计数器T1优先级设定位;
PS (IPH.4),串行口优先级设定位;
PT2 (IPH.5) ,定时/计数器T2优先级设定位。

工作方式寄存器TMOD

低四位用于T0,高四位用于T1
GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或 TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。
C/T:定时/计数模式选择位。 =0为定时模式; =1为计数模式。
M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。

控制寄存器TCON

TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作 时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/ 计数器的启动与停止。
TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
TR0(TCON.4):T0运行控制位,其功能与TR1类同。

定时/计数器的工作方式0原理图

方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的 TF0标志,向CPU发出中断请求。

定时器模式时有:N=t/ Tcy
计数初值计算的公式为:
定时器的初值还可以采用计数个数直接取补法获得。
计数模式时,计数脉冲是T0引脚上的外部脉冲。

门控位GATE具有特殊的作用。当GATE=0时,经反相后使
或门输出为1,此时仅由TR0控制与门的开启,与门输出1
时,控制开关接通,计数开始;当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TR0共同控制。当TR0=1 时,外中断引脚信号引脚的高电平启动计数,外中断引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。
定时/计数器的工作方式1原理图

方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器 。

定时/计数器的工作方式2原理图

方式2为自动重装初值的8位计数方式。

定时/计数器的工作方式3原理图

方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。 工作方式3将T0分成为两个独立的8位计数器TL0和TH0 。

RS-232C标准接口主要引脚定义

RS232C电平与TTL电平转换驱动电路

80C51串行口的结构

SCON

SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到 的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均 可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。
在方式0时,SM2必须是0。在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。

REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。

TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志 位。
在方式0和方式1中,该位未用。

RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止 位。

TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申 请。在中断服务程序中,必须用软件将其清0,取消此中断申请。

RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申 请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。

PCON

SMOD(PCON.7) 波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。

串口方式0的输出

串口方式0的输入

串口方式0的电路图

串口方式1数据格式

串口方式1的输出

串口方式1的输入

用软件置REN为1时,接收器以所选择波特率的16倍速率采样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入 输入移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移 位。当RI=0,且SM2=0(或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置 RI=1,向CPU请求中断。

串口方式2和3数据格式

方式2或方式3时为11位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚 。
方式2和方式3时起始位1位,数据9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位,一帧数据为11位。方式2的波 特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器T1的溢出率决定。

串口方式2和3的输出

发送开始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位, 并由TXD引脚输出。
第一次移位时,停止位“1”移入输出移位寄存器的第9位上 ,以后每次移位,左边都移入0。当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置TI=1,向 CPU请求中断。

串口方式2和3的输入

接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的第9位数据为 1)时,接收到的数据装入接收缓冲器SBUF和RB8(接收数据的第9位),置RI=1,向CPU请求中断。如果条件不满足,则数据丢失,且不置位RI, 继续搜索RXD引脚的负跳变。

波特率的计算

方式0的波特率 = fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)
T1 溢出率 = fosc /{12×[256 -(TH1)]}

串口初始化步骤

确定T1的工作方式(编程TMOD寄存器);
计算T1的初值,装载TH1、TL1;
启动T1(编程TCON中的TR1位);
确定串行口控制(编程SCON寄存器);
串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。

单片机与单片机通信电路图

25May/10

Proteus 7 Professional 仿真51 单片机入门教程

Posted by Nick Xu

Proteus 7 Professional 仿真51 单片机入门教程
初学单片机时,拿着一块实验板发呆,电路也不懂、程序也不懂,
只好慢慢弄,等弄懂了,实验板也差不多报销了。而proteus 正好可
以解决这个问题,它功能强大,这里只讨论仿真MCU 的功能。它可
以在原理图上仿真,不用出PCB 板,不怕你“啥弄”。
下面就先认识一下proteus.

上图是启动后的画面。
我们点中的“P”后,弹出下面的画面:

里输入at89c51 后:

右侧出现AT89C51,双击它,左侧空白框中出现AT89C51.

左键单击它,它上面框中显示出它的原理图,把鼠标移到右侧框
中,鼠标变成铅笔形状,单击左键,框中出现一个AT89C51 原理图
的轮廓图,可以移动。鼠标移到合适的位置后,按下鼠标左键,原理
图放好了。

好了,一个单片机的原理图放好了。按这个方法依次把元件
led-red、res 放到右侧的框中(单片机旁)。

这张图太小了,看得不清楚,要是大的就好了。别着急,把鼠标
放在LED 旁,向前滚动鼠标中键,图像放大,向后滚动鼠标,图像
缩小。如果你的鼠标没这个键,你可以试试上面工具栏上这二
个图标,也是一样的。
选择左侧工具栏上的“箭头”图标,

把鼠标移到右侧的原理图中,鼠标经过元件时会就成“手形”,

把鼠标移到LED-RED 上,按下左键,LED-RED 高亮显示,鼠
标变成“手形”并带有方向键头。松开鼠标后,形状没变,指着
LED-RED 按住鼠标左键,移动鼠标,哈哈!元件移动了。好了,现
在你应该明白它们了吧!不用我说你应该明白刚才用到的工具的作用
了。
在任何情况下,右键单击元器件时,元件会亮显示并弹出菜单:

非常直观,都是一些一目了然的图标。从上到的几个菜单分别是:
移动物体、编辑属性、删除物体、顺时针旋转90 度(后面几个就不
用说了吧)。单击鼠标左键操作。当元件高亮显示时,再右键击它,
会删掉它。
把原理图中的元件摆放好。

左键单击左侧工具栏上的元件图标,把鼠标移到LED-RED
引脚上,引脚上高亮的小方框,单击左键,有一条绿色的线拉出来了。

把它移动到电阻上的引脚上,当有个高亮的小方框出现时按下左
键,一条线画好了。

我们把线画成下图的情形:

在电阻R1 没有选择时,左键双击电阻,弹出电阻的属性:

好了,现在在电阻的前面加上一个5V 的电压,这部份电路就绘
制好了。点击左侧terminals 图标:

选择POWER放置并连接好电阻:

单片机电路暂时不讲解了,因为就这样也可以仿真。我们现在可
以来点亮LED 了,只要把程序下载到单片机中就可以了。哦!忘了,
你可能还不会写程序,没关系,下面就讲keil:
把proteus 保存在test 文件夹中,命名为led.dsn.启动keil 后显
示如下:

选择上方的project 菜单选择New Project,保存在test 文件夹中,
命名为ledc51。弹出cpu 选项,选择Atmel 中的At89c51:

弹出菜单后选择”是” :

点击图 标,现在可以编写程序了,我们编写如下代码:

保存为led_demo.c.左边的Source Group1 文件夹图标上右击,
在弹出的菜单中选择,如下图所示

c 程序加进来了,马上就要生成proteus 中需要的文件了。我们先配置
一下keil:

就配置这些,其它的以后再讲,先把LED 亮起来。

左键单击图标:

看到了吗?

激动人心的时刻就要到来,打开刚才的proteus 文件,左键双击
At89c51 元件:

开始仿真

左键单击,没有看到灯亮呀,哎!电阻太大了,我们把电阻改
成330,左键单击

LED 亮了,好高兴呀。我们现在要让LED 灭该如何改程序呢?

左键单击图标,keil————编译
再按仿真图标,灯灭了:

是不是很简单呢?恭喜你入门了!
限于时间的关系,就写这么多。学会这些当然只是懂一点皮毛,后面
的路还很长。

25May/10

Protel 99 se 简体中文第六版(含第二版)下载

Posted by Nick Xu

第一,运行setup.exe安装 Protel 99 se
s/n:Y7ZP-5QQG-ZWSF-K858
第二, 再安装Protel 99 se service pack 6 简体中文第六版
(运行Protel99SP6protel99seservicepack6.exe)
第三,汉化安装(Protel99汉化)
1, 安装中文菜单
将附带光盘中的client99se.rcs复制到windows根目录中。
说明:在复制中文菜单前,先启动一次Protel99se,关闭后将windows根目录
中的client99se.rcs英文菜单保存起来。
2, 安装PCB汉字模块
将附带光盘中pcb-hz目录的全部文件复制到Design Explorer 99 se根目录中,
注意检查一下hanzi.lgs和Font.DDB文件的属性,将其只读选项去掉。
3, 安装国标码、 库
将附带光盘中的gb4728.ddb(国标库)复制到Design Explorer 99 se/
library/SCH目录中,并将其属性中的只读去掉。
将附带光盘中的Guobiao Template.ddb(国标模板)复制到Design
Explorer 99 se 根目录中,并将其属性中的只读去掉。
汉化完成.OK!
4, 安装orCAD转换程序(如果需要的话)
将附带光盘中orCAD-Protel目录中的全部文件复制到Design Explorer 99 se
根目录中。

下载地址:

http://www.w78.cn/Software/Catalog177/791.html

<br>

site
site