打印

自制<<手把手教你学单片机C程序设计>>实验板

[复制链接]
楼主: gdqinci
手机看帖
扫描二维码
随时随地手机跟帖
41
思考| | 2010-4-1 13:41 | 只看该作者 回帖奖励 |倒序浏览
板子画的很漂亮。

使用特权

评论回复
42
人五鸟木| | 2010-4-1 16:57 | 只看该作者
谢谢楼主!

使用特权

评论回复
43
feikun| | 2010-4-2 12:00 | 只看该作者
很好很强大,lz的精神可嘉

使用特权

评论回复
44
donlcn| | 2010-4-2 17:34 | 只看该作者
顶了  边看边学习

使用特权

评论回复
45
eaglehzw| | 2010-4-2 20:13 | 只看该作者
我怎么发不了留言

使用特权

评论回复
46
sn516952| | 2010-4-3 01:03 | 只看该作者
楼主说的很专业,这个程度了也叫新手吗?新手也能找出这么多问题,那我又算什么?前端时间还觉得自己有一只脚迈进mcu的大门了,现在和楼主这样的新手一比较,原来我前面的门是海市蜃楼!

使用特权

评论回复
47
woaihaojia| | 2010-4-3 11:32 | 只看该作者
好啊

使用特权

评论回复
48
学海泛舟| | 2010-4-4 16:37 | 只看该作者
mark~~~~~~~~

使用特权

评论回复
49
gdqinci|  楼主 | 2010-4-4 20:32 | 只看该作者
原书
第一章是概述
第二章是实验器材简介
第三章是Keil C51集成开发环境及并口下载软件的介绍

/*由于我没有采用原书里面的实验板和书中所指的下载软件,所以前面三章的作用只起到修正原书里面的电路原理图和给我自己的制板做参考用。*/

下面从第四章的实验说起
第一个C51演示程序及效果

#include <reg51.h>
void delay(void);
void main(void)
{
loop:P1=0x00;
      delay();
   P1=0xff;
   delay();
   goto loop;
}
void delay(void)
{
  unsigned int i,j;
  for(i=0;i<500;i++)
  {
    for(j=0;j<121;j++)
{;}
   }
}

上面程序完全照书中所写的,和编译的结果
下面是程序在我的板子上运行的效果

04_test1.jpg (69.67 KB )

04_test1.jpg

04_test1_1.jpg (22.72 KB )

04_test1_1.jpg

使用特权

评论回复
50
gdqinci|  楼主 | 2010-4-4 20:35 | 只看该作者
本帖最后由 gdqinci 于 2010-4-4 20:38 编辑

匠人:
我打LOOP然后冒号,为什么会变成LOOP和一个表情

使用特权

评论回复
51
gdqinci|  楼主 | 2010-4-4 20:47 | 只看该作者
由于主函数写在delay子函数的前面,所以必须在由函数调用子函数之前声明要调用到的子函数,因此在主函数前面加上了一句:
void delay(void);
这是一个声明语句

但是我不喜欢这样的程序结构,既然是先声明后使用,那为何不把子函数写在前面,这样不就可以省略掉了那句声明了吗???

以上是我的理解,不知道对不对,请有经验的前辈们指正!!!

我将书中的程序结构改动了一下,既是把子函数写在前面,主函数写在后面,省略了那句声明

#include <reg51.h>
void delay(void)
{
  unsigned int i,j;
  for(i=0;i<500;i++)
  {
    for(j=0;j<121;j++)
{;}
   }
}
void main(void)
{
loop:P1=0x00;
      delay();
   P1=0xff;
   delay();
   goto loop;
}



下面是编译结果和运行效果

04_test11.jpg (65.24 KB )

04_test11.jpg

04_test11_1.jpg (37.77 KB )

04_test11_1.jpg

使用特权

评论回复
52
gdqinci|  楼主 | 2010-4-4 20:53 | 只看该作者
我突发奇想,如果把以上两个C文件那到同一工程项目里面去会有什么结果???

我常常有这些莫明其妙的无哩头的想法,请看我帖子的
兄弟们原谅

结果是,出错了!

我觉得这是不可能的呀,C编译器不可能这么差吧,那么问题出在哪呢?请前辈们指点。。。。

04_test2.jpg (92.57 KB )

04_test2.jpg

使用特权

评论回复
53
gdqinci|  楼主 | 2010-4-5 10:03 | 只看该作者
下面是第五章:
第一个实验,用函数调用的方式完成LED1~LED8共个二极管实现D0、D2、D4、D6及D1、D3、D5、D7的交替点亮的实验,周期约1S

#include <reg51.h>
/*==================================*/
void delay(void)
{
  unsigned int i,j;
  for(i=0;i<500;i++)
  {
     for(j=0;j<121;j++)
  {;}
   }
}
//===================================
void light1(void)
{
P1=0xaa;//#10101010B
}
//==================================
void light2(void)
{
P1=0x55;//#01010101B
}
/*=====================================*/
void main(void)
{
while(1)
     {
  light1();
  delay();
  light2();
  delay();
  }
}

