《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

C51语言应用编程的若干问题
程序匠人 发表于 2006-7-31 15:12:00  阅读全文 | 回复(0) | 引用通告 | 编辑

                                 C51语言应用编程的若干问题

摘 要   简要介绍了Franklin C51交叉编译器的特点,较详细地讨论了C51语言程序设计的基本技巧及其与汇编语言程序的混合编程、中断处理过程等实际问题,并给出了相应的处理程序。

关键词   Franklin    C51编译器    汇编语言     结构化设计    模块    中断  Franklin    C51编译器    汇编语言     结构化设计    模块    中断


       在研制单片机应用系统时,汇编语言是一种常用的软件工具。它能直接操作硬件,指令的执行速度快。但其指令系统的固有格式受硬件结构的限制很大,且难于编写与调试,可移植性也差。随着单片机硬件性能的提高,其工作速度越来越快,因此在编写单片机应用系统程序时,更着重于程序本身的编写效率。而Franklin C51交叉编译器是专为80C51系列单片机设计的一种高效的C语言编译器,使用它可以缩短开发周期,降低开发成本,而且开发出的系统易于维护,可靠性高,可移植性好,即使在代码的使用效率上,也完全可以和汇编语言相比,因此目前它已成为开发80C51系列单片机的流行工具。

1 C51语言程序设计的基本技巧

    C语言是一种高级程序设计语言,它提供了十分完备的规范化流程控制结构。因此采用C51语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,这样可使整个应用系统程序结构清晰,易于调试和维护。对于一个较大的程序,可将整个程序按功能分成若干个模块,不同的模块完成不同的功能。对于不同的功能模块,分别指定相应的入口参数和出口参数,而经常使用的一些程序最好编成函数,这样既不会引起整个程序管理的混乱,还可增强可读性,移植性也好。

    在程序设计过程中,要充分利用C51语言的预处理命令。对于一些常用的常数,如TRUE,FALSE,PI以及各种特殊功能寄存器,或程序中一些重要的依据外界条件可变的常量,可采用宏定义"#define"或集中起来放在一个头文件中进行定义,再采用文件包含命令"#include"将其加入到程序中去。这样当需要修改某个参量时,只须修改相应的包含文件或宏定义,而不必对使用它们的每个程序文件都作修改,从而有利于文件的维护和更新。现举例说明如下:

    例1 对于不同的单片机晶振,程序取不同的延时时间,而且可根据外界条件的变化修改延时时间的长短。对于这样的程序,可利用宏定义和条件编译来实现。程序如下:

#define     flag 1
 #ifdef     flag==1
   #define  fosc  6M
   delay=10;
 #elif     flag = = 0
 #define   fosc    8M
   delay=12;
 #else
#define    fosc   12M
   delay=20;
 #endif
 main()
 { 
 for(I=0;I<delay;I++);
 }

    这样源程序不作任何修改就可适用于不同时钟频率的单片机系统,并可根据情况的不同取不同的delay值,完成不同的目的。

2 C51语言与汇编语言程序的混合编程

    C51编译器能对C语言源程序进行高效率的编译,生成高效简洁的代码,在绝大多数场合采用C语言编程即可完成预期的目的。但有时为了编程直观或某些特殊地址的处理,还须采用一定的汇编语言编程。而在另一些场合,出于某种目的,汇编语言也可调用C语言。在这种混合编程中,关键是参数的传递和函数的返回值。它们必须有完整的约定,否则数据的交换就可能出错。下面就以力源公司的10位串行A/D转换器TLC1549 为例说明C语言程序与汇编语言程序的调用。  

                                
                                             图1 TLC1549管脚图
 

    1549的管脚图和时序图分别如图1和图2所示,假定DATA OUT接P1.0,CS   接P1.1,CLOCK接P1.2。
1549的具体特性请查阅有关资料。

 

                                                       图2 TLC1549时序图

    例2 C语言程序与汇编语言程序的调用,其子程序如下:

 PUBLIC AD     ;入口地址
 SEG_AD SEGMENT CODE ;程序段 
 RSEG SEG_AD
 USING 0
   AD:   MOV R6,#00
 MOV R7,#00
 SETB P1.1
 ACALL DELAY
 CLR P1.1
 ACALL DELAY
 MOV R0,#10
   RR0: SETB P1.2
 NOP
 CLR P1.2
 DJNZ R0,RR0
 ACALL DELAY
 MOV 30H,R6     ;A/D转换的高
               ;两位保存在R6中
 ACALL CIR 
 MOV R6,30H
 SETB P1.2
 NOP
 CLR P1.2
 MOV 30H,R6
 ACALL CIR
 MOV R6,30H 
 MOV R0,#8     ;A/D转换的低
              ;8位保存在R7中
   RR2: SETB P1.2
 NOP
 CLR P1.2
 MOV 30H,R7
 ACALL CIR
 MOV R7,30H 
 DJNZ R0,RR2
 RET
   CIR: CLR C
 MOV C,P1.0
 MOV A,30H
 RLC A
 MOV 30H,A
 RET
 END

    在以上程序中,函数的返回值为一无符号整型数,根据调用规则,返回值的高位必须在R6中,低位在R7中,这样才可保证数据的传递不出错。另外,在调用过程中,必须注意寄存器的入栈。这样在以后用到A/D转换时,在C语言中调用汇编语言子程序AD()即可。 

3 C51中断处理过程

    C51编译器支持在C源程序中直接开发中断过程,因此减轻了使用汇编语言的繁琐工作,提高了开发效率。中断服务函数的完整语法如下:

    void 函数名(void)[模式]
    [再入]interrupt n [using r]

    其中n(0~31)代表中断号。C51编译器允许32个中断,具体使用哪个中断由80C51系列的芯片决定。r(0~3)代表第r组寄存器。在调用中断函数时,要求中断过程调用的函数所使用的寄存器组必须与其相同。"再入"用于说明中断处理函数有无"再入"能力。C51编译器及其对C语言的扩充允许编程者对中断所有方面的控制和寄存器组的使用。这种支持能使编程者创建高效的中断服务程序,用户只须在C语言下关心中断和必要的寄存器组切换操作。

    例3 设单片机的fosc=12MHz,要求用T0的方式1编程,在P1.0脚输出周期为2ms的方波。

    用C语言编写的中断服务程序如下:

#include <reg51.h>
sbit P1_0=P1^0;
void timer0(void)interrupt 1 using 1 { 
     /*T0中断服务程序入口*/
P1_0=!P1_0;
TH0=-(1000/256);      /*计数初值重装*/
TL0=-(1000%256);
}
void main(void)
{
TMOD=0x01;     /*T0工作在定时器方式1*/
P1_0=0;
TH0=-(1000/256);     /*预置计数初值*/
TL0=-(1000%256);
EA=1;            /*CPU开中断*/
ET0=1;           /*T0开中断*/
TR0=1;           /*启动T0*/
do{}while(1);
}

  在编写中断服务程序时必须注意不能进行参数传递,不能有返回值。

4 结论

    C51编译器不但可以缩短单片机控制系统的开发周期,而且易于调试和维护。此外,C51语言还有许多强大的功能,如提供丰富的库函数供用户直接调用,完整的编译控制指令为程序调试提供必要的符号信息等等。总之,C51语言是广大单片机开发人员的强有力的工具。

 

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!