侵权投诉

C语言基本知识点和编程规范详解

2018-03-29 09:21 次阅读

写这个8*8按键程序的过程中,不管是在自己写还是参考别人程序的过程中,发现自己对C语言有些基本知识点和编程规范有很多不懂的地方,有些是自己以前的编程习惯不好,有些就是基础知识不扎实的表现,所以总结出来。

一、.H文件与.C文件的关系:

迄今为止,写过的程序都是一些很简单的程序,从来没有想到要自己写.H文件,也不知道.H文件到底什么用,与.C文件什么关系。只是最近写键盘程序,参考别人的程序时,发现别人写的严格的程序都带有一个“KEY.H”,里面定义了.C文件里用到的自己写的函数,如Keyhit()、Keyscan()等。

经过查找资料得知,.H文件就是头文件,估计就是Head的意思吧,这是规范程序结构化设计的需要,既可以实现大型程序的模块化,又可以实现根各模块的连接调试。

1、.H文件介绍:

单片机C程序设计中,项目一般按功能模块化进行结构化设计。将一个项目划分为多个功能,每个功能的相关程序放在一个C程序文档中,称之为一个模块,对应的文件名即为模块名。一个模块通常由两个文档组成,一个为头文件*.h,对模块中的数据结构和函数原型进行描述;另一个则为C文件*.c ,对数据实例或对象定义,以及函数算法具体实现。

2、.H文件的作用

作为项目设计,除了对项目总体功能进行详细描述外,就是对每个模块进行详细定义,也就是给出所有模块的头文件。通常H头文件要定义模块中各函数的功能,以及输入和输出参数的要求。模块的具体实现,由项目组成根据H文件进行设计、编程、调试完成。为了保密和安全,模块实现后以可连接文件OBJ、或库文件LIB的方式提供给项目其他成员使用。由于不用提供源程序文档,一方面可以公开发行,保证开发人员的所有权;另一方面可以防止别人有意或无意修改产生非一致性,造成版本混乱。所以H头文件是项目的详细设计和团队工作划分的依据,也是对模块进行测试的功能说明。要引用模块内的数据或算法,只要用包含include指定模块H头文件即可。

3、.H文件的基本组成

/*如下为键盘驱动的头文档*/

#ifndef _KEY_H_ //防重复引用,如果没有定义过_KEY_H_,则编译下句

#define _KEY_H_ //此符号唯一, 表示只要引用过一次,即#i nclude,则定义符号_KEY_H_

/////////////////////////////////////////////////////////////////

char keyhit( void ); //击键否

unsigned char Keyscan( void ); //取键值

/////////////////////////////////////////////////////////////////

#endif

二、尽量使用宏定义#define

开始看别人的程序时,发现程序开头,在文件包含后面有很多#define语句,当时就想,搞这么多标示符替换来替换去的,麻不麻烦啊,完全没有理解这种写法的好处。原来,用一个标示符表示常数,有利于以后的修改和维护,修改时只要在程序开头改一下,程序中所有用到的地方就全部修改,节省时间。

#define KEYNUM 65//按键数量,用于Keycode[KEYNUM]

#define LINENUM 8//键盘行数

#define ROWNUM 8//键盘列数

注意的地方:

1、宏名一般用大写

2、宏定义不是C语句,结尾不加分号

三、不要乱定义变量类型

以前写程序,当需要一个新的变量时,不管函数内还是函数外的,直接在程序开头定义,虽然不是原则上的错误,但是很不可取的作法。

下面说一下,C语言中变量类型的有关概念:

从变量的作用范围来分,分为局部变量和全局变量:

1、全局变量:是在函数外定义的变量,像我以前定义在程序开头的变量都是全局变量,这里我就犯了一个大忌,使用了过多的全局变量。

带来的问题有两个:一是,全局变量在程序全部执行过程中都占用资源;二是,全局变量过多使程序的通用性变差,因为全局变量是模块间耦合的原因之一。

2、局部变量:在函数内部定义的变量,只在函数内部有效。

从变量的变量值存在的时间分为两种:

1、静态存储变量:程序运行期间分配固定的存储空间。

2、动态存储变量:程序运行期间根据需要动态地分配存储空间。

具体又包括四种存储方式:auto static register extern

1、局部变量,不加说明默认为auto型,即动态存储,如果不赋初值,将是一个不确定的值。而将局部变量定义为static型的话,则它的值在函数内是不变的,且初值默认为0。

static unsigned char sts;//按键状态变量

static unsigned char Nowkeycode;//此时的键码

