18b20精确延时.docxVIP

  • 20
  • 0
  • 约7.32千字
  • 约 7页
  • 2018-10-16 发布于湖北
  • 举报
18b20精确延时

在这个实验中最重要的是时序,因为要精确到us,所以找到合适的延时函数很重要。之前网上有一些关于51的和PIC的精确延时函数,我试了下,还要去仿真,很不方便,后面搞了很久发现了一个很好的延时函数,我已经把它用红色标注出来了,抓好了延时,这程序基本没什么问题了。 //************DS18B20温度测量数码管显示实验// //CKP=0; 空闲为低电平 //CKP=1; 空闲为高电平 //STAT_CKE=0; SDO后沿采样 //STAT_CKE=1; SDO前沿采样 //STAT_SMP=0; //在数据输出时间的中间采样输入数据 //STAT_SMP=1; //RC3/SCK 接74595 移位时钟11脚 //RC5/SDO 接74595 数据输入14脚 //RC4/SDI 接74595 锁存时钟12脚 //TMR0用作定时器时,定时器时钟=系统时钟/4 //写TMR0时,会产生2个周期的延时,如果不使用前置分频器,可通过设置初值进行补偿 //例如 需要定时200个时钟周期时,TMR0=256-200+2=58 //使用TMR0实现数码管动态扫描,每1ms点亮一位数码管 //每隔1s钟,启动DS18B20测量温度,测量数值送数码管显示 //DS18B20数据口与PIC16F877A RB5引脚相连 //*************************************************************************** #includepic.h __CONFIG(HSWDTDISLVPDISPWRTEN);//HS振荡,禁止看门狗,低压编程关闭,启动延时定时器 #define uint unsigned int #define uchar unsigned #define Fclk 4000000UL /*采用4M晶振 定时器时钟=系统时钟/4=1MHz*/ #define BAUD 9600UL /*波特率定义为9600*/ #define _XTAL_FREQ 4000000 //从六开始可以精确延时,函数为__delay_us(char x)超过六要多延时2us #define DQ_DIR TRISB5 //控制DS18B20的DQ端 #define DQ RB5 //控制DS18B20的DQ端 uchar disbuf[4]; //数码管要显示的四位数据 uint t; //采集到的温度 uchar time_ok=0; //采集温度标志 //********************函数定义********************* uchar spi_write_read(uchar dd);//spi总线发送接收数据 void led_display(void);//数码管显示 void decimal_bcd_16bit(uint cnt); void ds18b20_startconvert(void); uint ds18b20_getconvert(void); void init_ds18b20(void); //初始化18b20函数 uchar read_da18b20(void); //读一个字节 void write_da18b20(uchar dat); //写一个字节 void init_spi(void);//初始化spi函数 //ds18b20 ROM操作指令码 #define ds18b20_skip_rom 0xCC //跳过ROM指令码 #define ds18b20_search_rom 0xF0 //搜索ROM指令码 #define ds18b20_read_rom 0x33 //读ROM指令码 #define ds18b20_match_rom 0x55 //匹配ROM指令码 #define ds18b20_alarm_rom 0xEC //报警搜索ROM指令码 //ds18b20 RAM操作指令码 #define ds18b20_convert_ram 0x44 //启动温度转换指令码 #define ds18b20_read_ram 0xBE //读RAM指令码 #define ds18b20_write_ram

文档评论(0)

1亿VIP精品文档

相关文档