C语言编程实例专题(一)|专题111特点

主题1单片机C语言应用程序设计主题1单片机C语言应用程序设计11C51特点12C51数据类型13C51数据存储类型和MCS-51存储结构14特殊功能寄存器SFR C51定义15位变量C51定义16MCS-51 C51并行接口定义 17MCS-51C语言编程实例 题目1 C语言单片机应用程序设计 11C51特点 用汇编程序设计MCS-51系列单片机应用程序时,需要考虑其存储器结构,尤其是其片内数据存储器和特殊功能寄存器的正确合理使用以及根据实际地址处理端口数据在使用汇编语言时会遇到很多问题。第一的,它的可读性和可维护性不强,尤其是在程序没有很好标记的情况下。其次是代码的可重用性。使用C语言可以很好地解决这些问题。用C语言编写单片机应用程序与编写标准篮球课程标准儿科分级护理标准分级护理细化标准党员活动室建设尘肺标准电影C语言程序的区别重点在于对应的数据类型和变量C语言是根据单片机的存储结构和内部资源定义的。其他语法规定程序结构和编程方法与标准C语言编程相同。主题1 C语言单片机应用程序编程与使用汇编语言相比,使用C语言具有以下优点: 1、不需要知道处理器的指令集或内存结构。2. 寄存器的分配和寻址由编译器管理。编程时,无需考虑存储器的寻址和数据类型。3 指定运算的变量选择组合,提高程序的可读性 4 可以使用更接近人类思维的关键字和运算函数 5 与汇编语言编程相比,用C语言编写的MCS-51单片机的应用程序在分配内存资源和处理端口数据方面不像汇编语言那样具体,但在C语言编程中数据类型和变量的定义是必须的。与单片机的存储结构相关,否则编译器无法正确映射定位。主题1 C语言单片机应用程序设计 C51的基本语法与C语言相同,但在特定硬件结构上有一些扩展,如关键字sbitdataidatapdataxdatacode等。C51拥有所有标准C语言标准数据类型还增加了一种特殊数据类型①bit变量值为0或1 ②从字节声明的sbit位变量为0或1 ③sfr特殊功能寄存器sfr字节地址为0~255和sfr16数据type 专用于 8051 硬件,C51 编译器不是标准 C 语言的一部分 bitsfrs 和 sfr16 数据类型用于访问 8051 的特殊功能寄存器 主题 1 C 语言用于 MCU 应用程序的 C 语言编程 应用程序编写的程序必须经过单片机的C语言编译器转换,生成单片机的可执行代码程序。支持MCS-51系列单片机的C语言编译器有很多,如AmericanAutomationAuocetBSOTASKINGDUNFIELDSHAREWAREKEILFranklin等,其中,无符号变量unsignedchar的取值范围为0255 对于有符号字符变量signedchar,最高位为符号标志位 msb1表示负数 0表示正数 有符号字符变量和无符号字符变量表示值时意义相同0127的,都是00x7F,在进行有符号字符变量的乘除运算时C51编译器会自动将相应的库函数传入程序中进行运算。题目1 C语言单片机应用程序设计。int 变量的高字节数存储在低地址字节中。低字节数存储在高地址字节中。有符号整数变量 signedint 也使用 msb 位作为符号标志位,并使用两个’ s 补码表示该值可以直接使用 几个特殊的机器指令用来完成多字节的加减乘除运算。整型变量值0x1234在内存中的存储方式如图11所示。 题目1C语言应用程序设计单片机存储结构01地址0123地址长整型变量0x120x340x120x340x560x78的存储结构题目1C语言应用程序设计单片机如果只强调运算速度而不是负数运算,最好使用无符号无符号格式。Unsigned char 类型的使用应始终尽可能使用 unsigned char 变量,因为出于同样的原因,MCS-51 可以直接接受它。您还应该尝试使用位变量。有符号字符变量只占一个字节,但需要额外的操作来测试代码的符号位。整数变量值0x1234按图11所示的方式存储在内存中。 题目1 C语言单片机应用程序设计存储结构整数01地址0123长整型变量存储结构地址0x120x340x120x340x560x78题目1单片机浮点变量C语言应用程序设计float浮点变量为32位,占用4字节。许多复杂的数学表达式使用浮点变量数据类型。如果在编程时只强调运算速度,不进行负数运算的话,尽量使用unsigned char类型时最好使用unsigned unsigned格式,尽可能使用 unsigned char 变量,因为它可以被 MCS-51 直接接受。出于同样的原因,您也应该尝试使用位变量。同样只占用一个字节但需要额外的操作来测试代码的符号位整数变量值0x1234以图11所示的方式存储在内存中。 题目1 C语言单片机应用程序设计整数01的存储结构地址0123长整型变量存储结构地址 0x120x340x120x340x560x78 题目1 C语言单片机浮点变量的应用程序设计 float 浮点变量为32位,占用4字节。许多复杂的数学表达式使用浮点变量数据类型。如果只强调编程时的运算速度,并且不执行负数运算 使用 unsigned char 类型时最好使用 unsigned unsigned 格式,尽可能使用 unsigned char 变量,因为它可以被 MCS-51 直接接受。出于同样的原因,您也应该尝试使用位变量。也只需要一个字节,但需要额外的操作来测试代码的符号位

