单片机-C语言-定义和申明

以下代码是单片机程序,51单片机,编译器为HT-IDE3000,

简单来说

头文件中只能申明,

变量在头文件中申明时,要加上extern 这个关键字用来告诉编译器,变量在其它的文件中定义,

enum 不是变量,是我们自己定义的数据类型,像int char 一样,只不过是我们自己定义的,所以不用加,

 1 extern u16    g_u16TimeBaseCount;
 2 extern u8    g_8count_2s;
 3 extern u8    g_8count_8s;
 4 extern u8    g_8count_18s;
 5 extern u8    g_8count_60s;
 6 extern u8    g_8count_200s;
 7 extern u8    g_8count_6h;
 8 extern u8   g_8count_200sw;//6hour wash
 9 extern u8   g_8count_6hw;//6hour wash
10 extern u8   w_6hw_start;
11 extern u8   w_6hw_end;
12 extern u8   g_state;
13 extern u16    make_6h_count;
14 extern u8   g_once;
15 extern u16  s_c1;//中间变量
16 extern u16  s_c2;
17 extern u16  s_c3;
18 extern u16  s_c4;
19
20 extern u8 UARTReceive;
21 extern u8 AD[6];
22 extern u8 TDS[6];
23 extern u8 count_AD;
24 extern u8 count_ADS;
25 extern u16 sumTDS_H,sumTDS_L,sum;
26 extern u16 temer;
27
28 typedef enum GPIOPin
29 {
30   GPIO_Pin_0    = ((u8)0x01),   /*!< Pin 0 selected */
31   GPIO_Pin_1    = ((u8)0x02),   /*!< Pin 1 selected */
32   GPIO_Pin_2    = ((u8)0x04),   /*!< Pin 2 selected */
33   GPIO_Pin_3    = ((u8)0x08),   /*!< Pin 3 selected */
34   GPIO_Pin_4    = ((u8)0x10),   /*!< Pin 4 selected */
35   GPIO_Pin_5    = ((u8)0x20),   /*!< Pin 5 selected */
36   GPIO_Pin_6    = ((u8)0x40),   /*!< Pin 6 selected */
37   GPIO_Pin_7    = ((u8)0x80),   /*!< Pin 7 selected */
38   GPIO_Pin_LNib = ((u8)0x0F),   /*!< Low nibble pins selected */
39   GPIO_Pin_HNib = ((u8)0xF0),   /*!< High nibble pins selected */
40   GPIO_Pin_All  = ((u8)0xFF)    /*!< All pins selected */
41 }GPIO_Pin_TypeDef;

函数也在头文件中,也只能申明,不能加函数体

u8 UART_Receive();

变量和函数的实现也就是函数体,只能在源文件中定义

 1 uFlg uF1,uF2,uF3,uF4;
 2 u16    g_u16TimeBaseCount;
 3 u8    g_8count_2s;
 4 u8    g_8count_8s;
 5 u8    g_8count_18s;
 6 u8    g_8count_60s;
 7 u8    g_8count_200s;
 8 u8    g_8count_6h;
 9 u8   g_8count_200sw;//6hour wash
10 u8   g_8count_6hw;//6hour wash
11 u8   w_6hw_start;
12 u8   w_6hw_end;
13 u8   g_state;
14 u16    make_6h_count;
15 u8   g_once;
16 u16  s_c1;//中间变量
17 u16  s_c2;
18 u16  s_c3;
19 u16  s_c4;
20 u8 UARTReceive=0;
21 u8 AD[6]={0,0,0,0,0,0};
22 u8 TDS[6]={0,0,0,0,0,0};
23 u8 count_AD=0;
24 u8 count_ADS=0;
25 u16 sumTDS_H=0,sumTDS_L=0,sum=0;
26 u16 temer;
27
28 //===========================数据接收=========================================//
29 u8 UART_Receive()
30     {
31        u8 data;
32        if(_rxif==1)//如果接收到数据
33        {
34              data=_txr_rxr;
35              return data;
36            }
37      }

原文地址:https://www.cnblogs.com/chenzhong-w/p/9610988.html

时间: 2024-11-05 16:04:29

单片机-C语言-定义和申明的相关文章

单片机c语言教程:C51循环语句

