博文
【003】点亮二极管 [51](2006-04-06 20:31:00)
摘要:实验目的:点亮二极管。
实验参考:笨笨工作室实验一、基本I/O口试验:点亮二极管。(查看原文)
实验板: FB51A(查看)。
所用部分的电路图如下:
汇编程序:
org 0000h
loop: mov p0, #55h
ajmp loop
end
★ 其中55h=01010101b,由电路可知,八支二极管与单片机相接为低电平有效,故应该对应的D1,D3,D5,D7四个二极管发光。
实测结果:下载到实验板上可以看到对应的二极管被点亮。
C51实现:
#include<reg51.h>
main()
{
P0 = 0x55;
}
下载到板上测试结果同上。
说明:
51的I0口能够直接驱动LED,可以不用接74LS245。因为实验板上有这部分电路,所以此处原理图以实验板上的资源为准。P0口的作IO口使用时必须接上拉电阻。
另外,原理图中省略了电源,时钟,复位等最小系统基本电路。......
【002】51单片机实验板之三网助2号(2006-04-02 22:05:00)
摘要: 这块板是一个MCU+CPLD的综合板,是笨笨工作室为帮助爱好者实践所设计的一块板,它是笨笨老师网助计划的第二块板,有兴趣的请查看网助2号。
虽然这块板单片机部分资源不多,但考虑到在做一些综合性的实验时会用到它的CPLD部分,这时用板上自带的单片机会比较方便,所以简介帖上来,便于日后查阅。
以下是引自笨笨工作室对此板资源的介绍:
★单片机特有功能:
(1)传感器输入设备:有一个DS180温度信号输入接口,已具有AD采集输入功能,加上AD芯片即可调试AD采集,完成大部分测控系统功能。
(2)液晶显示接口:具有1602型字符液晶、122×32、128×64等各种点阵液晶的并口、串口双接口,非常方便你使用。
(3)PC键盘接口:有很多人很喜欢用单片机控制计算机的键盘来输入,这样就有了103的按键,非常好玩并不用作电路,你要是需要或者有兴趣,这个板子直接有PC键盘接口,插上键盘,你就可以有一大堆按键拉,^_^。
(4)扩展接口:板子把单片机的40个管脚全部扩展出来,便于你扩展其他功能。
(5)在线下载程序功能:单片机的程序都不需要其他设备来烧写,板子已具有自动从计算机下载程序的功能,方便你调试和修改程序。
★公用部分功能:
(1)双电源供电系统,使你在任何时候都能方便的使用,并教会你如何设计稳压电路和USB供电的知识,可外接直流9V或者USB口取电,USB口有保护电路设计,确保计算机不受影响。
(2)输入输出设备:8个跑马灯指示、四个数码管显示、四个按键输入、四个拨码开关,可以满足你如何的输入要求。
(3)通信设备:具有RS232接口便于和其他单片机系统或者计算机进行通信;
(4)音乐设备:蜂鸣器奏出的《祝你平安》和《生日快乐》你听过吗?酷极拉!
(5)红外接口设备:板子有一个红外接近开关电路,就象自动开关的门的功能你2分钟就可以实现;还有一个红外接收接口,用来接收各种遥控器的信号的,也许你听说过万能遥控器吧,有兴趣你可以做做。
(6)输出电源:板子为外部电路提供5V电压输出。
★CPLD特有功能:
(1)PWM功能输出:CPLD可以完......
【001】51单片机实验板之二AS综合系统(2006-04-02 20:18:00)
摘要: 这块板,是电子之城的产品,前面也提到过,它外围的资源比较多,无论是设计上还是性能上都Very好,不想多说,想了解其详情请参看AS综合系统。
虽然一些基本的实验可以在实验板一上实现,但考虑到以后可能会涉及一些复杂的实验,不想在实验板一上再做扩展,就直接用这个AS系统了,所以先将其写在日志里,便于今后查阅。......
[047] 求传递闭包(2006-04-01 23:36:00)
摘要:问题的提出参见: 《图像工程上册图像处理和分析》(清华) P34
数字图像处理课上讲到图像和视觉基础时涉及到了离散数学中的一个概念: 传递闭包。刚好我的C语言刚看到数组,就编来看看吧。
二值矩阵是一种常用的描述关系的形式。我们可取矩阵中对应相关元素相交处的值为1,其它地方的的值为0。从R={{a, a), (a, b), (b, d), (d, b), (c, e)}}可得如下矩阵B:
a b c d e
┌ 1 1 0 0 0 ┐a
│ 0 0 0 1 0 │b
B =│ 0 0 0 0 1 │c
│ 0 1 0 0 0 │d
└ 0 0 0 0 0 ┘e
传递性指出,如果 a~R~b, b~R~c, 则a~R~c。在以上矩阵中,a与b相连且b与d相连,因为(a,b)和(b,d)在R中。但我们注意到(a,d)不在集合R中。包含这些隐含关系的集合称为R的传递闭包,并记为R+ 。所以R+ = {(a, a), (a, b), (a, d) , (b, b) , (b, d), (d, b), (d, d) , (c, e)}。这个集合包含(a, d), (b, b), (d, d)是根据传递性定义(即由a~R~b, b~R~d, 推出a~R~d; 由b~R~d, d~R~b, 推出b~R~b; 由d~R~b, b~R~d, 推出d~R~d)而来的。描述关系R+的矩阵如下:
a b c d ......
【000】51单片机实验板之一FB51A(2006-04-02 19:04:00)
摘要: 今天Blog增加了一个单片机的分类, 准备把自己做的一些实验都放在日志上,一来与大家分享, 二来请各路高手多多帮助,多多指导。指出我在实验中的一些错误和您的高见!我在这里先谢过了!
一直都想研究一下单片机, 书也看过一些, 只是种种原因拖到现在才有机会实践。这东西没有实践是很难学好的, 虽然以前也隔三差五的做过一些简单的实验,也快忘的差不多了,打算从现在开始系统的学学,做做。这里选用的是51系列的单片机,因为资料较多。
实验所用的实验板之一算是自制的吧,确切的说应该是自己焊的, 资料来自于电子之城。那里提供了一些简单的免费实验板:查看。我用的这个板具体位置:查看 。拿它提供的PCB文件到电子市场做的板,买元件组装的。其具体功能里面也有介绍。这是那里提供的一个图片:
下面是我自己的板,起了个名叫做FB51A型实验板,由于上面那块设计的比较早了,有些地方不是很方便,比如单片机的插座不是零插拔力那种,没有USB取电口,最主要的是没有ISP下载口,因此自己改造了一下,如下图所标示的:
主要修改如下:
<1> 拆掉了原来的电源部分,增加了USB电源接口。并加了个电源开关。还利用板上空闲下来的孔加了两个插针,做为备用电源。
<2> 原来的蜂鸣器是利用P1.5口,而增加的ISP下载功能要用到P1.5,P1.6,P1.7三个口,蜂鸣器所占的P1.5口对下载的干扰很严重,所以把蜂鸣器改接到了P1.4口,而且利用空闲的孔做了个开关,用跳线控制。这样在用不到它的时候就关掉,这样做主要是因为在做与其不相关的实验时若不在程序中绐它置无效,它可能会工作。
<3> 因为以前没有编程器,这块板也没怎么用,就在电子之城买了一个AS系统, 由于AS系"集成了ISP下载外扩接口:对目标板上面已经焊接固定的芯片,可以通过这个接口完成在线编程写入工作", 不舍得将原来这块板扔掉, 就绐它做了个下载口(图中的"用AS下载时的接口"),用AS对其在线烧写。后来有了一条ISP下载线,但是它的接口排列方式与AS的不同,不能直接用在我的板上,所以用"洞洞......
[046] 字符数组与字符串(2006-03-30 21:29:00)
摘要: C语言中没有专门的字符串变量,如果要将一个字符串存放在变量中,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。
<1> 定义: char c[10]
字符型与整型互相通用,因此 int c[10] 也可以定义字符数组。但由于两种类型分配字节不同, 用整型来定义会浪费空间, 另外这样定义实际意义也不大, 只是为了说明其合法性。
<2> 初始化:
最简单的方法即逐个赋值: char c[10]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; 10个字符分别赋绐c[0]到c[9]10个元素。
如果初值个数小于数组长度,则只将这些字符赋绐数组中前面的元素,其余元素自动定为空字符(即'\0')。
如char c[12]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; 则c[10]、c[11]值都为'\0' 。
C语言中,将字符串作为字符数组来处理。一般我们用字符数组来存放字符串时,都要先确定一个足够大的数组,而实际并用不了那么多,而我们只关心其有效位,为测定字符串实际长度,C规定了一个"字符串结束标志",以字符 '\0' 代表。如果有一个字符串,其中第10个字符为'\0',则此字符串的有效字符为9个。也就是说,在遇到字符'\0'时,表示字符串结束,由它前面的字符组成字符串。
系统对字符串常量也自动加一个'\0'作为结束符。
对于语句: pirntf("How do you do? \n"); 实际上该字符串在内存中存放时,系统自动在最后一个字符'\0'的后面加了一个'\0'作为字符串结束标志,在执行printf函数时,每输出一个字符检查一次,看下一个字符是否'\0'。遇'\0'就停止输出。
&nbs......
[045] 二维数组(2006-03-25 23:06:00)
摘要:<谭> 7.2.3
C语言中,二维数组中元素排列的顺序是:按行存放,即在内存中先顺序放第一行的元素,再存放第二行的元素。
二维数组的初始化:
(1) 分行给二维数组赋初值。如
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
这种赋初值方法比较直观,把第1个花括弧内的数据给第1行的元素,第2个花括弧内的数据赋给第2行的元素……即按行赋初值。
(2) 可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。如:
int a[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,12};
效果与前相同。但以第1种方法为好,一行对一行,界限清楚。用第2种方法如果数据多,写成一大片,容易遗漏,也不易检查。
(3) 可以对部分元素赋初值。
int a[3][4]={{1},{5},{9}};
它的作用是只对各行第1列的元素赋初值,其余元素值自动为0。赋初值后数组各元素为
1 0 0 0
5 0 0 0
9 0 0 0
也可以对各行中的某一元素赋初值:
int a[3][4]={{1},{0,6},{0,0,11}};
初始化后的数组元素如下:
1 0 0 0
0 6 0 0
0 0 11 0
这种方法对非0元素少时比较方便,不必将所有的0都写出来,只需输入少量数据。也可以只对某几行元素赋初值:
int a[3][4]={{1},{5,6}};
数组元素为
1 0 0 0
5 6 0 0
0 0 0 0
第3行不赋初值。也可以对第2行不赋初值:
int a[3][4]={{1},{},{9}};
(4) 如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。如:
......
[044] 起泡排序(2006-03-25 21:15:00)
摘要:<谭> 例7.3
用起泡法对10个数排序(由小到大)
若有n个数。第一次将第1和第2个数比较,若第1个数大于第2个数,刚两数对调,否则不操作。第二次将第2和第3个数比较,如上操作,刚经过n-1次这样的操作,最大的数排到了最后(即所谓的沉底)。以上为第一趟操作的结果。第二趟要对余下的n-1个数作同样的操作(因为最大的数已排到最后,不必考虑)。第二趟中要作n-2次比较……依次类推可得出结论:n个数排序,要进行n-1趟比较。第一趟中比较n-1次,第 i 趟中比较 n-i 次。
#include <stdio.h>
int main()
{
int a[11]; /* 为了符合习惯, 第0号元素不用 */
int i, j, cup;
printf("Input 10 numbers:\n");
for(i = 1; i < 11; i++)
scanf("%d", &a[i]);
for(i = 1; i <= 9; i++) /* 趟数 */
for(j = 1; j <= 10 - i; j++) /* 每趟要比较数 */
if(a[j] > a[j+1]) /* 前面数大于后面数刚对调 */
&......
[043] 一维数组的定义(2006-03-25 20:32:00)
摘要:一维数组的定义方式为:
类型说明符 数组名[常量表达式];
如: int a[10];
它表示数组名为a,此数组有10个元素。
(1) 数组名定名规则和变量名相同,遵循标识符定名规则。
(2) 数组名后是用方括弧括起来的常量表达式。
(3) 常量表达式表示元素的个数,即数组长度。例如,在a[10]中,10表示a数组有10个元素,下标从0开始,这10个元素是,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]。注意不能使用数组元素a[10] 。
(4) 常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,c不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的:
int n;
scanf("%d",&n);
int a[n];
★ 所以用到数组时数组的大小是确定的,不能动态分配。
关于一维数组的初始化: 可以只绐一部分元素赋值, 例如:
int a[10] = {0, 1, 2, 3, 4};
此时只绐前面5个元素赋初值,后5个元素值为0 。
[更新] C语言中动态分配数组(一维) 。由此看来上面书中“不能动态分配”的说法还是太绝对了。......
[042] 比赛对手(2006-03-19 16:50:00)
摘要:<谭> 6.15
两个乒乓球队进行比赛, 各出三人。甲队为A、B、C三人,乙队为X、Y、Z三人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比。请编程序找出三赛手的名单。
分析:
① X既不与A比,又不与C比,必然与B比;
② C既不与X比,又不与Z比,必然与Y比;
③ A只能与Z比.
以上为逻辑推理得到结论,而用计算机处理此问题,必须对所有组合一一检验,看是否符合条件。
#include <stdio.h>
int main()
{
char _A, _B, _C; /* 分别表示A,B,C的对手 */
for(_A = 'X'; _A <= 'Z'; _A++)
for(_B = 'X'; _B <= 'Z'; _B++)
for(_C = 'X'; _C <= 'Z'; _C++)
if(_A != _B && _A != _C && _B != _C && _A != 'X' && _C != 'X' && _C != 'Z')
printf("A--%c\tB--%c\tC--%c\n", _A, _B, _C);
retu......