单片机原理及应用笔记:C51的数组与项目实践

作者简介

博文男,银川科技学院计算机与人工智能学院,2022级计算机科学与技术9班本科生,单片机原理及应用课程第9组。

指导老师:王兴泽

电子邮件:1834746988@qq.com

本篇文章是参考《单片机原理及应用(c语言版)第2版》杨居义·编著教材 清华大学出版“ http://www.tup.tsinghua.edu.cn” 编写的笔记 。文章 毕轶喃许海楠李兆生李聪、马博文同学共同完成,其中李聪、李兆生、许海楠同学负责笔记总结 ,毕轶喃同学负责整理,由马博文负责编写排版。

本文章由理论和实践两大部分组成是我们自己的一些总结,欢迎阅读指正!

一、工程知识:

C51的数组与项目实践

在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按程序排列的同类型数据元素的集合称为数组。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。

  1. 一维数组

1)一维数组的定义方式

类型说明符数组名【整型常量表达式】;

一维数组只有一个下标,定义的形式如下:

数据类型 说明符 数组名[常量表达式][={初值,初值}]

例如:

int a[10]

表示a数组名,该数组有10个元素

说明如下

  1. 数组名的命名规则与变量名的命名规则相同,遵循标识符号命名规则。
  2. 数组名后是用方括号括起来的常量表达式,不能用圆括号。
  3. 常量表表示元素的个数,即数组的长度
  4. 常量表达式中可以包括常量和符号常量,不能包括变量。

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的显示状态

  1. 任务要求
  1. 掌握for语句功能及编程。
  2. 掌握无符号字符型数组功能及编程。
  3. 掌握while语句功能及编程。
  4. 掌握延时程序编写。

  1. 任务描述

用数组控制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. 任务实现

(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单片机一次简单点亮不同二极管的项目,但是却涉及到二进制转十六进制等等进制之间转换的方法,还需要巩固自己的基本知识。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/463372.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes实战——部署微服务项目(一)

目录 一、搭建Redis集群 1、安装redis 2、测试连接 二、搭建RocketMq 1、下载资源 2、安装 3、查看dashboard 三、搭建Elasticseach 1、es-service.yaml 2、es-statefulset.yaml 3、创建资源 四、搭建mongodb 1、mongodb.yaml 2、创建资源 五、搭建Mysql集群 1…

【React 轮子】文本溢出后显示展开/收起按钮

/** hooks* 用于文本展示时判断是否展示 展开/收起按钮 &#xff08;包含监听 文本变化/页面尺寸变换&#xff09;* param { string } text 需要展示的文本* param { number } maxLength 文本最大展示行数* param { number } lineHeight 文本行高 (单位 px) */ import React, …

【AD】2-1 元件符号的绘制创建实例-电阻容/CHIP类器件

1.新建工程后&#xff0c;双击原理图库&#xff0c;点击Panels后&#xff0c;选择SCH Library&#xff0c;双击元器件可在右侧进行更改名称 2.点击视图&#xff0c;栅格&#xff0c;设置捕捉栅格为100mil 3.点击放置管脚&#xff0c;可按空格键进行旋转&#xff0c;按TAB键可以…

javascript-Web APLs (三)

事件流 指的是事件完整执行过程中的流动路 说明&#xff1a;假设页面里有个div&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 简单来说&#xff1a;捕获阶段是 从父到子 冒泡阶段是从子到父 实际工作都是使用事件冒泡为主 事件…

恋爱脑学Rust之Box与RC的对比

在遥远的某个小镇&#xff0c;住着一对年轻的恋人&#xff1a;阿丽和小明。他们的爱情故事就像 Rust 中的 Rc 和 Box 智能指针那样&#xff0c;有着各自不同的「所有权」和「共享」的理解。 故事背景 阿丽和小明准备共同养一株非常珍贵的花&#xff08;我们称之为“心之花”&…

【uni-app】创建自定义模板

1. 步骤 打开自定义模板文件夹 在此文件夹下创建模板文件&#xff08;注意后缀名&#xff09; 重新点击“新建页面” 即可看到新建的模板 2. 注意事项 创建的模板必须文件类型对应&#xff08;vue模板就创建*.vue文件, uvue模板就创建*.uvue文件&#xff09;

推荐一款功能强大的数据库开发管理工具:SQLite Expert Pro

SQLite Expert Professional是一个功能强大的工具&#xff0c;旨在简化SQLite3数据库的开发。 它是SQLite的一个功能丰富的管理和开发工具&#xff0c;旨在满足所有用户从编写简单SQL查询到开发复杂数据库的需求。 图形界面支持所有SQLite功能。 它包括一个可视化查询构建器&a…

【制造业&仓库】流水线能源设备检测系统源码&数据集全套:改进yolo11-DCNV2-Dynamic

改进yolo11-CAA-HSFPN等200全套创新点大全&#xff1a;流水线能源设备检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图…

FreeRTOS学习9——补充 API函数详解(创建、删除任务函数 和 挂起、恢复任务函数,空闲任务函数)

API函数详解(创建任务函数 和 删除任务函数) 创建函数 xTaskCreate() 作用&#xff1a;创建任务 ​ 函数 xTaskCreate()在 task.c 文件中有定义&#xff0c;具体的代码如下所示&#xff1a; BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName,…

Vue2.0 通过vue-pdf-signature@4.2.7和pdfjs-dist@2.5.207实现PDF预览

1.安装依赖 npm install pdfjs-dist2.5.207 --savenpm install vue-pdf-signature4.2.7 --save2.在.vue文件中 script 部分引入 <script> import * as PDFJS from pdfjs-dist PDFJS.GlobalWorkerOptions.workerSrc require(pdfjs-dist/build/pdf.worker.js);//解决pdf…

kafka-console-ui的简介及安装使用

kafka-console-ui的简介及安装使用 一、kafka-console-ui的简介二、安装kafka-console-ui2.1 源码安装2.2 docker安装 三、kafka-console-ui功能使用3.1、功能特性3.2、 功能介绍3.2.1 集群3.2.2 topic3.2.3 消费组3.2.4 Acl3.2.5 运维 一、kafka-console-ui的简介 kafka-cons…

MySQL(上)

一、SQL优化 1、如何定位及优化SQL语句的性能问题&#xff1f;创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因&#xff1f; 对于性能比较低的sql语句定位&#xff0c;最重要的也是最有效的方法其实还是看sql的执行计划&#xff0c;而对于mysql来说&a…

贪心算法---java---黑马

贪心算法 1)Greedy algorithm 称之为贪心算法或者贪婪算法&#xff0c;核心思想是 将寻找最优解的问题分为若干个步骤每一步骤都采用贪心原则&#xff0c;选取当前最优解因为未考虑所有可能&#xff0c;局部最优的堆叠不一定得到最终解最优 贪心算法例子 Dijkstra while …

