PIC单片机C语言延时程序和循环子程序实现方法

很多朋友说C中不能精确控制延时时间,不能象汇编那样直观。

其实不然,对延时函数深入了解一下就能设计出一个理想的框价出来。

一般的我们都用

for(x=100;--x;){;}此句等同与x=100;while(--x){;};

或for(x=0;x<100;x++){;}

来写一个延时函数。

在这里要特别注意:X=100,并不表示只运行100个指令时间就跳出循环。

可以看看编译后的汇编:

x=100;while(--x){;}

汇编后:

movlw 100

bcf 3,5

bcf 3,6

movwf_delay

l2 decfsz _delay

goto l2

return

从代码可以看出总的指令是是303个,其公式是8+3*(X-1)。注意其中循环周期是X-1是99个。

这里总结的是x为char类型的循环体,当x为int时候,其中受X值的影响较大。

建议设计一个char类型的循环体,然后再用一个循环体来调用它,可以实现精确的长时间的延时。

下面给出一个能精确控制延时的函数,此函数的汇编代码是最简洁、最能精确控制指令时间的:

void delay(char x,char y){

char z;

do{

z=y;

do{;}while(--z);

}while(--x);

}

其指令时间为:7+(3*(Y-1)+7)*(X-1)

如果再加上函数调用的call指令、页面设定、传递参数花掉的7个指令。

则是:14+(3*(Y-1)+7)*(X-1)。

如果要求不是特别严格的延时,可以用这个函数:

void delay(){

unsigned int d=1000;

while(--d){;}

}

此函数在4M晶体下产生10003us的延时,也就是10MS。

如果把D改成2000,则是20003us,以此类推。

有朋友不明白,为什么不用while(x--)后减量,来控制设定X值是多少就循环多少周期呢?

现在看看编译它的汇编代码:

bcf 3,5

bcf 3,6

movlw 10

movwf _delay

l2

decf _delay

incfsz _delay,w

goto l2

return

可以看出循环体中多了一条指令,不简洁。所以在PICC中最好用前减量来控制循环体。

再谈谈这样的语句:

for(x=100;--x;){;}和for(x=0;x<100;x++){;}

从字面上看2者意思一样,但可以通过汇编查看代码。后者代码雍长,而前者就很好的汇编出了简洁的代码。

所以在PICC中最好用前者的形式来写循环体,好的C编译器会自动把增量循环化为减量循环。因为这是由处理器硬件特性决定的。

PIC并不是一个很智能的C编译器,所以还是人脑才是第一的,掌握一些经验对写出高效,简洁的代码是有好处的。

pic单片机延时程序C语言,PIC单片机C语言延时程序和循环子程序实现方法相关推荐

  1. c语言51单片机延时程序,51单片机c语言延时.doc

    1,_nop_() 适用于us级的少量延时 标准的C语言中没有空语句.但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果.这在汇编语言中很容易实现,写几个nop就行了. 在keil C51 ...

  2. 单片机ad显示程序c语言,pic单片机ad转换c程序分享

    A/D转换器是用来通过一定的电路将模拟量转变为数字量.模拟量可以是电压.电流等电信号,也可以是压力.温度.湿度.位移.声音等非电信号.但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各 ...

  3. c语言延时系统,基于VB的单片机C语言延时程序各参数计算系统

    仪器仪表用户 doi:10.3969/j.issn.1671-1041.2011.04.013 □科研设计成果□ 基于VB的单片机C语言延时程序各参数计算系统 刘 1 锋,林 奕 2 (1.武汉理工大 ...

  4. 延时1us程序12mhz晶振c语言,51单片机 Keil C 延时程序的简单(晶振12MHz,一个机器周期1us.)...

    一. 500ms延时子程序 void delay500ms(void) { unsignedchari,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for ...

  5. pic12f1823单片机入门_单片机入门案例:使用PIC单片机制作声控拍手开关

    拍手开关对于初学者来说是一个很有趣的单片机方案.它以拍手的声音打开和关闭电器.在本文中,英锐恩单片机开发工程师们将使用PIC单片机制作一个简单的拍手开关,当它连续检测到两个拍手声音时,该开关便会运行. ...

  6. 基于单片机的c语言倒计时程序,30秒倒计时c语言51单片机实现.doc

    30秒倒计时c语言51单片机实现 原理图: 程序: #include #define uchar unsigned char #define uint unsigned int sbit dula=P ...

  7. c语言delay_单片机模拟流星雨,电路图和程序,一起来感受下,其实C语言不难...

    流星划过夜空,在你默默许愿的同时,是不是也在想,能否通过学习单片机来模拟实现这种效果呢?一起行动,寻找流星的感觉. 流星雨电路图 元器件清单  以下是程序设计 #include//头文件 void ...

  8. c语言数码管流动显示一个数,51单片机数码管动态显示 - 数码管动态扫描显示01234567程序(三种方案)...

    数码管动态扫描显示01234567程序二--51单片机动态显示共阳数码管01234567 原理图 c语言程序 程序如下: #include #define uint unsigned int #def ...

  9. 单片机六位抢答器c语言程序,八路电子抢答器(基于51单片机的8路抢答器设计C语言程序)...

    哥,你还有AT89C51单片机8路抢答器的资料吗 哥,你还有AT89C51单片机8路抢答器的资料吗 AT89C51单片机8路抢答器的资料 源程序如下 #include #define uchar un ...

最新文章

  1. 跟随美国博导 12 年,我学到最深刻的不是科研,而是……
  2. 【计算机网络】物理层和数据链路层概述吐血总结(这知识它不进脑子啊~!)
  3. 双样本T检验——机器学习特征工程相关性分析实战
  4. Cocos Creator JS 时间戳日期转换
  5. shell脚本常用参数与格式
  6. HttpServletResponse和HttpServletRequest详解——Web网络学习笔记
  7. 程序的重定位问题(程序装入)
  8. 【MATLAB】求点到多边形的最短距离
  9. 一年之计:如何构建知识体系?
  10. 如何使用大数据算法改善有效链接
  11. 城市智慧停车管理模式方案科普
  12. AO采集用友oracle,用SQL快速生成用友GRP-U8的AO财务账套的方法2017
  13. 神经元人体分布大图,人体的神经元图片
  14. Gradle编译时,assets文件未打包进apk
  15. 【2018亚太数据中心峰会】林峰:中国游戏打破传统模式立足国际舞台
  16. 服务器创建文件失败是什么意思,网站提示无法创建文件错误解决详情(图文)...
  17. 利用flex布局实现六个骰子
  18. 普元云计算-AI杂谈:从洗衣机到老鼠屁股
  19. Unhandled promise rejection
  20. 学习记录3——PMSM数学建模——simulink内数学模型搭建以及仿真

热门文章

  1. 他总在逆风翻盘,绝地反击!最不爱钱却成了最有钱的人...
  2. Windows 7/8.1 仍可免费升级至 Windows 10
  3. python 同时打乱多个列表
  4. 会计转行算法之路(一)会计转程序员
  5. python打印类的属性
  6. python opencv轮廓总结
  7. 卷积神经网络「失陷」,CoordConv来填坑
  8. RNN循环神经网络的直观理解:基于TensorFlow的简单RNN例子
  9. avformat_find_stream_info 时间太长
  10. CUBLAS_STATUS_ALLOC_FAILED CUDA_ERROR_OUT_OF_MEMORY