基于单片机的温度控制电机转速课程设计 下载本文

内容发布更新时间 : 2024/12/23 19:38:11星期一 下面是文章的全部内容请认真阅读。

65℃ - 125℃

0℃ - 65℃

35℃ - 0℃

1 5

7 源程序

#include #include #include

#define INT8U unsigned char #define INT16U unsigned int extern INT8U Temp_Value[];

extern INT8U read_Temperature(); extern void delay_ms(INT16U x); extern void LCD_Initialise();

extern void LCD_ShowString(INT8U,INT8U,INT8U*) reentrant; sbit MA=P1^0; sbit MB=P1^1; sbit PWM1=P1^2;

INT8U Back_Temp_Value[]={0xFF,0XFF}; char Temp_Disp_Buff[17]; float f_Temp=35.0;

void T0_INT() interrupt 1 {

static INT8U t_Count=0;

TH0=(INT16U)(-11.0592/12*500)/256; TL0=(INT16U)(-11.0592/12*500)%6; if(++t_Count==100) {

t_Count=0;

if(Read_Temperature() ) {

if(Temp_Value[0]!=Back_Temp_Value[0]||Temp_Value[1]=Back_Temp_Value[1]) {

Back_Temp_Value[0]=Temp_Value[0]; Back_Temp_Value[1]=Temp_Value[1];

f_Temp=(int)(Temp_Value[1]<<8|Temp_Value[0]*0.0625; sprintf(Temp_Disp_Buff,\ LCD_ShowString(1,0,Temp_Disp_Buff); } } }

if (f_Temp>=75) f_Temp=75; if (f_Temp<=0) f_Temp=0; if(f_Temp>=45) {

MA=1;MB=0;

1 6

#include #include #include

#define INT8U unsigned char #define INT16U unsigned int extern INT8U Temp_Value[];

extern INT8U read_Temperature(); extern void delay_ms(INT16U x); extern void LCD_Initialise();

extern void LCD_ShowString(INT8U,INT8U,INT8U*) reentrant; sbit MA=P1^0; sbit MB=P1^1; sbit PWM1=P1^2;

INT8U Back_Temp_Value[]={0xFF,0XFF}; char Temp_Disp_Buff[17]; float f_Temp=35.0;

void T0_INT() interrupt 1 {

static INT8U t_Count=0;

TH0=(INT16U)(-11.0592/12*500)/256; TL0=(INT16U)(-11.0592/12*500)%6; if(++t_Count==100) {

t_Count=0;

if(Read_Temperature()) {

if(Temp_Value[0]!=Back_Temp_Value[0]||Temp_Value[1]!=Back_Temp_Value[1]) {

Back_Temp_Value[0]=Temp_Value[0]; Back_Temp_Value[1]=Temp_Value[1];

f_Temp=(int)(Temp_Value[1]<<8|Temp_Value[0])*0.0625; sprintf(Temp_Disp_Buff,\ LCD_ShowString(1,0,Temp_Disp_Buff); } } }

bit tmpreadbit(void) { uint i; bit dat; DS=1;

DS=0;i++;i++; DS=1;i++;

1 7

dat=DS;

i=8;while(i>0)i--; return (dat); }

uchar tmpread(void) { uchar i,j,dat; dat=0;

for(i=1;i<=8;i++) {

j=tmpreadbit();

dat=(j<<7)|(dat>>1); }

return(dat); }

void tmpwritebyte(uchar dat) {

uint i; uchar j; bit testb;

for(j=1;j<=8;j++) {

testb=dat&0x01; dat=dat>>1;

if(testb) //write 1 {

DS=0; i++;i++; DS=1;

i=8;while(i>0)i--; } else {

DS=0;

i=8;while(i>0)i--;//write 0 DS=1; i++;i++; } } }

if (f_Temp>=75) f_Temp=75; if (f_Temp<=0) f_Temp=0; if(f_Temp>=45)

1 8

{

MA=1;MB=0; if(f_Temp==45)

{ PWM1=0;delay_ms(30);return;} else

if(f_Temp==75)

{ PWM1=1;delay_ms(30);return;} PWM1=1;delay_ms(f_Temp-45); PWM1=0;delay_ms(75-f_Temp); }

else if(f_Temp<=10) {

MA=0;MB=1; if (f_Temp==10)

{PWM1=0;delay_ms(10);return;} else

if(f_Temp==0)

{PWM1=1;delay_ms(10);return;} PWM1=1;delay_ms(10-f_Temp); PWM1=0;delay_ms(f_Temp); }

else {MA=0;MB=0;} }

void main() {

LCD_Initialise();

LCD_ShowString(0,0,\ Read_Temperature();delay_ms(800); TMOD=0x01;

TH0=(INT16U)(-11.0592/12*500)/256; TL0=(INT16U)(-11.0592/12*500)%6; IE=0x82; TR0=1; while(1); }

8 总结

此次课程设计中,难点在于DS18B20的使用,即对它的时序控制、初始化以及字节读写方法,任何一个环节出错或是时序控制不到位的话就不能得到正确的数据。一旦学会了正确的使用方法,就能感觉到它带来的便利是热电偶不能比

1 9