static unsigned char Prekeycode;//上一次的键码

static unsigned char Keydowntime;//矩形键盘按下去抖时间变量

static unsigned char Keyuptime;//矩形键盘释放去抖时间变量

static unsigned char Onoffdowntime;//关机键按下去抖时间变量

static unsigned char Onoffuptime;//关机键释放去抖时间变量

static unsigned char onoff_10ms; //判断关机键中断次数变量,累计150次大约为3S,因为前后进了两个10ms中断

2、全局变量,编译时分配为静态存储区,可以被本文件中的各个函数引用。如果是多个文件的话,如果在一个文件中引用另外文件中的变量,在此文件中要用extern说明。不过如果一个全局变量定义为static的话,就只能在此一个文件中使用。

四、特殊关键字const volatile的使用

1、const

const用于声明一个只读的变量

const unsigned char a=1;//定义a=1,编译器不允许修改a的值

作用:保护不希望被修改的参数

const unsigned char Key_code[KEYNUM]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,

0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,

0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,

0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,

0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,

0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,

0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,

0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,

0x41

};//键码

const unsigned char Line_out[LINENUM]={0xFE,0xFD,0xFB,0xf7,0xEF,0xDF,0xBF,0x7F};//行输出编码

const unsigned char Row_in[ROWNUM]={0xFE,0xFD,0xFB,0xf7,0xEF,0xDF,0xBF,0x7F};//列输入编码

2、volatile

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

static int i=0;

int main(void)

{

...

while (1)

{

if (i)

dosomething();

}

}

/* Interrupt service routine. */

void ISR_2(void)

{

i=1;

}

程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

原文标题:单片机C语言编程心得

文章出处:【微信号:weixin21ic,微信公众号:21ic电子网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

RISC-V单片机玩转ESP8266 WIFI模块解析

程序主要包括如下4个功能模块:ESP01S初始化、串口处理、Event回调函数、事件处理;串口处理模....
发表于 07-07 09:26 0次 阅读
RISC-V单片机玩转ESP8266 WIFI模块解析

40个经典单片机实验帮你成功 206页 2.6M

40个经典单片机实验帮你成功 206页 2.6M 非常适合初学者和毕设 资料分享来自网络资源 ...
发表于 07-06 22:13 72次 阅读
40个经典单片机实验帮你成功 206页 2.6M

单片机的组成和特点详细资料概述

单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单....
发表于 07-06 18:11 21次 阅读
单片机的组成和特点详细资料概述

单片机最小系统的设计方案

单片机最小系统设计主要在STC89C52单片机上,用MAX23芯片实现串口程序下载,用HD7279A....
发表于 07-06 18:08 20次 阅读
单片机最小系统的设计方案

51单片机c程序

