博文

【010】单片机中编程的方法和技巧(2006-05-26 21:12:00)

摘要:选自《单片机原理及及接口技术(简明修订版)》(李朝青)
一、模块化的程序设计方法 1. 程序功能模块化的优点     实际的应用程序一般都由一个主程序(包括若干个功能模块)和多个子程序构成。每一程序模块都能完成一个明确的任务,实现某个具体功能,如发送、接收、延时、显示、打印等。采用模块化的程序设计方法,有下术优点:

    <> 单个模块结构的程序功能单一,易于编写、调试和修改;
    <> 便于分工,从而可使多个程序员同时进行程序的编写和调试,加快软件研制进度;
    <> 程序可读性好,便于功能扩充和版本升级;
    <> 对程序的修改可局部进行,其他部分可以保持不变;
    <> 对于使用频繁的子程序可以建立子程序库,便于多个模块调用。 2. 划分模块的原则     在进行模块划分时,应首先弄清楚每个模块的功能,确定其数据结构以及与其他模块的关系;其次是对主要任务进一步细化,把一些专用的子任务交由下一级即第二级子模块完成,这时也需要弄清楚它们之间的相互关系。按这种方法一直细分成易于理解和实现的小模块为止。
    模块的划分有很大的灵活性,但也不能随意划分。划分时应遵循下述原则:     <1> 每个模块应具有独立的功能,能产生一个明确的结果,这就是单模块的功能高内聚性。
    <2> 模块之间的控制耦合应尽量简单,数据耦合应尽量少,这就是模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换(传递)方式、交换量的多少及交换的频繁程度。
    <3> 模块长度适中。模块语句的长度通常在20条~100条的范围较合适。模块太长时,分析和调试比较困难,失去了模块化程序结构的优越性;过短则模块的连接太复杂,信息交换太频繁......

阅读全文(4054) | 评论:3

[058] 统计字符串中单词个数(2006-05-24 12:45:00)

摘要:《C程序设计(第二版)》 (谭) 字符数组练习: 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。

思路:
    程序中用i作循环变量, num统计单词个数, word作为判别是否是单词的标志,若word = 0 表示未出现单词, 如出现单词word置1。
    单词数目可由空格出现次数决定(连续若干空格作为出现一次空格;一行开头的空格不统计在内).如果测出某一个字符为非空格,而其前面的字符是空格,则表示"新单词开始",此时单词数num累加1.如果当前字符为非空格而其前面的字符也是非空格,则意味着仍是原来的单词的继续,num不累加.前面一个字符是否空格可以从word值分析,若word=0,则表示前一个字符是空格;如果word = 1,意味着前一个字符为非空格。

#include <stdio.h>
int main()
{
    char string[81];
    int i;
    int num = 0;  /* 统计单词个数 */
    int word = 0; /* 是否为单词的标示 */
    char c;     gets(string);     for (i = 0; (c = string[i]) != '\0'; i++)
    {
        if (c == ' ')
            word = 0;
        else
      &nbs......

阅读全文(7900) | 评论:5

[057] 实矩阵相乘函数(2006-05-20 15:47:00)

摘要:最近频繁用到矩阵相乘运算, 所以想写一个函数。遇到的问题不少! 关于矩阵乘法规则,请查看: [050] 求两个矩阵的乘积矩阵 算法参考了徐士良的《常用算法程序集》里的一个实矩阵相乘函数,如下:

void brmul(a, b, m, n, k, c)
int m, n, k;
double a[], b[], c[];
{
    int i, j, l, u;
    for (i = 0; i<= m - 1; i++)
        for (j = 0; j <= k - 1; j++)
        {
            u = i * k + j;
            c[u] = 0.0;
            for (l = 0; l <= n - 1; l++)
                c[u] = c[u] + a[i * n + l] * b[l * k + j];
        }
}

参数说明:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  形参与函数类型           &nbs......

阅读全文(4697) | 评论:5

[056] Turbo C的图形系统(2006-05-16 18:40:00)

摘要:    虽然DOS下这种图形系统基本上已经没什么用武之地了, 但最近在做图形学上机时发现, 用它来做相关试验时还是不错的。首先由于其分辨率比较低,每个像素点很明显,可以看清一些细节。其次使用简单,可以把精力放到算法上,而不必像在VC里那样还要关心类似MFC那里一堆堆的东西。当然这些仅仅指的是算法的实现,做应用时就另当别论了。另外TC下的鼠标驱动要自己写,虽然网上有些代码,但是不好好研究一下还是很难会运用自如的。所以如果用鼠标做图形的拾取并不容易。

关于TC下的图形函数参见:Turbo C 图形函数 一文,比较全了。

用Win-TC的 文件->使用模板新建->BGI图形编程模板, 生成如下代码:
/* WIN-TC BGI 图形编程模板 */ #include "Conio.h"
#include "graphics.h"
#define closegr closegraph void initgr(void) /* BGI初始化 */
{
    int gd = DETECT, gm = 0;          /*和gd = VGA,gm = VGAHI是同样效果 */
    registerbgidriver(EGAVGA_driver); /*注册BGI驱动后可以不需要.BGI文件的支持运行*/
                                                &nbs......

阅读全文(6478) | 评论:0

[055] double型数的输入(2006-05-09 22:36:00)

摘要:    最近在做图形学上机,遇到许多问题,其中关于double型数的输入因为一个简单的错误,却困惑了很久。在书中看到用printf()函数输出时,用格式%f可以输出实数,包括单精度,双精度数,隐含输出6位小数。所以误以为对scanf()也是一样的,所以程序中输入用了如下的语句:

double Scal_R;
scanf("%f", &Scal_R);

程序里用输入的这个参数Scal_R控制一个圆的半径比例,比如输入此参数为1.5时,应该将原来圆的半径乘以1.5再重画此圆。但总是没有出现正确结果,也一直没有往这个地方想,郁闷了好一阵子。后来还是看了下谭老的书,才发现原来scanf()的附加格式说明字符里有个"l",用于输入长整型数据(可用%ld,%lo,%lx) 以及double型数据(用%lf或%le) ,可见输入double型数应该用"%lf",于是做了如下试验:

#include <stdio.h>
int main()
{
    double d_ouble;
    scanf("%f", &d_ouble);
    printf("%f\n", d_ouble);
    return 0;
}

运行结果(VC):
=======================================================================
1.5↙
-92559604329505835000000000000000000000000000000000000000000000.000000
=======================================================================

显然没有正确输出, 改为%lf 后: #include <stdio.h>
int main()
{
    double d_ou......

阅读全文(5897) | 评论:9

〖001〗三人表决器(2006-05-02 21:57:00)

摘要:万事开头难啊,Blog开这了个EDA·HDL〖〗分类,Starting ……
关于下载线的驱动配置,参见:安装下载电缆的驱动程序。
实验参考: 10分钟学会PLD设计。
实验板:   网助二号。

实验题目:
分别采用VHDL、Verilog-HDL和原理图输入方式设计一个简单的三人表决器,并下载到实验板进行实际运行。 三人表决器的功能描述:三个人分别用手指拨动开关SW1、SW2、SW3来表示自己的意愿,如果对某决议同意,各人就把自己的指拨开关拨到高电平(上方),不同意就把自己的指拨开关拨到低电平(下方)。表决结果用LED(高电平亮)显示,如果决议通过那么实验板上L2(绿灯,本实验板上为L1)亮;如果不通过那么实验板上L1(红灯,本实验板上为L5)亮;如果对某个决议有任意二到三人同意,那么此决议通过,L2亮;如果对某个决议只有一个人或没人同意,那么此决议不通过,L1亮。
方案一:采用原理图输入
方案二:采用VHDL语言 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY majority_voter IS
   PORT(SW : IN std_logic_vector(3 DOWNTO 1);
        L : OUT std_logic_vector(2 DOWNTO 1));
END majority_voter; ARCHITECTURE concurrent OF majority_voter IS BEGIN
    WITH SW SELECT
      L <= "10" WHEN "011",
           "10" WHEN "101",
           "1......

阅读全文(8961) | 评论:3

〖000〗CPLD实验板之网助二号(2006-05-02 21:40:00)

摘要:这块板是一个MCU+CPLD的综合板,是笨笨工作室为帮助爱好者实践所设计的一块板,它是笨笨老师网助计划的第二块板,有兴趣的请到笨笨工作室查看网助2号。


 以下资源的介绍均来自于笨笨工作室, 贴上来方便查阅: ★公用部分功能:
(1)双电源供电系统,使你在任何时候都能方便的使用,并教会你如何设计稳压电路和USB供电的知识,可外接直流9V或者USB口取电,USB口有保护电路设计,确保计算机不受影响。
(2)输入输出设备:8个跑马灯指示、四个数码管显示、四个按键输入、四个拨码开关,可以满足你如何的输入要求。
(3)通信设备:具有RS232接口便于和其他单片机系统或者计算机进行通信;
(4)音乐设备:蜂鸣器奏出的《祝你平安》和《生日快乐》你听过吗?酷极拉!
(5)红外接口设备:板子有一个红外接近开关电路,就象自动开关的门的功能你2分钟就可以实现;还有一个红外接收接口,用来接收各种遥控器的信号的,也许你听说过万能遥控器吧,有兴趣你可以做做。
(6)输出电源:板子为外部电路提供5V电压输出。 ★单片机特有功能:

(1)传感器输入设备:有一个DS180温度信号输入接口,已具有AD采集输入功能,加上AD芯片即可调试AD采集,完成大部分测控系统功能。
(2)液晶显示接口:具有1602型字符液晶、122×32、128×64等各种点阵液晶的并口、串口双接口,非常方便你使用。
(3)PC键盘接口:有很多人很喜欢用单片机控制计算机的键盘来输入,这样就有了103的按键,非常好玩并不用作电路,你要是需要或者有兴趣,这个板子直接有PC键盘接口,插上键盘,你就可以有一大堆按键拉,^_^。
(4)扩展接口:板子把单片机的40个管脚全部扩展出来,便于你扩展其他功能。
(5)在线下载程序功能:单片机的程序都不需要其他设备来烧写,板子已具有自动从计算机下载程序的功能,方便你调试和修改程序。 ★CPLD特有功能:

(1)PWM功能输出:CPLD可以完成你对外部电机或者使其他要求脉宽调制信号的电路。
(2)在线下载程序功能:CPLD的程序都不需要其他设备来烧写,板子已具有自动从计算机下载程序的功能,方便你调试和修改程序。 ★接口说明:

(1)单片......

阅读全文(4787) | 评论:3

【009】一位数码管循环计数 [51](2006-05-02 17:28:00)

摘要:实验目的:1位数码管从0到9循环计数,间隔1s。
实验板: FB51A(查看)。 该实验用到实验板的资源电路图如下: 其中P0口是段码,低电平有效。P2口是位码,高电平有效。P2.0口控制第1个数码管,一直到P2.7口控制第8个。该板的段码表如下:

┌─────┬────────────────┬────┐
ㄧ          ㄧ P0.*:  7  6  5  4  3  2  1  0  ㄧ P0口值 ㄧ
ㄧ 十进制数 ㄧ  段 :  d dp  e  c  g  b  f  a  ㄧ 即段码 ㄧ
├─────┼────────────────┼────┤
ㄧ    0     ㄧ        0  1  0  0  1  0  0  0  ㄧ  48H   ㄧ
ㄧ    1     ㄧ        1  1  1  0  1  0  1  1  ㄧ  ebH   ㄧ
ㄧ    2     ㄧ        0  1  0  1  0  0  1  0  ㄧ  52H   ㄧ
ㄧ    3     ㄧ        0  1  1  0  0  0  1  0  ㄧ &n......

阅读全文(4675) | 评论:9

【008】Proteus 第一次亲密接触(2006-04-26 20:56:00)

摘要:关于Proteus, 查看简介。
实验方案用的是【004】流水灯实验。(查看)

用Proteus搭建的电路图如下:
所用汇编程序如下:

       org    0000h
       mov   a,#0feh
loop:  mov   p0,a
       lcall delay
       rl    a
       ajmp  loop

delay: mov   r7,#100       ;djnz为二周期指令,机器周期为振荡周期的12倍.所以延时时间为:
temp1: mov   r6,#02h       ;100×2×255×2×12×(1/12) =100ms,
temp2: mov   r5,#0ffh
       djnz  r5,$
       djnz  r6,temp2
       djnz  r7,temp1
       ret
end

用Keil编译,将生成的HEX文件载入电路中的MCU,仿真结果如下(红为高电平,蓝为低电平):
★ 关注Proteus有一段时间了,今天......

阅读全文(5532) | 评论:0

【007】Proteus 简介(2006-04-24 20:31:00)

摘要:    Proteus软件是来自英国Labcenter electronics公司的EDA工具软件,Proteus软件有十多年的历史,在全球广泛使用,除了其具有和其它EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能是,他的电路仿真是互动的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级的实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,您不需要别的,Proteus为您建立了完备的电子设计开发环境!尤其重要的是Proteus Lite可以完全免费,也可以花微不足道的费用注册达到更好的效果;功能最强的Proteus专业版也非常便宜,人人用得起,对高校还有更多优惠。     Proteus组合了高级原理布图、混合模式SPICE仿真,PCB设计以及自动布线来实现一个完整的电子设计系统。此系统受益于15年来的持续开发,被《电子世界》在其对PCB设计系统的比较文章中评为最好产品—“The Route to PCB CAD”。Proteus 产品系列也包含了我们革命性的VSM技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。     其功能模块:—个易用而又功能强大的ISIS原理布图工具;PROSPICE混合模型SPICE仿真; ARES PCB设计.     PROSPICE 仿真器的一个扩展PROTEUS VSM:便于包括所有相关的器件的基于微处理器设计的协同仿真。此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LEDs甚至LCD显示CPU模型. >> 支持许多通用的微控制器,如PIC,AVR,HC11以及8051.
>> 交互的装置模型包括:LED和LCD显示,RS232终端,通用键盘,
>> 强大的调试工具,包括寄存器和存储器,断点和单步模式
>> IAR C-SPY 和Keil uVision2等开发工具的源层调试
>>......

阅读全文(8483) | 评论:1