博文
【010】单片机中编程的方法和技巧(2006-05-26 21:12:00)
摘要:选自《单片机原理及及接口技术(简明修订版)》(李朝青)
一、模块化的程序设计方法
1. 程序功能模块化的优点
实际的应用程序一般都由一个主程序(包括若干个功能模块)和多个子程序构成。每一程序模块都能完成一个明确的任务,实现某个具体功能,如发送、接收、延时、显示、打印等。采用模块化的程序设计方法,有下术优点:
<> 单个模块结构的程序功能单一,易于编写、调试和修改;
<> 便于分工,从而可使多个程序员同时进行程序的编写和调试,加快软件研制进度;
<> 程序可读性好,便于功能扩充和版本升级;
<> 对程序的修改可局部进行,其他部分可以保持不变;
<> 对于使用频繁的子程序可以建立子程序库,便于多个模块调用。
2. 划分模块的原则
在进行模块划分时,应首先弄清楚每个模块的功能,确定其数据结构以及与其他模块的关系;其次是对主要任务进一步细化,把一些专用的子任务交由下一级即第二级子模块完成,这时也需要弄清楚它们之间的相互关系。按这种方法一直细分成易于理解和实现的小模块为止。
模块的划分有很大的灵活性,但也不能随意划分。划分时应遵循下述原则:
<1> 每个模块应具有独立的功能,能产生一个明确的结果,这就是单模块的功能高内聚性。
<2> 模块之间的控制耦合应尽量简单,数据耦合应尽量少,这就是模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换(传递)方式、交换量的多少及交换的频繁程度。
<3> 模块长度适中。模块语句的长度通常在20条~100条的范围较合适。模块太长时,分析和调试比较困难,失去了模块化程序结构的优越性;过短则模块的连接太复杂,信息交换太频繁......
[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......
[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......
[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......
[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......
〖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......
〖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)单片......
【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......
【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有一段时间了,今天......
【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等开发工具的源层调试
>>......