第三周(20110315)

回顾一下上次课程

我们照抄了书上的程序:

#include <reg51.h>
void main( void )
{									
	data unsigned char LedBuff;	//定义无符号字符型变量LedBuff并存放在片内RAM中
	for( ; ; ){
		LedBuff=0x01 ;  P1=LedBuff ;		// 点亮接在P1.0上的LED 
		Delay( 1000 ) ;				// 调用延时函数
		LedBuff=0x02 ;  P1=LedBuff ;
		Delay( 1000 ) ;
		LedBuff=0x04 ;  P1=LedBuff ;
		Delay( 1000 ) ;
		LedBuff=0x08 ;  P1=LedBuff ;
		Delay( 1000 ) ;
		LedBuff=0x10 ;  P1=LedBuff ;
		Delay( 1000 ) ;
		LedBuff=0x20 ;  P1=LedBuff ;
		Delay( 1000 ) ;
		LedBuff=0x40 ;  P1=LedBuff ;
		Delay( 1000 ) ;
		LedBuff=0x80 ;  P1=LedBuff ;
		Delay( 1000 ) ;
	}
}
/**************************************************************
函数名称:Delay( unsigned int x)
功能描述:若晶振频率为12MHz,延时x 
作者名称:张三
创建时间:2008-3-28
***************************************************************/
void Delay( unsigned int x)
{				
	if( x==0 ) 	return;
	while( x!=0 ) 	x--;
}

引出了下列问题:

1、编译时出现错误怎么办? (Delay()函数未定义先调用)

2、如何知道Delay()延时时间?

3、P1在哪里定义?

4、51系列单片机的存储空间

5、十六进制和二进制

6、变量溢出问题

关于这些问题如果还没有搞清楚,也不用着急,我们将在下面的项目中不断遇到类似问题。“遇到问题-分析问题-解决问题”就是我们学习的过程。

 

LED流水灯程序的优化

#include <reg51.h>
 
/* 
 * 延时
 *    t: 延时时间,单位ms 
 */
void Delay(unsigned int t)
{				
  unsigned char i;  
  while(t!=0) {
    t--;
    for(i=120;i>0;i--);
  }
}
 
void main( void )
{									
  unsigned char code LEDMAP[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  unsigned char i;
  for (;;) {
    for (i=0;i<8;i++) {
      P1=LEDMAP[i];
      Delay(500);  /* 延时500ms */
    }
  }
}

1、改进Delay()函数,使传入参数的单位为毫秒

2、用数组和循环简化程序

3、自己动手试一下,可以自由发挥变换花样

4、请大家录入并调试好上面的程序,我们会用这个程序作为模板进入下面的学习。

 

C51入门基础

教材P46

要点:

标识符

常量的表示法

#define的实质 — 宏替换

变量的实质 — 存储器

基本数据类型 — 字节数和取值范围

存储区域和存储模式

单片机编程必须了解的知识 — 存储结构  (P58)

 

 

P54页的小程序

#include <reg51.h>
 
/* 
 * 延时
 *    t: 延时时间,单位ms 
 */
void Delay(unsigned int t)
{				
  unsigned char i;  
  while(t!=0) {
    t--;
    for(i=120;i>0;i--);
  }
}
 
sbit P1_0=0x90;     // 定义P1口的P1.0引脚
sbit P1_1=P1^1;     // 定义P1口的P1.1引脚
sbit P1_2=0x90^2;   // 定义P1口的P1.2引脚
 
void main( void )
{									
  unsigned int i;   // 定义无符号整型变量i,用于循环延时
  P1=0x00; 	    // 关闭接在P1口的所有发光二极管
  do {		
    P1_0 = ~P1_0;   // 将sbit型变量P1_0取反
    P1_1 = ~P1_1;   // 将sbit型变量P1_1取反
    P1_2 = ~P1_2;   // 将sbit型变量P1_2取反
    Delay(1000);    // 延时1秒		
  }while(1);
}

 

教一招书上没有的

既然Delay()经常用到,能不能象printf()一样?

程序分模块有什么好处?

 

        自己动手完成P76页的实训程序

要点: 数组及指针、函数

此条目发表在 单片机教学 分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已被标记为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">