📄 can18b20.c
字号:
PORTC &= ~DQ; // pull DQ low to start timeslot
delay_us(10);
PORTC |= DQ;
delay_us(100);
}
else
{
PORTC &= ~DQ; // pull DQ low to start timeslot
delay_us(100);
PORTC |= DQ;
delay_us(10);
}
value >>= 1;
}
}
/*===================================================================
// 函数功能: 读取温度
// 形参: *temperature 温度存储空间
// 返回: unsigned char true为有效
// 编写: 2004/8/25
===================================================================*/
/*unsigned char Read_Temperature(unsigned int *temperature)
{
unsigned char i;
union{
unsigned char c[2];
unsigned int x;
}temp;
unsigned char temporary[9];
while(!ds1820_ack());
write_byte(0xCC); // Skip ROM
write_byte(0x44); // Start Conversion
//for(i = 0; i < 16; i++)
//delay_us(50000);
delay(20);
while(!ds1820_ack());
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
for(i = 0; i < 9; i++)
temporary[i] = read_byte();
temp.c[0] = temporary[0];
temp.c[1] = temporary[1];
if(crccheck(temporary,9))
return 0;
else
{
*temperature = temp.x;
return 1;
}
}
*/
/*===================================================================
// 函数功能: 读取Rom Code
// 形参: *temp DS18B20的Rom Code存储空间
// 返回: unsigned char true为有效
// 编写: 2004/8/25
===================================================================*/
/*unsigned char Read_RomCode(unsigned char *temp)
{
ds1820_ack();
write_byte(0x33);
temp[0] = read_byte();
temp[1] = read_byte();
temp[2] = read_byte();
temp[3] = read_byte();
temp[4] = read_byte();
temp[5] = read_byte();
temp[6] = read_byte();
temp[7] = read_byte();
if(crccheck(temp,8))
return 0;
else
return 1;
}
*/
/*===================================================================
// 函数功能: 匹配DS18B20
// 形参: *p DS18B20的Rom Code
// 返回: void
// 编写: 2004/8/25
===================================================================*/
/*void ds1820_match(unsigned char *p)
{
unsigned char i;
ds1820_ack();
write_byte(0x55);
for(i=0;i<8;i++)
write_byte(p[i]);
}
*/
/*nms delay*/
void wait(unsigned int n)
{unsigned int i;
for(i=0;i<n;i++)
delay_1ms();
}
/*1ms delay*/
void delay_1ms(void)
{unsigned int i;
for(i=0;i<1035;i++);
}
void delay(unsigned int n)
{ unsigned int i;
for(i=0;i<n;i++)
asm("nop");
}
/*595数据传输*/
void HC595_SENDDAT(unsigned char dat)
{unsigned char i;
C_CS; //cs 拉低
asm("nop");
for(i=0;i<8;i++)
{C_CLK ; //时钟拉低
asm("nop");
if((dat&0x80)!=0)
S_DATA;
else
C_DATA;
dat<<=1;
asm("nop");
S_CLK; // 时钟拉高
}
S_CS; //cs 拉高
}
//定时器1中断,1ms中断一次
#pragma interrupt_handler time0_ovf_isr:10
void time0_ovf_isr(void)
{
TCNT0=0xF8; //重新装置
count++;
if(count>=100) //100ms
count=0;
if(flag==0)
{ flag=1;
//个位显示
PORTC&=(~0x18);
HC595_SENDDAT(table[ge]|0x80); //加小数点
PORTC|=0x10;
}
else
{ flag=0;
//十位显示
PORTC&=(~0x18);
HC595_SENDDAT(table[shi]);
PORTC|=0x08;
}
}
/*************************** 主机先发送,等待接收***************************/
/* 说明:外部中断0不使能,如果允许,显示保持不住。*/
void main( void )
{ unsigned char i,j;
unsigned char teml,temh;
unsigned char a=0;
unsigned int m;
unsigned char temporary[9];
//M8 端口初始化
PORTB=0x07; //MCP2515 disable(CS,PB2),PB1,PB0上、下行灯灭
DDRB|=0x07;
DDRD=0xC0; //1100 0000 PD7、PD6输出保持,PD5、PD4按键输入
PORTC=0x02; //CS disable
DDRC|=0x1F; //PC3为595的位选COM2(十位),PC4为595的位选COM1(个位)+595(PC0、PC1、PC2)
/*use int0*/
// GICR|=0x40; //int0 enable
//MCUCR|=0x02; //下降沿触发中断0
//uart_init(); //串口初始化
//初始化SPI
init_SPI();
//reset mcp2515
reset_MCP();
//初始化 CAN
init_can();
minus_flag=0; //初始化负温度标志
CLI(); //关中断
//矫正第一次数据,不矫正第一次显示85
while(!ds1820_ack());
write_byte(0xCC); // Skip ROM
write_byte(0x44); // Start Conversion
wait(750);
while(!ds1820_ack());
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
teml = read_byte();
temh = read_byte();
m=temh*256+teml;
if ((m&0xf800)!=0)
{minus_flag=1;
m=(~m)+1; //取反
a=(unsigned char)((m*5)/80);}
else
a=(unsigned char)((m*5)/80);
shi=a/10;
ge=a%10;
if(minus_flag==1)
wendu=a|0x80; //暂时做 char处理
else
wendu=a;
TCNT0=0xF8;//1ms
TCCR0=5; //1024
TIMSK=(1<<TOIE0);
count=0;
dot1=0;
//开中断
SEI();
while(1)
{ if(count==0)
{ fill_msg_box_0(); //填充CAN数据
send_box_0(); //发送CAN信息
minus_flag=0; //负温度标志清0
// 读取温度值
CLI();
while(!ds1820_ack());
SEI();
write_byte(0xCC); // Skip ROM
write_byte(0x44); // Start Conversion
delay(20);
CLI();
while(!ds1820_ack());
SEI();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
for(j = 0; j < 9; j++)
temporary[j] = read_byte();
if(!crccheck(temporary,9)) //CRC校验正确
{
teml=temporary[0];
temh=temporary[1];
// 处理小数第一位
j=teml&0x0F;
//温度十位个位处理
teml>>=4;
temh<<=4;
i=teml|temh;
if(i>=0x80) //是负温度
{minus_flag=1;
i=~i; //取反
j=(~j)&0x0F;
j=j+1;} //加1
switch(j) //小数第一位
{case 0:
case 1:{dot1=0;break;}
case 2:
case 3:{dot1=1;break;}
case 4:{dot1=2;break;}
case 5:
case 6:{dot1=3;break;}
case 7:{dot1=4;break;}
case 8:
case 9:{dot1=5;break;}
case 10:
case 11:{dot1=6;break;}
case 12:{dot1=7;break;}
case 13:
case 14:{dot1=8;break;}
case 15:{dot1=9;break;}
case 16:{dot1=0;i=i+1;break;}
default:break;
}
shi=i/10; //十位
ge=i%10; //个位
if(minus_flag==1)//负温度
wendu=i|0x80; //暂时做 char处理
else
wendu=i;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -