电路原理图如下:
单片机源程序如下:
#include
#include
unsigned int times;
unsigned int controlway;
unsigned int flag=0;
unsigned int flaghongwai=0;
//电机控制
sbit out3=P2^2;
sbit out1=P2^0;
sbit out2=P2^1;
//按钮控制
sbit button=P1^0;
sbit buttonup=P1^6;
sbit buttondown=P1^7;
//温度控制
sbit DQ=P3^7;
sbit temp=P1^1;
//红外控制
sbit hongwai=P1^2;
sbit IR = P3^2;
unsigned char N[4];//识别码,操作码存放
unsigned char X1,X2,X3,X4;
void delay(unsigned char n){
do{
_nop_();
_nop_();
_nop_();
n--;
}while(n);
}
//温度控制
void init_ds18b20(){
unsigned char x=0;
DQ=0;
delay(120);
DQ=1;
delay(16);
delay(80);
}
unsigned char readbyte(){
unsigned char i=0;
unsigned char date=0;
for(i=8;i>0;i--){
DQ=0;
delay(1);
DQ=1;
date>>=1;
if(DQ)
date|=0x80;
delay(11);
}
return (date);
}
void writebyte(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 char retemp(){
unsigned char a,b,tt;
unsigned int t;
init_ds18b20();
writebyte(0xcc);
writebyte(0x44);
init_ds18b20();
writebyte(0xcc);
writebyte(0xbe);
a=readbyte();
b=readbyte();
t=b;
//t=t<<8;
t<<=8;
t=t|a;
tt=t*0.0625;
return (tt);
}
//按键检测,电机转速控制
timer0 () interrupt 1 {
unsigned char tempread=0;
if(button==0){
controlway=1;
}else if(temp==0){
controlway=2;
}else if(hongwai==0){
controlway=3;
}else{
controlway=1;
}
switch(controlway){
case 1:
if(buttonup==0){
if(times<10000){
times+=1000;
}
}else if(buttondown==0){
if(times>0){
times-=1000;
}
}
delay(100);
break;
case 2:
flag++;
if(flag==20)
{
tempread=retemp();
if(tempread>24&&tempread<34){
times=1000*(tempread-24);
}else{
times=10000;
}
flag=0;
}
break;
case 3:
//转换为外部中断
IT0 = 0;
EX0 = 1;
break;
}
TH0=0x3c;
TL0=0xb0;
}
//红外接收信号
/********************** 外部中断函数************************/
void exint0() interrupt 0
{
unsigned int cnt;
unsigned char i;
EX0 = 0;
cnt = 0;
while(!IR) cnt++; //记录引导码时间
if(cnt < 1000){EX0=1;return;} //9ms的计数值(12MHz:1000< cnt <1500)
cnt = 0;
while(IR) if(cnt++ > 400){EX0=1;return;} //防卡死,超时保护(12MHz: > 300)
if(cnt < 200){EX0=1;return;} //(12MHz不分频: <260)
for(i=0; i<32; i++) //读取32位位码
{
cnt = 0;
while(!IR);
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』