- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第4章 单片机的C51语言 4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编语言的混合编程 4.4 C51仿真开发环境 4.5 C51初步应用编程 (1). 采用扩展关键字“_at_”或指针定义变量的绝对地址 一般格式: 数据类型 【存储类型】 变量名 _at_ 地址常量 例如: char data a[10] _at_ 0x30; int idata b _at_ 0x80; char xdata text[256] _at_ 0x0E000; 注意:利用扩展关键字“_at_”定义的变量称为“绝对变量”,对该变量的操作就是对指定存储器空间绝对地址的直接操作,因此不能对“绝对变量”进行初始化。 (2). 采用预定义宏指定变量的绝对地址 在“ABSACC.H”中提供了如下一套预义宏: CBYTE CWORD FARRAY DBYTE DWORD FCARRAY PBYTE PWORD PCVAR XBYTE XWORD FVAR 包含该头文件,即可在C51源程序中利用这些宏来指定变量的绝对地址。 常用于扩展I/O端口地址的定义,如 #includeabsacc.h #define port_con XBYTE[0x8001] #define port_dat XBYTE[0x8000] char x; port_con=0x5A; //向XDATA存储地址8001写入数据0x5A x=port_dat; //从XDATA存储地址0100中读取数据并赋值给x 基本概念 由于C语言是“使用函数的语言”,所以实现两者混合编程的关键在于实现不同语言之间的函数调用。 由于C51语言对函数的参数、返回值传送规则、段的选用和命名都做了严格的规定,因此在混合编程时汇编语言要按照C51语言的规定来编写。这是一般高级语言和低级语言混合编程的通用规则,即低级语言要向高级语言看齐,按照高级语言的规定进行编写。 汇编语言与C51混合编程时,通常用C51编写主程序,用汇编语言编写与硬件相关的子程序。 不同的编译程序中,C语言对汇编语言的编译方法不同。在Keil中,是将不同模块分别编译或汇编,再通过链接来产生一个目标文件。 例如:编写程序从P1.0输出方波 #includereg51.h sbit p10=P1^0; //主函数 void main() { while(1) { p10=!p10; #pragma ASM MOV R7,#2; D1: MOV R6,#250; DJNZ R6,$ DJNZ R7,D1 #pragma ENDASM } } #include REG51.H char led_mod[] = {0x38,0x5B,0x76,0x4F}; //显示字模“L2H3” void delay(unsigned int time); sbit P17=P1^7; void main() { char md,i,k; while (1) { md=0x01; if(P17)k=2;else k=0; for (i=0;i2;i++) { P3=0x03; P2=led_mod[k+i]; P3=~md0x03; md=1; delay(30); } } } void delay(unsigned int time){ unsigned int j = 0; for(;time0;time--) for(j=0;j125;j++); } 修改原理图 修改程序 #includereg51.h #define uchar unsigned char #define uint unsigned int uchar code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71}; uchar code kbv[]={0xee,0xde,0xbe,0x7e,0xed,0xdd, 0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; void delay(uint time) { uchar i,j; for(i=0;itime;i++) for(j=0;j125;j++); } uchar key_scan() { uchar temp,i,c1,c2; delay(20); P3=0xf0; if(P3!=0xf0) { c1=P3; P3=0x0f;
文档评论(0)