《KEIL,STC单片机学习心得体会 .docx》由会员分享,可在线阅读,更多相关《KEIL,STC单片机学习心得体会 .docx(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品名师归纳总结51 单片机学习心得以下为本人学习 51 内核的个人心得,并且表达才能不是很好,如各路高手发觉小弟说的不对的的方,请多指教!为什么要用 51 单片机, 51 到现在算衰落的产品,但是它仍是有很大的市场,这是为什么?用性价比来说这个问题。一套产品用1 块钱能解决的问题假如搞成 10 块,在批量生产 10W 套后,你看看能节省到少 MONEY .本人是用 keil 来学习 51 单片机的,现在就利用KEIL2 编程心得。个人仍是想说一句话:成才主在己,有难先网络。师傅再强自己不下工夫是不能成功的,别人自学也能成才。并且基本上我们能遇到的方向性问题网上基本都有答案了。为什么说方向性的
2、问题 了?比如:你可以在网上问如何做饭,但是你不能问:为什么我的饭做得不好吃。很多 51 单片机是没有在线仿真的,这样就需要我们想方设法做调试,指示灯,蜂鸣器,串口等等。可以通过串口发送一些内容到上位机便于观看。当然串口仍是没有仿真器实在,比如:Unsignedchar a,b。/我想将 A 左移 8 位后加上 b 得到一个 16 进制的数。这是针对于 c 语言问题。Unsignedshort c。A=0xaa。b=0xbb。C=Unsignedshorta8+b。请问 C 的值是多少?对于新手来说可能会犯的错误,可能我们会答成 0xaabb。其实并不是这样的, 要比+的优先级低。所以正确的写
3、法为 c=( Unsignedshort)a对象指针 - 成员名- 表达式 数据类型 表达式右到左单目运算符可编辑资料 - - - 欢迎下载精品名师归纳总结+自增运算符+变量名 / 变量名+单目运算符-自减运算符- 变量名 / 变量名-单目运算符*取值运算符* 指针变量单目运算符&取的址运算符&变量名单目运算符.规律非运算符. 表达式单目运算符按位取反运算符表达式单目运算符sizeof长度运算符sizeof表达式/除表达式 / 表达式双目运算符*%乘余数(取模)表达式 * 表达式整型表达式 / 整型表达式左到右双目运算符双目运算符+-加减表达式 +表达式表达式 - 表达式左到右双目运算符双目运
4、算符左移右移变量 表达式左到右双目运算符双目运算符大于表达式 表达式双目运算符=大于等于表达式 =表达式左到右双目运算符小于表达式 表达式双目运算符=小于等于表达式 =表达式双目运算符=等于表达式 =表达式双目运算符.=不等于表达式 .=表达式左到右双目运算符8&按位与表达式 &表达式左到右双目运算符9按位异或表达式 表达式左到右双目运算符10|按位或表达式 | 表达式左到右双目运算符11&规律与表达式 &表达式左到右双目运算符12|规律或表达式 | 表达式左到右双目运算符表达式 1. 表达式2:表达式 3=/=赋值运算符除后赋值变量 =表达式变量 /= 表达式*=乘后赋值变量 *= 表达式%
5、=取模后赋值变量 %=表达式14+=-=加后赋值减后赋值变量 +=表达式变量 -= 表达式右到左=左移后赋值右移后赋值变量 =表达式&=按位与后赋值变量 &=表达式=|=按位异或后赋值按位或后赋值变量 =表达式变量 |= 表达式15,逗号运算符表达式 , 表达式 , 左到右3456713.:条件运算符右到左三目运算符从左向右顺序运算以下问题: Unsigned char a,b。Float c。A=0xea。B=0x60。可编辑资料 - - - 欢迎下载精品名师归纳总结C=floata*256+b/100 。C=600.仍是 -55.35 取决于单片机内部运算方式但是 C=floatusign
6、ed shorta*256+b/100。确定是 600。但是 C=floatshorta*256+b/100 。确定是 -55.35。Error: Multiplepublicdefinitions,symbol: (某个全局变量)。这个错误是说一个全局变量多重定义了。对于体会不足的同学们来说,以下例子可能是比较难以找到缘由的问题。比如,我有2 个.C 文件( a1.c, a2.c),有一个 .h 文件 a1.h,然后在这个 .h 文件中 a1.h定义一个变量: Unsignedchar a。然后在 a1.c 中调用 a1.h文件,可以正常运行。但是 a1.c 和 a2.c 中同时调用 a1.
7、h 文件就会显现以上错误(基本全部编译器都一样)。是由于编译器在编译的时候,编译A1.C 发觉定义了 char a,在编译 a2.c 的时候又发觉定义了一次 char a。良好的编程习惯是不要在 .H 文件中定义变量,在大工程中头文件用得比较多的情形下尤为重要。可以在.H 中声明如: #define a 10,extern u8 a。Error:Address space overflow。说明我们使用的变量空间太大了, 51单片机内部 ram只有128byte,需要将变量修改为 XDATA (片外ram 变量)标志,如: unsigned charxdata a=0。对于我们不需要修改的参数
8、,可以设置为 const/code如,CRC校验数组我们就可以用 code来定义:usigned char code auchCRCHi = 。当然也可以通过以下设置来解决这个问题:这样定义后,变量将放在片外 ram 中,编译器将以xdata处理。Uncalledsegment: ignored for overlay process, segment:(某个函数)这是一个警告,看起来是没什么作用的,但是对于51 脆弱的可编辑资料 - - - 欢迎下载精品名师归纳总结FLASH ,这些 warn 是很重要的。这个警告是说某个函数没用到。这 个函数不仅占空间,并且他所附带的变量也会占空间的。Ke
9、il2 编译生产执行文件 .hex 文件时,这些没用到的代码(当然你的注释不会编译进去)也会编译到执行文件中,使得执行文件会偏大。当然有些问题是编译器能通过,但工作起来是有问题的,比如: Usigned short a,b。/(该问题针对 51,8 位单片机) A=2000。B=a*500/3333。请问 b 的值是多少?本意是想得 300,但是 51 内核运算是用 16 位为来运算的,所以a*500=1000000。明显溢出了,所以他得到的 值为 0x4240,最终得到的值为 5.以下为个人使用 51 内核时的笔记:51 内存问题可编辑资料 - - - 欢迎下载精品名师归纳总结部 ramda
10、ta-可寻址片内 rambdata-可位寻址的片内 ramidata-可寻址片内 ram,答应拜望全部内可编辑资料 - - - 欢迎下载精品名师归纳总结pdata-分页寻址片外ramMOVX R0256BYTE/页xdata-可寻址片外ram64k的址范畴code-程序储备区64k的址范畴 , 对应 MOVC DPTR51 的 RAM只有 128byte ,不能存放太多数据假如 memory model 选择的small ,定义 data128 就会显现 ERROR:SEGMENTTOO LARG。E 这样就必需将有些数据定义为 XDATA,放在外部 RAM中,或者配置 memorymodel
11、 设置为 large 。假如要用到大数组,并且数组不需转变时,对数组设置为code,将他们放在FLASH里面,数组数据不能改。假如大数组需要修改的,进行xdata 定义,然后对其进行赋值。内存使用1、内存定义一个变量后,他们的内容是不确定的,假如你要使用它,先初始化2、内存定义一个数值时,他们是以补码的形式存在,正数补码为本身,负数的补码为(除标志符外)取反 +1),便于运算,减法也可以做加法运算可编辑资料 - - - 欢迎下载精品名师归纳总结在使用串口时,波特率是通过单片机的时钟来运算的,所以我们用于参与运算的时钟与单片机实际时钟偏大,单片机就不能正常运行串口,最好时钟外部晶振来解决这个问题
12、。我使用 51 单片机做东西,发觉我的全局变量用得太多后(xdata1000 ), 显现了部分程序不能正常运行,我就单单设置了一个全局变量a1000 (未用),部分程序不能工作,然后将该变量去掉,OK。生成 LIB 文件也可以削减部分代码生成对于 51 单片机,时钟速度比较低,并且执行周期比较长(假设12 个时钟周期,假如是浮点数运算,执行时间更长),因此尽量少用中断实现功能。 比如ADC采集,假如我们用中断来做的话,假定设置ADC采样周期为 840 个时钟周期,里面的语句有 20 条,这样使得每 840 个周期都会显现一个中断,并且每次中断要铺张 240 个周期来 ADC处理,这样会是单片机
13、运行主程序的速度减低30%,假如在加上其他的中断,那就不得了了,MCU估量就跑不动主程序了。对于 51 单片机空间较小,对于状态位就不要用byte 了,可以用 bit,这样可以节省确定的空间。 sbit用于寄存器的位。如: sbit abc=P11 。对于 51 单片机,假如发觉程序跑的很慢,又不能用仿真的时候,要考虑是否调用死循环( 虽然你能保证他能跳出循环,但是假如你频繁使用它就会导致降低速度 )。keil4添加 C51型号keil被 arm 公司收购后,我们下载的 keil4是不行以直接选择 51 单片机的, 经过一些修改才能下载 51 单片机以下可以完成 51 单片机型号库的添加,但是
14、不能实现51 单片机的 PC模拟调试,版本不兼容!大家假如 51 和 ARM都要用到,可以安装一个 keil3以及一个keil4放在不同的盘中。先装 keil2/3,他们里面有 51 单片机的型号库,装好KEIL4,将 keil2/3里面的 C51文件夹放入 keil4中,在 keil4中的 tool.ini加入 51 单片机的内容keil2/3中 TOOL.INI 文件复制出 C51内容过来即可,记住在之前加上的址 :UV2BOOK0=UV4RELEASE_NOTES.HTMuVisionR2eleaseNotes BOOK1=UV4UV2.HLPuVision2 UsersGuide Ve
15、rsion=V2.2可编辑资料 - - - 欢迎下载精品名师归纳总结C166 PATH=C:Keil4C51BOOK0=HLPRELEASE.TXTReleaseNotesBOOK1=HLPGS166.PDFuVision2 GettingStarted BOOK2=HLPC166.PDFC166UsersGuideBOOK3=HLPC166LIB.CHMC166LibraryFunctions,C BOOK4=HLPA166.PDFA166&UtilitiesUsersGuide BOOK5=HLPDBG166.CHMuVision2DebugCommands TDRV0=MONITORMO
16、N166.DLLKeilMonitor-166Driver TDRV1=OCDSCBC166.DLLKeilOCDS-166 Driver RTOS1=RTXTINY.DLLRTX-166Tiny RTOS2=RTXFULL.DLLRTX-166FullVersion=V4.2C51 BOOK0=HLPRELEASE_NOTES.HTMReleaNsoetesBOOK1=HLPGS51.PDFuVision2 GettingStartedBOOK2=HLPC51.PDFC51UsersGuideBOOK3=HLPC51LIB.CHMC51LibraryFunctions,C BOOK4=HLP
17、A51.PDFAssembler/Utilities BOOK5=HLPTR51.PDFRTX51TinyUsersGuideBOOK6=HLPDBG51.CHMuVision2DebugCommands BOOK7=ISD51ISD51.HTMISD51 InSystemDebugger TDRV0=BINMON51.DLLKeilMonitor-51Driver TDRV1=BINISD51.DLL KeilISD51In-SystemDebugger TDRV2=BINTE5_UV2.DLL TriscendE5Driver RTOS1=RTXTINY.DLLRTX-51TinyRTOS
18、2=RTX51.DLLRTX-51FullVersion=V6.2 PATH=C:Kei4C51 SN=K1RIP-M2192-K014EC251 PATH=C:Keil4C51BOOK0=HLPRELEASE.TXTReleaseNotesBOOK1=HLPGS51.PDFuVision2 GettingStarted BOOK2=HLPC251.PDFC251UsersGuideBOOK3=HLPC251LIB.CHMC251LibraryFunctions,CBOOK4=HLPA51.PDFAssembler/Utilities BOOK5=HLPDBG251.CHMuVision2De
19、bugCommands TDRV0=BINMON251.DLLKeilMonitor-251Driver Version=V3.2可编辑资料 - - - 欢迎下载精品名师归纳总结接下来介绍一下在 KEIL2 环境中新建一个工程: 打开 keil2,点击 projectnew project然后选择路径,填入工程名字,点击:储存接下来就是选择单片机型号,对应你所用的单片机内核来选择型号:我这里用的是STC 单片机,内核是52 故选择 ATMEL公司的89c52。假如你需要重新选择内核可以一下途径:可编辑资料 - - - 欢迎下载精品名师归纳总结工程建立完成后,添加文件:输入内容后储存,然后添加文
20、件,假如已有.c,.h 文件了,可以直接把那些文件拷到工程目录下,然后再添加,便于爱护:可编辑资料 - - - 欢迎下载精品名师归纳总结完成后,我们就要对工程的选项进行配置:可编辑资料 - - - 欢迎下载精品名师归纳总结可编辑资料 - - - 欢迎下载精品名师归纳总结然后编译工程成功后在指定目录中会生成.hex文件。以下我就共享一下我在keil2 环境用 STC5604AD 单片机的串口代可编辑资料 - - - 欢迎下载精品名师归纳总结码:/#include /#include #include u8 receiveError=0。/u8 receiveflag=0。UART1 UART1R
21、eceive。u8 code auchCRCHi=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,
22、 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,
23、 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,
24、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, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80,0x41, 0x00, 0xC1, 0x81,0x40, 0x01, 0xC0, 0x80, 0x41, 0
25、x01, 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,可编
26、辑资料 - - - 欢迎下载精品名师归纳总结0x41, 0x00, 0xC1, 0x81,0x40 。/ CRC 低位字节值表/u8 auchCRCLo= 。u8 code auchCRCLo=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, 0x1
27、9, 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, 0x3
28、F,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,
29、 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,
30、 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,
31、0x8C,0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,0x41, 0x81, 0x80,0x40 。可编辑资料 - - - 欢迎下载精品名师归纳总结u16 CRC16u8 *puchMsg,u8 usDataLenu8 uchCRCHi = 0xFF 。u8 uchCRCLo = 0xFF 。u16 uIndex 。while usDataLen- uIndex=uchCRCHi*puchMsg+ 。uchCRCHi=uchCRCLoauchCRCHiuIndex 。uchCRCLo=auchCR
32、CLouIndex 。return uchCRCHiRECEIVEBUFLEN-1UART1Receive.ReceiveDataLen=0。UART1Receive.IndexPointer=UART1Receive.ProPointer=0。receiveError+。RI=0。/else ifTI/TI :发送中断标志位,用于指示一帧数据发送是否完成。/TI=0 。/u8 GetDataFromUART1Bufferu8 *outBuffer,u8 GetLenu8 i=0。ifGetLen=UART1Receive.ReceiveDataLenfori=0 。iGetLen。i+out
33、Bufferi=UART1Receive.ReceiveDataUART1Receive.Index可编辑资料 - - - 欢迎下载精品名师归纳总结Pointer+%RECEIVEBUFLEN 。UART1Receive.ReceiveDataLen-。return 1。return 0。void SendOneDataByteu8 senddataTI=0 。SBUF=senddata。while.TI。TI=0 。void SendDataBytesu8 *senddata,u8 sendDataLenu8 i=0。for i=0 。i1 b-。void mdelayu16 au16 b。
34、b=a+1。whileb1delay350。可编辑资料 - - - 欢迎下载精品名师归纳总结b-。void testuartu8 receivebuf32=0x11,0x55,0x2f,0x08,0x02,0x05,0x10,0x05,0x00,0x00, 0x00 。/=0x00, 0x55, 0xBA, 0x02, 0x02, 0x00, 0x00, 0x00 。u8sendbuf32=0xaa,0x55,0x2f,0x08,0x02,0x05,0x10,0x05,0x00,0x00,0x0 0 。/sendbuf0=0xaa。/sendbuf1=0xbb。/sendbuf2=0xcc。/
35、sendbuf3=0xdd。/sendbuf4=0xee。/sendbuf5=0xff 。/u8 i。u16 temp。/fori=0 。i=8GetDataFromUART1Bufferreceivebuf, 1。ifreceivebuf0=0xaa/&receivebuf1=0x5a/&receivebuf2=0x11&receivebuf3=0x99可编辑资料 - - - 欢迎下载精品名师归纳总结GetDataFromUART1Bufferreceivebuf+1, 7。temp=CRC16receivebuf,8。receivebuf8=temp8。 receivebuf9=temp。
36、SendDataBytesreceivebuf,10。/SendDataBytesreceivebuf, 4。/sendbuf0=sendbuf0+1。/SendOneDataByte0xaa。/SendOneDataByte0x5a。/WDT_CONTR=0x3f 。/mdelay500。WDT_CONTR=0x3f 。H 文件/#include const.h#ifndef _UART_H #define _UART_H/#include config.h/struct UART1/u8 ReceiveData32。/u8 SendData32。/u8 ReceiveDataLen。/u8
37、 ProPointer。/u8 IndexPointer。/ 。#define RECEIVEBUFLEN 32typedef struct uart可编辑资料 - - - 欢迎下载精品名师归纳总结unsigned charReceiveDataRECEIVEBUFLEN。/缓冲区/u8 SendData32。unsigned char ReceiveDataLe。n /接收长度unsigned char ProPointe。r /生产可编辑资料 - - - 欢迎下载精品名师归纳总结unsigned char IndexPointe。rUART1 。extern UART1 UART1Receive。/消费指针可编辑资料