这无疑会降低代码效率。题目1 C语言单片机应用设计可以用简化形式定义数据类型。方法是在源程序开头使用define语句自定义简化类型标识,如defineucharunsignedchardefineuintunsignedint,在编程中可以用uchar代替 unsignedchar用uint代替unsignedint来定义变量 主题1 C语言应用程序设计单片机 13 C51 数据的存储类型与 MCS-51 存储结构 C51 存储类型与 MCS-51 存储空间的对应关系 主题 1 单片机 C 语言应用程序设计 DATA 区域寻址最快,所以经常使用的变量应该放在DATA区。DATA 区域的空间是有限的。除程序变量外,DATA区还包含堆栈和寄存器组DATA区声明中的存储类型标识符数据。通常是指存储在低128B内部数据区的变量,该变量可以直接寻址。声明示例如下: unsignedchardatasystem_status0unsignedintdataunit_id[2] 主题 1 单片机的 C 语言应用设计 位可寻址位变量的声明对于状态寄存器非常有用,因为它可能只需要使用某个位而不是整个字节。BDATA 区域声明中的存储类型标识符是 bdata,用于内部位寻址 16B 存储。20H 到 2FH 区位寻址变量的数据类型 在 BDATA 区中声明位变量和使用位变量的示例 优于通过声明 DATA 区中的字节生成的汇编代码。主题 1 单片机的 C 语言应用程序编程。PDATA 区和XDATA 区属于外部存储区。将外部数据存储区作为存储区访问比访问内部数据存储区慢,因为外部数据存储区是通过加载数据指针的地址间接访问的。数量声明的语法与其他区域相同,但PDATA区只有256B,XDATA区可以达到65535B。PDATA 和 XDATA 的操作类似。PDATA区寻址比XDATA区寻址快,因为PDATA区是A区寻址只需要加载8位地址,而XDATA区寻址需要16位地址,所以尽量存储外部数据在 PDATA 区域。类标识符分别是 pdata 和 xdata。xdata存储类型标识可以指定外部数据区64KB内的任意地址,而pdata存储类型标识只指定1页或256B外部数据区。声明示例如下:unsignedcharxdatasystem_status0unsignedintpdataunit_id[2] 外部地址段除外 包含IO设备的地址 除了内存地址 寻址外部设备可以通过C51提供的指针或宏来寻址 使用宏寻址外部设备更易读 inp_byteXBYTE[0x8500] 读一来自地址 8500H 的字节 XBYTE[0x7500 ]out_val 将一个字节写入 7500H。如果要寻址 BDATA 和 BIT 段以外的其他数据区域,SFR 分散在片上 RAM 区域的高 128 字节。地址范围为 80H0FFHSFR。有 11 个具有位寻址能力的寄存器,可以访问它们的字节地址。8 除以字段地址为8或0为尾数。为了直接访问这些SFRFranklinC51,它提供了一种独立的形式定义方法。这种定义方式与标准C语言不兼容。仅适用于 MCS-51 系列单片机的 C 语言编程。单片机特殊功能寄存器C51的C语言应用程序设计的一般语法格式如下“-name”的字节地址,这个常数值的范围必须位于SFR地址范围内的0x800xFF处。例子,