CS5-1.jpg (25.37 KB )

CS5-1.jpg

使用特权

评论回复
54
gdqinci|  楼主 | 2010-4-5 10:04 | 只看该作者
不知道为什么拍到的效果刚好是8个同时亮的时候,但是用眼睛看的动态效果是会交替亮的

使用特权

评论回复
55
gdqinci|  楼主 | 2010-4-5 10:06 | 只看该作者
第二个实验,只用主函数完成LED1~LED8共个二极管实现D0、D2、D4、D6及D1、D3、D5、D7的交替点亮的实验,周期约1S


#include <reg51.h>
/*=====================================*/
void main(void)
{
    unsigned int i,j;
while(1)
    {
         P1=0xaa;
  //================================
    for(i=0;i<500;i++)
     {
      for(j=0;j<121;j++)
   {;}
      }
   //================================
         P1=0x55;
   //================================
     for(i=0;i<500;i++)
      {
       for(j=0;j<121;j++)
    {;}
       }
    //===============================
  }
}



CS5-2.jpg (31.1 KB )

CS5-2.jpg

使用特权

评论回复
56
gdqinci|  楼主 | 2010-4-5 10:15 | 只看该作者
函数连接实验一

将程序的若干个函数保存在几个源程序文件中,最后再将他们连接在一起,实现D0、D2、D4、D6及D1、D3、D5、D7的交替点亮的实验,周期约1S


文件CS5-3a.c

#include <reg51.h>
extern void light1(void);  //这里声明了三个外部函数
extern void light2(void);
extern void delay(void);
//===================================
void main(void)
{
while(1)
     {
  light1();
  delay();
  light2();
  delay();
  }
}


文件CS5-3b.c

#include <reg51.h>
/*==================================*/
void delay(void)
{
  unsigned int i,j;
  for(i=0;i<500;i++)
  {
     for(j=0;j<121;j++)
  {;}
   }
}
//===================================
void light1(void)
{
P1=0xaa;//#10101010B
}
//==================================
void light2(void)
{
P1=0x55;//#01010101B
}
/*=====================================*/


CS5-3.jpg (38.29 KB )

CS5-3.jpg

使用特权

评论回复
57
gdqinci|  楼主 | 2010-4-5 10:22 | 只看该作者
函数连接实验二

将程序的若干个函数保存在几个源程序文件中,最后用文件包含的方法将他们连接在一起,实现D0、D2、D4、D6及D1、D3、D5、D7的交替点亮的实验,周期约1S


文件CS5-4a.c

#include <reg51.h>
#include "CS5-4b.c"
//===================================
void main(void)
{
while(1)
     {
  light1();
  delay();
  light2();
  delay();
  }
}

文件CS5-4b.c
#include <reg51.h>
/*==================================*/
void delay(void)
{
  unsigned int i,j;
  for(i=0;i<500;i++)
  {
     for(j=0;j<121;j++)
  {;}
   }
}
//===================================
void light1(void)
{
P1=0xaa;//#10101010B
}
//==================================
void light2(void)
{
P1=0x55;//#01010101B
}
/*=====================================*/

CS5-4.jpg (34.61 KB )

CS5-4.jpg

使用特权

评论回复
58
gdqinci|  楼主 | 2010-4-5 10:24 | 只看该作者
其实实验一和实验二的b程序是一样的,只是实验一采用在文件开头先声明了三个外部函数,而实验二则是将整个b文件包含在a文件里面而已。

使用特权

评论回复
59
nighn| | 2010-4-5 12:30 | 只看该作者
顶!顶!顶!

使用特权

评论回复
60
gdqinci|  楼主 | 2010-4-5 15:36 | 只看该作者
下面是第6章

第一个实验,4个LED数码管从左至右显示“1235”

注:在前面做板子的时候已经推断出本实验书中的源程序存在错误,现在这里一并将其改正:

#include <reg51.h>
unsigned char dis0=0x66;//原书源程序在这里开始下面的4句出现错误
unsigned char dis1=0x4f;
unsigned char dis2=0x5b;
unsigned char dis3=0x06;
/*===============================*/
void delay(void)
{
  unsigned int i,j;
  for(i=0;i<2;i++)
  {
     for(j=0;j<121;j++)
  {;}
   }
}
//====================================
void main(void)
{
while(1)
     {
  P0=dis0;
  P2=0xfe;
  delay();
  //=============
  P0=dis1;
  P2=0xfd;
  delay();
  //=============
  P0=dis2;
  P2=0xfb;
  delay();
  //=============
  P0=dis3;
  P2=0xf7;
  delay();
  }
}

改正后的源程序如上,然后烧到板子里面去运行,结果显示正确,说明原书是错误的

显示结果如下

CS6-1.jpg (52.22 KB )

CS6-1.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则