void tim( )interrupt 1 {     static  uchar count=0;     TH0=0xfc;    ...
发表于 07-06 12:41 98次 阅读
51单片机c程序

STC ISPV6.87单片机烧录软件免费下载

本文档的主要内容详细介绍的是STC ISPV6.87单片机烧录软件免费下载。
发表于 07-06 08:00 15次 阅读
STC ISPV6.87单片机烧录软件免费下载

使用Proteus仿真单片机设计远程计算器的资料免费下载

本文档的主要内容详细介绍的是使用Proteus仿真单片机设计远程计算器的资料免费下载。
发表于 07-06 08:00 18次 阅读
使用Proteus仿真单片机设计远程计算器的资料免费下载

当前常用单片机开发模式有哪些

单片机开发的过程肯定是需要单片机开发工具的支持的,进行程序的调试等是单片机开发过程更加顺畅,缩短开发....
发表于 07-05 11:12 64次 阅读
当前常用单片机开发模式有哪些

低功耗MCU单片机如何选型

 小编给带来分享低功耗MCU单片机如何选型,需要关注以下几点。
发表于 07-05 11:11 84次 阅读
低功耗MCU单片机如何选型

单片机芯片生产工艺对单片机芯片良率的影响

单片机芯片生产工艺对单片机芯片良率的影响是至关重要的。这些因素可以细化到单片机芯片工艺制程步骤数量、....
发表于 07-05 11:08 50次 阅读
单片机芯片生产工艺对单片机芯片良率的影响

基于单片机的点火系统工作原理

汽车电子市场火热,英锐恩科技分享基于单片机的点或市场。与传统的机械调节式点火时刻控制系统相比,基于微....
发表于 07-05 11:05 60次 阅读
基于单片机的点火系统工作原理

8051单片机架构_封装及原理图

 继8051单片机成功之后,许多其他半导体制造商纷纷以自己的品牌发布了使用MCS-51内核的单片机。....
发表于 07-05 11:01 58次 阅读
8051单片机架构_封装及原理图

学习单片机C语言,必知的数据存储与程序编写知识!

堆区(heap):就是那些由new分配的内存块,它们的释放编译器不去管,由我们的应用程序去控制,一般....
的头像 MCU开发加油站 发表于 07-05 10:31 203次 阅读
学习单片机C语言,必知的数据存储与程序编写知识!

插入uart不显示COM号怎么解决?

[table] [tr][td]我插入jtag口显示USB Serial Port(com2),插入UART只会显示USB to UART Adapter,并不会显示...
发表于 07-04 13:40 147次 阅读
插入uart不显示COM号怎么解决?

单片机最小系统的设计资料概述

单片机最小系统特点:系统资源完全开放,配合其它模块板或自行搭建用户电路可实现任意实验功能。接口设计灵....
的头像 Wildesbeast 发表于 07-04 12:09 435次 阅读
单片机最小系统的设计资料概述

使用单片机设计IC卡读写器的资料概述

本文对AT24系列存贮器和AT89系列单片机的特征及总线状态作为介绍,并以AT24C01与AT89C....
的头像 Wildesbeast 发表于 07-04 12:09 508次 阅读
使用单片机设计IC卡读写器的资料概述

如何将PIC单片机AD转换数据打包

pic单片机作用宽泛,对于pic单片机,大家已不再像若干年前一样一无所知。随着对pic单片机的使用,....
的头像 Wildesbeast 发表于 07-04 11:13 634次 阅读
如何将PIC单片机AD转换数据打包

如何选择合适的PIC单片机?PIC单片机或运算符运用应该怎么样应用

pic单片机对于大家早已不再是琢磨不透的大山,随着pic单片机的使用,大家对pic单片机的认识逐步增....
的头像 Wildesbeast 发表于 07-04 09:28 324次 阅读
如何选择合适的PIC单片机?PIC单片机或运算符运用应该怎么样应用

晶振应该如何实现秒信号

晶振的重要性显而易见,缺少晶振,单片机等器件将不能良好运行。因此,大家有必要增进对晶振的认识。为此,....
的头像 Wildesbeast 发表于 07-04 09:28 249次 阅读
晶振应该如何实现秒信号

如何判断晶振的好坏晶振对于单片机有怎么样的影响

晶振的作用日渐突出,本文中,将基于三方面介绍晶振:1.如何判断晶振好坏,2.石英晶振的运用准则,3.....
的头像 Wildesbeast 发表于 07-04 09:27 595次 阅读
如何判断晶振的好坏晶振对于单片机有怎么样的影响

单片机选择的原则有哪些

根据设计任务的复杂程度来决定选择什么样的单片机研发阶段,推荐使用Flash单片机,它有电写入、电擦除....
发表于 07-03 18:12 50次 阅读
单片机选择的原则有哪些

如何使用STC89C52单片机实现多功能数字钟的设计

钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。数字钟是一种用数字电....
发表于 07-03 17:45 63次 阅读
如何使用STC89C52单片机实现多功能数字钟的设计

国产航顺芯(HK)高性价比32位MCU选型表分享

国产航顺芯(HK)高性价比32位MCU选型表,有需要的可以了解下 ...
发表于 07-03 16:51 169次 阅读
国产航顺芯(HK)高性价比32位MCU选型表分享

有大神用过瑞萨单片机开发过机车仪表盘吗?

摩托车仪表盘的油量与速度采集算法优化是怎么做的? 油量是通过AD采样,速度是外部中断触发计数,换算成频率再折合成速度值。...
发表于 07-03 16:44 161次 阅读
有大神用过瑞萨单片机开发过机车仪表盘吗?

简易抢答器 双人 需要一个C语言代码

(四) 简易抢答器功能:1)制作两人抢答器,每人分值范围0~9,两人初始分值均为5。2)主持人按下“开始”按键后,设定1个LED...
发表于 07-03 13:54 174次 阅读
简易抢答器 双人  需要一个C语言代码

单片机学习笔记,三个步骤教你学!

一、基础理论知识学习 基础理论知识包括模拟电路、数字电路和C语言知识。模拟电路和数字电路属于抽象学科,要把它学好还得费点...
发表于 07-03 11:41 693次 阅读
单片机学习笔记,三个步骤教你学!

浅谈2020年六大主流编程语言