“” 符号后面的 int 常数是特殊功能寄存器中寻址位的位数。例如,sbitOV0XD02 定义了 OV 位地址是 D0H 字节中的第 2 位。sbitCY0XD07 定义 CY 位地址是 D0H 字节中的第 7 位。题目1 单片机C语言应用设计 第三种格式 sbitbit-nameintconstant “” 地址后面的intconstant为寻址位 例如sbitOV0XD2定义OV位地址为D2H,sbitCY0XD7定义CY位地址为D7H,特殊功能位代表一个独立的定义类,不能与其他位定义和位域互换。C51定义的一般语法格式如下: 位类型标识符 位位变量名称如bitdirection_bit到direction_bit 定义为位变量 bitlook_pointer 定义look_pointer为位变量 C51定义一个15位变量 Topic 1 C语言应用设计微控制器的 2 个函数可以包含类型“位”的参数,也可以作为返回值。比如bitfuncbitb0bitb1变量b0b1作为函数returnb1的参数,变量b1作为函数的返回值。主题 1 微控制器的 C 语言应用程序编程 3 位变量定义的限制。位变量不能定义为指针。位数组中不存在定义 bitbit_pointer。如果无法定义 bitb_array[],存储类型允许在位定义中定义。位变量被放置在一个位段中。该段始终位于 MCS-51 芯片的 RAM 区域,因此存储类型仅限于 data 和 idata。如果bit变量的存储类型定义为其他存储类型,会编译错误4]定义为bdata字符数组然后可以用“sbit”定义一个可以独立访问的对象sbitmybit0ibase0mybit0定义为第0位ibase sbitmybit15ibase15mybit0 的第 15 位定义为 ibase sbitAry07bary[0]7Ary07 的第 7 位定义为 abry[0] sbitAry37bary[3] 的第 7 位定义为 7Ary37 的第 7 位定义为 abry[3]。主题 1 单片机 ibase 和 bary 的 C 语言应用程序设计对象也可以是字节可寻址的。ary370bary[3]的第7位赋值为0bary[3]一个字节寻址bary[3]赋值为asbit定义位寻址对象所在字节基地址对象的存储类型,否则只有绝对特殊位被定义。sbit isOtherwise 只有绝对特殊位定义 sbit isOtherwise 只有绝对特殊位定义 sbit is定义可独立访问的对象位 sbitmybit0ibase0mybit0定义为ibase的第0位 sbitmybit15ibase15mybit0定义为ibase的第15位 sbitAry07bary[0]7Ary07为定义为 abry[0] 的第 7 位 sbitAry37bary[3] 7Ary37 定义为 abry[3 ] 主题 1 的第 7 位 微控制器 ibase 和 bary 的 C 语言应用程序编程对象也可以是字节寻址的。定义要位寻址的对象为“bdata”的字节基地址对象的存储类型,否则只定义绝对特殊位。sbit is 定义可以独立访问的对象位 sbitmybit0ibase0mybit0 定义为 ibase 的第 0 位 sbitmybit15ibase15mybit0 定义为 ibase 的第 15 位 sbitAry07bary[0]7Ary07 定义为 abry[0] 的第 7 位 sbitAry37bary[3]7Ary37 is定义为 abry[3] 主题 1 的第 7 位微控制器 ibase 和 bary 的 C 语言应用程序编程对象也可以是字节寻址的。定义要位寻址的对象为“bdata”的字节基地址对象的存储类型,否则只定义绝对特殊位。位是 否则只定义绝对特殊位。sbit is 定义可以独立访问的对象位 sbitmybit0ibase0mybit0 定义为 ibase 的第 0 位 sbitmybit15ibase15mybit0 定义为 ibase 的第 15 位 sbitAry07bary[0]7Ary07 定义为 abry[0] 的第 7 位 sbitAry37bary[3]7Ary37 is定义为 abry[3] 主题 1 的第 7 位微控制器 ibase 和 bary 的 C 语言应用程序编程对象也可以是字节寻址的。定义要位寻址的对象为“bdata”的字节基地址对象的存储类型,否则只定义绝对特殊位。位是 否则只定义绝对特殊位。sbit is 定义可以独立访问的对象位 sbitmybit0ibase0mybit0 定义为 ibase 的第 0 位 sbitmybit15ibase15mybit0 定义为 ibase 的第 15 位 sbitAry07bary[0]7Ary07 定义为 abry[0] 的第 7 位 sbitAry37bary[3]7Ary37 is定义为 abry[3] 主题 1 的第 7 位微控制器 ibase 和 bary 的 C 语言应用程序编程对象也可以是字节寻址的。定义要位寻址的对象为“bdata”的字节基地址对象的存储类型,否则只定义绝对特殊位。位是 sbit is 定义可以独立访问的对象位 sbitmybit0ibase0mybit0 定义为 ibase 的第 0 位 sbitmybit15ibase15mybit0 定义为 ibase 的第 15 位 sbitAry07bary[0]7Ary07 定义为 abry[0] 的第 7 位 sbitAry37bary[3]7Ary37 is定义为 abry[3] 主题 1 的第 7 位微控制器 ibase 和 bary 的 C 语言应用程序编程对象也可以是字节寻址的。定义要位寻址的对象为“bdata”的字节基地址对象的存储类型,否则只定义绝对特殊位。位是 sbit is 定义可以独立访问的对象位 sbitmybit0ibase0mybit0 定义为 ibase 的第 0 位 sbitmybit15ibase15mybit0 定义为 ibase 的第 15 位 sbitAry07bary[0]7Ary07 定义为 abry[0] 的第 7 位 sbitAry37bary[3]7Ary37 is定义为 abry[3] 主题 1 的第 7 位微控制器 ibase 和 bary 的 C 语言应用程序编程对象也可以是字节寻址的。定义要位寻址的对象为“bdata”的字节基地址对象的存储类型,否则只定义绝对特殊位。位是 定义要位寻址的对象为“bdata”的字节基地址对象的存储类型,否则只定义绝对特殊位。位是 定义要位寻址的对象为“bdata”的字节基地址对象的存储类型,否则只定义绝对特殊位。位是

