pic单片机延时程序C语言,PIC单片机C语言延时程序和循环子程序实现方法
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语言延时程序和循环子程序实现方法相关推荐
- c语言51单片机延时程序,51单片机c语言延时.doc
1,_nop_() 适用于us级的少量延时 标准的C语言中没有空语句.但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果.这在汇编语言中很容易实现,写几个nop就行了. 在keil C51 ...
- 单片机ad显示程序c语言,pic单片机ad转换c程序分享
A/D转换器是用来通过一定的电路将模拟量转变为数字量.模拟量可以是电压.电流等电信号,也可以是压力.温度.湿度.位移.声音等非电信号.但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各 ...
- c语言延时系统,基于VB的单片机C语言延时程序各参数计算系统
仪器仪表用户 doi:10.3969/j.issn.1671-1041.2011.04.013 □科研设计成果□ 基于VB的单片机C语言延时程序各参数计算系统 刘 1 锋,林 奕 2 (1.武汉理工大 ...
- 延时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 ...
- pic12f1823单片机入门_单片机入门案例:使用PIC单片机制作声控拍手开关
拍手开关对于初学者来说是一个很有趣的单片机方案.它以拍手的声音打开和关闭电器.在本文中,英锐恩单片机开发工程师们将使用PIC单片机制作一个简单的拍手开关,当它连续检测到两个拍手声音时,该开关便会运行. ...
- 基于单片机的c语言倒计时程序,30秒倒计时c语言51单片机实现.doc
30秒倒计时c语言51单片机实现 原理图: 程序: #include #define uchar unsigned char #define uint unsigned int sbit dula=P ...
- c语言delay_单片机模拟流星雨,电路图和程序,一起来感受下,其实C语言不难...
流星划过夜空,在你默默许愿的同时,是不是也在想,能否通过学习单片机来模拟实现这种效果呢?一起行动,寻找流星的感觉. 流星雨电路图 元器件清单  以下是程序设计 #include//头文件 void ...
- c语言数码管流动显示一个数,51单片机数码管动态显示 - 数码管动态扫描显示01234567程序(三种方案)...
数码管动态扫描显示01234567程序二--51单片机动态显示共阳数码管01234567 原理图 c语言程序 程序如下: #include #define uint unsigned int #def ...
- 单片机六位抢答器c语言程序,八路电子抢答器(基于51单片机的8路抢答器设计C语言程序)...
哥,你还有AT89C51单片机8路抢答器的资料吗 哥,你还有AT89C51单片机8路抢答器的资料吗 AT89C51单片机8路抢答器的资料 源程序如下 #include #define uchar un ...
最新文章
- 跟随美国博导 12 年,我学到最深刻的不是科研,而是……
- 【计算机网络】物理层和数据链路层概述吐血总结(这知识它不进脑子啊~!)
- 双样本T检验——机器学习特征工程相关性分析实战
- Cocos Creator JS 时间戳日期转换
- shell脚本常用参数与格式
- HttpServletResponse和HttpServletRequest详解——Web网络学习笔记
- 程序的重定位问题(程序装入)
- 【MATLAB】求点到多边形的最短距离
- 一年之计:如何构建知识体系?
- 如何使用大数据算法改善有效链接
- 城市智慧停车管理模式方案科普
- AO采集用友oracle,用SQL快速生成用友GRP-U8的AO财务账套的方法2017
- 神经元人体分布大图,人体的神经元图片
- Gradle编译时,assets文件未打包进apk
- 【2018亚太数据中心峰会】林峰:中国游戏打破传统模式立足国际舞台
- 服务器创建文件失败是什么意思,网站提示无法创建文件错误解决详情(图文)...
- 利用flex布局实现六个骰子
- 普元云计算-AI杂谈:从洗衣机到老鼠屁股
- Unhandled promise rejection
- 学习记录3——PMSM数学建模——simulink内数学模型搭建以及仿真
热门文章
- 他总在逆风翻盘,绝地反击!最不爱钱却成了最有钱的人...
- Windows 7/8.1 仍可免费升级至 Windows 10
- python 同时打乱多个列表
- 会计转行算法之路(一)会计转程序员
- python打印类的属性
- python opencv轮廓总结
- 卷积神经网络「失陷」,CoordConv来填坑
- RNN循环神经网络的直观理解:基于TensorFlow的简单RNN例子
- avformat_find_stream_info 时间太长
- CUBLAS_STATUS_ALLOC_FAILED CUDA_ERROR_OUT_OF_MEMORY