VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 25309|回复: 45

谁说单片机不能用VB语言? — BASCOM AVR 简介

[复制链接]
 楼主| 发表于 2007-10-5 10:38:53 | 显示全部楼层 |阅读模式
经常看到论坛上的一些朋友说,单片机用BASIC写是不可能的!今天就发发这方面的东东,让大家开拓一下眼界:


出处:星火单片机网
http://www.tongxin8.com/AVR/2960.shtml

PS:里面的图没了,为大家看时的不方便感到抱歉。

BASCOM-AVR入门第一例

    提到BASCOM-AVR就先要从BASIC说起,BASIC语言就是初学者通用符号指令代码。它很接近于人类语言、像英语、好学、好记。QBASIC语言是微软开发的产品,它并不是正中的BASIC血统,它与最初的BASIC有着非常相似的地方,但是它强大的功是第一代的BASIC难以实现的, 还有,因为它是出自微软门下,所以它就成了事实上的BASIC标准。Visual Basic是微软近年来的产品,相信大家没有学过它都应该听说过不少吧?这个我就不敢多说了,因为我也没有学过。 BASCOM-AVR编译器的语法高度兼容微软的QB、VB语言,具有界面友好、自带仿真、下载控制等功能。它针对单片机特有资源,集成了很多通用实用的强大语句,如LCD语句、各种通信接口语句等。当然,任何一个软件都具有不尽人意的地方 ,BASCOM-AVR也不另外,它是共享软件,它的免费版只能产生小于4K的代码,但是4K代码对于学习AVR单片机以及控制ATmega48、ATtiny26、ATtiny13等芯片是绰绰有余的 ,还有,它也具有一般软件的BUG,但是,只要你勇于发现与思考,你同样也可以设计出满意的程序的 。话也说回来来,我对BASCOM的了解也只不过是一点点而已,它的更多细节有待大家的不断发现和应用。 
    另外也提一下BASCOM-8051,它和BASCOM-AVR一样都是同一个公司的产品,它们在很多方面都基本上是相同的,由于有些型号的51单片机比AVR的单片机具有价格上的优势,再加上有不少的爱好者都接触过51单片机,所以学习一下BASCOM-8051也是不无好处的 。

    下面让我们来编写一个最简单的例子,就是让ATmega88单片机的‘PC5’引脚驱动LED,并且不断闪烁,频率为1Hz ,首先,新买的ATmega88的振荡源是默认的内部RC振荡电路,频率是1MHz ,我们只要把芯片接上5V电源,第28脚接上LED的正负极均可,但是LED的另外一个脚就要接上电源相应的负极或者正极,其它的脚悬空就可以了,不过,LED最好串联一个100~1K的限流电阻,下面是详细代码:

' **********************************************************************************
' 最左边的这个上标的小点表示它后面的文字是注释语句,编译时不产生代码,直到转行为止
' 注意,所有语句代码的标点符号请用英文标点符号
' **********************************************************************************
' www.avrdiy.com
' 最后修改时间:2006-02-20
' 编译器软件:BASCOM-AVR 1.11.8.1
' 软件说明:入门第一例:闪烁的LED
' **********************************************************************************
$regfile = "m88def.dat" ' 定义目标单片机是ATmega88
$crystal = 1000000      ' 定义单片机时钟周期是1000000Hz
DDRC.5 = 1              ' 定义PC5端口作为输出
Led:                    ' 语句行标号,后面以冒号结尾,在编译器的标签栏Label可以看到
    PORTC.5 = 1         ' 定义PC5口输出高电平
    Waitms 500          ' 等待500ms秒钟
    PORTC.5 = 0         ' 定义PC5口输出的电平
    Waitms 500
Goto Led                ' 无条件转移到Led标签处继续运行
End                     ' End是主程序结束语句 

    如果大家手头上还没有可以试验的工具的话并不要紧,我们同样也可以在软件的仿真界面看到运行的模拟结果。首先,让我们运行BASCOM-AVR程序,把上面的代码复制到编译的窗口,界面如下:


图1

    然后点击编译按钮,出现保存位置选项,假设我们保存在 “闪烁的 LED” 文件夹,名字叫noname1,则如图:


图2

    选择保存后,将出现以下画面:


图3

    如果顺利通过的话,软件不会出现其它提示,并且返回 主界面,然后我们在文件夹可以看到已经产生了noname1.hex文件,这个就是我们要的烧写文件,确定最终代码大小的文件是noname1.bin文件。

    现在我们来打开仿真窗口,点击软件仿真按钮,出现以下窗口,并且点击绿色的“LCD”按键和有一个键盘模样的那个按键,再点击那个三角形的运行按键,看,单片机的PC5端口红色小灯是不是一闪一闪的?


图4

    好了,现在,我们应该对BASCOM-AVR有了初步的了解吧?不过,很多人说要少用 goto 语句,那我们可以写成下面的代码:

$regfile = "m88def.dat" ' 定义目标单片机是ATmega88
$crystal = 1000000      ' 定义单片机时钟周期是1000000Hz
DDRC.5 = 1              ' 定义PC5端口作为输出
Do
    PORTC.5 = 1         ' 定义PC5口输出高电平
    Waitms 500          ' 等待500ms秒钟
    PORTC.5 = 0         ' 定义PC5口输出的电平
    Waitms 500
Loop
End                     ' End是主程序结束语句  

[ 本帖最后由 VBProFan 于 2007-10-5 10:54 编辑 ]
 楼主| 发表于 2007-10-5 10:43:17 | 显示全部楼层
出处:宜昌AVR单片机
http://www.ycavr.cn/ShowPost.asp?ThreadID=26

BASCOM:关于软串口接收字符串

在BASCOM中,可以用以下语句定义一个软串口:
---------------------------------------------
Open "comd.1:19200,8,n,1" For Output As #1
Open "comd.0:19200,8,n,1" For Input As #2
---------------------------------------------
在BASCOM的例程中,定义个Byte变量"B"来接收字符,该例程我调试通过了,接收字符的方式是:
---------------------------------------------
B = Inkey(#2)
---------------------------------------------

例程中也同样用了INPUT语句来接收字符:
--------------------------------------------
Input #2 , B
--------------------------------------------

可是我想接收一个字符串,于是我修改例程,将变量B声明为字符串变量:
--------------------------------------------
dim B as string * 10
--------------------------------------------

然后用 INPUT #2 , B的方法,接受字符串失败.

BASCOM中关于用OPEN定义软串口的帮助文件中,有一断是说:
The INPUT statement in combination with the software UART, will not echo characters back because there is no default associated pin for this.

那么,我到底应该用什么方法来用软串口一次接收一个字符串呢?

2006-3-29:
.经过BASCOM论坛上的高手指点,已经搞定.
原因:软串口不能同时收发,在发送的时候就会丢失接收缓冲区内的数据.
解决方案:自定协议,规定起始字符和结束字符作为判定标准,接收完后才能发送.
Sample Code:
已经搞定---BASCOM:关于软串口接收字符串

在BASCOM中,可以用以下语句定义一个软串口:
---------------------------------------------
Open "comd.1:19200,8,n,1" For Output As #1
Open "comd.0:19200,8,n,1" For Input As #2
---------------------------------------------
在BASCOM的例程中,定义个Byte变量"B"来接收字符,该例程我调试通过了,接收字符的方式是:
---------------------------------------------
B = Inkey(#2)
---------------------------------------------

例程中也同样用了INPUT语句来接收字符:
--------------------------------------------
Input #2 , B
--------------------------------------------

可是我想接收一个字符串,于是我修改例程,将变量B声明为字符串变量:
--------------------------------------------
dim B as string * 10
--------------------------------------------

然后用 INPUT #2 , B的方法,接受字符串失败.

BASCOM中关于用OPEN定义软串口的帮助文件中,有一断是说:
The INPUT statement in combination with the software UART, will not echo characters back because there is no default associated pin for this.

那么,我到底应该用什么方法来用软串口一次接收一个字符串呢?

2006-3-29:
.经过BASCOM论坛上的高手指点,已经搞定.
原因:软串口不能同时收发,在发送的时候就会丢失接收缓冲区内的数据.
解决方案:自定协议,规定起始字符和结束字符作为判定标准,接收完后才能发送.
Sample Code:
----------------------------------------------------------------------
$crystal    = 6000000 'change to the value of the XTAL you have installed
   
  Ucsr0b    = 0'disable the HW UART
   
  Dim  B  As  Byte
  Dim  S  As  String  *  255
  Dim  I  As  Byte
  I    = 1
   
  Waitms  100
   
   
  Open  "comg.4  :9600,8,n,1"  For  Output  As  #1
  Print  #1    ,  "serial  output"
   
   
   
  Open  "comg.3  :9600,8,n,1"  For  Input  As  #2
   
  Print  #1,  "Number"
   
  Input  #2,  B
   
  Print  #1,  B
   
  Do
      B    = Inkey  (#2)
      If  B  >  0 Then
          If  B    = "0"  Then  I    = 1'"0" is start word
          If  B    = "9"  Then    Print  #1    ,  S ' "9"is stop word
          Incr  I
          Mid  (s, I, 1)    = Chr(b)
      End  If
      
  Loop
   
   
  Close  #2
  Close  #1
  End

[ 本帖最后由 VBProFan 于 2007-10-5 12:36 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-5 10:46:23 | 显示全部楼层
出处:www.basicavr.com
http://www.basicavr.com/watchdog.htm

watchdog看门狗试验

   AVR单片机的内部资源非常丰富,其中看门狗watchdog对于提高单片机的抗干扰有很大的帮助,下面这个例子可以作为参考。

BASCOM中看门狗的使用,我编写了一个小demo程序,现在发到网上,希望对大家有所帮助
'------------------------------------------------------------------------
'使用芯片:  ATmega16,
'晶振:      内部8MHz晶振
'mail:      bascomavr@126.com
'软件版本:  Bascom-AVR 1.11.8.2 Full version
'------------------------------------------------------------------------
$regfile = "m16def.dat"
$crystal = 8000000
$noramclear                       '不初始化RAM,也就是不初始化全局变量
Config Watchdog = 2048            'reset after 2048 mSec
Start Watchdog
Config Porta = Output
Dim A As Byte

If Mcucsr = &H01 Then              '判断是否为上电复位
A = &HFF                           '如果是,给A赋初值
End If

A = Not A
Porta = A
Do
'Reset Watchdog
Loop
End

程序下载到芯片中运行,您可以看到A口所接的LED会在大约2秒钟闪动一次,说明看门狗复位动作被执行。
如除去Reset Watchdog的注释后,您可以发现LED就会停止闪烁。
使用$noramclear语句后,程序中的变量不会被初始化为0。需程序中手动赋值,但这时需通过mcucsr寄存器来确定复位原因,决定是否执行赋值语句。
如不使用$noramclear语句,不能在A口观察到led闪动,原因是每次程序开始运行前变量A都被清零。

 

如将程序改为
'------------------------------------------------------------------------
'使用芯片:  ATmega16,
'晶振:      内部8MHz晶振
'mail:      bascomavr@126.com
'软件版本:  Bascom-AVR 1.11.8.2 Full version
'------------------------------------------------------------------------
$regfile = "m16def.dat"
$crystal = 8000000

$noramclear                         '不初始化RAM,也就是不初始化全局变量

Config Watchdog = 2048              'reset after 2048 mSec
Start Watchdog
Config Porta = Output
Dim A As Byte
Dim B As Byte


If Mcucsr = &H01 Then                '判断是否为上电复位
A = &HFF                             '如果是,给A赋初值
End If

If B = 30 Then
Stop Watchdog
End If

Incr B
A = Not A
Porta = A
Do
Loop
End

看门狗复位30次后,就会关闭看门狗,A口的Led将不会再继续闪烁啦。

[ 本帖最后由 VBProFan 于 2007-10-5 10:50 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2007-10-5 13:34:02 | 显示全部楼层


太好了  好东西   就这个单片机支持   统统支持那才更好!
回复 支持 反对

使用道具 举报

jake_jrc 该用户已被删除
发表于 2007-10-5 14:39:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-5 16:28:08 | 显示全部楼层

回复 #4 半空烟雨 的帖子

AVR单片机比较流行啊,好多产商都为它做编译器,听说甚至还有Pascal语言的编译器,不过我没有找到。

8051也有BASIC编译器啊。

其实任何一种单片机都可以用任何一种语言编程,关键是有没有人做了这个编译器,有没有人愿意付出努力和心血去做这项工作。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-5 16:32:23 | 显示全部楼层

回复 #5 jake_jrc 的帖子

你是不是概念搞错了?IAR只做C/C++的编译器吧?只不过它为许多种类的单片机做C/C++的编译器。
回复 支持 反对

使用道具 举报

jake_jrc 该用户已被删除
发表于 2007-10-5 19:48:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

jake_jrc 该用户已被删除
发表于 2007-10-5 19:52:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2007-10-5 20:04:53 | 显示全部楼层
都是高手勒。!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-1-21 12:17

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表