c51单片机编程要点总结

c51单片机编程要点总结

1、头文件:#include (我用的是 STC 89C54RD+)

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[ ] = ;// 想用 table[i] 指定不同的引脚,但这么做会报错

sbit table[ ] = ; // 考虑到上面可能是 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

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

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

7、按位与或:

P1 = P1 & 0x01

P1 = P1 0x01

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

unsigned char code table[ ] = ;

使用: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……

为了方便大家更好的学习,畅学电子网特别增加了针对单片机和EDA的公众号,每天推送相关知识,希望能对你的学习有所帮助!

本文来自企鹅号 - 畅学电子媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

wpf 如何使用 Magick.NET 播放 gif 图片 安装 Magick.NET解析 gif播放 gif

最近在做 gif 播放,发现 gif 播放需要很多内存,于是就使用 Magick.NET 播放,但是这个方式也需要很多的内存。播放一张 uwp 萤火虫 需要 ...

482
来自专栏Netkiller

Solidity 智能合约开发语言·数据类型

中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>

67310
来自专栏逆向技术

COM编程_第一讲_深入COM框架以及实现简单的COM

一丶我们要理解COM是什么(为什么理解) 现在很多人会用com(也就是ALT)但是不知道原理,如果改一点东西,那么整体的框架重来,因为你不懂改哪里,如果懂了,那...

2030
来自专栏calmound

HTML

注释<!--这里是注释--> 页面内容<body>展示的页面内容</body> 段落 <p></p> 标题<hx></hx>     <body>     <h...

2797
来自专栏FreeBuf

VLC播放器加载恶意字幕文件导致执行任意代码漏洞分析与POC实现

今年5月23号的时候,听说checkpoint搞了个大新闻:vlc等播放器加载特定字幕可以完全控制用户电脑。当时我就震惊了:还有何种操作。想想看,当你吃着辣条,...

3884
来自专栏破晓之歌

React组件(推荐,差代码) 原

react官方教程:https://reactjs.org/tutorial/tutorial.html

632
来自专栏Seebug漏洞平台

PWN学习之house of系列(一)

house of spirit是fastbin的一种利用方法,利用demo可参考: https://github.com/shellphish/how2heap...

86113
来自专栏Python绿色通道

Python爬虫:现学现用xpath爬取豆瓣音乐

爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能

1143
来自专栏安恒网络空间安全讲武堂

利用通用伪造签名绕过ElGamal

利用通用伪造签名绕过ElGamal ElGamal签名加密国赛mailbox有出过,国赛的绕过方法是选择签名伪造绕过,而我们所讲的是利用通用伪造签名来绕过,以...

1896
来自专栏州的先生

周末玩个球,几行代码用PyQt5实现足球射门动画

QT作为一个全面的桌面应用程序开发包,其自然提供了对图像的动画支持。本篇文章中,就来简单地在PYQt5中使用Animation动画功能。

852

扫码关注云+社区