历史上的今天
返回首页

历史上的今天

今天是: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……


推荐阅读

史海拾趣

Facon公司的发展小趣事

在2010年代初,随着科技的飞速发展,电子行业正迎来新一轮的创新浪潮。这时,一群充满激情和梦想的工程师在硅谷创立了Facon公司,他们怀揣着改变世界的愿景,立志在电子行业中留下自己的印记。初始阶段,Facon主要专注于研发高性能的半导体芯片,为智能手机、平板电脑等电子产品提供强大的计算能力。通过不懈努力和持续创新,Facon逐渐在市场中树立了良好的口碑。

Avalon Photonics公司的发展小趣事

Avalon Photonics的创立源于一次技术突破。创始人Dr. Smith在光子学领域有着深厚的学术背景,他成功研发出了一种新型的光子探测器,具有极高的灵敏度和稳定性。这一创新技术迅速引起了业界的关注。Dr. Smith看到了商业化的潜力,于是决定成立Avalon Photonics,将这项技术转化为实际产品。初创期的Avalon面临着资金短缺和市场认知度低的挑战,但凭借着技术优势和团队的努力,逐渐在市场上站稳脚跟。

Hokuriku公司的发展小趣事

90年代初期,随着全球化进程的加速,Hokuriku Electric开始将目光投向国际市场。公司首先在欧洲和北美设立了销售分支机构,随后又逐步拓展至亚洲其他地区。通过参加国际展会、建立合作伙伴关系等多种方式,Hokuriku Electric成功将其优质产品推向全球市场。这一过程中,公司不仅积累了丰富的国际销售经验,还提升了品牌知名度和影响力,为后续的全球化发展奠定了坚实基础。

Heatron LED Integration公司的发展小趣事

在环保和可持续发展成为全球共识的今天,Heatron LED Integration积极践行绿色发展理念。公司不仅在生产过程中注重节能减排和资源循环利用,还致力于推广高效、节能的LED照明产品。通过不断的技术创新和产品优化,公司成功推出了一系列低碳环保的LED照明解决方案,为推动全球绿色可持续发展贡献了自己的力量。

ABL Heatsink公司的发展小趣事

ABL Heatsink公司在电子散热领域一直默默耕耘,直到某天,公司的研发团队成功开发了一种新型的高效散热材料。这种材料不仅导热性能卓越,而且成本相对较低,立即引起了业界的关注。随着这种新型散热材料的广泛应用,ABL Heatsink公司的订单量激增,公司规模迅速扩大。

Acculin Inc公司的发展小趣事

随着电子行业的竞争加剧,Acculin Inc面临着市场份额下降的挑战。为了应对这一变化,公司决定调整战略方向,将重点转向智能穿戴设备市场。通过研发具有独特功能的智能手环和智能手表,Acculin成功吸引了年轻消费者的关注,并在新的市场领域取得了突破。

问答坊 | AI 解惑

解决了,有牛人给了方案,贴上来共享!

主要的思想就是每来一个脉冲,电容C21的电压会升高一点,但在第一个脉冲来的时候,电容C21的电压还不足以使三极管Q11导通,C21的电压会在若干个脉冲后达到最高值,只要控制好电容的放电时间,就能保持三极管Q11一直导通.. 输出表现在PNP三极管的集电 ...…

查看全部问答>

天祥 十天学会CPLD FPGA VHDL视频教程(3.12G完整版)

自从天祥电子推出40小时的“十天学会单片机和C语言编程”视频教程后,受到了广大电子爱好者的好评,并希望我们能够赶紧推出“CPLD器件及VHDL程序设计”的视频教程,为了能够满足大家的要求,提供更多的帮助,我们便抓紧时间推出了这套教程。 这是 ...…

查看全部问答>

关于plc在输煤系统中的应用的程序

大概能实现时间不同,速度不同,自动转手动等简单功能就好!…

查看全部问答>

融合识别与定位的远程交叉电子监控系统

随着现代通信技术和定位技术的快速发展,特别是无线移动通信和全球卫星定位GPS的日益普及,对具有定位和通信功能的装置(比如:形态各异的普通手机,或者带GPS功能的手机)开展远程定位跟踪变得越来越方便,定位监控系统的成本越来越低,这吸引了大量 ...…

查看全部问答>

麻烦帮忙解决EVC编译错误

编译出现如下错误 --------------------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 编辑 很久之前承诺过要给大家做电子大赛试题的分类分析的,现在终于要兑现了。此次分析主要针对没有什么基础的同学们,目的是给大家提供一个思路,故只做入门级的分析,其中的具体资料都是可以在论坛里找 ...…

查看全部问答>

悬挂运动系统设计报告

本帖最后由 dontium 于 2015-1-23 13:24 编辑 悬挂运动系统设计报告 …

查看全部问答>

430的smclk这样就可以了吗?

我用的msp430afe253 woid main(void) {         WDTCTL = WDTPW +WDTHOLD;                 DCOCTL = DCO0+DCO1;         BCSCTL1 = XT2OFF+RSEL0+RSEL1+ ...…

查看全部问答>

晒WEBENCH设计的过程+3.6V转1.8V电源设计

设计一款3.6V锂电池转1.8V输出的电源电路:设计过程如下: 1、启动WEBENCH,选择单电源设计,在出现的画面选择高能效 2、在随后出现的界面输入设计参数 3、单击重新计算,出现推荐的设计方案 4、选择LM3764-ADJ这个方案,打开设计 5、优化设计 ...…

查看全部问答>