12条C51编程经验
巧学模电数电单片机 2022-01-06

 

1、头文件:#include 


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


注1:“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 进行编译,记住一点:它不区分大小写!准确的说是“连接的时候不区分大小写”,更准确一点就是“具有外部连接的变量区分大小写,内部连接 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指针溢出,溢出后的地址指向开头,造成继续执行的效果。


声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
热门推荐
  • 相关技术文库
  • C语言
  • 编程
  • 软件开发
  • 程序
  • 一键多义的按键管理智能仪表设计代码

    设计采用高性能单片机C8051F020为控制芯片,监控示波器面板上40个按键、3个编码开关及4个电位器的状态。分别介绍了键盘、编码开关和电位器的工作原理,以及其

    前天
  • 舵机PWM信号控制及程序

    舵机概述舵机最早出现在航模运动中。在航空模型中,飞行机的飞行姿态是通过调节发动机和各个控制舵面来实现的。举个简单的四通飞机来说,飞机上有以下几个地方需要控制:1

    01-24
  • 你所写的程序有多大?该怎么看?

    程序写好并编译后生成hex文件,这个hex文件就是要下载到单片机里的文件,这个文件的大小不能超过单片机的FLASH大小,否则就要优化程序或者选用更大FLASH的

    01-20
  • 浮点数与IEEE格式转换

    1. 问题的提出笔者在系统开发中采用RS485实现单片机与外围设备的通信,通信采用通用串行接口协议(USS),按照串行总线的主从通讯原理来确定访问的方法。USS

    01-19
  • SYS/BIOS的一种实时软件组件技术

    XDCtools 是SYS/BIOS引用的一种实时的软件组件技术(RTSC),它包括一些有用的工具,标准的API函数,静态配置文件和打包(packaging)操

    01-19
  • C常用的循环语句

    [导读]单片机延时程序分析应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单

    01-18
  • C51中延时子程序设计时要注意的问题

    [导读]标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。在keil C5

    01-18
  • Linux lseek函数详解

    Linux应用编程之lseek详解1、lseek函数介绍(1)、文件指针:当我们要对一个文件进行读写时,一定要先打开这个文件,所以我们读写的所有文件都是动态文件

    01-17
  • C51怎样实现混合编程?

    [导读]在C51中,怎样嵌入汇编语言程序?怎样进行处理实现混合编程?答:其方法是用编译控制指令“#pragma src”、“#pragma asm”和“#pra

    01-17
  • 汇编语言文件中对于函数的调用方法

    [导读]如何在C51文件和汇编语言文件中相互调用对方文件中的函数?答:汇编语言文件中对于函数的调用方法,与调用汇编语言中的函数一样,如:LCALL DISPLA

    01-17
  • C51函数代码编写两条

    [导读]1.编写一C51函数,把从键盘输入的5位十进制数数转换成一个无符号整型数(假设未超出整型数范围)。设从键盘输入的数存放在一无符号数组中,低位数为低下标元

    01-17
  • 入门基础之单片机C代码

    [导读]1.某单片机系统的P2口接一数模转换器DAC0832输出模拟量,现在要求从DAC0832输出连续的三角波,实现的方法是从P2口连续输出按照三角波变化的数

    01-17
下载排行榜
更多
广告
X
广告