- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据类型选择
数据类型选择
PIC8位在PICC中的数据类型程序设计
PIC8位MCU的内存都是8位字节结构的,所以PICC中对于数据的划分都是以8位为基础的。
在汇编中,我们对一个地址为0X20的内存附值:
movlw 255;
movwf 0x20;
但一个内存是8位结构,能表示最大的数是255。要是超过了会怎么样呢?
movlw 256;
movwf 0x20;
通过DEBUG后,可以看出0X20中的值不是256,而是0了。
这里可以看出PIC处理器计算过程是当计算结果超过内存能容纳的最大数(也就是所谓溢出),则自动抛弃最高位。
如下:
255 - 256100000000
256的2进制有9位,于是PIC处理器就自动抛弃最高位1,剩下的8个0放入内存,于是就成了0了。这过程是由硬件自动完成的。
在PICC中象这样的概验比比都是。
如:char x;
for(x=255;x--;){;}
是完成255个循环。
要是for(x=256;x--;){;}
则是0个循环。
因为PICC中定义CHAR类型数据是8位。
再如:int x;
for(x=65537;x--){;}
则是只循环一次。因为PICC中INT数据是16位,占2个存储单位。
如上所述,在规划一个程序之前要考虑程序中可能涉及到的最大计算量来定义数据类型,不然将会发生溢出,导致数据混乱。
但也不可为了简便,全用长结构的类型来申明数据类型,不然会导致计算时间慢,空间占用多。
如X可能大于255,但不会大于65535,那么申明:unsigned int x;
如果X可能会是负数就一定要定义int x;
同上要是X可能大于65535,那么就得定义long x;
浮点数是一个很特殊的类型,不需要了解它的构造,只需要了解它是一个24位或32位的存储结构,是一个能表示小数的数据类型,浮点表示的数字范围极大,所以在用浮点类型时候,不需要考虑是否溢出的问题。
用PIC写高效的位移操作
在许多模拟串行通信中需要用位移操作。
以1-W总线的读字节为例,原厂的代码是:
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i = 0; i 8; i++)
{
if(read_bit()) value| = 0 x 01i;
// reads byte in, one byte at a time and then
// shifts it left
delay(10); // wait for rest of timeslot
}
return(value);
}
虽然可以用,但编译后执行效率并不高效,这也是很多朋友认为C一定不能和汇编相比的认识提供了说法。
其实完全可以深入了解C和汇编之间的关系,写出非常高效的C代码,既有C的便利,又有汇编的效率。
首先对 for (i = 0; i 8; i++)做手术,改成递减的形式:
for(i=8;i!=0;i--),因为CPU判断一个数是否是0(只需要一个指令),比判断一个数是多大来的快(需要3个指令)。
再对value| = 0 x 01i;做手术。
value| = 0 x 01i;其实是一个低水平的代码,效率低,DALLAS的工程师都是NO1,奇怪为什么会如此疏忽。
仔细研究C语言的位移操作,可以发现C总是先把标志位清0,然后再把此位移入字节中,也就是说,当前移动进字节的位一定是0。
那么,既然已经是0了,我们就只剩下一个步骤:判断总线状态是否是高来决定是否改写此位,而不需要判断总线是低的情况。
于是改写如下代码:
for(i=8;i!=0;i--){
value=1; //先右移一位,value最高位一定是0
if(read_bit()) value|=0x80; //判断总线状态,如果是高,就把value的最高位置1
}
这样一来,整个代码变得极其高效,编译后根本就是汇编级的代码。
再举一个例子:
在采集信号方面,经常是连续采集N次,最后求其平均值。
一般的,无论是用汇编或C,在采集次数上都推荐用8,16,32、64、128、256等次数,因为这些数都比较特殊,对于MCU计算有很大好处。
我们以128次采样为例:注:sampling()为外部采样函数。
unsigned int total;
unsigned char i,val;
for(i=0;i128;i++){
total+=sampling();
}
val=total/128;
以上代
您可能关注的文档
最近下载
- 2025年中国四氯化锆项目投资计划书.docx
- 八师兵团职工考试题库及答案.doc
- 健康保险的论文开题报告.docx VIP
- [自学考试密押题库与答案解析]高级英语自考题模拟2.docx VIP
- 基于利益相关者理论的企业协同发展战略研究.doc VIP
- 五年级上册英语教案Lesson 3 What Subject Do You Like Best? 川教版三年级起点.doc VIP
- 劳动通识课件 第5章 家庭劳动实践.pptx VIP
- 2025年四川省普通高中学业水平合格考数学试卷(补考)(含答案).pdf VIP
- DB13T 2501-2017 风力塔筒自动免爬器技术条件.pdf VIP
- 《建筑基桩检测技术规范2023》.pdf VIP
文档评论(0)