文档章节

单片机 C51 编程要点总结

qq3120895059
 qq3120895059
发布于 2017/08/29 11:46
字数 907
阅读 21
收藏 0

单片机 C51 编程要点总结

1、头文件:#include

 

2、预定义:sbit LED = P1^0  // 定义 P1 口的 0 位为 LED  

 

注:“P1^0”这个写法,与 A51 不同(A51 是 P1.0),P1 是一组端口,端口号范围 0~7

 

注2:sbit 用于定义 SFR(特殊功能寄存器)的位变量,上例中 LED 作为“全局变量”进行定义

 

注3:以下写法是错误的:

 

sbit code table[ ] = {P1^0, P1^1, P1^2, P1^3};  // 想用 table[i] 指定不同的引脚,但这么做会报错

 

sbit table[ ] = {P1^0, P1^1, P1^2, P1^3};            // 考虑到上面可能是 code 关键字使用错误,使用标准 C 数组写法,但这同样是错的

 

3、主函数写法:void main (void)

 

4、数值的表示:

 

P1 = 1111 1111       // 二进制

P1 = 0xff 或者 P1 = 0xFF   // 十六进制,0x 开头,且数值不分大小写

P1 = 255          // 十进制

 

5、定义小数值时,可以使用 unsigned char i,这样 i 的范围为 0~255,作为循环变量比较好用

 

6、左右移位:

 

P1 <<= 2 等价于 P1 = P1 << 2  // P1 左移 2 位,左移一位相当于乘以 2

P1 >>= 3 等价于 P1 = P1 >> 3  // P1 右移 3 位,右移一位相当于除以 2

 

注:左右移位默认为“逻辑移位”,即无论左移还是右移,空位都补 0

 

7、按位与或:

P1 = P1 & 0x01

P1 = P1 | 0x01

 

8、定义 ROM 表格(就是数据为常量的数组):

 

unsigned char code table[ ] = {0xff, 0xff, 0xff, 0xff};

 

使用:P1 = table[i]

 

注:table[ ] 定义为“全局变量”,上例中 i 的范围为 0~3

 

注2:code 定义的常量存于“代码区”,即 ROM 区,可以节省 RAM 空间

 

9、在使用数码管编程时,假如你正在使用 temp[i] 代表某一个显示字符,突然想显示小数点,可以使用 temp[i] | 0x80,通过“或”运算实现加上小数点……

 

10、如果你用 Keil C51 进行编译,记住一点:它不区分大小写!!!卧槽,今天编程序那个调错啊,就因为一个数组名和一个变量名完全一样,只是大小写不一样罢了,标准 C 我怎么记得这样可以啊……上网一查,卧槽,Keil C51 不区分大小写,准确的说是“连接的时候不区分大小写”,更准确一点就是“具有外部连接的变量区分大小写,内部连接 static 区分大小写”……至少 Keil uVision2 是这样,不知道别的版本是不是,待验证……

 

11、没有 unsigned float x !float 型变量从来没有前边加 unsigned 的语法!

 

12、Keil 编译的程序,main 函数执行完不会停止,会循环执行 main 函数,何解?

 

结论 1:如果主程序中没有 while(1) 这个无限循环,程序走到最后会再次从头开始执行。

 

结论 2:如果主程序有 while(1) 这个无限循环,程序走到最后会一直在这个死循环中运行,不会出现再从头执行的情况。

 

这应该属于 Keil 编译器的 bug,有网友做过实验,表示 Keil 编译后期产生的汇编代码中,结尾有一条 LJMP main,意思就是跳到 main 函数重复执行……还有一种说法是 PC 指针溢出,溢出后的地址指向开头,造成继续执行的效果……(博主觉得还是 Keil 的问题,要是 Keil 编译器不产生 LJMP main 这种语句,也不会产生循环效应……)

 

不管怎么说,在程序结尾加上 while(1) 能够解决循环执行 main 函数的 bug……

 

© 著作权归作者所有

qq3120895059
粉丝 1
博文 4
码字总数 5066
作品 0
郑州
程序员
私信 提问
【目录】电子发烧友, 持续更新

目录内容: 1)Geek 2)C51单片机学习平台搭建 3)入门 4)提高 5)红外发射 6)树莓派 7)物联网 8)模电基础 【Geek】 C51单片机 SIM900A 手机给门禁解锁 智能家居 【C程序代码已开源,更新...

990487026
2015/09/26
0
0
关于C51与汇编的实用混合编程

最近研究了下51的混合编程,总结一下吧! 1.生成C51的汇编源码 右键单击项目文件,在弹出的opinion for file ....选择上生成SRC文件,这个可以产生汇编源文件,也能允许在C51中嵌入A51,即汇...

文剑Boy
2014/05/01
0
0
单片机学习,如何从菜鸟到高手?!

深圳|广州|郑州单片机、pcb培训!信盈达帮你改变!改变你的现状!成就你的梦想! 深圳信盈达一家集产品开发、单片机、pcb、电子、嵌入式培训于一身的公司。凭多年的产品开发经验和心得,将其...

educn114
2014/06/06
0
0
keil mdk代码提示与代码补全设置

(主要参考https://blog.csdn.net/w5862338/article/details/50520423,结合自己的实际问题) 一旦习惯了一些实用的功能,当进入到类似的环境中而没有熟悉的功能,会觉得很不方便,代码提示与...

weixin_41852866
2018/04/13
0
0
【计算机类】大学生计算机专业电子书汇总

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/dengjin20104042056/article/details/95334387 00. 目录 文章目录 本...

沧海一笑-dj
07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
18
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部