用Keil写C51程序是最好不过的了。用伟福也可以写,但伟福的编辑能力就相差太远了。我习惯用Keil写代码,然后用伟福硬件仿真(只有WAVE的仿真头)。不过Keil是好用,但写代码关键还是C51水平,也就是编程能力,写C程序就离不开模块化这个词了。C51和A51,要扬长避短,发挥C的长处,就得将C模块化好。刚刚开始的时候就只是熟悉C51的语法规则了,熟悉了这个然后再追求程序的可读性和可移植性。
下面是的我使用Keil C51的一点心得。
1、程序可读性的提高
要提高程序的可读性,就得养成一良好的编程习惯了,例如变量用小写,常量用大写,函数第一个字母用大写等等。这样成习惯以后,自己看代码就会一目了然。另外还要灵活的在KEIL中使用TAB键对对齐文本,而不要敲空格代替(优势,试了就知道了)。
2、程序的可移植性的提高
程序的可移值性是C51的优势所在,要做到移植方便,就得熟悉C51的编译过程有一定的了解,合理组织文件。可以将一个功能模块(如显示驱动,端口读写)放在一个C文件中,作为一个函数调用,然后在主程序中申明该函数,就可以随便调用了。
移值的时候也只要把当前的C文件加入到新的项目中,同样的方法调用它就可以。
另外模块化程序要善用C里面的“#IFDEF”、“#ENDIF”、“#DEFINE”等专为模块设计提供的功能。例如设计一个外面带的晶振的驱动模块,在不同的晶振频率下,该项模块的设置位可能不同。如果就直接在程序中写设置位,晶振改变,这些设置位也要逐一修改,这个程序也就不通用了,也就是可移值性不好。要解决这个问题怎么办 ,“#IFDEF”、“#ENDIF”可以帮你解决问题。这两个命令的功能就不具体说了,书上面讲得很清楚。知道这些功能你就知道该怎样使用它们进行模块化设计了。
3、Keil C51的debug技巧
A51的程序执行时间可能通过指令周期计算出来,而C51的却无从下手,很多程序员为了得到精确的执行时间而研读反汇编代码,何等的悲哀。巧妙的使用Keil中的debug功能,问题就迎刃而解了。
下面举例说明:
该程序为一个延时程序,在12M的晶振下,调用一次的时间为16uS ,执行一次循环的时间为9uS(延时范围(25us~589.831ms))。这样来,假设有语句Delay(N);那么该语句的精确延时的计算公式就是(9*N+16)uS了.这个公式可以理解吧!
如何得到程序的调用时间和执行一次循环的时间了。接着看下面:
在主程序MAIN()函数下添加上面两条语句,当前的SEC栏为执行到DELAY(1);语句所花的时间。T(0-)
上面的SEC栏为执行完DELAY(1)所花的时间,这样就可以得到DEALY(1)这条语句的执行时间为595-570=25uS.
上面的SEC栏为执行完DELAY(2)所花的时间,这样就可以得到DEALY(2)这条语句的执行时间为629-595=34uS.
结果不就出来了嘛,T[DELAY(2)]-T[DELAY(1)]不就是执行一次循环的时间嘛,而T[DELAY(1)]减去执行一次循环的时间就是调用一次要花的时间了。精确到1uS,与A51有差距吗?
关键字:Keil C51单片机 开发环境
引用地址:
Keil C51单片机开发环境使用小记
推荐阅读最新更新时间:2024-03-16 13:11
PIC中断写法(MPLAB X集成开发环境,XC编译器 )
XC编译器下中断的写法: 根据XC编译器的用户指南:里面是举例了堆栈错的的中断写法。 void __attribute__((__interrupt__,__auto_psv__)) _StackError(void); 如果我们写自己的终端服务程序,那么将void __attribute__((__interrupt__,__auto_psv__)) 不改动 只修改后面的即可,根据XC编译器的中断向量表来修改: 比如写定时器1中断服务函数就是void __attribute__((__interrupt__,__auto_psv__))_T1Interrupt(void); 另一个可以参考芯片数据手册中关
[单片机]
keil大常量计算问题
Keil C51是与ANSI C兼容的编译器,ANSI C规范规定十进制整数常量的默认数据类型是int、long int和unsigned long int的其中一种,对给定的常量是其中的哪一种要看这个常量的实际大小,如果常数在-32768~32767之间则按int类型处理,如果按int类型处理会溢出就考虑long int或更大的数据类型unsigned long int。总之,编译器总是按尽可能的原则指定常量的类型。 但这一原则并不总能奏效,当两个常量做运算时就可能导致溢出。如: #define SYSCLK 22118400 // SYSCLK in Hz (22.1184 M
[单片机]
KEIL C51代码优化详细分析:局部参数放寄存器变量,数据覆盖技术
阅读了《单片机与嵌入式系统应用》2005年第10期杂志《经验交流》栏目的一篇文章《Keil C51对同一端口的连续读取方法》(原文)后,笔者认为该文并未就此问题进行深入准确的分析 文章中提到的两种解决方法并不直接和简单。笔者认为这并非是Keil C51中不能处理对一个端口进行连续读写的问题,而是对Kei1 C51的使用不够熟悉和设计不够细致的问题,因此特撰写本文。 本文中对原文提到的问题,提出了三种不同于原文的解决方法。每种方法都比原文中提到的方法更直接和简单,设计也更规范。(无意批评,请原文作者见谅) 1 问题回顾和分析 原文中提到:在实际工作中遇到对同一端口反复连续读取,Keil C51编译并未达到预期的结果。原文作者
[单片机]
C51单片机 写一个外部中断(入门单片机)
代码部分 void main() { /*---------------EA,IT,EX必须写-------------*/ EA=1; //开启总中断 IT1=1; //中断触发模式 //=0为低电平触发,=1为下降沿触发 EX1=1; //外部中断允许位 while(1) { led1=0; } } void int1() interrupt 0 { led=~led1; } 解释: 1.外部中断(按键中断)最最重要的部分就是EA,IT,EX三条语句,这三条是必不可少的。 2.EA是中断总开关,类似家里电闸的总闸,总闸
[单片机]
PIC16F1823开发笔记(一)准备和开发环境,资料推荐
综述 近期需要对PIC芯片进行开发,这里记录开发笔记。 环境:maplab IDE 8.92 芯片:PIC16F1823 1、PIC芯片综述: 单片机,全称单片微型计算机(英语:single-chip microcomputer),是把中央处理器、存储器、定时/计数器(timer/counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。其主要应用于功能较为单一的物件中。 优点:采用哈弗结构,采用精简指令集,相对于51系列,指令集相当减少,上手快,入门容易 缺点: 1、开发板和调试器都比较贵 2、资料相对于stm和51都比较少 3、感觉开发软件不太友好 2、开发资料及大佬笔记 链接: 微芯官网:产
[单片机]
stm32 keil实现串口printf输出中文字符
添加如下代码,可以GNUC的方式实现 #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ int main() { whil
[单片机]
keil c51的内部RAM(idata)动态内存管理程序
程序比较简单,但感觉比较有意思,个人认为有一定应用价值,希望大家有更好的思路和方法,互相促进。 程序的基本思路是:在CPU堆栈指针SP以上的RAM区域,通过把堆栈指针SP上移若干个字节,把空出的RAM区域供用户使用,当用户在使用完后又可以把该RAM区域释放。 头文件dmalloc51.h /* ********************************************************************************************************* * C51内部RAM动态内存申请函数 ,动态内存释放函数 * (c)
[单片机]
基于80C51单片机和AD526运放实现防腐电源监控节点的设计
金属发生腐蚀的现象随处可见。腐蚀给金属材料造成的直接和间接损失是巨大的,以至造成灾难性的破坏事故,引起严重的环境污染。研究表明,因腐蚀造成的损失一般占国民生产总值的3%~4%,其中约有15%是可以通过现有的防腐技术避免的,而阴极保护技术的发展又是与防腐技术的进步分不开的。 防腐电源是阴极保护技术中最为关键的设备。由于易腐蚀的金属构件大部分分布在野外或者地下,并且分布范围广,如石油管道、输电线路、海上平台等,所以必然要求发展可靠性高、智能化的新型防腐电源,并且要求通过工业网远程采集现场数据,进行计算分析,实现远程控制,从而提高现场设备的可靠性,实现无人管理。 1、防腐电源系统的结构组成 阴极保护技术简单地说就是测量被保护金属
[单片机]