#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit DS=P3^0; sbit IN1=P1^0; //P10与电机驱动IN1相连 sbit IN2=P1^1; //P11与电机驱动IN2相连 sbit ENA=P1^2; sbit lcdrs=P2^0; sbit lcdrw=P2^1; sbit lcden=P2^2; uint temp,num,t; uchar flag,count,fu; uchar code table[]="Current Temp :"; //延时 void delay(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=1;j>0;j--); } /*LCD 显示 */ void write_com(uchar com) { lcdrs=0; lcdrw=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar date) { lcdrs=1; lcdrw=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; lcdrs=0; } //初始化 void init() { TMOD=0x11; TH0=(65536-1000)/256; TL0=(65536-1000)%256; TH1=(65536-5000)/256; TL1=(65536-5000)%256; EA=1; ET0=1; TR0=1; ET1=1; TR1=1; flag=0; ENA=0; } /*温度模块 */ void dsreset(void) { uint i; DS=1; i++; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--; DS=1; } //读一位 bit tmpreadbit(void) { uint i; bit dat; DS=1; DS=0; i++; i++; DS=1; i++; 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++; } } } //启动温度转换 void tmpchange(void) { dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0x44); } uint tmp() { float tt; uchar a,b,b1; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); b=tmpread(); temp=b; b1=b; temp<<=8; temp=temp|a; if(b1<8) { flag+=1; tt=temp*0.0625; temp=tt*10+0.5; fu='+'; } else { flag-=1; temp=~temp; temp=temp+1; tt=temp*0.0625; temp=tt*10+0.5; fu='-'; } return temp; } void display(uint temp) { uchar A1,A2,A3; A1=temp/100; A2=temp%100/10; A3=temp%10; write_com(0x80+0x06+0x40); write_data(fu); write_data(A1+0x30); write_data(A2+0x30); write_data('.'); write_data(A3+0x30); } /*电机模块 */ //电机停止 void Turn_t(void) { ENA=0; IN1=0; IN2=0; } //电机顺时针旋转 void Turn_z(void) { ENA=1; IN1=1; IN2=0; } //电机逆时针旋转 void Turn_f(void) { ENA=1; IN1=0; IN2=1; } //电机逆时针加速 void Turn_fj(void) { uint x; ENA=1; IN1=0; x=500; while(x<=1000) { IN2=1; delay(x); IN2=0; delay(1000-x); x+=50; } IN2=1; } //电机顺时针加速 void Turn_zj(void) { uint x; ENA=1; IN2=0; x=500; while(x<=1000) { IN1=1; delay(x); IN1=0; delay(1000-x); x+=50; } IN1=1; } void main() { init(); lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); for(num=0;num<15;num++) { write_data(table[num]); delay(5); } while(1) { tmpchange(); t = tmp(); display(t); if(flag==1) { flag=0; if(t>30) Turn_z(); else if(t>20) Turn_zj(); else if(t<10) Turn_f(); else if(t<20) Turn_fj(); } else if(flag==-1) { flag=0; Turn_f(); } } }
|