标题:
单片机温控及LED显示系统仿真设计
[打印本页]
作者:
514900253
时间:
2018-4-12 20:27
标题:
单片机温控及LED显示系统仿真设计
包括keil温控程序及proteus仿真图:
0.png
(34.2 KB, 下载次数: 36)
下载附件
2018-4-13 01:25 上传
0.png
(54.23 KB, 下载次数: 40)
下载附件
2018-4-13 01:25 上传
单片机温控源程序如下:
#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)
2018-4-12 20:27 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
201730645473
时间:
2018-4-16 22:41
学习了!!!拉还
作者:
我回来了鲨鱼
时间:
2018-4-19 10:53
什么垃圾,有问题,无法调
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1