回顾一下上次课程
我们照抄了书上的程序:
#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页的实训程序
要点: 数组及指针、函数