原创代码:转载请注明转载URL和作者。
本人几年前参加蓝桥杯单片机本科组拿了一个小奖,但是由于对单片机得爱好兴趣不是很大,所以毅然决然决定学习JAVA,所以以前写的一些单片机例子程序也分享出来给大家参考:
头文件代码ONEWIRE.H:(代码很简单,如果需要解释得同学们请留言,我还有很多其他模块的例子代码和学习资料可以给大家参考)
#ifndef _ONEWIRE_H
#define _ONEWIRE_H
#include "reg52.h"
#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe
//IC引脚定义
sbit DQ = P1^4;
//函数声明
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);
#endif
驱动文件代码onewire.c:
#include "onewire.h"
//单总线延时函数
void Delay_OneWire(unsigned int t)
{
unsigned char i;
while(t--)
{
for(i=0;i<12;i++);
}
}
//DS18B20芯片初始化
bit Init_DS18B20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0; //DQ置为0
DQ = dat&0x01; //检测要写的位数是0还是1
Delay_OneWire(5); //大于15us即可开始采样,0就是0,1就是1,传送过去,写1的话电阻自动拉高
DQ = 1; //DQ置高为初始状态
dat >>= 1;
}
Delay_OneWire(5);
}
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1; //读0几乎可以忽略不计,读1大于1us就行,电平拉上去之后就等着控制器采样,即DQ反馈回来的值
DQ = 1;
if(DQ) //DQ反馈回来的值分析
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
主函数代码:
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6}; //sub=11 - sub=12 c
uchar disbuff[]={10,10,10,10,10,10,10,10};
uchar discom,temp;
unsigned char temperature_process();
void init_timer0();
void temperature_display();
void main()
{
init_timer0();
while(1)
{
temp=temperature_process();
}
}
void init_timer0()
{
TMOD|=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0()interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
temperature_display();
}
unsigned char temperature_process()
{
uchar low,high,temperature;
init_ds18b20();
Write_DS18B20(OW_SKIP_ROM);
Write_DS18B20(DS18B20_CONVERT);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(OW_SKIP_ROM);
Write_DS18B20(DS18B20_READ);
low=Read_DS18B20();
high=Read_DS18B20();
temperature=(high<<4);
temperature|=(low>>4);
return temperature;
}
void temperature_display()
{
disbuff[6]=temp%10;
disbuff[7]=12;
disbuff[5]=temp/10;
disbuff[4]=10;
disbuff[3]=10;
disbuff[0]=11;
disbuff[1]=4;
disbuff[2]=11;
P2=(P2&0x1f)|0xe0;
P0=0xff;
P2&=0x1f;
P2=(P2&0x1f)|0xc0;
P0=1<
P2=(P2&0x1f)|0xe0;
P0=table[disbuff[discom]];
P2&=0x1f;
if(++discom==8)discom=0;
}
这是CT107D实训台蓝桥杯的DS18B20数字温度传感器代码,如果有需要的小伙伴需要其他模块的代码可以私聊我,我会尽快写出其他几个模块的博客的。