历史上的今天
今天是:2025年02月22日(星期六)
2021年02月22日 | c51单片机编程要点总结
2021-02-22 来源:eefocus
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[ ] = {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……
上一篇:最简单的单片机PID控制算法程序
下一篇:51单片机上拉电阻多大
史海拾趣
|
主要的思想就是每来一个脉冲,电容C21的电压会升高一点,但在第一个脉冲来的时候,电容C21的电压还不足以使三极管Q11导通,C21的电压会在若干个脉冲后达到最高值,只要控制好电容的放电时间,就能保持三极管Q11一直导通.. 输出表现在PNP三极管的集电 ...… 查看全部问答> |
|
天祥 十天学会CPLD FPGA VHDL视频教程(3.12G完整版) 自从天祥电子推出40小时的“十天学会单片机和C语言编程”视频教程后,受到了广大电子爱好者的好评,并希望我们能够赶紧推出“CPLD器件及VHDL程序设计”的视频教程,为了能够满足大家的要求,提供更多的帮助,我们便抓紧时间推出了这套教程。 这是 ...… 查看全部问答> |
|
随着现代通信技术和定位技术的快速发展,特别是无线移动通信和全球卫星定位GPS的日益普及,对具有定位和通信功能的装置(比如:形态各异的普通手机,或者带GPS功能的手机)开展远程定位跟踪变得越来越方便,定位监控系统的成本越来越低,这吸引了大量 ...… 查看全部问答> |
|
编译出现如下错误 --------------------Configuration: SDMMC - Win32 (WCE ARMV4I) Release-------------------- Compiling resources... Compiling... StdAfx.cpp c:\\program files\\windows ce tools\\wce500\\2440t6\\mfc\\include\\afxw ...… 查看全部问答> |
|
早就听说单片机很有钱景,所以找了n多个老师才决定学习单片机。 社会上的培训机构只有理论,还浪费时间、钱财、功夫。 偶然机会遇到以为自学成功的并且只有小学四年级文凭的李老师,另外就是他还有自己的23项专利。然后就拜倒在李老师门下。 更 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:06 编辑 很久之前承诺过要给大家做电子大赛试题的分类分析的,现在终于要兑现了。此次分析主要针对没有什么基础的同学们,目的是给大家提供一个思路,故只做入门级的分析,其中的具体资料都是可以在论坛里找 ...… 查看全部问答> |
|
我用的msp430afe253 woid main(void) { WDTCTL = WDTPW +WDTHOLD; DCOCTL = DCO0+DCO1; BCSCTL1 = XT2OFF+RSEL0+RSEL1+ ...… 查看全部问答> |
|
设计一款3.6V锂电池转1.8V输出的电源电路:设计过程如下: 1、启动WEBENCH,选择单电源设计,在出现的画面选择高能效 2、在随后出现的界面输入设计参数 3、单击重新计算,出现推荐的设计方案 4、选择LM3764-ADJ这个方案,打开设计 5、优化设计 ...… 查看全部问答> |




