求一个51单片机的多路温度控制系统的C语言程序。

求一个51单片机的多路温度控制系统的C语言程序。,第1张

#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单片机组成的测温电路程序、基于数字温度传感器的数字温度计的汇编语言程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9436620.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存