
#include<reg52h> #include<mathh>
#include<INTRINSH>
#define uchar unsigned char
#define uint unsigned int;
//
/ 定义端口 /
//
sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;
sbit DQ=P1^7;//ds18b20 端口
sfr dataled=0x80;//显示数据端口
//
/ 全局变量 /
//
uint temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//7段数码管段码表共阳
uchar str[6];
//
/ 函数声明 /
//
void delay1(uchar MS);
unsigned int ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
//
/ 主函数 /
//
main()
{
unsigned char TempH,TempL;
TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00;
count=0;
while(1)
{
str[5]=0x39; //显示C符号
str[1]=tab[TempH/100]; //十位温度
str[2]=tab[(TempH%100)/10]; //十位温度
str[3]=tab[(TempH%100)%10]|0x80; //个位温度,带小数点
str[4]=tab[TempL];
if(flag_get==1) //定时读取当前温度
{
temp=ReadTemperature();
if(temp&0x8000)
{
str[0]=0x40;//负号标志
temp=~temp; // 取反加1
temp +=1;
}
else
str[0]=0;
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL6/10;//小数近似处理
flag_get=0;
}
}
}
//
/ 定时器中断 /
//
void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
{
TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
if (num==50)
{num=0;
flag_get=1;//标志位有效
second++;
if(second>=60)
{second=0;
minute++;
}
}
count++;
if(count==1)
{P2=0;
dataled=str[0];}//数码管扫描
if(count==2)
{P2=1;
dataled=str[1];}
if(count==3)
{ P2=2;
dataled=str[2];
}
if(count==4)
{ P2=3;
dataled=str[3];
}
if(count==5)
{ P2=4;
dataled=str[4];
}
if(count==6)
{ P2=5;
dataled=str[5];
count=0;}
}
//
/ 延时函数 /
//
void delay(unsigned int i)//延时函数
{
while(i--);
}
//
/ 初始化 /
//
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(5);
}
//
/ 读一个字节 /
//
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
//
/ 写一个字节 /
//
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
//
/ 读取温度 /
//
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的 *** 作
WriteOneChar(0x44); // 启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的 *** 作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
//LZ,这是测温并且用数码管显示程序,报警可以自己另行添加!主要程序就是这些!
()
MAX6675 是Maxim 公司推出的具有冷端补偿的单片K 型热电偶放大器与数字转换器。文中介绍器件的特点、工作原理及接口时序,并给出与单片机的接口电路及温度读取、转换程序。
热电偶作为一种主要的测温元件,具有结构简单、制造容易、使用方便、测温范围宽、测温精度高等特点。但是将热电偶应用在基于单片机的嵌入式系统领域时,却存在着以下几方面的问题。① 非线性: 热电偶输出热电势与温度之间的关系为非线性关系,因此在应用时必须进行线性化处理。②冷端补偿:热电偶输出的热电势为冷端保持为0℃时与测量端的电势差值,而在实际应用中冷端的温度是随着环境温度而变化的,故需进行冷端补偿。
③ 数字化输出 : 与嵌入式系统接口必然要采用数字化输出及数字化接口,而作为模拟小信号测温元件的热电偶显然无法直接满足这个要求。因此,若将热电偶应用于嵌入式系统时,须进行复杂的信号放大、A/D转换、查表线性化、温度补偿及数字化输出接口等软硬件设计。如果能将上述的功能集成到一个集成电路芯片中,即采用单芯片来完成信号放大、冷端补偿、线性化及数字化输出功能,则将大大简化热电偶在嵌入式领域的应用设计。Maxim公司新近推出的MAX6675即是一个集成了热电偶放大器、冷端补偿、A/D转换器及SPI 串口的热电偶放大器与数字转换器。
用c很简单 ,
/
FILE NAME: DS18B20c
CHIP TYPE: ATMEGA16
CLOCK FREQUENCY: 8MHZ
IDE: VSMStudio
COMPILER: AVR-GCC
TIME: September 2010
/
#include <avr/ioh>
#include <util/delayh>
#define uchar unsigned char
#define uint unsigned int
#define BUS PORTC
// Low level port/pin definitions
#define sbit(x,PORT) (PORT) |= (1<<x)
#define cbit(x,PORT) (PORT) &= ~(1<<x)
#define pin(x,PIN) (PIN) & (1<<x)
// Pins definition
#define s_digit1 sbit(5,PORTC)
#define c_digit1 cbit(5,PORTC)
#define s_digit2 sbit(4,PORTC)
#define c_digit2 cbit(4,PORTC)
#define out PORTC
#define DQ_IN DDRA&=~(1<<7)
#define DQ_OUT DDRA|=(1<<7)
#define S_DQ sbit(7,PORTA)
#define C_DQ cbit(7,PORTA)
#define DQ pin(7,PINA)
// Function Prototypes
void init_ds18b20(void);
uchar readbyte(void);
void writecommand(uchar);
uchar readtemp(void);
uchar a, b, tt;
// Main program
int main(void)
{ uchar i=0, temp;
// Initialize Stack Pointer
SPL=0x54;
SPH=0x04;
// Configure port pins
DDRC = 0xff;
DDRA = 0xff;
while(1)
{ temp = readtemp();
for(i=0; i<10; i++) // 10 measures
{ // output the units
out = (temp/10) & 0x0f;
s_digit1;
c_digit2;
_delay_ms(5);
// output the tens
out = (temp%10) & 0x0f;
c_digit1;
s_digit2;
_delay_ms(5);
}
}
}
// Start transaction with 1-wire line
void init_ds18b20(void)
{ DQ_OUT;
C_DQ ;
_delay_us(600);
S_DQ;
_delay_us(50);
DQ_IN;
while(DQ);
_delay_us(240);
DQ_OUT;
S_DQ;
_delay_us(300);
}
// Read a byte from the sensor
uchar readbyte(void)
{ uchar i = 0,data = 0;
DQ_OUT;
for (i=0; i<8; i++)
{ C_DQ ;
data >>= 1;
_delay_us(3);
S_DQ;
DQ_IN;
_delay_us(12);
if(DQ)
data |= 0x80;
DQ_OUT;
S_DQ;
_delay_us(45);
_delay_us(5);
}
return(data);
}
// Write a command to the sensor
void writecommand(uchar data)
{ uchar i;
for(i=0; i<8; i++)
{ C_DQ;
_delay_us(15);
if(data & 0x01)
S_DQ;
else
C_DQ;
_delay_us(45);
data >>= 1;
S_DQ;
_delay_us(2);
}
}
// Read value from the sensor
uchar readtemp(void)
{ uint t;
init_ds18b20();
// Convert
writecommand(0xCC);
writecommand(0x44);
init_ds18b20();
// Read Scratch memory area
writecommand(0xCC);
writecommand(0xBE);
a = readbyte();
b = readbyte();
t = b;
t <<= 8;
t = t|a;
tt = t00625;
return(tt);
}
以上就是关于求一个51单片机的多路温度控制系统的C语言程序。全部的内容,包括:求一个51单片机的多路温度控制系统的C语言程序。、k型热电偶 max6675 51单片机组成的测温电路程序、基于数字温度传感器的数字温度计的汇编语言程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)