legal””运算符后面的最大值取决于指定的基类型。charuchar为07,intuint为015候殿有单片机c语言程序设计,longulong为031。除了片内4个IO口P0P3外,该系列MCU的并行IO口还可以在片外扩展IO口. 使用C51进行编程时,MCS-51的片内IO口和片外扩展IO可以在头文件中定义,也可以在程序开头定义。定义方法如下。对于 MCS-51 片上 IO 端口是通过特殊功能寄存器方法定义的。例如sfrP00x80定义P0端口地址为80H,sfrP10x90定义P1端口地址为90H。题目1 单片机C语言应用设计 对于片外扩展IO口,根据硬件解码地址,它被认为是片外数据存储器。使用define 语句定义一个单元。比如includeabsacchdefinePORTAXBYTE[0xFFC0]absacch就是C51中绝对地址访问函数的头文件。PORTA 定义为外部 IO 口地址为 FFC0H,长度为 8 位。一旦在头文件或程序中定义了这些片外 IO 端口后,就可以在程序中自由使用变量名与其实际地址之间的联系,让程序员可以模拟 MCS 的硬件操作-51 与软件。主题1 单片机C语言应用设计 17MCS-51 C语言编程实例 编译FranklinC51库 主题1 单片机C语言应用编程 1 程序优化 1 尽量选择小存储模式,避免使用MOVX指令 2 使用大模式 COMPACTLARGE 注意应该考虑要放在内部数据存储器中的变量是否需要经常使用或用于中间结果访问内部数据存储器比访问外部数据存储器要快得多。内部 RAM 由寄存器组位数据区和用户定义的数据类型的其他变量共享。由于内部 RAM 容量为 128256 字节的限制,由所使用的单片机决定。必须权衡利弊。解决访问效率与这些对象数量的矛盾 题目 1 C 语言单片机应用设计 3 考虑先完成一件事再做另一件事的操作顺序 4 注意编程细节。CJNE指令效率更高,可以减少重复循环的次数 5 如果编译器不能使用左移和右移完成乘除,应立即修改。例如,左移乘以 26。使用逻辑 AND 取模比 MOD 操作更有效。7 因为计算机是根据二进制谨慎选择的 数据存储器和数组大小可以节省操作 主题 1 微控制器的 C 编程 8 尽可能使用最小的数据类型 MCS-51 系列是 8 位机器 显然对“char”类型的对象进行操作比“int”或“对 long 类型的对象进行操作更方便”更快。尽可能使用“无符号”数据类型。MCS-51系列CPU不直接支持有符号数的运算,所以C51编译器必须生成更多与其相关的程序代码来解决这个问题 10.尽可能使用局部函数变量。编译器总是试图将局部变量保存在寄存器中。因此,将 for 和 while 循环中的 count 变量等循环变量声明为局部变量最好使用 ” 对应的中断源为低优先级。当 MCU 复位时,IP 位清 0。每个中断源与低优先级中断相同。题目一、单片机的C语言应用设计。3. 定时器工作模式寄存器 TMOD89H 用于设置定时器计数器的工作模式。用于 T11GATE 门控位 GATE=0候殿有单片机c语言程序设计,当软件设置 TCON 中的 TR0 或 TR1 为 1 时,定时器计数器启动。当 GATA=1 时,软件设置 TR0 或 TR1 为 1,外部中断引脚也为高电平。启动定时器计数器工作 2C 定时器计数模式选择位 C=0 为计时模式 C1 为计数模式位 D7D6D5D4D3D2D1D0 字节地址 TMODGATECM1M0GATEC1M089H 主题 1 MCU 的 C 语言应用设计 一种工作模式由 M1M0 设置 M1M0 工作模式功能说明 停止计数 主题 1 C单片机语言应用设计 4 定时计数器控制寄存器 TCON88HTCON 的低4 位用于控制外部中断。为 1 时,定时器计数器 T1 开始工作。当 TR1 设置为 0 时,定时器计数器 T1 停止工作。TR1 设置为 1 或由软件清零。TR0 定时器计数 T0 操作控制位的功能与 TR1 类似。Topic 1 MCU TF0 定时器计数器T0 溢出中断请求标志位的C 语言应用程序设计T0 启动后从初始值开始计数,直到最高位溢出并由硬件置位TF0 向CPU 请求中断。当 CPU 响应中断时,TF0 被硬件自动清零。如果在查询模式下使用,该位可以作为状态位进行查询,但需要注意的是查询后会被软件清零。TF1 定时器计数 但需要注意的是,查询后会被软件清零。TF1 定时器计数 但需要注意的是,查询后会被软件清零。TF1 定时器计数

T1溢出中断请求标志位,其操作功能类似于TF0 IT0外部中断0触发方式控制位IE0外部中断0中断请求标志位IE01表示向CPU请求中断 IT1外部中断1触发方式控制位IE1外部中断1中断当请求标志为 IE11 时,表示向 CPU 请求中断。题目1 C语言单片机应用程序设计 C51编译器支持在C源程序中直接开发中断程序。定义的语法格式如下: 返回值函数名[参数]interruptm[usingn] 题目1 C语言单片机应用设计usingn选项用于实现工作寄存器组的切换。n 是在中断服务子程序中选择的工作寄存器组号。03是在很多情况下,响应中断时需要保护相关的场景信息,以便中断返回后从断点处继续正确执行中断前的源程序。即在进入中断服务程序之前的程序中,使用一组工作寄存器进入中断服务程序,通过“使用n”切换到另一组寄存器,然后在中断返回后返回原来的寄存器组。这样,相互切换的两组寄存器的内容就不会被破坏。主题1 单片机C 语言应用设计 图15 扩展多个中断源 单片机主题1 C 语言应用程序设计只在中断服务程序中设置标志,保存IO 口的输入状态。FranklinC51 编译器提供了定义特定 MCS-51 系列成员的寄存器头文件。

]defineucharunsignedcharvoiddac2buchardata1uchardata2INPUTR1data1向一个发送数据 0832IN​​PUTR2data2向另一个发送数据 0832DACR0启动双向DA同时转换 话题1C语言MCU的应用设计 选择线确定FFFEH为DAC0832的端口地址。C51程序在运行输出处输出锯齿电压信号如下: includeabsacchincludereg51hdefineDA0832XBYTE[0xfffe]defineucharunsignedchardefineuintunsignedintvoidmainvoiduchariwhile1fori0i255i 锯齿波输出值最大值为255DA0832iDA转换输出 题目1 单片机C语言应用设计 177 输入的主要过程键盘与8031接口的信息为: 1、单片机判断是否有按键按下;2.确定按下的是哪个键;3. 将这一步所代表的信息翻译成计算机可以识别的代码,如ASCII或其他特征 Code Topic 1 C语言应用程序设计 单片机的接口 8031与行列式键盘之间的接口 Topic 1 C语言应用程序单片机设计 4×4键盘扫描程序 扫描程序查询的内容为1,检查是否有按键按下。首先,单片机到行扫描P10P13输出全“0”扫描码F0H,然后从列校验端口P14P17输入列扫描信号。只要一列信号不是“1”,即P1口不是F0H,就说明有按键按下。然后你需要找出按下的键在哪里。行列位置专题 1 单片机的C 语言应用设计 2 查询按键被按下的行列位置 单片机将得到的信号反相。P14P17 中的 1 位是密钥所在的列。接下来,您需要确定键所在的行。对于逐行扫描,单片机先使P10为“0”,P11P17为“1”,即向P1端口发送扫描码FEH,然后输入列校验信号。然后读入列信号,使“0” “逐行发出扫描代码,直到找到按下的键所在的行。反转行的扫描码并保留。当所有的行都扫描完仍然没有找到时,放弃扫描,认为是key的故障 解码列号得到key值 4.key的抖动处理。用手按下按键时,经常会出现按键在闭合位置和打开位置之间跳跃几次,然后才稳定到闭合状态。当一个键被释放时,它也会发生。也会出现类似的情况,就是key jitter的持续时间不一样,一般不超过10ms。如果不解决抖动问题,会导致关闭键的多次读数。按键抖动最方便的解决方案是发现按键被按下时。下载后不会立即进行逐行扫描,而是延迟10ms后进行。因为按键的时间持续了几百毫秒,现在处理还不算晚。系统,全面提高CPU的工作效率。题目一、单片机的C语言应用设计 用于在CPU和8279之间传递控制状态和数据信息CLK系统的时钟输入线,用于产生内部时钟RESET复位信号。输入线高电平有效。当 RESET 为 1 时,8279 将其复位状态重置为 16 个字符。输入代码左端扫描键盘,双键锁定程序时钟。编程是31CS。当 CS0 有效时,片选输入线为低电平有效。题目 1 C 语言单片机应用编程 电平有效 CPU 从 8279 读数据 WR 写控制信号低电平有效 CPU 写数据到 8279 IRQ 中断请求信号高电平有效 在键盘工作模式下,当 FIFO sensor RAM 有数据时,IRQ 为高电平 CPU 每次从 RAM 中读出数据时,IRQ 变为低电平。如果 RAM 中仍有数据,则 IRQ 再次返回高电平。在传感器工作模式下,只要检测到传感器状态发生变化,IRQ就会出现高电平。主题 1 单片机 C 语言应用程序编程 2 数据显示接口部分 OUTA0~OUTA3A 组显示信号输出线 OUTB0~OUTB3B 组显示信号输出线 BD 显示消隐指示输出 用于在数字转换过程中指示消隐或在显示消隐控制下使用命令 消隐指令 SL0~SL3 用于键盘传感器矩阵或显示器的扫描输出线,可通过编程设置为编码模式或内解码模式。Topic 1 C 语言单片机应用设计 3 键盘接口部分 RL0~RL7 键盘返回输入线是键盘阵列或传感器阵列,当状态改变时,IRQ会出现高电平。题目一、C语言单片机应用程序设计时间指示消隐或用于显示消隐指令控制下的消隐指示应用程序设计3键盘接口部分RL0~RL7键盘返回输入线为键盘阵列或传感器阵列时的状态变化, IRQ 会出现高电平。主题 1。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论