《单片机软件实践经验》由会员分享,可在线阅读,更多相关《单片机软件实践经验(6页珍藏版)》请在金锄头文库上搜索。
1、一:相信很多人碰到uVision编辑中文字体错位的问题。下面给出一个解决方案Edit = Configuration = Colors & Fonts(有些是在view=options里面,自己找一下)选择需要修改字体的项目, 点击Font选择框,在Font对话框里面选择Font: FixedsysSize: 10 (此处很重要)EDIT-Configuration-Colors&Fonts在左边windows窗口中选 8051:Editor C Files,然后在中间Element窗口中选Text,接着在右边Font窗口点Courier New.,最后选一个字体和大小,一路OK就行了。确定后
2、回到源代码,输入汉字,OK,汉字显示问题解决了BTW: 汉字在注释,或者字符串中才能正确显示,这是uVision的一个限制。一般如果Keil不修改配置文件的话,应该要默认装在C盘根目录下,当然也可以装在其他任何路径下,只需要修改Keil安装根目录下的tool.ini文件中的路径参数:PATH=C:KeilC51如果你要装在其他路径的话,把其他路径的完整路径写到双引号之间。修改Keil路径并不是不能安装keil的原因,而是解决在编译的时候,A51、BL51、CX51等都找不到而无法编译的问题。至于修改字体,非常方便,打开任何一个工程文件:(我这里直接说中文)(主菜单)“编辑” - “配置” -
3、“颜色和字体”标签页,选择你要修改字体相应的“窗口”和“元素”后,点击右边的“字体”,就能设置字体了,我用到现在,个人感觉字体“Fixedsys”10号比较不错,当然别人可能有别的感觉,呵呵。二:为什么在Keil uVision4中找不到AT89C51芯片?你装的是keil MDK,MDK是征对于ARM芯片的,你没装C51的安装包C51V905,装了之后就可以找到了。另外它们两个可以装在同一路径下的。我是因为安装了个叫MDK的软件,建立工程时发现没有AT89C51芯片。后来把它卸了,从新下载了个Keil C51的软件,装起来之后就可以找到AT89C51了。三Keil uVision2里面怎么调
4、节字体?点击工具栏上的Configuration按钮,找到Colors & Fonts标签,在左侧的windows框中选择是C文件还是Asm文件,以C为例,选择中间的Element框中的/*Comment*/(或是别的都行),然后在右侧即可进行字体属性设置。四:keil uvision4中如何使用查找功能 比如在main.c中定义了一个函数delay并多次使用,可能第一查找到的delay快捷键:F3五:在Keil uvision4中使用C语言进行编程,在进行debug调试时,反汇编窗口都是nop,无法单步执行? 你先确认一下项目编译是否正常,是否生成了目标文件六:keil uVision4一些
5、使用总结(汉字注释,C关键字等)问题一:keil中没有STC的东西解决: 方案一:使用Atmel 89C52。若使用STC的特有功能,单独指定头文件 方案二:从STC官方主页下载UV3.CDB文件(2012-08-21为UV3.CDB),放到安装目录下。虽然是3的,不过我放到4下也可以。 添加方法A 直接将UV3.CDB改成UV4.CDB覆盖安装目录下文件。这样下次启动keil只有STC的。(未自己测试,仅记录) 添加方法B 将UV3.CDB重命名为STC.CDB放到安装目录下的UV4。并修改UV4的上级目录下的TOOLS.INI文件,在 BOOK0=UV4RELEASE_NOTES.HTM(
6、uVisionReleaseNotes)下面加入CDB0=UV4STC.CDB(STCCPUDataBase) 即可。 这样下次启动keil的时候,会提示选择数据库选项。需要STC选择STC,或者选择原来的。问题二:keil中无法输入中文注释解决:方案一:英文状态下输入/。在英文状态下的引号内输入中文注释 方案二:菜单工具栏中。Edit-configuration 去掉Use Color in Comments方框中的勾。正常显示:在大量使用中文注释的情况下,感觉第二个方案比较好,可以省去很多的问题三:keil中C的关键字没有颜色显示解决:类似问题二修改foreground为自己喜欢的颜色即可
7、七,STC89C52RC单片机是否可以包含reg51.h这个头文件,为什么?可以包含,原因如下: Reg51.h,看名字相信你也明白,是关于51寄存器的,说白了一点,Reg51.h是关于最基本的51单片机的SFR定义的,比如IO口,定时器,串口等等相关的特殊寄存器的定义,所以,REG51.H相对来说应用广泛,因为他是最基础的单片机的定义,差不多所有的51单片机都可以包含他。 STC89C52也是51单片机中的一种,自然也可以包含这个文件。用KEIL编译STC单片机的程序时,如果没有用到STC单片机在51的基础上添加的一些寄存器和中断,头文件可以直接用51的reg51.h或reg52.h,如果用
8、了添加的功能就必须在头文件中增加定义,我根据STC单片机网站提供的资料整理成头文件,大家可以从下面的链接下载:八,STC89C52定时器使用方法STC89C52定时器使用方法定时器/计数器0 和定时器/计数器1 都可以在方式0、方式1、方式2 工作,而方式3 只有前者才能工作。1. 方式 0当TMOD 中M1、M0 都为0 时,T/C 工作在方式0。方式0 为13 位的T/C,由TH 提供高8 位,TL 提供低5 位,注意TL 的高3 位是无效的,计数溢出值为2 的13 次方=8192,启动该计数器需要设置好计数初值。当C/- T该位为0 时,T/C 为定时器,振荡源12 分频的信号作为计数脉
9、冲;当C/- T该位为1 时,T/C为计数器,对外部脉冲输入端的T0 或T1 引脚进行脉冲计数。计数脉冲能否加到计数器上,受启动信号的控制。当GATE=0 时,只要TR=1,则T/C 启动;当GATE=1时,启动信号受到TR 与INT 的双重控制。T/C 启动后立即加1 计数,当13 位计数满时,TH 向高位进位。此进位将中断溢出标志TF 置位即TF=1,产生中断请求,表示定时时间或计数次数到达。若T/C 开中断(ET=1)且CPU 开中断(EA=1),则当CPU 自动转向中断服务函数时,TF 自动清零,不需要人工软件清零。2. 方式 1当TMOD 中M1、M0 为0、1 时,T/C 工作在方
10、式1。方式1 与方式0 基本相同,唯一不同的是方式0 是13 位计数方式,方式1 是16 位计数方式,TH 和TL 都同时提供8 位(方式0 时TL 只提供低5 位,高3 位无效),计数溢出值为2 的16 次方=65536。3. 方式 2当TMOD 中M1、M0 为1、0 时,T/C 工作在方式2。方式2 是8 位的可自动重装载的T/C,满计数值为2 的8 次方=256。在方式0 和方式1 中,当计数满后,若要进行下一次定时/计数,必须通过软件向TH 和TL 重新装载预置计数值。方式2 中TH 和TL 被当作两个8 位计数器。技术过程中,TH 寄存8 位初值并保持不变,由TL 进行8 位计数。
11、计数溢出时,除产生溢出中断请求外,还自动将TH 中初值重装到TL,即重装载。除此之外,方式2 也同方式0。4. 方式 3方式3 只适合于T/C0。当T/C0 工作在方式3 时,TH0 和TL0 成为两个独立的计数器。这时,TL0可作定时器/计数器,占用T/C0 在TCON 和TMOD 寄存器中的控制位和标志位;而TH0 只能作定时器使用,占用T/C1 的资源TR1 和TF1。在这种情况下,T/C1 仍可用于方式0/1/2,当不能够使用中断方式。只有将T/C1 用作串行口的波特率方式器时,T/C0 才工作在方式3,以便增加一个定时器。5. T/C2的工作方式定时器/计数器2 包含一个16 位重载
12、方式,T/C2 在计数溢出后,自动在瞬间重装载(像8 位自动重载方式2)。自动重载可由外部引脚T2EX 的负跳变开始,这样外部引脚用于产生和其他硬件计数器的同步信号。T/C2 可以看作看门狗或定时溢出的定时器。T/C2 还有捕获方式。把瞬时计数值传到另外的CPU 可读取的寄存器对(RCAP2H、RCAP2L)。这样,在读的过程中,两个字节的计数值无波动的危险。对于快速变化的计数,比如计数值在读取高字节时是16FF时,到读取低字节时已变到1700,结果却得到1600。若16FF 瞬间捕获到另外的寄存器,则可以在CPU空闲的时候取到16 和FF。#include stc.h /加载stc.h 头文
13、件unsigned char i=0; /声明变量ivoid main(void) /主函数,程序是在这里运行的TH0=(65536-50000)/256; /计数寄存器高8 位TL0=(65536-50000)%6; /计数寄存器低8 位TMOD=0x01; /工作方式为16 位定时器ET0=0x01; /允许T/C0 中断EA=1; / 全部中断允许TR0=1; / 启动T/C0 运行while(1) / 进入死循环if(i7)i=0; /若i7,则i=0void Timer0IRQ(void) interrupt 1 /中断服务函数TH0=(65536-50000)/256; /计数寄存
14、器高8 位重新载入TL0=(65536-50000)%6; /计数寄存器低8 位重新载入84P2=1i; /进入位移操作,熄灭相对应位的LEDi+; /i 自加1分析:T/C0 的初始化在main 函数中进行,在while(1)死循环当中,只有对i 变量检测,对LED 灯进行操作主要放置在T/C0 的中断服务函数Timer0IRQ,即P2=1i 就是对LED 灯进行操作。很奇怪,main()函数里面基本对单片机的操作什么都没有,只有对变量i 的检测操作,几乎是空载运作,但是为什么流水灯还是能够运行呢?那么答案只能有一个,Timer0IRQ()中断服务函数能够脱离主函数独立运行。大家很自然地想到为什么Timer0IRQ()函数独立于main()函数还能够运行,联系到在PC 机的C 语言的编程是根本不可能的事,因为所有的运行都必选在main()函数体中运行。只能告诉大家不同的平台自然有所不同,它们之间的不同必然会有各自的优点,还有例如AVR、ARM单片机编程同样是“主程序+中断服务函数”组合的架构,更何况是8051 系列单片机编程。当然我们学会了8051 系列单片机的编程,自然而然在AVR、ARM 或者更加多的单片机中的编程中得心应手,感觉就是以不变应万变