目前,计算机语言的总数总计达9000种。但是,其中只有50种编程语言是较为流行的。今天,小编就给大家....
的头像 如意 发表于 07-03 11:36 209次 阅读
浅谈2020年六大主流编程语言

单片机学习笔记,三个步骤教你学!

作为一名电子技术从业人员,你学过单片机吗?你会运用单片机吗?我想你一定学过,但不一定会运用。因为学习单片机比学习其他学科...
发表于 07-03 11:13 983次 阅读
单片机学习笔记,三个步骤教你学!

单片机通过串口向串口助手发送字符串,串口助手显示只接收到第一个字符,什么问题?

我是通过二串口接收一串字符,然后通过一串口发送给串口助手,图如下 ...
发表于 07-03 09:43 629次 阅读
单片机通过串口向串口助手发送字符串,串口助手显示只接收到第一个字符,什么问题?

PCB板上电后的运行情况

对于手边的一盒STC单片机,测试一下它们使用相同的ISP方案在下载过程中是否都可以按照相同的方式完成....
的头像 玩转单片机 发表于 07-03 09:14 284次 阅读
PCB板上电后的运行情况

基于定时控制寄存器TCON

如果定时器工作在中断方式下,则当定时器的当前值计满溢出时,就会触发定时器溢出中断。
的头像 玩转单片机 发表于 07-03 09:11 173次 阅读
基于定时控制寄存器TCON

单片机最小系统的PCB和电路原理图免费下载

本文档的主要内容详细介绍的是单片机最小系统的PCB和电路原理图免费下载。
发表于 07-03 08:00 74次 阅读
单片机最小系统的PCB和电路原理图免费下载

STM32单片机使用SPI方式驱动ST7565无字库12864LCD的程序免费下载

本文档的主要内容详细介绍的是STM32单片机使用SPI方式驱动ST7565无字库12864LCD的程....
发表于 07-03 08:00 42次 阅读
STM32单片机使用SPI方式驱动ST7565无字库12864LCD的程序免费下载

如何使用TMS320F2808单片机实现全桥三电平LLC谐振变换器的设计论文

为了降低谐波污染,提高功率因数,在大功率变换器应用场合中,往往采用功率因数校正电路。但是功率因数校正....
发表于 07-03 08:00 47次 阅读
如何使用TMS320F2808单片机实现全桥三电平LLC谐振变换器的设计论文

51单片机系统板开发常见错误大全

对元件封装没有认真考虑,造成 PCB 与原理图之间不对应
发表于 07-02 18:01 48次 阅读
51单片机系统板开发常见错误大全

单片机教程之C语言的程序设计说明

C51是在标准C的基础上,根据单片机存储器硬件结构及内部资源,扩展了相应的数据类型和变量,而C51在....
发表于 07-02 17:45 50次 阅读
单片机教程之C语言的程序设计说明

基于AVR单片机的RFID阅读器设计方案

无线射频识别(Radio Frequency Identification,RFID)是利用感应、电....
发表于 07-02 16:07 53次 阅读
基于AVR单片机的RFID阅读器设计方案

c语言宏定义的使用方法

当宏作为常量使用时,C程序员习惯在名字中只使用大写字母。但是并没有如何将用于其他目的的宏大写的统一做....
发表于 07-02 15:04 72次 阅读
c语言宏定义的使用方法

C语言二级指针的用法与原理

提到指针,我们都知道指针是用来存储一个变量的地址。所以,当我们定义了一个指向指针的指针的时候(poi....
发表于 07-02 14:52 58次 阅读
C语言二级指针的用法与原理

双芯单片机实验系统说明书

双MCU:左边MCU可以用STC89C52或IAP15F2K61S2(可仿真)右边MCU 可以用STC89C52或IAP15F2K61S2(可仿...
发表于 07-01 20:00 152次 阅读
双芯单片机实验系统说明书

固件模块可以分为哪几种类型?

固件模块原理固件开发中模块化编程的基本概念是创建固件模块。从概念上讲,模块代表关注点分离。在计算机科....
的头像 玩转单片机 发表于 07-01 17:05 262次 阅读
固件模块可以分为哪几种类型?

单片机内部结构几个基本概念

请大家自己写上3盏灯的情况000 001 010 011 100 101 110 111我们来看,这....
的头像 玩转单片机 发表于 07-01 16:49 241次 阅读
单片机内部结构几个基本概念

单片机控制LED灯点亮的实验资料说明

本文档的主要内容详细介绍的是单片机控制LED灯点亮的实验资料说明
发表于 07-01 16:49 72次 阅读
单片机控制LED灯点亮的实验资料说明

单片机开发一个数据采集系统

本例题采用可调电阻 调节电压值作为模拟信号的输入量,通过A/D转换芯片AD0808把模拟信号转换为数....
的头像 玩转单片机 发表于 07-01 16:47 282次 阅读
单片机开发一个数据采集系统

C语言和PHP,新手选择哪个比较好?

计科专业从事嵌入式开发多年,从现在的市场行情以及就业的机会上讲php的就业空间还是大于C语言,但并不....
的头像 如意 发表于 07-01 16:15 103次 阅读
C语言和PHP,新手选择哪个比较好?

关于意法半导体STM32单片机的特性分析

MCU经过多年发展,性能也得到了很大的提升。因为MCU必须顺序执行程序,所以适于做控制,较多地应用于....
发表于 07-01 13:41 35次 阅读
关于意法半导体STM32单片机的特性分析

Python的发展趋势,未来可期

首先,当前Python作为一门流行程度比较高的全场景编程语言,在IT互联网行业和一部分传统行业已经有....
的头像 如意 发表于 07-01 10:19 172次 阅读
Python的发展趋势,未来可期

怎么样才能在Keil C51环境下实现64位浮点库的设计

为解决Keil C51环境下无法进行64位双精度计算的问题,采用分部存储和分部计算的方法,设计了在K....
发表于 07-01 08:00 15次 阅读
怎么样才能在Keil C51环境下实现64位浮点库的设计

使用keil和proteus软件基于51单片机设计简易计数器系统的资料说明

目前科技发展迅速,单片机由于其种类繁多及其使用+方便,在我们的日常工作与生活中起着必不可少的作用。首....
发表于 07-01 08:00 33次 阅读
使用keil和proteus软件基于51单片机设计简易计数器系统的资料说明

怎么样才能使用Keil C51开发大型嵌入式程序

 结合在8051系列单片机平台上的实际开发应用的经验,介绍用 Keil C在8051单片机上进行大型....
发表于 07-01 08:00 14次 阅读
怎么样才能使用Keil C51开发大型嵌入式程序

单片机播放音乐的仿真电路图和源代码资料免费下载

本文档的主要内容详细介绍的是单片机播放音乐的Proteus仿真电路图和源代码资料免费下载。
发表于 07-01 08:00 55次 阅读
单片机播放音乐的仿真电路图和源代码资料免费下载

使用单片机实现控制循环输出彩灯的proteus仿真和Keil程序免费下载

本文档的主要内容详细介绍的是使用单片机实现控制循环输出彩灯的proteus仿真和Keil程序免费下载....
发表于 07-01 08:00 32次 阅读
使用单片机实现控制循环输出彩灯的proteus仿真和Keil程序免费下载

使用单片机实现LED滚动输出字符的Proteus仿真资料合集和程序免费下载

本文档的主要内容详细介绍的是使用单片机实现LED滚动输出字符的Proteus仿真资料合集和程序免费下....
发表于 07-01 08:00 40次 阅读
使用单片机实现LED滚动输出字符的Proteus仿真资料合集和程序免费下载

keil uvision4编译环境与使用教程详细说明

单片机开发是一种包括软、硬件设计的系统工程,硬件是基础,软件是升华,两者息息相关。汇编语言源程序要变....
发表于 07-01 08:00 37次 阅读
keil uvision4编译环境与使用教程详细说明

Keil 51和protues联调仿真实验资料合集免费下载

本文档的主要内容详细介绍的是Keil 51和protues联调仿真实验资料合集免费下载包括了:实验一....
发表于 07-01 08:00 39次 阅读
Keil 51和protues联调仿真实验资料合集免费下载

使用单片机和DS1302实现时钟LCD1602显示的程序和仿真资料免费下载

本文档的主要内容详细介绍的是使用单片机和DS1302实现时钟LCD1602显示的程序和仿真资料免费下....
发表于 06-30 17:35 38次 阅读
使用单片机和DS1302实现时钟LCD1602显示的程序和仿真资料免费下载

使用单片机和DS302实现6位数码管显示程序和仿真图免费下载

本文档的主要内容详细介绍的是使用单片机和DS302实现6位数码管显示程序和仿真图免费下载。
发表于 06-30 17:34 31次 阅读
使用单片机和DS302实现6位数码管显示程序和仿真图免费下载

详谈选择排序算法的定义和过程

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数....
的头像 如意 发表于 06-30 17:06 67次 阅读
详谈选择排序算法的定义和过程