一、总程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit key4=P3^3;
sbit key5=P3^2;
sbit key6=P3^1;
sbit key7=P3^0;
sbit PWM=P3^4; //直流电机控制输出
void delayms(uint z)
{
uint i,j;
for(i=0;i99)
wendu_H=99;
write_24C02(0x00,wendu_H);
}
while(!key4);
}
else if(key5==0) /*加下限*/
{
delayms(2);
if(key5==0)
{
wendu_L++;
if(wendu_L>wendu_H)
wendu_L=wendu_H;
write_24C02(0x01,wendu_L);
}
while(!key5);
}
else if(key6==0) /*减上限*/
{
delayms(2);
if(key6==0)
{
wendu_H--;
if(wendu_H wendu_H)
{TR0=1;}
else if((wendu_now < wendu_H) && (wendu_now > wendu_L))
{TR0=0;PWM=1; }
if(wendu_now < wendu_L)
{relay();}
else if((wendu_now < wendu_H) && (wendu_now > wendu_L))
{
P0=0x00;
P2=0xa0;
P2=0x00;
}
}
void main()
{
P0=0x00; //清 uln2003
P2=0xa0;
P2=0x00;
P0=0xff; //清数码管
P2=0xe0;
P2=0x00;
P0=0xff; //清流水灯
P2=0x80;
P2=0x00;
TMOD=0x01;
TH0=(65536-100)/256;
TH0=(65536-100)%256;
ET0=1;
// TR0=1;
EA=1;
wendu_H=read_24C02(0x00);
wendu_L=read_24C02(0x01);
while(1)
{
keyscan1();
Read_temperature();
jiance();
display();
}
}
/*定时器 0 中断服务函数*/
void timer0() interrupt 1
{
TH0=(65536-100)/256;
TH0=(65536-100)%256;
cnt++;
if(cnt==3)
{
PWM=0;
}
if(cnt==10)
{
cnt=0;
PWM=1;
}
}
// #include "18B20.h"
sbit DQ = P1^4 ;
void delay(uint i)
{
while(i--);
}
void DS18B20_init(void)
{
DQ = 1;
delay(8);
DQ = 0;
delay(80);
DQ = 1;
delay(10);
delay(5);
}
uchar DS18B20_read_char(void)
{
uchar dat = 0;
uchar i=0;
for (i=8;i>0;i--)
{
DQ = 0;
dat>>=1;
DQ = 1;
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
void DS18B20_write_char(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
void Read_temperature(void)
{
uchar a=0;
uint b=0;
uint t=0;
uchar TempH;
DS18B20_init();
DS18B20_write_char(0xCC);
DS18B20_write_char(0x44);
delay(200);
DS18B20_init();
DS18B20_write_char(0xCC);
DS18B20_write_char(0xBE);
a=DS18B20_read_char();
b=DS18B20_read_char();
t=b;
t=(t<<8)|a;
TempH=t>>4;
wendu_now=TempH;
wendu[4]=TempH%100/10;
wendu[5]=TempH%10;
}
// #include "24C02.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
sbit SDA=P2^1;
sbit SCL=P2^0;
void start()
{
SDA=1;
_nop_();
SCL=1;
somenop;
SDA=0;
somenop;
SCL=0;
}
void stop()
{
SDA=0;
_nop_();
SCL=1;
somenop;
SDA=1;
}
void ack()
{
SDA=1;
somenop;
SCL=1;
somenop;
SCL=0;
SDA=1;
somenop;
}
void waitack()
{
SDA=1;
somenop;
SCL=1;
somenop;
if(SDA)
{
SCL=0;
stop();
}
else SCL=0;
}
/*先送一个字节的高位*/
void sendbyte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
if(dat&0x80)
SDA=1;
else SDA=0;
somenop;
SCL=1;
dat<<=1;
somenop;
SCL=0;
}
}
uchar readbyte()
{
uchar i;
uchar dat;
for(i=0;i<8;i++)
{
SCL=1;
somenop;
dat<<=1;
if(SDA)
dat |=0x01;
SCL=0;
somenop;
}
return dat;
}
void write_24C02(uchar add,uchar dat)
{
start();
sendbyte(0xa0);
waitack();
sendbyte(add);
waitack();
sendbyte(dat);
waitack();
stop();
}
uchar read_24C02(uchar add)
{
uchar temp;
start();
sendbyte(0xa0);
waitack();
sendbyte(add);
waitack();
start();
sendbyte(0xa1);
waitack();
temp=readbyte();
ack();
stop();
return temp;
}
二、流程图
开始
初始化
改变温度上下限值
Y
上下限值写入EEPROM
读取当前温度
P34口输出PWM波
Y
P34口输出高电平
继电器关闭
Y继电器打开
Y
wendu_now > wendu_H
wendu_now < wendu_L
N
数码管显示
有按键按下
从EEPROM中读上下限值
N
程序流程图
三、电机驱动电路图