单片机c语言教程第十三课 C51循环语句 循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作.如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 1000 次空语句 才能达到延时的目的(当然能使用定时器来做,这里就不讨论),如果是写 1000 条空语 句那是多么麻烦的事情,再者就是要占用很多的存储空间.我们能知道这 1000 条空语句, 无非就是一条空语句重复执行 1000 次,因此我们就能用循环语句去写,这样不但使程序 结构清晰明了,而且

语言定义的其他示例

在本章的以后部分,我们会看到有关如何解析简单的算术语言的两个扩展示例.第一个用fslex.exe 和 fsyacc.exe 实现,第二个用开源的解析库 FParsec.这种语言与前一章的非常相似,语言规范完全相同,有四则运算,只是不再使用连接符(combinator),语言本身有文字格式 *.+./.- 来表示运算.扩展的巴氏范式(Extended Backus–Naur Form,EBNF),用下面的代码定义这种语言: digit     = "1"| "2"|

Java语言定义的线程状态分析

说到线程,一定要谈到线程状态,不同的状态说明线程正处于不同的工作机制下,不同的工作机制下某些动作可能对线程产生不同的影响. Java语言定义了6中状态,而同一时刻,线程有且仅有其中的一种状态.要获取Java线程的状态可以使用 java.lang.Thread类中定义的 getState()方法,获取当前线程的状态就可以使用Thread.currentThread().getState()来获取.该方法返回的类型是一个枚举类型,是Thread内部的一个枚举,全称为“java.lang.Thread

单片机脚本语言-移植lua到stm32-MDK

Lua简介 Lua[1]  是一个小巧的脚本语言.作者是巴西人.该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用.不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护. Lua的目标是成为一个很容易嵌入其它语言中使用的语言.大多数程序员也认为它的确做到了这一点. 很多应用程序使用LUA作为自己的嵌入式脚本

C++语言定义的标准转换

标准转换 C++ 语言定义其基础类型之间的转换. 它还定义指针.引用和指向成员的指针派生类型的转换. 这些转换称为"标准转换. 1. 整型提升 整数类型的对象可以转换为另一个更宽的整数类型(即,可表示更大的一组值的类型). 这种扩展类型的转换称为"整型提升". 利用整型提升,您可以在可使用其他整数类型的任何位置将以下项用于表达式: char 和 short int 类型的对象.文本和常量 枚举类型 int 位域 枚举器 C++ 提升是"值保留". 即,提升

单片机C语言延时需注意的问题

标准的C语言中没有空语句.但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果.这在汇编语言中很容易实现,写几个nop就行了. 在keil C51中,直接调用库函数: #include // 声明了void _nop_(void); _nop_(); // 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒.NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS.对于延时比较长的,要求在大于10

单片机C语言探究--为什么变量最好要赋初值

有许多书上说,变量最好要赋初值.但是为什么要初值呢?不赋初值可能会出现什么样的意外呢?以下就我在以51单片机为MCU,Keil为编译器看到的实现现象作分析.众所周知,变量是存储在RAM中,掉电后即丢失,上电后默认全为0.那么这样的话没赋初值的变量值全为0,这也应该是大家认为理所当然的.但是,当单片机复位的时候(包括硬件复位即按下复位按钮,看门狗复位,以及其它软件程序复位),单片机只是重新跳回到main函数开始执行,而并没有清空RAM!所以,那些只是定义而没有赋初值的变量(尤其是全局变量)依然会使

单片机C语言的程序架构

初学单片机时,都会纠结于其各个模块功能的应用,如串口(232,485)对各种功能IC的控制,电机控制PWM,中断应用,定时器应用,人机界面应用,CAN总线等. 这是一个学习过程中必需的阶段,是基本功.很庆幸,在参加电子设计大赛赛前培训时,MCU周围的控制都训练的很扎实.经过这个阶段后,后来接触不同的MCU就会发现,都大同小异,各有各的优势而已,学任何一种新的MCU都很容易入手包括一些复杂的处理器.而且对MCU的编程控制会提升一个高度概况--就是对各种外围进行控制(如果是对复杂算法的运算就会 用D

c语言定义函数指针和typedef简写

二种方法来定义函数指针 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<Windows.h> 4 5 int add(int a, int b) 6 { 7 return a + b; 8 } 9 10 //void msg(char s[]) 11 //void (*p)(char s[]) 函数指针的定义方法 12 //void (*)(char *s) 函数指针的类型 13 14 void msg(char