本帖最后由 迷失朋友 于 2018-3-8 21:12 编辑
求求大神解救我,是我程序问题吗?
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //七段数码管显示码,显示0~9
uint tt=20; // 为了计时一秒,定时器一次中断为50ms,20*50ms=1s
uint mt=150; //电机速度
uint st=1; //扫描速度
uint signalm; //电机信号
uint signald; //显示信号
uint minutetens,minuteuints,secondtens,seconduints;//时间分、秒十位个位
uint temphundreds,temptens,tempuints;//温度百位十位个位
uint tmax=30; //火力上限
uint check=0; //检测信号
uint m; //全局温度
int count_s=0; //时间
sbit P10=P1^0; //引脚定义
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P30=P3^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
sbit DQ=P2^7; //定义DS18B20总线I/O
void T_initalize()
{
EA=1; //开中断
ET0=1;
ET1=1; //定时器 中断允许
TMOD=0x11; //定时器T0 定时 方式一
TR1=1;
TH0=0x3c;
TL0=0xaf;
TH1=0xfc;
TL1=0x18;
//12M 晶振,65536-15536=50000,50000us*20=1000000us=1s
}
void Delay(uint i)//延时
{
while( i-- );
}
void Init_DS18B20(void)//初始化DS18B20
{
uchar n;
DQ=1;
Delay(8);
DQ=0;
Delay(80); //500us
DQ=1;
Delay(8);
n=DQ;
Delay(4);
}
uchar Readonechar(void)//读一个字节
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0; //给脉冲
value>>=1;
DQ=1; //给脉冲
if(DQ)
value|=0x80;
Delay(4);
}
return value;
}
void Writeonechar(uchar dat)//写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
Delay(4);
DQ=1;
dat>>=1;
}
Delay(4);
}
void Tmperature_change(void) //发送温度转换命令
{
Init_DS18B20();
Writeonechar(0xCC); //跳过读序号列号的操作
Writeonechar(0x44); //启动温度转换
}
uint Read_temperature(void)//读取温度
{
uchar a=0;
uchar b=0;
uint t=0;
Init_DS18B20();
Tmperature_change();
Delay(300);
Init_DS18B20();
Writeonechar(0xCC); //跳过读序号列号的操作
Writeonechar(0xBE); //读取温度寄存器
a=Readonechar(); //读低8位
b=Readonechar(); //读高8位
t=b;
t<<=8;
t=t|a;
t=t*0.0625;
return(t);
}
void Temperature()//显示温度
{
uint i;
i=Read_temperature(); //获取温度值
temphundreds=i/100; //百位
temptens=i%100/10; //十位
tempuints=i%10; //个位
m=i;
}
void Time()//显示时间
{
minutetens=count_s/600; //取分的十位
minuteuints=(count_s/60)%10; //取分的个位
secondtens=(count_s%60)/10; //取秒的十位
seconduints=(count_s%60)%10; //取秒的个位
}
void Display_initalize()
{
P2=0xff;
P0=0x40;
P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=1,P21=0,P22=1,P23=1,P24=1,P25=1,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=1,P21=1,P22=0,P23=1,P24=1,P25=1,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=1,P21=1,P22=1,P23=0,P24=1,P25=1,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=0,P21=1,P22=1,P23=1,P24=0,P25=1,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=0,P21=1,P22=1,P23=1,P24=1,P25=0,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=0;
Delay(120);
P2=0xff;
}
void Motor()//电机
{
switch(signalm)
{case 0:P33=1,P34=0,P35=0,P36=0;signalm=1;break;
case 1:P33=1,P34=1,P35=0,P36=0;signalm=2;break;
case 2:P33=0,P34=1,P35=0,P36=0;signalm=3;break;
case 3:P33=0,P34=1,P35=1,P36=0;signalm=4;break;
case 4:P33=0,P34=0,P35=1,P36=0;signalm=5;break;
case 5:P33=0,P34=0,P35=1,P36=1;signalm=6;break;
case 6:P33=0,P34=0,P35=0,P36=1;signalm=7;break;
case 7:P33=1,P34=0,P35=0,P36=1;signalm=0;break;
}
}
void Display()
{
switch(signald)
{case 0:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
P0=codevalue[minutetens];
P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
signald=1;
break;
case 1:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
P0=codevalue[minuteuints];
P20=1,P21=0,P22=1,P23=1,P24=1,P25=1,P26=1;
signald=2;
break;
case 2:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
P0=codevalue[secondtens];
P20=1,P21=1,P22=0,P23=1,P24=1,P25=1,P26=1;
signald=3;
break;
case 3:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
P0=codevalue[seconduints];
P20=1,P21=1,P22=1,P23=0,P24=1,P25=1,P26=1;
signald=4;
break;
case 4:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
P0=codevalue[temphundreds];
P20=1,P21=1,P22=1,P23=1,P24=0,P25=1,P26=1;
signald=5;
break;
case 5:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
P0=codevalue[temptens];
P20=1,P21=1,P22=1,P23=1,P24=1,P25=0,P26=1;
signald=6;
break;
case 6:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
P0=codevalue[tempuints];
P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=0;
signald=0;
break;
}
}
void Temperature_check()//温度检测
{if(check==1)
{
if(m<=tmax)
P17=0;
if(m>tmax)
P17=1;
}
}
void Key_scan()//键位扫描
{
if(!P10)
{
count_s+=60; //时间+1分
if (count_s>6000)
count_s=0;
while(!P10);
}
if(!P11)
{
count_s-=60; //时间-1分
if (count_s<0)
count_s=0;
while(!P11);
}
if(!P12)
{
tmax=50; //小火
}
if(!P13)
{
tmax=80; //中火
}
if(!P14)
{
tmax=120; //大火
}
if(!P15)
{
P17=1;
if(count_s==0) //如果没有设定时间,不加热,定时器不工作
{ TR0=0;
TR1=0;
}
else //如果已经设定时间,则开始计时,开始加热
{
T_initalize();
TR0=1;
TR1=1;
check=1;
P17=0;
}
}
if(!P16) //停止加热,终止定时器
{
P17=1;
TR0=0;
TR1=0;
check=0;
}
}
void t0() interrupt 1//定时
{
TR0=0;
TH0=0x3c;
TL0=0xaf;
tt--;
if (tt==0)
{tt=20;
count_s--; //时间-1S
if (count_s==0) //如果定时已到
{
P17=1; //停止加热,定时器终止
TR0=0;
TR1=0;
check=0;
P37=0;
Delay(500);
P37=1;
P37=0;
Delay(500);
P37=1;
P37=0;
Delay(500);
P37=1;
}
else
TR0=1; //继续定时
}
else
TR0=1;
}
void t1() interrupt 3
{
TH1=0xfc;
TL1=0x18;
mt--;
st--;
if(mt==0)
{if(check==1)Motor();
mt=150;
}
if(st==0)
{Display();
st=1;
}
}
void main()
{
uint j;
P37=0;
Delay(500);
P37=1;
Read_temperature();
Delay(150);
T_initalize();
for(j=0;j<100;j++)
{
Display_initalize();
}
while(1)
{
Time();
Temperature();
Key_scan();
Temperature_check();
}
}
微波炉.rar
(28.97 KB, 下载次数: 31)
|