KEILSTC单片机单片机内核学习心得体会Word格式.docx
- 文档编号:21954788
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:22
- 大小:970.90KB
KEILSTC单片机单片机内核学习心得体会Word格式.docx
《KEILSTC单片机单片机内核学习心得体会Word格式.docx》由会员分享,可在线阅读,更多相关《KEILSTC单片机单片机内核学习心得体会Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
名称或含义
使用形式
结合方向
说明
1
[]
数组下标
数组名[常量表达式]
左到右
()
圆括号
(表达式)/函数名(形参表)
.
成员选择(对象)
对象.成员名
->
成员选择(指针)
对象指针->
成员名
2
-
负号运算符
-表达式
右到左
单目运算符
(类型)
强制类型转换
(数据类型)表达式
++
自增运算符
++变量名/变量名++
--
自减运算符
--变量名/变量名--
*
取值运算符
*指针变量
&
取地址运算符
变量名
!
逻辑非运算符
表达式
~
按位取反运算符
~表达式
sizeof
长度运算符
sizeof(表达式)
3
/
除
表达式/表达式
双目运算符
乘
表达式*表达式
%
余数(取模)
整型表达式/整型表达式
4
+
加
表达式+表达式
减
表达式-表达式
5
左移
变量<
>
右移
变量>
6
大于
表达式>
=
大于等于
=表达式
小于
表达式<
小于等于
7
==
等于
表达式==表达式
不等于
表达式!
=表达式
8
按位与
表达式&
9
^
按位异或
表达式^表达式
10
|
按位或
表达式|表达式
11
逻辑与
12
||
逻辑或
表达式||表达式
13
?
:
条件运算符
表达式1?
表达式2:
表达式3
三目运算符
14
赋值运算符
变量=表达式
/=
除后赋值
变量/=表达式
*=
乘后赋值
变量*=表达式
%=
取模后赋值
变量%=表达式
+=
加后赋值
变量+=表达式
-=
减后赋值
变量-=表达式
左移后赋值
右移后赋值
按位与后赋值
变量&
^=
按位异或后赋值
变量^=表达式
|=
按位或后赋值
变量|=表达式
15
逗号运算符
表达式,表达式,…
从左向右顺序运算
以下问题:
Unsignedchara,b。
Floatc。
A=0xea。
B=0x60。
C=(float)(a*256+b)/100;
C=600?
还是-55.35取决于单片机内部计算方式
但是C=(float)(usignedshort)(a*256+b)/100;
一定是600。
但是C=(float)(short)(a*256+b)/100;
一定是-55.35。
Error:
Multiplepublicdefinitions,symbol:
(某个全局变量)。
这个错误是说一个全局变量多重定义了。
对于经验不足的同学们来说,以下例子可能是比较难以找到原因的问题。
比如,我有2个.C文件(a1.c,a2.c),有一个.h文件(a1.h),然后在这个.h文件中(a1.h)定义一个变量:
Unsignedchara。
然后在a1.c中调用a1.h文件,可以正常运行;
但是a1.c和a2.c中同时调用a1.h文件就会出现以上错误(基本所有编译器都一样)。
是因为编译器在编译的时候,编译A1.C发现定义了chara,在编译a2.c的时候又发现定义了一次chara。
良好的编程习惯是不要在.H文件中定义变量,在大工程中头文件用得比较多的情况下尤为重要。
可以在.H中声明如:
#definea10,externu8a。
Addressspaceoverflow。
说明我们使用的变量空间太大了,51单片机内部ram只有128byte,需要将变量修改为XDATA(片外ram变量)标志,如:
unsignedcharxdataa=0。
对于我们不需要修改的参数,可以设置为const/code,如CRC校验数组我们就可以用code来定义:
usignedcharcode[]auchCRCHi={…}。
。
当然也可以通过以下设置来解决这个问题:
这样定义后,变量将放在片外ram
中,编译器将以xdata处理。
Uncalledsegment:
ignoredforoverlayprocess,segment:
(某个函数)这是一个警告,看起来是没什么作用的,但是对于51微弱的FLASH,这些warn是很重要的。
这个警告是说某个函数没用到。
这个函数不仅占空间,并且他所附带的变量也会占空间的。
Keil2编译生产执行文件.hex文件时,这些没用到的代码(当然你的注释不会编译进去)也会编译到执行文件中,使得执行文件会偏大。
当然有些问题是编译器能通过,但工作起来是有问题的,比如:
Usignedshorta,b。
//(该问题针对51,8位单片机)
A=2000。
B=a*500/3333。
请问b的值是多少?
本意是想得300,但是51内核计算是用16位为来计算的,所以a*500=1000000。
明显溢出了,所以他得到的值为0x4240,最终得到的值为5.
以下为个人使用51内核时的笔记:
51内存问题
data
--->
可寻址片内ram
bdata
可位寻址的片内ram
idata
可寻址片内ram,允许访问全部内部ram
pdata
分页寻址片外ram
(MOVX
@R0)
(256
BYTE/页)
xdata
可寻址片外ram
(64k
地址范围)
code
程序存储区
地址范围),对应MOVC
@DPTR
51的RAM只有128byte,不能存放太多数据如果memory
model选择的small,定义data>
128就会出现'
ERROR'
SEGMENT
TOO
LARGE。
这样就必须将有些数据定义为XDATA,放在外部RAM中,或者配置memory
model设置为large。
如果要用到大数组,并且数组不需改变时,对数组设置为code,将他们放在FLASH里面,数组数据不能改。
如果大数组需要修改的,进行xdata定义,然后对其进行赋值。
内存使用
1、内存定义一个变量后,他们的内容是不确定的,如果你要使用它,先初始化
2、内存定义一个数值时,他们是以补码的形式存在,正数补码为本身,负数的补码为((除标志符外)取反+1),便于计算,减法也可以做加法计算
在使用串口时,波特率是通过单片机的时钟来计算的,所以我们用于参与计算的时钟与单片机实际时钟偏大,单片机就不能正常运行串口,最好时钟外部晶振来解决这个问题。
我使用51单片机做东西,发现我的全局变量用得太多后(xdata>
1000),出现了部分程序不能正常运行,我就单单设置了一个全局变量a[1000](未用),部分程序不能工作,然后将该变量去掉,OK。
生成LIB文件也可以减少部分代码生成
对于51单片机,时钟速度比较低,并且执行周期比较长(假设12个时钟周期,如果是浮点数计算,执行时间更长),因此尽量少用中断实现功能。
比如ADC采集,如果我们用中断来做的话,假定设置ADC采样周期为840个时钟周期,里面的语句有20条,这样使得每840个周期都会出现一个中断,并且每次中断要浪费240个周期来ADC处理,这样会是单片机运行主程序的速度减低30%,如果在加上其他的中断,那就不得了了,MCU估计就跑不动主程序了。
对于51单片机空间较小,对于状态位就不要用byte了,可以用bit,这样可以节省一定的空间。
sbit用于寄存器的位;
如:
sbitabc=P1^1。
对于51单片机,如果发现程序跑的很慢,又不能用仿真的时候,要考虑是否调用死循环(虽然你能保证他能跳出循环,但是如果你频繁使用它就会导致降低速度)。
keil4添加C51型号
keil被arm公司收购后,我们下载的keil4是不可以直接选择51单片机的,经过一些修改才能下载51单片机
以下可以完成51单片机型号库的添加,但是不能实现51单片机的PC模拟调试,版本不兼容!
大家如果51和ARM都要用到,可以安装一个keil3以及一个keil4放在不同的盘中。
先装keil2/3,他们里面有51单片机的型号库,装好KEIL4,将keil2/3里面的C51文件夹放入keil4中,在keil4中的tool.ini加入51单片机的内容(keil2/3中TOOL.INI文件复制出C51内容过来即可,记住在之前加上地址):
[UV2]
BOOK0=UV4\RELEASE_NOTES.HTM("
uVision2
Release
Notes"
)
BOOK1=UV4\UV2.HLP("
User'
s
Guide"
Version=V2.2
[C166]
PATH="
C:
\Keil4\C51"
BOOK0=HLP\RELEASE.TXT("
BOOK1=HLP\GS166.PDF("
Getting
Started"
BOOK2=HLP\C166.PDF("
C166
BOOK3=HLP\C166LIB.CHM("
Library
Functions"
C)
BOOK4=HLP\A166.PDF("
A166
Utilities
BOOK5=HLP\DBG166.CHM("
Debug
Commands"
TDRV0=MONITOR\MON166.DLL
("
Keil
Monitor-166
Driver"
TDRV1=OCDS\CBC166.DLL
OCDS-166
RTOS1=RTXTINY.DLL
RTX-166
Tiny"
RTOS2=RTXFULL.DLL
Full"
Version=V4.2
[C51]
BOOK0=HLP\RELEASE_NOTES.HTM("
BOOK1=HLP\GS51.PDF("
BOOK2=HLP\C51.PDF("
C51
BOOK3=HLP\C51LIB.CHM("
BOOK4=HLP\A51.PDF("
Assembler/Utilities"
BOOK5=HLP\TR51.PDF("
RTX51
Tiny
BOOK6=HLP\DBG51.CHM("
BOOK7=ISD51\ISD51.HTM("
ISD51
In
System
Debugger"
TDRV0=BIN\MON51.DLL
Monitor-51
TDRV1=BIN\ISD51.DLL
In-System
TDRV2=BIN\TE5_UV2.DLL
Triscend
E5
RTX-51
RTOS2=RTX51.DLL
Version=V6.2
\Kei4\C51"
SN=K1RIP-M2192-K014E
[C251]
BOOK2=HLP\C251.PDF("
C251
BOOK3=HLP\C251LIB.CHM("
BOOK5=HLP\DBG251.CHM("
TDRV0=BIN\MON251.DLL
Monitor-251
Version=V3.2
接下来介绍一下在KEIL2环境中新建一个工程:
打开keil2,点击projectnewproject
然后选择路径,填入工程名字,点击:
保存
接下来就是选择单片机型号,对应你所用的单片机内核来选择型号:
我这里用的是STC单片机,内核是52故选择ATMEL公司的89c52。
如果你需要重新选择内核可以一下途径:
工程建立完成后,添加文件:
输入内容后保存,
然后添加文件,如果已有.c,.h文件了,可以直接把那些文件拷到工程目录下,然后再添加,便于维护:
完成后,我们就要对工程的选项进行配置:
然后编译工程成功后在指定目录中会生成.hex文件。
以下我就分享一下我在keil2环境用STC5604AD单片机的串口代码:
//#include<
Stc12c54.h>
mcu.h>
#include<
config.h>
u8receiveError=0。
//u8receiveflag=0。
UART1UART1Receive。
u8codeauchCRCHi[]={
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,
0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,
0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,
0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,
0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,
0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x40}。
//CRC低位字节值表
//u8auchCRCLo[]={}。
u8codeauchCRCLo[]={
0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,
0x04,0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,
0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,
0x1D,0x1C,0xDC,0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,
0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,
0x37,0xF5,0x35,0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,
0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,
0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,
0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,
0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,
0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,0x78,0xB8,0xB9,0x79,0xBB,
0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,
0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,0x50,0x90,0x91,
0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,
0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,0x88,
0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- KEILSTC 单片机 内核 学习心得 体会