包括keil温控程序及proteus仿真图:
单片机温控源程序如下:
- #include<absacc.h>
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define COM8255 XBYTE[0xbfff]
- #define PA8255 XBYTE[0xbcff]
- #define PB8255 XBYTE[0xbdff]
- #define PC8255 XBYTE[0xbeff]
- #define ADC08090 XBYTE[0x78ff]
- #define DAC08320 XBYTE[0xf7ff]
- #define DAC08321 XBYTE[0xefff]
- sbit K0=P1^0;
- sbit K1=P1^1;
- sbit K2=P1^2;
- sbit K3=P1^3;
- sbit L0=P1^6;
- sbit L1=P1^7;
- bit on=0; //温控系统启动标志
- bit set=0; //温度设定标志标志
- int temperature,temperature0=0;
- uchar data dis_buf[6]; //显示缓冲区
- uchar code table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x40,0x00}; //显示代码表
- void dlxms(unsigned int xms) //毫秒延迟
- { data unsigned t1,t2;
- for(t1=xms;t1>0;t1--)
- for(t2=110;t2>0;t2--);
- }
-
- void display( ) //显示函数
- { data uchar segcode, bitcode, i;
- bitcode=0xfe;
- for(i=0;i<4;i++)
- {segcode=dis_buf[i];
- segcode=table[segcode];
- if(i==2) //小数点位判断
- {segcode=segcode|0x80;
- }
- PA8255=segcode;
- PC8255=bitcode;
- dlxms(1);
- PC8255=0xff;
- bitcode=bitcode<<1;
- bitcode=bitcode|0x01;
- }
- }
- void light( ) //指示灯
- { if(on==0) //温控系统未启动
- {L0=0; L1=1; //指示灯 红灯亮 绿灯灭
- }
- else //温控系统启动
- {L0=1; L1=0; //灯指示 红灯灭 绿灯亮
- }
- }
- void control( ) //温度控制函数
- { int t;
- if(on==1)
- {t=temperature-temperature0; //求温差
- if(t>=0) //温度高于设定值
- {PB8255=0x00; //关闭加热
- DAC08320=PB8255;
- DAC08320=1;
- t=t/10;
- PB8255=0x80+t; //设置制冷功率
- DAC08321=PB8255; //启动制冷
- }
- else //温度低于设定值
- {PB8255=0x00; //关闭制冷
- DAC08321=PB8255;
- DAC08321=1;
- t=t/10;
- PB8255=0x80-t; //设置加热功率
- DAC08320=PB8255; //启动加热
- }
- }
- else //全部关闭
- {PB8255=0x00;
- DAC08320=PB8255;
- DAC08321=PB8255;
- DAC08320=1;
- DAC08321=1;
- }
- }
- void main(void) //主函数
- { uint k;
- COM8255=0x80; //8255初始化 10010000
- dis_buf[0]=8; //开机显示初始化
- dis_buf[1]=8;
- dis_buf[2]=8;
- dis_buf[3]=8;
- for(k=0;k<50;k++)
- {display( );
- dlxms(10);
- }
- light( ); //指示灯亮
- TMOD=0x01; TH0=-20000/256; TL0=-20000%256; //定时器管理
- IE=0x87; //中断管理
- IP=0x01; //键盘输入的中断优先
- ADC08090=0x00; //启动A/D
- while(1);
- }
- void time0_int( ) interrupt 1 //定时器中断函数
- { TH0=-20000/256; TL0=-20000%256;
- display( );
- }
- void wint1() interrupt 2 // A/D转换器
- { uchar reseut;
- uint reseut1;
- reseut=ADC08090;
- reseut1=reseut*4; //数据转换
- if(reseut1>=500) //零上 0-50
- {reseut1=reseut1-500;
- temperature=reseut1;
- dis_buf[0]=11;
- }
- else //零下 0-50
- {reseut1=500-reseut1;
- temperature=0-reseut1;
- dis_buf[0]=10;
- }
- dis_buf[1]=reseut1/100;
- dis_buf[2]=(reseut1/10)%10;
- dis_buf[3]=reseut1%10;
- display( );
- control( );
- ADC08090=0x00;
- }
- void wint0() interrupt 0 //温度设定
- { uint print,i,j=0;
- for(i=j;i<1000;i++)
- {P1=0x0f;
- if(K0==0&&set==1) //温度设定确认键
- {on=1; //启动温控
- break;
- }
- if(K1==0) //设定温度+1
- {set=1; //设定过温度
- on=0; //温控系统启动标志
- temperature0=temperature0+10;
- j=0; //延长循环时间
- }
- if(K2==0) //设定温度-1
- {set=1; //设定过温度
- on=0; //温控系统启动标志
- temperature0=temperature0-10;
- j=0; //延长循环时间
- }
- if(K3==0) //关闭温控
- {set=0; //温度设定标志置零
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
综合设计(温控).rar
(80.12 KB, 下载次数: 16)
|