单片机c语言温控制程序,单片机控制的温度传感器C语言程序.doc

#include at89x52.h

#define DO P3_7

#define SEG P0 //数码管自左至右依次为1234位

#define MS2L 0x18 //1ms的延时参数

#define MS2H 0xfc

#define uchar unsigned char

#define uint unsigned int

uchar code comm[4] = {0x01,0x02,0x04,0x08};

uchar code seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchar code seg_add_dicimal[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

uchar code seg_dicimal[2] ={0xc0, 0x92};

uchar k = 0;

uchar temp_l = 0;

uchar temp_h = 0;

uchar tempsign = 0;

uchar hundreds = 0;

uchar tens = 0;

uchar ones = 0;

uchar low_four = 0;

/*延时以ms为单位的t时间*/

void Delay(uint t)

{

uint i;

while(t--)

{

for(i=0; i125; i++)

{ }

}

}

/*us级延时,延时时间约4+2*i*/

void Delayus(uchar i)

{

while(--i);

}

/*产生复位脉冲,等待应答信号*/

void Resetpaulse()

{

DO = 0; //拉低约600us

Delayus(150);

Delayus(150);

DO = 1;//产生上升沿,延时约15~60us

Delayus(30);

while(~DO); //等待应答信号

}

/*读取数据一位*/

bit Readbit()

{

uint i = 0;

bit b = 0;

DO = 0; //产生读时隙

i++; //维持低电平至少1us

DO = 1; //1us以上后拉高

Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效

b = DO; //读取数据

Delayus(40); //每个读时隙至少持续60us

return(b);

}

/*读取一个字节*/

uchar Readbyte()

{

uchar byte_read = 0;

uchar i, j;

for(i=0; i8; i++)

{

j = Readbit();

byte_read = (ji) | byte_read; //低位读起

}

return(byte_read);

}

/*写一个字节*/

void Writebyte(uchar byte_to_write)

{

uchar i = 0;

uchar j = 0;

bit write_bit = 0;

for(j=0; j8; j++)

{

write_bit = (byte_to_write 0x01);

if(write_bit == 1) //写1

{

DO = 0; //产生写时隙

Delayus(3); //延时15us

DO = 1; //写1

Delayus(40); //延时,写时隙不得低于60us

}

else

{

DO = 0; //产生写时隙

Delayus(50); //延时,保持低约60us~120us

DO = 1;

i++;

}

byte_to_write = byte_to_write 1;

}

}

/*配置ds18b20,9位分辨率 */

void Configurate()

{

EA = 0;

Resetpaulse(); //发出复位脉冲,每次操作都从复位开始

Delay(1);

Writebyte(0xcc); //skip room命令

Writebyte(0x4e);

Writebyte(0x7f);

Writebyte(0x80);

Writebyte(0x1f);

EA = 1;

}

/*启动温度转换*/

void StartConvert()

{

Resetpaulse(); // 发出复位脉冲,每次操作都从复位开始

Delay(1);

EA = 0;

Writebyte(0xcc); //skip room命令

Writebyte(0x44); //启动温度转换命令

EA = 1;

}

/*读取温度值*/

void ReadTempreture()

{

EA = 0;

Resetpaulse(); // 发出复位脉冲,每次操作都从复位开始

Delay(1);

Writebyte(0xcc); //skip room命令

Writebyte(0xbe); //读取暂存器命令

temp_l = Readbyte(); //存储温度低字节值 (整数部分低四位和小数部分)

temp_h= Readbyte(); //存储温度高字节值 (其中高五位为符号位)

EA = 1;

}

/*数据转换*/

void DigitalConvert()

{

uchar total = 0;

tempsign = (temp_h 7) 0x01; //得出符号位

if(tempsign == 0) //正数的处理方法

{

total = ((temp_h 4)0xf0) | ((temp_l 4)0x0f); //取整数位

low_four = (temp_l3) 0x01; //取小数位,9位分辨率,低字节第3位为小数位,只有0、1两种取值

hundreds = total / 100; //计算百、十、个位

tens = (total%100)/10;

ones = (total%100)%10;

}

else //负数处理 求负数补码规则是,按位取反,得到反码,加1即得补码(符号位不变)

{

tempsign = 1;

total = ((temp_l 4) 0x0f); //取整数部分低4位

total |= ((temp_h 4) 0xf0); //整数部分高三位和符号位

low_four = (temp_l 3) 0x01; //取小数位

if(low_four == 0) //这里total位uchar型变量,所以根据最低位来确定整数取补规则

total = ~total + 1; //最低位为0的时候,取反加1后有进位,所以这里total要取反加1

else

total = ~total;//最低位为1的时候,取反加1没有进位,所以total直接取反即可

tens = (total%100)/10;

ones = (total%100)%10;

}

}

/*中断处理*/

void Display()interrupt 1

{

EA = 0;

TL0 = MS2L;

TH0 = MS2H;

DigitalConvert(); //数据转换

if(tempsign == 0)//正数

{

if(k == 0)

{

if(hundreds == 0) //高位0消隐

{P1 = 0;}

else

{

P1 = comm[k];

SEG = seg[hundreds];

}

}

else if(k == 1)

{

if(tens == 0 hundreds == 0) //高位0消隐

{P1 = 0;}

else

{

P1 = comm[k];

SEG = seg[tens];

}

}

else if(k == 2)//显示个位,因为个位有小数点,所以又定义了一个数组分开来显示

{

P1 = comm[k];

SEG = seg_add_dicimal[ones]; //要加上小数点

}

else //显示小数,0或5

{

P1 = comm[k];

SEG = seg_dicimal[low_four];

}

}

else if(tempsign == 1) //负数

{

if(k == 0)//显示符号位

{

P1 = comm[k];

SEG = 0xbf;

}

else if(k == 1)

{

if(tens == 0)

{P1 = 0;}

else

{

P1 = comm[k];

SEG = seg[tens];

}

}

else if(k == 2)//显示个位,因为各位有小数点,所以分开来显示

{

P1 = comm[k];

SEG = seg_add_dicimal[ones]; //要加上小数点

}

else //显示小数,0或5

{

P1 = comm[k];

SEG = seg_dicimal[low_four];

}

}

k++;

if(k == 4)

k = 0;

EA = 1;

}

/*主函数部分*/

void main()

{

TMOD = 0x01;

TL0 = MS2L;

TH0 = MS2H;

TF0 = 0;

EA = 1;

ET0 = 1;

TR0 = 1;

Configurate();

do{

Delay(1);

StartConvert();

Delay(100);

ReadTempreture();

}

while(1);

}

展开阅读全文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #define uchar unsigned char #define uint unsigned int sbit led=P2^5; sbit wei=P2^7; sbit duan=P2^6; sbit DQ=P2^2; uchar mazhi_duan[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00}; uchar mazhi_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xff}; void delayl(uint n) { uint i,j; for(i=n;i>0;i--) for(j=114;j>0;j--); } void delays(uchar i) { while(i--); } bit init_DS18B20() //DS8B20初始化 { bit x; DQ=1; //DQ复位 delays(8); DQ=0; //单片机将DQ拉低 delays(75); DQ=1; //拉高总线 delays(15); x=DQ; //延时过后 若x=0则初始化成功 若x=1则初始化失败 delays(5); return x; } void write_data(uchar dat) { uchar i,temp; temp=dat; DQ=1; for(i=0;i>=1; } } uchar read_data() { uchar i,dat; DQ=1; for(i=0;i>=1; DQ=1;//配置为输入 if(DQ) dat|=0x80; delays(4); } return dat; } uint readtemp() { uchar temph,templ; uint temp; float wendu; init_DS18B20(); write_data(0xcc);//跳过ROM write_data(0x44);//启动度转换 //delayl(100); init_DS18B20(); write_data(0xcc);//跳过ROM write_data(0xBE);//读度 //以下读度,低八位在前 //高8位在后 templ=read_data(); temph=read_data(); temp = (temph<<8)|templ; wendu = temp*0.625+0.5;//度扩大10倍,四舍五入 temp = wendu;//10倍度 return temp; } void STC_init() { P1=0x00;//关闭led led=0; //锁存 wei=0; duan=0; } void display(uchar weil,uchar duanl,bit dp) { wei=1; P0=mazhi_wei[weil-1]; wei=0; duan=1; if(dp==1) P0=(mazhi_duan[duanl]|0x80); else P0=mazhi_duan[duanl]; duan=0; } void main() { uchar i; uint wendu; STC_init(); wendu=readtemp(); delayl(500); wendu=readtemp(); delayl(500); while(1) { wendu=readtemp(); for(i=0;i<80;i++) { display(1,wendu/100,0); delayl(3); display(2,wendu0/10,1); delayl(3); display(3,wendu,0); delayl(3); } } }
基于单片机控风扇的设计 摘 要 控风扇在现代社会中的生产以及人们的日常生活中都有广泛的应用,如工业生产中大型机械散热系统中的风扇、现在笔记本电脑上的广泛应用的智能CPU风扇等。本文设计了基于单片机控风扇系统,采用单片机作为控制器,利用温度传感器DS18B20作为度采集元件,并根据采集到的度,通过一个达林顿反向驱动器ULN2803驱动风扇电机。根据检测到的度与系统设定的度的比较实现风扇电机的自动启动和停止,并能根度的变化自动改变风扇电机的转速,同时用LED八段数码管显示检测到的度与设定的度。 关键词:单片机、DS18B20、控、风扇 第一章 整体方案设计 1.1 前 言 在现代社会中,风扇被广泛的应用,发挥着举足轻重的作用,如夏天人们用的散热风扇、工业生产中大型机械中的散热风扇以及现在笔记本电脑上广泛使用的智能CPU风扇等。而随着控制技术的发展,为了降低风扇运转时的噪音以及节省能源等,控风扇越来越受到重视并被广泛的应用。在现阶段,控风扇的设计已经有了一定的成效,可以使风扇根据环境度的变化进行自动无级调速,当度升高到一定时能自动启动风扇,当度降到一定时能自动停止风扇的转动,实现智能控制。 随着单片机在各个领域的广泛应用,许多用单片机控制控制系统也应运而生,如基于单片机控风扇系统。它使风扇根据环境度的变化实现自动启停,使风扇转速随着环境度的变化而变化,实现了风扇的智能控制。它的设计为现代社会人们的生活以及生产带来了诸多便利,在提高人们的生活质量、生产效率的同时还能节省风扇运转所需的能量。 本文设计了由ATMEL公司的8052系列单片机AT89C52作为控制器,采用DALLAS公司的温度传感器DS18B20作为度采集元件,并通过一个达林顿反向驱动器ULN2803驱动风扇电机的转动。同时使系统检测到得环境度以及系统预设的度动态的显示在LED数码管上。根据系统检测到得环境度与系统预设度的比较,实现风扇电机的自动启停以及转速的自动调节。 1.2 系统整体设计 本设计的整体思路是:利用温度传感器DS18B20检测环境度并直接输出数字度信号给单片机AT89C52进行处理,在LED数码管上显示当前环境度值以及预设度值。其中预设度值只能为整数形式,检测到的当前环境度可精确到小数点后一位。同时采用PWM脉宽调制方式来改变直流风扇电机的转速。并通过两个按键改变预设度值,一个提高预设度,另一个降低预设度值。系统结构框图如下: 结 论 本次设计的系统以单片机控制核心,以温度传感器DS18B20检测环境度,实现了根据环境度变化调节不同的风扇电机转速,在一定范围能能实现转速的连续调节,LED数码管能连续稳定的显示环境度和设置度,并能通过两个独立按键调节不同的设置度,从而改变环境度与设置度的差值,进而改变电机转速。实现了基于单片机控风扇的设计。 本系统设计可推广到各种电动机的控制系统中,实现电动机的转速调节。在生产生活中,本系统可用于简单的日常风扇的智能控制,为生活带来便利;在工业生产中,可以改变不同的输入信号,实现对不同信号输入控制电机的转速,进而实现生产自动化,如在电力系统中可以根据不同的负荷达到不同的电压信号,再由电压信号调节不同的发电机转速,进而调节发电量,实现电力系统的自动化调节。综上所述,该系统的设计和研究在社会生产和生活中具有重要地位。 附录2:程序代码 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit DQ=P1^7; sbit key1=P1^3; sbit key2=P1^4; sbit dianji=P3^1; float ff; uint y3; uchar shi,ge,xiaoshu,sheding=20,gaonum,dinum; uchar code dispcode[]={ //段码 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code tablel[]={ //带小数点的段码 0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfd, 0x87,0xff,0xef}; uchar dispbitcode[]={ //位选 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; uchar dispbuf[8]={0,0,0,0,0,0,0,0}; void Delay(uint num)// 延时函数 { while( --num ); } void digitalshow(uchar a4,uchar a3,uchar a2,uchar a1,uchar a0) { dispbuf[0]=a0; dispbuf[1]=a1; dispbuf[2]=a2; dispbuf[3]=a3; dispbuf[4]=a4; P2=0xff; P0=dispcode[dispbuf[0]]; P2=dispbitcode[5]; Delay(1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值