作者简介
马博文,男,银川科技学院计算机与人工智能学院,2022级计算机科学与技术9班本科生,单片机原理及应用课程第9组。
指导老师:王兴泽
电子邮件:1834746988@qq.com
本篇文章是参考《单片机原理及应用(c语言版)第2版》杨居义·编著教材 清华大学出版“ http://www.tup.tsinghua.edu.cn” 编写的笔记 。文章由 毕轶喃、许海楠、李兆生、李聪、马博文同学共同完成,其中李聪、李兆生、许海楠同学负责笔记总结 ,毕轶喃同学负责整理,由马博文负责编写排版。
本文章由理论和实践两大部分组成是我们自己的一些总结,欢迎阅读指正!
一、工程知识:
C51的数组与项目实践
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按程序排列的同类型数据元素的集合称为数组。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
- 一维数组
1)一维数组的定义方式
类型说明符数组名【整型常量表达式】;
一维数组只有一个下标,定义的形式如下:
数据类型 说明符 数组名[常量表达式][={初值,初值}]
例如:
int a[10]
表示a数组名,该数组有10个元素
说明如下
- 数组名的命名规则与变量名的命名规则相同,遵循标识符号命名规则。
- 数组名后是用方括号括起来的常量表达式,不能用圆括号。
- 常量表表示元素的个数,即数组的长度
- 常量表达式中可以包括常量和符号常量,不能包括变量。
2)一维数组的初始化
(1)在定义数组时对数组元素赋予初值
在定义时赋值,后面须带等号,初值须用花括号括起来,括号内的初值两两之间用逗号间隔,可以对数组的全部元素赋值,也可以只对部分元素赋值,初值为0的元素可以只用逗号占位而不写初值0。
例如
Int a[10]={0,1,2,3,4,5,6,7,8,9};
Int y[3];
第一句定义了一个无符号字符数组,数组名为a,数组中的元素个数为10,定义的同时,分别为10个值赋值,分别是1,2,3,4,5,6,7,8,9,
第二句定义了一个无符号字符数组,数组名为y,数组中的元素个数为3。
C51的数组的下标是从0开始
2.二维数组
1)二维数组的定义
有两个下标的数组称为二维数组
二维数组的定义:
类型 数组名[常量表达式1] [常量表达式2] = {值1,值2...};
第一维的长度 ;第二维的长度
例如: int a[2][3]
定义a为2x3(2行3列)的数组。数组元素为int型数据。
需要注意的是不能写成int[2,3].
C51语言对二维数组采用这样的定义方式,使我们可以把二维数组看作一种特殊的
维数组:它的元素又是 一维数组。例如把a看作一个一维数组,它有3个元素: a[0].a[1].a[2],每一个元素又是一个包含4个元素的一维数组,如图 3-13(a),图3-13(b)所示。
图3-13 二维数组
(1)按行赋初值。
数据类型数组名[行常量表达式][列常量表达式]=({第0行初值表},{第1行初值表},·,(最后1行初值表}};
(2)按二维数组在内存中的排列顺序给各元素赋初值。
数据类型数组名[行常量表达式][列常量表达式]= (初值表};
3)二维数组元素的引用
数组名[行下标表达式][列下标表达式]
说明如下:
(1)“行下标表达式”和“列下标表达式”都应是整型表达式或符号常量。
(2)“行下标表达式”和“列下标表达式”的值都应在已定义数组大小的范围内。
(3) 对基本数据类型的变量能进行的操作也适用于相同数据类型的二维数组元素。
3.字符数组
字符数组字符数组就是元素类型为字符型(char)的数组,字符数组是用来存放字符的。在字符数组中,一个元素存放一个字符,可以用字符数组来存储长度不同的字符串。
(1)字符数组的定义
字符数组的定义和数组定义的方法类似。如 char str[10],定义str为一个有10个字符的一维数组。
(2)字符数组赋初值
最直接的方法是将各字符逐个赋给数组中的各元素例如:char str[10]={'M','"','A','N''',"Y ,'A','N','G',"0”;/*“0'表示字符串的结束标志。*/C语言还允许用字符串直接给字符数组赋初值。其方法有以下两种形式:
char str[10]={"Cheng Du"};
char str[10]=" Bei Jing";
4查表
在C51编程中,数组的一个非常有用的功能之一就是查表。
在实际单片机应用系统中,希望单片机能进行高精度的数学运算,但这并非单片机的特长,也不是完全必要的。许多嵌入式控制系统的应用中,人们更愿意用表格而不是数学公式,特别是在转换中对模拟量的标定,使用表格查找法可避免数值计算。在LED数码显示、LCD的汉字显示系统中,一般将字符或汉字的点阵信息存放在表格中,表格可事先计算好装入EPROM中。
例如,一个摄氏温度转换成华氏温度的例子。
# define uchar unsigned char
uchar code tempt[]={32,34,36,37,39,41}; /*数组,设置在 EPROM 中,长度为实际输入的值*/
uchar f2c( uchar degr)
{
return tempt( degr);
} /*返回华氏温度值*/
void main()
{
uchar x;
x= f2c(5); /*得到5 摄氏度相应的华氏温度*/
}
任务 13-2:基础项目实践
任务13-2-1:用数组控制P1口8只LED的显示状态
- 任务要求
- 掌握for语句功能及编程。
- 掌握无符号字符型数组功能及编程。
- 掌握while语句功能及编程。
- 掌握延时程序编写。
- 任务描述
用数组控制P1口8只LED的显示状态。设计一个程序用无符号字符型数组实现以下功能:先设置一个变量i,当i=1时,LED1 发光(即被点亮);当i=2时,LED1.LED2发光;当i=3时,LED1~LED3发光。当i=8时,LED1~LED8都发光;当i=9时,LED1~LED8都熄灭;当i=1时,LED1 发光·依次循环。
- 任务实现
(1)分析
用无符号字符型数组来实现,极大简化程序设计和节约存储器空间 ,关键字为code,其定义如下:
unsigned char code Tab[] {0xfe,0xfc,0xf8,0xf,0xe0,0xc0,0x80,0x00,0xff}; /*定义无符号字符型数组,数组元素为点亮LED状态控制码*/
(2)程序设计
先建立文件夹 XM13-2-1,然后建立工程项目XM13-2-1,最后建立源程序文件XM13-2-1.c,输入如下源程序。
#include<reg51.h> //包含单片机寄存器的头文件
函数功能:延时约150ms
Void delay(void)
{
unsigned char i, j;
for(i=0;i<200;i++)
for(j=0;j<250;j++)
;
}
函数功能:主函数
void main(void)
{
unsigned char i;
unsigned char code Tab[ ]= {0xfe,0xfc,0xf8,0xf,0xe0,0xc0,0x80,0x00,0xff}; /*定义
无符号字符型数组,数组元素为点亮LED状态控制码*/
while(1) //无限循环 地
{
for(i=0;i<9;i++)
{
P1=Tab[i]; //引用数组元素,传送至P1口点亮LED 的
delay(); //延时
}
}
}
总结:
虽然这是80C51单片机一次简单点亮不同二极管的项目,但是却涉及到二进制转十六进制等等进制之间转换的方法,还需要巩固自己的基本知识。