《计算机控制技术》专题实习任务书
一、实习题目:多点温度采集系统
二、任务要求:
1)设计数字多点温度采集系统结构及其系统电路原理图
2)选择仿真控制对象,(Proteus仿真软件中的电机),根据采集温度与设定温度编程
实现报警及开关电机控制。
3)用仿真软件调试系统,观察总结控制效果。
完成专题实习报告。
二、验收标准:
1)系统电路原理图
2)仿真结果:
1模拟量输入通道(对Proteus仿真软件中的热电偶进行温度测量并把结果送入单片机,显示实时温度)
2单片机编程实现报警及开关电机控制
3电机控制速度可变
三、实习报告要求:
1)统一的封面(打印)
2)数字多点温度采集系统结构及其系统电路原理图
3)模拟量输入通道(单片机电路及其程序)
4)控制量输出通道(单片机电路及其程序)
5)仿真结果分析
6)小结。
程序框图:
完整单片机C语言程序:
#include<reg51.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit d0=P2^2;
sbit d1=P3^0;
sbit d2=P3^1;
sbit d3=P3^2;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit highset=P2^3;
sbit lowset=P3^4;
sbit set=P3^3;
sbit SCK=P3^6;
sbit CS=P3^7;
sbit ena=P3^5;
bit t=0;
float wendu[4];
uchar xun=0;
int shi,ge,xiao;
float shezhi[4]={49.22,58.32,62.43,74.54};
uchar code tab_1[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; uchar code tab_2[4]={0x1f,0x2f,0x4f,0x8f};
uchar code db[8]={0x01,0x02,0x04,0x08,0x80,0x40,0x20,0x10};
uchar code tab_3[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
float Re_Convert(uint z)
{
uchar i;
unsigned long Temp_2;
Temp_2=0;
CS=1;
SCK=0;
_nop_();
_nop_();
CS=0;
for(i=0;i<16;i++)
{
Temp_2<<=1;
_nop_();
SCK=1;//上升
switch(z)
{
case 0:
{
if(d0==1)
Temp_2=Temp_2|0x01;
else
Temp_2=Temp_2|0x00;
}; break;
case 1:
{
if(d1==1)
Temp_2=Temp_2|0x01;
else
Temp_2=Temp_2|0x00;
}; break;
case 2:
{
if(d2==1)
Temp_2=Temp_2|0x01;
else
Temp_2=Temp_2|0x00;
}; break;
case 3:
{
if(d3==1)
Temp_2=Temp_2|0x01;
else
Temp_2=Temp_2|0x00;
}; break;
default:break;
}
_nop_();
SCK=0;
_nop_();
}
Temp_2=Temp_2<<1;
Temp_2=Temp_2>>6;
Temp_2=Temp_2*0.125;
return(Temp_2);
}
void Disp_temp(uchar k)
{
uint j,i=0;
uchar toop,loop=0;
float temp,var;
if(wendu[k]>0&&wendu[k]<=30) i=k;
else
i=7-k;
switch(k)
{
case 0:
temp=wendu[0];
toop=db[i]; break;
case 1:
temp=wendu[1];
toop=db[i]; break;
case 2:
temp=wendu[2];
toop=db[i]; break;
case 3:
temp=wendu[3];
toop=db[i];break;
default:break;
}
var=temp;
ge =((int)temp)%10;
shi =((int)temp)/10;
xiao=((int)(var*10))%10;
if(temp>0&&temp<=30)
loop=db[i];
else
loop=0x00;
P2=0x0f;
P0=tab_1[k];
P2=tab_2[3];
P1=toop;
for(j=200;j>0;j--)
{;}
P2=0x0f;
P0=tab_1[shi];
P2=tab_2[2];
P1=loop;
for(j=200;j>0;j--)
{;}
P2=0x0f;
P0=tab_3[ge];
P2=tab_2[1];
P1=toop;
for(j=200;j>0;j--);
P2=0x0f;
P0=tab_1[xiao];
P2=tab_2[0];
P1=loop;
for(j=200;j>0;j--)
{;}
P2=0x0f;
}
void display(uchar a)
{
float temp,m;
int t1,t2,t3,j;
switch(a)
{ case 0:
temp=shezhi[0]; break;
case 1:
temp=shezhi[1]; break;
case 2:
temp=shezhi[2]; break;
case 3:
temp=shezhi[3]; break;
default:break;
}
m=temp;
t1=(int)temp%10;
t2=(int)temp/10;
t3=(int)(m*10)%10;
P2=0x0f;
P0=tab_1[a];
P2=tab_2[3];
for(j=30;j>0;j--)
{;}
P2=0x0f;
P0=tab_1[t2];
P2=tab_2[2];
for(j=30;j>0;j--)
{;}
P2=0x0f;
P0=tab_3[t1];
P2=tab_2[1];
for(j=30;j>0;j--);
P2=0x0f;
P0=tab_1[t3];
P2=tab_2[0];
for(j=30;j>0;j--)
{;}
P2=0x0f;
}
void intt0() interrupt 2 using 1
{
uchar i;
uint j;
ena=1;
P1=0x00;
P3=0xff;
t=1;
for(;;)
{
i=P2&0x03;
display(i);
if(set==1) break;
if(highset==0)
{
for(j=20;j>0;j--)
{;}
shezhi[i]=shezhi[i]+0.1;
while(highset==0)
display(i) ;
}
if(lowset==0)
{
for(j=20;j>0;j--)
{;}
shezhi[i]=shezhi[i]-0.1;
while(lowset==0)
display(i);
}
}
}
void main()
{
EA=1;
EX1=1;
IT1=0;
while(1)
{
long int j;
uchar h;
for(xun=0;xun<4;xun++)
{
h=xun;
wendu[h]=Re_Convert(h)-24.0;
}
if((wendu[h]>=0)&&(wendu[h]<=shezhi[h]))
{
for(j=200;j>0;j--)
Disp_temp(h);
}
else
for(;;)
{
if(t==1)
{t=0;break;}
Disp_temp(h);
}
}
}。