下面通过几个简单的例子说明如何利用C51语言来编程,复杂的例子将在后面章节中介绍。
【例4-11】 片内RAM的20H单元存放一个有符号数x,函数y与x有如下关系式:
设y存放于21 H单元,C程序如下:
程序中为观察不同数的执行结果,采用了死循环语句for(;;),上机调试时退出死循环可用Ctrl+C组合键。
【例4-12】 有两个数a和b,根据R3的内容转向不同的处理子程序:
(1)r3=0,执行子程序pr0(完成两数相加);
(2)r3=1,执行子程序pr1(完成两数相减);
(3)r3=2,执行子程序pr2(完成两数相乘);
(4)r3=3,执行子程序pr3(完成两数相除)。
C语言中的子程序即为函数,因此需编4个处理的函数,如果主函数在前,主函数要对子函数进行说明;如果子函数在前,主函数无须对子函数说明,但是无论子、主函数的顺序如何,程序总是从主函数开始执行,执行到调用子函数就会转到子函数执行。
在C51编译器中通过头文件reg51.h可以识别特殊功能寄存器,但不能识别R0~R7通用寄存器,因此R0~R7只有通过绝对地址访问识别。
C程序如下:
在上述程序中,为便于调试观察,加了C1=56语句,并使用了死循环语句for(;;),用Ctrl+C组合键可退出死循环。
【例4-13】 外部RAM的000EH单元和000FH单元的内容交换。
C语言对地址的指示方法可以采用指针变量,也可以引用absacc.h头文件作绝对地址访问,下面采用绝对地址访问方法。
【例4-14】 十六进制到十进制转换。待转换的整型十六进制数存放于变量x中,将变量x中字节的十六进制数转换为相应的十进制数,存放于数组a[]中,其中转换结果的个位、十位、百位、千位、万位分别存入于a[0]、a[1]、a[2]、a[3]、a[4]中。
变量x为整型数,最大值为65535,则x除以10的余数为5,即十进制数的个位,商为6553;商再除以10余数为3,即十进制数的十位,商为655……依次类推,得到百位、千位、万位。
【例4-15】 十进制到十六进制转换。十进制数以BCD码的形式存放于数组a[]中,a[0]、a[1]、a[2]、a[3]、a[4]中分别存放个位、十位、百位、千位、万位,把此数据转换为十六进制数存放于变量x中。常用于键盘输入时输入十进制数,需要转换为十六进制数,便于后续程序的单片机运算。本例程序为例4-14的反运算。
一个十进制整数的表示形式为:x=an×10n+…+a1×10+a0
输入十进制数为5位,则n=4,即:x=a4×104+a3×103+a2×102+a1×10+a0
【例4-16】 数据排序。有8个无符号字符型数据存放在数组a[]中,求其中的最大值。(https://www.xing528.com)
数组中最大值存放于变量max中,设置max中初值为0,把数组中的数逐一与max比较,若比max大,则取代max中的值,若比max小,则保持max中值不变。
【例4-17】 查表程序。应用查表程序求0~5这几个数据的平方值。
把几个数的平方值预先放在数组中,根据序号查找相应数组中的数据,即为该序号的平方值。例如,2的平方值在a[2]内,3的平方值在a[3]内。
【例4-18】 用P1.0输出1k Hz和500Hz的音频信号驱动扬声器,作报警信号,要求1k Hz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上,响报警信号,当开关断开,报警信号停止。
500 Hz信号周期为2ms,信号电平为每1ms变反一次,1k Hz信号周期为1ms,信号电平每500μs变反一次。
C语言编程如下:
下面通过几个实例说明C语言与汇编语言混合编程的方法及参数传递过程。
【例4-19】 用P1.0产生周期为4ms的方波,同时用P1.1产生周期为8ms的方波。
用C语言编写主程序,使P1.1产生周期为8ms的方波为模块1;P1.0产生周期为4ms的方波为模块2;用汇编语言编写的延时1ms程序为模块3。
模块1调用模块2获得8ms方波,模块2调模块3时向汇编程序传递了字符型参数(x=2),延时2ms,程序如下:
模块1:
模块2:
模块3:
本例中,汇编语言程序从R7中获取参数(x=2)。以上各模块可以先分别汇编或编译(选择DEBUG编译控制项),生成各自的.OBJ文件,然后将各OBJ文件连接,生成一个新的文件。在集成环境下的连接调试可以连续进行,比上面方法更为方便。
【例4-20】 在汇编程序中比较两数大小,将大数放到指定的存储区,由C程序的主调函数取出。
模块1:C语言程序
模块2:汇编语言程序
此例中,C语言程序通过R7和R5传递字符型参数a和b到汇编语言程序,汇编语言程序将返回值放在固定存储单元,主调函数通过指针取出返回值。
C语言程序调用汇编程序最多只能传递3个参数,如果多于3个参数,就需要通过存储区传递,可以通过数组,也可以在汇编程序中建立数据段,来传递参数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
