单片机中常用的C语言编程
单片机内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能,其任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制。在给单片机输入灵魂时常使用C语言进行编程,本文以keil uVision5的编译过程为例作个人在编程过程中的总结。
一、进制换算
通过了解单片机的使用手册,可以发现每个寄存器有特定的地址编号,如C51中P0引脚的地址编号是0x80,SCON(Serial Control)的地址编号是0x98。在电平触发式发送指令或者数据时,用与运算可以实现十六进制转换成二进制一位位地传送,如定义变量Data,i,则可以用for(i=0;i<8;i++){Data&(0x80>>i);}进行传送,0x80用二进制表示是1000 0000,Data也是十六进制数据,把1进行移位,若Data对应位是1则为1,否则是0。
下面是进制间的数据转换:
- 十进制转二进制是除以2取余,即除以2取余后的商重复步骤,将余数倒序写就是结果;
- 二进制转十进制是从右到左按2的n次幂(n=0,左移一位n加1)乘以二进制对应位上的0或1,将积相加;
- 二进制转十六进制是取四合一法,即从二进制数据向左每四位取成一位,按二进制转十进制的方法算出,从右到左组合即可;
- 十六进制转二进制反之。
5. BCD码(Binary Coded Decimal),用4位二进制数来表示1位十进制数。BCD码转十进制:DEC=BCD/16*10+BCD%16(2位BCD);十进制转BCD码:BCD=DEC/10*16+DEC%10(2位BCD)。与二进制转十六进制相似,但是二进制换算结果超过10是不合法的,如0001 0001表示11,0001 1010不合法。与八进制有关的换算就不赘述了,在单片机编译过程中很少涉及。
- 数据类型
类型 |
符号 |
关键字 |
所占位数 |
数的表示范围 |
整 型 |
有 |
(signed) int |
16 |
-32768~32767 |
(signed) short |
16 |
-32768~32767 |
||
(signed) long |
32 |
-2147483648~2147483647 |
||
无 |
unsigned int |
16 |
0~65535 |
|
unsigned short int |
16 |
0~65535 |
||
unsigned long int |
32 |
0~4294967295 |
||
实 型 |
有 |
float |
32 |
3.4e-38~3.4e38 |
double |
64 |
1.7e-308~1.7e308 |
||
字 符 型 |
有 |
char |
8 |
-128~127 |
无 |
unsigned char |
8 |
0~255 |
注意:
’a’表示字符常量,”a”表示字符串常量。每个字符串结尾,编译器会自动的添加一个结束标志位’\0’,即”a”包含两个字符’a’和’\0’。
在函数外定义的变量是全局变量,所有函数都可以调用;加上static(静止的)是静态全局变量,如果不赋初值,它的值是0。在函数内定义的变量是局部变量,只能在函数内部调用;加上static是静态局部变量,如果不赋初值,它的值是0;定义普通局部变量,如果不赋初值,它的值是随机的。
- 数据运算符
类别 |
运算符 |
意义 |
类别 |
运算符 |
意义 |
算术 |
+ |
加 |
判断 |
!= |
不等于 |
- |
减 |
||||
* |
乘 |
逻辑 |
&& |
逻辑与 |
|
/ |
除 |
|| |
逻辑或 |
||
% |
取余 |
! |
逻辑非 |
||
= |
赋值 |
位运算 |
<< |
按位左移 |
|
++ |
i++(先用后加) ++i(先加后用) |
>> |
按位右移 |
||
-- |
i--(先用后减) --i(先减后用) |
& |
按位与 |
||
判断 |
> |
大于 |
| |
按位或 |
|
>= |
大于等于 |
^ |
按位异或 |
||
< |
小于 |
~ |
按位取反 |
||
<= |
小于等于 |
变量 |
【】 |
数组下标 |
|
== |
等于 |
* |
定义指针,指针取值 |
注意:/是整除;逻辑是判断真假的,0即为假,非0即为真;按位是对位数据进行运算。
- 常用基本语句
语句 |
解释 |
语句 |
解释 |
if(逻辑表达式) { 语句体1; } else { 语句体2; } |
如果逻辑表达式成立 执行语句体1 否则 执行语句体2 (else可以不写) |
for(初始化;逻辑表达式;更改条件) { 循环体; } |
先执行初始化 再判断逻辑表达式 若成立则执行循环体 执行后更改条件 再判断逻辑表达式 直到表达式不成立 |
while(逻辑表达式) { 循环体; } |
如果逻辑表达式成立 执行循环体 执行后再次判断 若还成立则继续执行 直到表达式不成立 |
switch(变量) { case 常量1:语句体1;break; case 常量1:语句体2;break; (...) default:语句体1;break; } |
将变量与case后的各个变量对比 若有相等,则执行相应的语句体 若没有一个相等,则执行default后的语句体 (default可以不写) |
注意:所有需要运行的程序都只能放在main()函数中执行,Project只能有一个main()函数。
- 数组
数组是若干个相同类型的变量在内存中有序存储的集合,可以通过数组名+索引号简单快捷的操作大量数据。如
int i[3]; //定义一组变量(3个)
i[0] //引用数组的第0个变量
i[1] //引用数组的第1个变量
i[2] //引用数组的第2个变量
int i[]={1,2,3}; //定义一组变量并初始化,此定义方法可以省去统计定义的变量个数。
引用i[3]时,数组越界,读出的数值不确定,应避免这种操作。
- 模块化函数
模块化函数是把不同模块的函数放在不同的源文件里,在头文件里声明外部可调用函数,其它源文件可以通过头文件使用其中的代码,使用模块化函数可极大的提高代码的可阅读性、可维护性、可移植性等。以C语言编程为例,main()函数所在的.c文件除外的其他.c文件中可以定义和编写不同功能的函数,建立相应的.h文件,在.h文件中声明自定义的函数,其他.c文件可以通过#include “~~~.h”进行函数调用。
注意:
a、任何自定义的变量、函数在调用前必须有定义或声明,即函数名+()+;
b、使用到的自定义函数的.c文件必须添加到Project参与编译
c、使用的.h文件必须放在编译器可寻找到的地方,如工程文件夹根目录、安装目录、自定义
预编译:(以C语言编译为例)
预编译 |
意义 |
#include <~~~.H> #include “~~~.h” |
头文件的内容替换预编译的语句,从而展开头文件 |
#define PI 3.1415926 |
定义PI,PI替换2.1415926 |
#define A |
定义A |
#ifndef __~~_h_ |
如果没有定义__~~_h_ |
#endif |
与#ifndef,#if匹配,组成“括号” |
为防止头文件重复定义,造成代码错乱,可以使用以下的方法:
#ifndef _DS1302__h_ //如果没有宏定义_DS1302__h_,则执行下面的语句
#define _DS1302__h_ //宏定义_DS1302__h_
外部可调用函数声明 //函数声明
如(void DS1302_Init(void);)
#endif //与#ifndef,#if匹配,组成“括号”
单片机中常用的C语言编程相关推荐
- c语言人机互动编程,单片机人机交互系统的C语言编程简介.ppt
单片机人机交互系统的C语言编程简介 第5章 单片机人机交互系统的C51语言编程 5.1 单片机的输入/输出端口 5.2 LED数码管显示器 5.3 LED数码管点阵显示器 5.4 液晶显示器 5.5 ...
- 梯形图 c语言代码生成,PLC梯形图中内嵌C语言编程的实现
针对现有梯形图语言适合实现逻辑控制而不适合实现复杂算法这一问题,从基于构件技术的梯形图实现原理出发,对构件的属性定义以及编译方法进行了分析,提出了一种PLC梯形图内嵌C语言实现混合编程的方法,并在CA ...
- 单片机中常用的串口通信协议帧
单片机中常用的串口通信协议帧 前言 一.单片机串口简介 二.常用的通信协议类型 1.没有格式 2.帧头帧尾+数据 3.帧头帧尾+数据+附加功能码 4.帧头帧尾+数据+附加功能码+目标地址 5.帧头帧尾 ...
- 嵌入式开发中的防御性C语言编程
嵌入式产品的可靠性自然与硬件密不可分,但在硬件确定.并且没有第三方测试的前提下,使用防御性编程思想写出的代码,往往具有更高的稳定性. 防御性编程首先需要认清C语言的种种缺陷和陷阱,C语言对于运行时的检 ...
- c语言中回显,C语言编程中实现输入密码回显星号
C语言编程中实现输入密码回显星号 众所周知,一个良好的密码输入程序是在用户输入密码时不显示密码本身,只回显星号. 或者,在安全性要求更高的某些程序中,什么都不显示.那么,在C语言中如何实现它呢? ge ...
- c语言中错误executing,C语言编程中常见问题解读.doc
C语言编程中常见问题解读 为什么vc6打开的文件却不能编译1 为什么一个vc6工程中有两个main函数不能编译成功?我想写两个程序怎么办?2 为什么v6不能编译程序,生成信息说compile和link ...
- PHP代码中的情话,php语言编程情话
为什么PHP是最好的编程语言呢 没有最好只有最合适. 无故比较语言的优劣是没有意义的. PHP是目前最先进的编程语言吗 Java和PHP语言两者各有千秋,都有自己独有的特点和应用场景,两者的对比. 1 ...
- STM32中常用的C语言知识点,开始复习!
要学嵌入式,关注@我要学嵌入式,嵌入式猛男的加油站. C语言是单片机开发中的必备基础知识,这里就列举部分STM32学习中会遇见的C 语言基础知识点. 01 位操作 下面我们先讲解几种位操作符,然后讲 ...
- 2 中ascii函数_C语言编程预备知识--字节、ASCII
今天说说代码规范化.字节.什么是ASCII. 一. 代码的规范化 代码写的规范可以使代码的可读性更强,容易让自己和别人更清楚的看懂程序. 还有就是使程序不容易出错. 那么代码如何写才能写得很规范呢?它 ...
- 单片机原理及应用c语言编程,单片机原理及应用(C语言版)
目录 模块1单片微型计算机 项目1:认识单片微型计算机 任务11:认识单片机 任务12:相关知识 项目2:认识单片机应用 任务21:了解单片机应用 任务22:相关知识 项目3:认识仿真软件Pr ...
最新文章
- ios第三方库和工具类
- CentOS部署NetCore - 2. 安装NetCore SDK On CentOS
- Android开发三:常用控件1--TextView、EditText、Button
- Docker最全教程——从理论到实战(九)
- 你不懂js系列学习笔记-异步与性能- 02
- (计算机组成原理)第三章存储系统-第六节1:高速缓冲存储器Cache及其相关基本概念、程序访问的局部性原理和命中率
- OpenCV--CvMemStorage
- 程序员为3万福利放弃30万年薪:贪小便宜的人,都把自己坑惨了
- VS2008编译错误:error PRJ0003 生成 cmd.exe 时出错
- Java 基本语法----数组
- OFFICE工具条的改进
- mysql把A表的数据插入到B表
- a5解锁 oppo_oppoa5忘记密码了怎么强制解锁
- 持续更新:历年硕士研究生报考人数与录取人数统计
- Photo Ninja for Mac(RAW图片转换器)
- 阳光直射对计算机有影响吗,办公电脑需要注意的风水
- 2-(4-噻吩)[4,5f][1,10]邻菲啰啉|cas1070190-29-2-齐岳
- Ubuntu趣味应用探索----我们怎么在ubuntu上玩QQ
- OS101:图灵机、通用图灵机与bootsect
- HpM351a激光打印机加粉后,提示remove shipping lock from black cartridge的解决办法