操作系统——计算机系统概述——1.4操作系统结构

目录 操作系统的体系结构 大内核&#xff08;宏内核/单内核&#xff09;&#xff1a; 微内核&#xff1a; 分层法 模块化 操作系统的体系结构 大内核&#xff08;宏内核/单内核&#xff09;&#xff1a; 将操作系统的主要功能模块都作为系统内核&#xff0c;运行在核心态。…

【MyBatis源码】BoundSql分析

基础 BoundSql是对SQL语句及参数信息的封装&#xff0c;它是SqlSource解析后的结果。Executor组件并不是直接通过StaticSqlSource对象完成数据库操作的&#xff0c;而是与BoundSql交互。BoundSql是对Executor组件执行SQL信息的封装&#xff0c;具体实现代码如下&#xff1a; …

本地部署bert-base-chinese模型交互式问答,gradio

首先下载bert-base-chinese&#xff0c;可以在 Huggingface, modelscope, github下载 pip install gradio torch transformers import gradio as gr import torch from transformers import BertTokenizer, BertForQuestionAnswering# 加载bert-base-chinese模型和分词器 mod…

【题】C#-数组:二维数组

1. 将1~10000赋值给一个二维数组(100行100列) int[,] array new int[100,100]; int index 1; for(int i 0;i < array.GetLength(0);i){for(int j 0;j < array.GetLength(1);j){array[i,j] index;index;} }2. 将二维数组的右上半部分置零 int[,] array new int[4,…

你还在用一串数字访问你的系统吗?

大家还记得第一次启动SpringBoot应用并在浏览器访问是如何进行的吗&#xff1f;在SpringBoot启动后&#xff0c;我们会看到如图所示&#xff1a; SpringBoot内置tomcat以端口8080启动&#xff0c;然后根据指引&#xff0c;我们在浏览器输入&#xff1a; http://127.0.0.1:8080…

ffmpeg视频滤镜:膨胀操作-dilation

滤镜介绍 dilation 官网链接 > FFmpeg Filters Documentation 膨胀滤镜会使图片变的更亮&#xff0c;会让细节别的更明显。膨胀也是形态学中的一种操作&#xff0c;在opencv中也有响应的算子。此外膨胀结合此前腐蚀操作&#xff0c;可以构成开闭操作。 开操作是先腐蚀…

Unity中的屏幕坐标系

获得视口宽高 拖动视口会改变屏幕宽高数值 MousePosition 屏幕坐标系的原点在左下角&#xff0c;MousePosition返回Z为0也就是纵深为0的Vector3 但是如果鼠标超出屏幕范围不会做限制&#xff0c;所以可能出现负数或者大于屏幕宽高的情况&#xff0c;做鼠标拖拽物体时需要注…