专栏首页企鹅号快讯c51单片机编程要点总结

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 条评论
登录 后参与评论

相关文章

  • mariadb数据库误操作的克星-flashback

    写在前面 对于数据库而言,误操作是很致命的,并且是很难完全避免的,除了规范DBA操作之外,还需要一个非常好用的快速闪回工具处理误操作问题。之前有同行发表过类似文...

    企鹅号小编
  • 来仿一仿retrofit

    为什么要重复造轮子 在开发领域有一句很流行的话就是不要重复造轮子,因为我们在开发中用到的很多东西早已有很多人去实现了,而且这些实现都是经过时间和开发者检验过的,...

    企鹅号小编
  • 王健林旗下万达网科被曝大裁员 总裁出面说话了

    处于风口浪尖的万达网络科技集团(以下简称万达网科)再陷裁员风波。 12月28日,据澎湃新闻报道称,有知情人士透露,万达网科从12月28日当天开始大规模裁员,据称...

    企鹅号小编
  • 如何在Sketch,Figma及XD之间转换文件格式?

    如今,UI设计工具越来越多,每个软件都有他特定的使用群体,但是,设计师不可避免的会遇到相互协作的时候。那么文件转换就成了一个大难题。

    用户5009027
  • 如何利用磁场驱动某个微型机器人

    该论文介绍了一种新技术,即使大量机器人采用同样材质制作,还位于同一磁场影响下,我们依然可以利用磁场选择性的驱动某个微型机器人,甚至精确到它们身上的某个组件。

    机器人网
  • 【视频】自然框架之分页控件的使用方法(二) 下载、DLL说明和web.config的设置

      上次说的是QuickPager分页控件的PostBack的使用方式,也提供了源码下载。但是有些人下载之后发现有一大堆的文件夹,还有一大堆的DLL,到底要用哪...

    用户1174620
  • 为什么IM不适合直接运行在公链上?

    “如果你还不了解区块链,这篇文章不适合你,建议你先学完再来;如果只关心撒币,你可以直接拖到最后看发币信息,前面的内容都不用看;如果有通讯和社交领域知识,并一直关...

    一乐骑摩托
  • [周末往期回顾] 自动备份思科交换机配置

    bsbforever
  • 使用Python自动备份思科交换机配置

    bsbforever
  • 初学者必会的Linux命令 - 基本操作篇

    聚沙成塔

扫码关注云+社区

领取腾讯云代金券