C语言单片机开发精确延时.doc

上传人:re****.1 文档编号:557748136 上传时间:2023-09-22 格式:DOC 页数:6 大小:40.50KB
返回 下载 相关 举报
C语言单片机开发精确延时.doc_第1页
第1页 / 共6页
C语言单片机开发精确延时.doc_第2页
第2页 / 共6页
C语言单片机开发精确延时.doc_第3页
第3页 / 共6页
C语言单片机开发精确延时.doc_第4页
第4页 / 共6页
C语言单片机开发精确延时.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《C语言单片机开发精确延时.doc》由会员分享,可在线阅读,更多相关《C语言单片机开发精确延时.doc(6页珍藏版)》请在金锄头文库上搜索。

1、这是C程序:#include#include#include#define uchar unsigned char#define tempint DBYTE0X30#define tempdf DBYTE0X31uchar code tab=0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90;sbit dat=P14;void set_ds18b20(); /初始化DS18B20子程序void get_temperature(); /获得温度子程序void read_ds18b20(); /读DS18B20子程序void write_ds18b2

2、0(uchar command);/向DS18B20写1字节子程序void delayms(uchar count); /延时count毫秒子程序void disp_temp(); /显示温度子程序void main() EA=0; /禁止中断 SP=0x60; /设置堆栈指针 while(1) get_temperature(); /获得温度 disp_temp(); /显示温度 void set_ds18b20() while(1) uchar delay,flag; flag=0; dat=0; /数据线置低电平 delay=250; while(-delay); /低电平保持500us

3、 dat=1; /数据线置高电平 delay=30; while(-delay); /低电平保持60us while(dat=0) /判断DS18B20是否发出低电平信号 delay=120; /DS18B20响应,延时240us while(-delay); if(dat) /DS18B20发出高电平初始化成功,返回 flag=1; /DS18B20初始化成功标志 break; if(flag) /初始化成功,再延时480us delay=240; while(-delay); break; void get_temperature() /温度转换、获得温度子程序 set_ds18b20()

4、; /初始化DS18B20 write_ds18b20(0xcc); /发跳过ROM匹配命令 write_ds18b20(0x44); /发温度转换命令 disp_temp(); /显示温度,等待转换结束,大于600ms set_ds18b20(); write_ds18b20(0xcc); /发跳过ROM匹配命令 write_ds18b20(0xbe); /发出读温度命令 read_ds18b20(); /将读出的温度数据保存到tempint和tempdf处void read_ds18b20() uchar delay,i,j,temp,temph,templ; j=2; /读2位字节数据

5、do for(i=8;i0;i-) /一个字节分8位读取 temp=1; /读取1位右移1位 dat=0; /数据线置低电平 _nop_(); _nop_(); dat=1; /数据线置高电平 delay=4; while(-delay); /延时4us if(dat) /读取1位数据 temp|=0x80; delay=10; /读取以为数据后延时20us while(-delay); if(j=2) /读取的第一字节存templ templ=temp; else temph=temp; /读取的第二字节存temph while(-j); tempdf=templ&0x0f; /将读取的数据

6、转换成温度值,整数部分存tempint,小数部分存tempdf templ=4; temph0;i-) /将一字节数据一位一位写入 dat=0; /数据线置低电平 delay=8; /延时16us while(-delay); dat=command&0x01; /将数据放置在数据线上 delay=20; /延时40us while(-delay); command=command1; /准备发送下一位数据 dat=1; /发送完一位数据,数据线置高电平 _nop_(); /延时1us void disp_temp() uchar tempinth,tempintl,tempdfh,tempd

7、fl,cnt; tempinth=tabtempint/10; /整数高半字节 tempintl=tabtempint%10&0x7f;/整数低半字节 tempdfh=tabtempdf/10; /小数高半字节 tempdfl=tabtempdf%10; /小数低半字节 cnt=200; /循环显示200次 while(-cnt) XBYTE0X3FFF=0x01; XBYTE0X5FFF=tempinth; delayms(1); XBYTE0X3FFF=0x02; XBYTE0X5FFF=tempintl; delayms(1); XBYTE0X3FFF=0x04; XBYTE0X5FFF

8、=tempdfh; delayms(1); XBYTE0X3FFF=0x08; XBYTE0X5FFF=tempdfl; delayms(1); XBYTE0X5FFF=0xff; void delayms(uchar count) uchar i,j; do for(i=5;i0;i-) for(j=98;j0;j-); while(-count);在用C语言写程序时,初学者遇到的一个难题时精确延时程序的设计。我刚开始用C语言写程序时同样遇到了这个问题,后来参考了一些文章和实际设计后才知道了精确延时程序的设计。 我现在就用两种方法来实现,一种是while()语句,另一种是for()语句,这两

9、种语句均可产生汇编语句中的DJNZ语句,以12MHZ晶振为例(说明:在编写C程序时,变量尽量使用unsigned char,如满足不了才使用unsigned int): 1.delay99;while(-delay);产生的汇编代码为:000FH MOV 08H,#63H0012H DJNZ 08H,0012H这样产生的延时时间为:(99+1)2us。最小延时时间为2us,若加上对delay赋值语句,则最小为4us。 2.for(i=delay;i0;i-);产生的汇编代码同while()语句。 下面来举例几个延时函数: 一. 500ms延时子程序void delay500ms(void) unsigned char i,j,k;for(i=15;i0;i-)for(j=202;j0;j-)for(k=81;k0;k-);产生的汇编代码:C:0x0800 7F0F MOV R7,#0x0FC:0x0802 7ECA MOV R6,#0xCAC:0x0804 7D51 MOV R5,#0x51C:0x0806 DDFE DJNZ R5,C:0806C:0x0808 DEFA DJNZ R6,C:0804C:0x080A DFF6 DJNZ R7,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号