本帖最后由 迷失朋友 于 2018-3-4 20:48 编辑
我自己做一个模拟微波炉的控制器,大概就是用ds18b20提供的温度控制步进电机,怎么我用ds18b20测温数据时不时跳一下然后又正常。有没有人帮我看一下,可以回复,也可以加我qq904784778。
微波炉.rar
(28.5 KB, 下载次数: 43)
单片机源程序如下:
- #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 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
- sbit DP=P0^7;
- void Delay(uint i)//延时
- {
- while( i-- );
- }
- void T_initalize()
- {
- EA=1; //开中断
- ET0=1;
- ET1=1; //定时器 中断允许
- TMOD=0x11; //定时器T0 定时 方式一
- TH0=0x3c;
- TL0=0xaf; //12M 晶振,65536-15536=50000,50000us*20=1000000us=1s
- }
- void Init_DS18B20(void)//初始化DS18B20
- {
- uchar x=0;
- DQ=1;
- Delay(8); //稍做延时
- DQ=0; //单片机将DQ拉低
- Delay(80); //精确延时,大于480us
- DQ=1; //拉高总线
- Delay(14);
- x=DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
- Delay(20);
- }
- uchar Readonechar(void)//读一个字节
- {
- uchar i=0;
- uchar dat=0;
- for (i=8;i>0;i--)
- {
- DQ=0; // 给脉冲信号
- dat>>=1;
- DQ=1; // 给脉冲信号
- if(DQ)
- dat|=0x80;
- Delay(4);
- }
- Delay(500);
- return(dat);
- }
- void Writeonechar(uchar dat)//写一个字节
- {
- uchar i=0;
- for (i=8; i>0; i--)
- {
- DQ=0;
- DQ=dat&0x01;
- Delay(10);
- DQ=1;
- dat>>=1;
- }
- }
- void Tmperature_change(void) //发送温度转换命令
- {
- Init_DS18B20();
- Writeonechar(0xCC); //跳过读序号列号的操作
- Writeonechar(0x44); //启动温度转换
- }
- uint Read_temperature(void)//读取温度
- {
- uchar a=0;
- uchar b=0;
- uint t=0;
- Tmperature_change();
- 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 Display_temperature()//显示温度
- {
- uint f,g,h,i;
- i=Read_temperature(); //获取温度值
- f=i/100; //百位
- g=i%100/10; //十位
- h=i%10; //个位
- m=i;
- P24=1,P25=1,P26=1;
- P0=codevalue[h]; //显示个位
- P24=1,P25=1,P26=0;
- Delay(160);
- P24=1,P25=1,P26=1;
- P0=codevalue[g]; //显示十位
- P24=1;P25=0;P26=1;
- Delay(160);
- P24=1,P25=1,P26=1;
- P0=codevalue[f]; //显示百位
- P24=0,P25=1,P26=1;
- Delay(160);
- P24=1,P25=1,P26=1;
- }
- void Display_time()//显示时间
- {
- uint a,b,c,d;
- a=count_s/600; //取分的十位
- b=(count_s/60)%10; //取分的个位
- c=(count_s%60)/10; //取秒的十位
- d=(count_s%60)%10; //取秒的个位
- P20=1,P21=1,P22=1,P23=1;
- P0=codevalue[d]; //显示秒的个位
- P20=1,P21=1,P22=1,P23=0;
- Delay(150);
- P20=1,P21=1,P22=1,P23=1;
- P0=codevalue[c]; //显示秒的十位
- P20=1,P21=1,P22=0,P23=1;
- Delay(160);
- P20=1,P21=1,P22=1,P23=1;
- P0=codevalue[b]; //显示分的个位
- P20=1,P21=0,P22=1,P23=1;
- Delay(160);
- P20=1,P21=1,P22=1,P23=1;
- P0=codevalue[a]; //显示分的十位
- P20=0,P21=1,P22=1,P23=0;
- Delay(160);
- P20=1,P21=1,P22=1,P23=1;
- }
- 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()//电机
- {
- if(check==1)
- {
- P33=1,P34=0,P35=0,P36=0;
- Delay(100);
- P33=0,P34=1,P35=0,P36=0;
- Delay(100);
- P33=0,P34=0,P35=1,P36=0;
- Delay(100);
- P33=0,P34=0,P35=0,P36=1;
- Delay(100);
- }
- }
- void Temperature_check()//温度检测
- {if(check==1)
- {
- if(m<=tmax)
- P17=0;
- if(m>tmax)
- P17=1;
- }
- }
- void Key_scan()//键位扫描
- {
- if(!P10)
- {
- Delay(150);
- if(!P10)
- count_s+=60; //时间+1分
- if (count_s>6000)
- count_s=0;
- }
-
- if(!P11)
- {
- Delay(150);
- if(!P11)
- count_s-=60; //时间-1分
- if (count_s<0)
- count_s=0;
- }
- if(!P12)
- {
- Delay(150);
- if(!P12)
- tmax=50; //小火
- }
- if(!P13)
- {
- Delay(150);
- if(!P13)
- tmax=80; //中火
- }
- if(!P14)
- {
- Delay(150);
- if(!P14)
- tmax=120; //大火
- }
- if(!P15)
- {
- Delay(150);
- if(!P15)
- {
- P22=1;
- if(count_s==0) //如果没有设定时间,不加热,定时器不工作
- TR0=0;
- else //如果已经设定时间,则开始计时,开始加热
- {
- T_initalize();
- TR0=1;
- check=1;
- P17=0;
- }
- }
- }
- if(!P16) //停止加热,终止定时器
- {
- Delay(150);
- if(!P16)
- {P17=1;
- TR0=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;
- 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 main()
- {
- uint j;
- P37=0;
- Delay(500);
- P37=1;
- Read_temperature();
- for(j=0;j<100;j++)
- {
- Display_initalize();
- }
- while(1)
- {
- Key_scan();
- Display_temperature();
- Display_time();
- Temperature_check();
- }
- }
复制代码 |