KeilC使用教程_第1页
KeilC使用教程_第2页
KeilC使用教程_第3页
KeilC使用教程_第4页
KeilC使用教程_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Keil C语言程序设计示例教程(开发C8051F310) 使用汇编语言或C语言要使用编译器,以便把写好的程序编译为机器码,才能把HEX可执行文件写入单片机内。KEIL uVISION是众多单片机应用开发软件中最优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,甚至ARM,它集编辑,编译,仿真等于一体,它的界面和常用的微软VC+的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。在这里以51单片机并结合C程序为例(汇编操作方法类似,唯一不同的是汇编源程序文件名后缀为“.ASM ”),图文描述工程项目

2、的创建和使用方法。1. 首先我们要养成一个习惯:最好先建立一个空文件夹,把您的工程文件放到里面,以避免和其他文件混合,如下图, 创建了一个名为“PRJ_C8051”文件夹2. 点击桌面上的Keil uVision4图标,出现启动画面:3. 点击“project - New uVision Project”新建一个工程:4. 在对话框,选择放在刚才建立的“PRJ_C8051”文件夹下,给这个工程取个名为Test_C8051F310, 然后保存, 工程的后缀为uvporj。5. 弹出一个框,在CPU类型下我们找到并选中“Silicon Laboratories. Inc.”下的C8051F3106

3、. 加入C8051起动码7. 建立一个源程序文本月夜   来源:本站原创(8. 在下面空白区别写入或复制一个完整的C程序:9. 输入源程序文件名名称,示例输入“Test_C8051F310.c”,然后保存:10. 把刚创建的源程序文件加入到工程项目文件中。作者:月夜   来源:本站原创()11. 设置-目标(第1步 第4步)12. 设置-Output栏(第5步 第7步)作者:月夜   来源:本站原创()13. 设置-Debug栏(第8步 第11步)14. 设置-Utilities栏(第12步 第16步)15. 工程项目创建和设置全部完

4、成!点击保持并编译16. 在C8051F310中的C语言程序示例/-/ Includes/ 在c8051f310.h在头文件中定义了C8051F310的寄存器、输入/输出的端口/-#include <c8051f310.h> / SFR declarations/-/ 16-bit SFR Definitions for 'F30x/-sfr16 TMR2RL = 0xca; / Timer2 reload valuesfr16 TMR2 = 0xcc; / Timer2 counter/-/ Global CONSTANTS/-#define SYSCLK 2450000

5、0 / 8 / SYSCLK frequency in Hzsbit LED = P00; / LED='1' means ON/-/ Function PROTOTYPES/-void SYSCLK_Init (void);void PORT_Init (void);void Timer2_Init (int counts);void Timer2_ISR (void);/-/ MAIN Routine/-void main (void) / disable watchdog timer PCA0MD &= 0x40; / WDTE = 0 (clear watchd

6、og timer / enable) SYSCLK_Init (); / Initialize system clock to / 24.5MHz PORT_Init (); / Initialize crossbar and GPIO Timer2_Init (SYSCLK / 12 / 10); / Init Timer2 to generate / interrupts at a 10Hz rate. EA = 1; / enable global interrupts while (1) / spin forever /-/ SYSCLK_Init/-/ This routine in

7、itializes the system clock to use the internal 24.5MHz / 8/ oscillator as its clock source. Also enables missing clock detector reset./void SYSCLK_Init (void) OSCICN = 0x80; / configure internal oscillator for / its lowest frequency RSTSRC = 0x04; / enable missing clock detector/-/ PORT_Init/-/ Conf

8、igure the Crossbar and GPIO ports./ P3.3 - LED (push-pull)/void PORT_Init (void) / assignments XBR0 = 0x00; / no digital peripherals selected XBR1 = 0x40; / Enable crossbar and weak pull-ups /P3MDOUT |= 0x08; P0MDOUT |= 0x03; / enable LED as a push-pull output/-/ Timer2_Init/-/ Configure Timer2 to 1

9、6-bit auto-reload and generate an interrupt at/ interval specified by <counts> using SYSCLK/48 as its time base./void Timer2_Init (int counts) TMR2CN = 0x00; / Stop Timer2; Clear TF2; / use SYSCLK/12 as timebase CKCON &= 0x60; / Timer2 clocked based on T2XCLK; TMR2RL = -counts; / Init relo

10、ad values TMR2 = 0xffff; / set to reload immediately ET2 = 1; / enable Timer2 interrupts TR2 = 1; / start Timer2/-/ Interrupt Service Routines/-/-/ Timer2_ISR/-/ This routine changes the state of the LED whenever Timer2 overflows./void Timer2_ISR (void) interrupt 5 TF2H = 0; / clear Timer2 interrupt

11、 flag LED = LED; / change state of LED17. KEIL C语言与汇编语言的混合编程方法C语言中加入汇编语言模块的方法: 例子: void func() C语言代码 #pragma asm MOV R6,#23 DELAY2: MOV R7,#191 DELAY1: DJNZ R7,DELAY1 DJNZ R6,DELAY2 RET #pragma endasm C语言代码 汇编部分需要用#pragma asm和#pragma endasm包起来18. KEIL C混合编程中的错误与解决方法1) Keil提示“asm/endasm”出错的解决方法如果只是像1

12、中那样直接加入汇编代码的话,编译将会报错,错误如下: compiling sendata.c. sendata.c(81): error C272: 'asm/endasm' requires src-control to be active sendata.c(87): error C272: 'asm/endasm' requires src-control to be active Target not created 解决方法如下: 首先project workspace窗口右键单击包含有汇编部分的c语言文件名,然后在如上图所示的菜单中选择带有红色方框的

13、选项在弹出的对话框中,将上图中红色方框选中的两项打上勾(默认的情况下,前面的勾是灰色的,要让这两项前的勾变为黑色的),点击确定。2) ?C_START等相关警告的处理按照2中的方法处理完之后,再编译不会出现错误信息了,但是会出现如下的警告信息: linking. * WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?C_START MODULE: STARTUP.obj (?C_STARTUP) * WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: ?C_START MODULE:

14、STARTUP.obj (?C_STARTUP) ADDRESS: 000DH处理方法如下:找在如下图所示的“Source Group 1”上点右键,在菜单中选择 “Add Files to Group 'Source Group 1' ”找到你的KEIL安装目录,选择其中的“C51”目录下的“LIB”目录下的“C51S.LIB”文件,点击Add,然后Close即可。注意,上图所示的文件选择框进入LIB目录下后,默认只显示.c文件,需要在“文件类型”中选择“Library file (*.lib)”,即可显示LIB文件了。添加C51S.LIB到工程后,再次编译,警告信息消失。3

15、) 寄存器冲突问题的解决汇编程序块中常常会使用到51的通用寄存器,比如R0-R7。这种情况下可能会和C语言程序中已经使用到的R0-R7产生冲突,以至于产生一些非常隐蔽和古怪的错误。虽然有人说KEIL可以自动分配寄存器组使之不产生冲突。但是在我这里具体测试时还是有冲突的(或者是我的KEIL设置有问题?),下面是测试小程序:/* * 测试程序 */ #include<reg51.h> #include<stdio.h> typedef unsigned char uint8 ; uint8 buf16= 0x55 ; uint8 i=0 ; /* * 初始化单片机相关寄存器

16、 */ void UartInit() SCON=0x50 ; TMOD|=0x21 ;PCON|=0x80 ; TH1=0xE8 ;TL1=0xE8 ; IE|=0x90 ; TR1=1 ; /* * 延时 */ void delay() #pragma asm MOV R6,#19 DELAY2 : MOV R7,#18 DELAY1 : DJNZ R7,DELAY1 DJNZ R6,DELAY2 RET #pragma endasm /* * 向COM1发送一个字符 */void SendChar(uint8 byteToSend) SBUF=byteToSend ; while(!TI

17、); TI=0 ; /* * 读取一个字节 */ uint8 read_byte() uint8 recvdata=8 ;delay(); /延时 return recvdata ; /* * 主 程 序 */ int main() UartInit(); /串口初始化 while(1) bufi+=read_byte(); /* * 串口中断处理 */ void chuankou()interrupt 4 if(RI) for(i=0;i<sizeof(buf);i+) SendChar(bufi); RI=0 ; 程序本身非常简单,一目了然。main函数的作用就是不断把read_by

18、te()的返回值读入buf中,再待有串口中断时,将buf中的内容输出到串口。read_byte()函数也已经做了简化,返回值固定为8。将这个程序在KEIL中编译,下载运行。奇怪的情况出现了,buf中的内容输出到串口总是0(输出理所当然应该是8)。(1) 避开C语言部分已经使用了的Rn编汇编模块时,看看C语言部分生成的汇编程序,把那些C语言已经使用到的,且可能对汇编部分构成冲突的Rn避开就好了。比如上面的延时程序中,把R6、R7换成R3、R4,程序就正常了。(2) 2)用USING X + ARX的方式调用其他组Rn寄存器void delay() #pragma asm USING 2 MOV AR6,#19 DELAY2:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论