📄 测温和显示可用.c
字号:
#include <mega16.h>
#include "delay.h"
// SPI functions
#include <spi.h>
#define data_out PORTA.0
#define data_en DDRA.0
#define data_in PINA.0
// 1 Wire Bus functions
#asm
.equ __w1_port=0x1B ;PORTA
.equ __w1_bit=0
#endasm
#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds1820.h>
#define MAX_DS1820 2
unsigned char ds1820_devices;
unsigned char code[8];
//eeprom unsigned char DS_mount; //18B20个数
//eeprom unsigned char ds1820_rom_codes[MAX_DS1820][8]; //18b20的序列号
unsigned char DS_mount; //18B20个数
unsigned char ds1820_rom_codes[MAX_DS1820][8]; //18b20的序列号
// Declare your global variables here
unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
//flash unsigned char seriouscode[64][8];
float w=0.0;
//*******************************************
// 74HC595驱动程序
unsigned char SPI_W_R(unsigned char data)
{
SPCR=0x50; //SPI为查询方式,系统时钟四分频
SPDR=data; //写入数据
while((SPSR>>7)==0x00); //等待数据发送完毕
return SPDR; //返回收到的数据
}
//*******************************************************************
// 温度测量
void init18b20()
{data_en=1;//置位输出状态
data_out=1;
data_out=0;
delay_us(490);
data_out=1;
data_en=0;
delay_us(20);
while(data_in);
data_en=1;
data_out=1;
delay_us(140);
}
void write18b20(unsigned char n)
{ unsigned char m;
for(m=0;m<8;m++)
{
data_out=0;
data_out=n&1;
delay_us(40); //15~60us
data_out=1;
n=n>>1;
}
data_out=1;
}
unsigned char read18b20()
{unsigned char temp,k,n;
temp=0;
data_en=1;
for(n=0;n<8;n++)
{
data_out=0;
data_out=1;
data_en=0;
k=(data_in); //读数据,从低位开始
if(k)
temp|=(1<<n);
else
temp&=~(1<<n);
delay_us(100); //60~120us
data_en=1;
}
return (temp);
}
unsigned int gettemperature(char codes[8])
{unsigned char k,temh,teml;//wm0,wm1,wm2,wm3;
init18b20(); //复位18b20
write18b20(0xcc); // 发出转换命令
write18b20(0x44); // 发出转换命令
delay_ms(800);
init18b20();
write18b20(0x55);
for(k=0;k<8;k++) {write18b20(codes[k]);delay_us(6);}
// write18b20(0xcc); // 发出转换命令
// write18b20(0x44); // 发出转换命令
// init18b20();
// write18b20(0x55);
// for(k=0;k<8;k++) write18b20(codes[k]);
// delay_ms(800);
write18b20(0xbe);
teml=read18b20(); //读数据
temh=read18b20();
return (unsigned int)temh*256+(unsigned int)teml;
//wm0=teml>>4; //只要高8位的低四位和低8位的高四位,温度范围0~99啦!
//wm1=temh<<4;
//wm2=wm1+wm0; //16进制转10进制
//wm3=wm2/100;
//wmh=(wm2%100)/10; //出口参数了!wmh是显示的高位,wml使显示的低位
//wml=(wm2%100)%10;
}
void main(void)
{bit flag; //初始化18B20时,开关开着,且没有读到一个18b20时为0
int value;
char i,j;
DDRB=0xff;
PORTB=0xff;
DDRC=0x00;
PORTC=0xff;
for(i=0;i<8;i++)
{
SPI_W_R(0xff);
PORTB.0=0;
delay_us(10);
PORTB.0=1;
}
while(PINC.1==0)
{
if(PINC.0==1&&flag==0)
{
init18b20();
write18b20(0x33);
for(i=0;i<8;i++){code[i]=read18b20();}
for(i=0;i<8;i++){ds1820_rom_codes[DS_mount][i]=code[i];}
DS_mount++;
flag=1;
}
if(PINC.0==0)flag=0;
}
// SPI_W_R(disp[DS_mount]);
// init18b20(); //复位18b20
// write18b20(0xcc); // 发出转换命令
// write18b20(0x44); // 发出转换命令
// delay_ms(800);
while (1)
{
/*
value=gettemperature();
w=(float)value;
w/=16;
SPI_W_R(disp[(int)(w*10)%10]);
SPI_W_R(disp[(int)w%10]);
SPI_W_R(disp[(int)w/10]);
SPI_W_R(disp[ds1820_devices]);
*/
for(i=0;i<DS_mount;i++)
{
value=gettemperature(ds1820_rom_codes[i]);
w=(float)value;
w/=16;
SPI_W_R(disp[(int)(w*10)%10]);
SPI_W_R(disp[(int)w%10]);
SPI_W_R(disp[(int)(w/10)]);
SPI_W_R(0x0ff);
SPI_W_R(disp[i]);
SPI_W_R(disp[0]);
PORTB.0=0;
delay_us(10);
PORTB.0=1;
delay_ms(1000);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -