📄 18b20.c
字号:
//ICC-AVR application builder : 2007-7-15 17:38:07
// Target : M16
// Crystal: 1.0000Mhz
#include <iom16v.h>
#include <macros.h>
//#define ds18b20_dq PC5
#define set_ds18b20_dq_ddr() DDRC|=0x04
#define set_ds18b20_dq() PORTC|=0x04
#define clr_ds18b20_dq() PORTC&=~0x04
#define clr_ds18b20_dq_ddr() DDRC&=~0x04
#define in_ds18b20_dq() PINC&0x04
#define ds18b20_read_rom 0x33
#define ds18b20_match_rom 0x55
#define ds18b20_skip_rom 0xcc
#define ds18b20_search_rom 0xf0
#define ds18b20_alarm_search_rom 0xec
#define ds18b20_write_ram 0x4e
#define ds18b20_read_ram 0xbe
#define ds18b20_copy_ram 0x48
#define ds18b20_convert_tem 0x44
#define ds18b20_eecall_eeprom 0xb8
#define ds18b20_read_power_supply 0xb4
#define uchar unsigned char
#define uint unsigned int
#define clk0 PORTB|=0x02//时钟宏定义port2接clk
#define clk1 PORTB&=~0x02
#define data1 PORTB|=0x01//数字宏定义port1接data
#define data0 PORTB&=~0x01
uchar table[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//数字编码
uchar table1[10]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};//带点编码
uchar pata[4]={0,0,0,0};//显存
uchar pata1[4]={0,0,0,0};
float t=0.0;//wenduzhi
uint temperature_low;
uint temperature_high;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void delay_ms(uint n)//10ms延时函数
{uint i,j;
for(i=0;i<n;i++)
{
for(j=0;j<1000;j++){;}
}
}
void delay_us(uint n)//us延时函数
{
uint i,j;
for(i=0;i<n;i++)
{
;
//for(j=0;j<1000;j++){;}
}
}
void neirong1(int n)//此法优于上面的列表法
{
uint ge,shi,bai,qian;
ge=n%10;//取n的各位个位
shi=n/10%10;//十位
bai=n/100%10;//百位
qian=n/1000;//千位
pata[0]=table[ge];//数字查表为该字符编码
pata[1]=table[shi];
pata[2]=table[bai];
pata[3]=table[qian];
}
void display(uchar p[]) //数字显示程序...不含显示小数点且不累集
{
uint i,j;
for(j=0;j<4;j++)
{for(i=0;i<8;i++)//八位全部显示完毕
{
if(p[j]&0x01)
data1;
else
data0;
clk0;//产生时钟脉冲
clk1;
p[j]=p[j]>>1;//右移以便取下一位
}
}
}
void convert_dianya(float t2)
{
float temp=t2;//未实际电压值
float xiaoshu;//小数
int zhenshu,t1;//t存储小数部分乘以十;整数;
// temp=adc*5.03/1024.0;//转化为电压
zhenshu=(int)temp;//取整数部分
xiaoshu=temp-zhenshu;
t1=xiaoshu*100;//江小树转换为整数
pata[3]=table[zhenshu/10];
pata[2]=table1[zhenshu%10];
pata[1]=table[t1/10];
pata[0]=table[t1%10];
}
void reset_ds18b20(void)
{
set_ds18b20_dq_ddr();
clr_ds18b20_dq();
delay_us(3);//100us
delay_us(3);//100us
delay_us(3);//100us
delay_us(3);//100us
delay_us(3);//100us
set_ds18b20_dq();
delay_us(2);//20us
}
void ack_ds18b20(void)
{
while(in_ds18b20_dq());
while(!(in_ds18b20_dq()));
delay_us(1);//20us
}
uchar read_ds18b20(void)
{
uchar data=0;
uchar i=0;
for(i=0;i<8;i++)
{
data>>=1;
set_ds18b20_dq_ddr();//shuru
clr_ds18b20_dq();
// delay_us(1);//1us
i=i;
set_ds18b20_dq();
clr_ds18b20_dq_ddr();// shuru
delay_us(2);//2us
i=i;
i=i;
if(in_ds18b20_dq()) data|=0x80;
delay_us(2);//60us
}
return(data);
}
void write_ds18b20(uchar data)
{
uchar i=0;
for(i=0;i<8;i++)
{
if(data&0x01)
{
set_ds18b20_dq_ddr();
clr_ds18b20_dq();
delay_us(1);//8us
set_ds18b20_dq();
delay_us(2);//55us
PORTC=PORTC;
PORTC=PORTC;
}
else
{
set_ds18b20_dq_ddr();
clr_ds18b20_dq();
delay_us(1);//55us
PORTC=PORTC;
set_ds18b20_dq();
//delay_us(14);//8us
PORTC=PORTC;
}
data>>=1;
}
}
void convert_ds18b20(void)
{
reset_ds18b20();
// ack_ds18b20();
delay_ms(1);
write_ds18b20(ds18b20_skip_rom);
write_ds18b20(ds18b20_convert_tem);
}
void read_temperature(void)
{
reset_ds18b20();
// ack_ds18b20();
delay_ms(1);
write_ds18b20(ds18b20_skip_rom); //rom中为序列号
write_ds18b20(ds18b20_read_ram);
temperature_low=read_ds18b20();
temperature_high=read_ds18b20();
}
void main(void)
{
uint i;
int temp;
port_init();
DDRB=0xff;
PORTB=0x00;
while(1)
{
convert_ds18b20();
delay_us(500);
read_temperature();
temp=temperature_high<<8+temperature_low;
t=temp*0.0625;//转换为实际温度值
// t=13.23;
convert_dianya(t);
display(pata);
delay_ms(200);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -