资源简介
包含【.c】,【.DSN】,【.pwi】,【.hex】和報告。
代码片段和文件信息
#include
#include “intrins.h“
#define uchar unsigned char
#define uint unsigned int
uchar out0=0x7f ; //赋初值
uchar buf[3]={000};//全局数组
uchar pr[]={0x570x6E0x5E0x3E0x6D0x5D0x3D0x6B0x5B0x3B};
uchar discode[]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f};
int AD; //转换结果,十六进制
int uuusc=0; //带小数部分数据处理结果
int Int_resultfloat_result; //Int_result 整数部分,float_result 小数部分
sbit Dataout=P1^0; //数据线
sbit cs=P1^1; //片选
sbit sclk=P1^2; //io口时钟
sbit dx=P1^3; //断码显示控制锁存
sbit wx=P1^4; //位控控制锁存
sbit sw=P1^7;
sbit PWM=P1^5;
sbit direction=P1^6;
void delay1ms(uchar T) //单位时间1ms延时
{
uchar time;
while(T--)
for(time=0;time<120;time++);
}
/***********显示程序*************/
void display(uint num)
{
uchar shige; //十,个处理
shi=num/10%10;
ge=num%10;
wx=0;
P0=0xf7;
wx=1;
dx=0;
P0=discode[ge]; //显示个位
dx=1;
delay1ms(1);
if(num>0)
{
wx=0;
P0=0xfb;
wx=1;
dx=0;
P0=discode[shi];//|0x80; //显示十位
dx=1;
delay1ms(1);
wx=0;
P0=0xfd;
wx=1;
dx=0;
delay1ms(1);
}
}
/*************AD转换程序************/
AD_val() //TLC549处理
{
uchar itemp=0;
cs=1; //初始化,启动
sclk=0;
cs=0;
_nop_();
for(i=0;i<8;i++) //读取采集数据,读取的是上一次采集数据
{
sclk=1;
temp=temp<<1;
if(Dataout) temp |=0x01;
sclk=0;
}
cs=1;
AD=temp;
for(i=0;i<5;i++) //延时17us以上,进行复位
_nop_();
Int_result=AD*100/256;
uuu=Int_result;
return uuu;}
/****************键盘扫描程序*************/
void KB_Scan1()
{ uchar tmplineijflagpress;
line=0x7E;
for(i=1;i<=4;i++)
{
P3=line;
tmp=P3;
tmp&=0x70;
if(tmp!=0x70)
{ tmp=P3;flag=1;break;}
else line=(line<<1)|0x01;
}
if(i==5) {tmp=0xFF;flag=0; }
for(j=0;j<10;j++)
{if(tmp==pr[j])
press=j;}
if(flag==1)
{
//buf[3]=buf[2];
buf[2]=buf[1];
delay1ms(100);
buf[1]=buf[0];
delay1ms(100);
buf[0]= press;
delay1ms(100);
sc=buf[2]*100+buf[1]*10+buf[0];
}
}
/***************PID服务程序*************/
void PID()
{ double e0e1e2;
uchar duout1;
uchar kp=16 kd=0ki=0;// ts=1;
e0=e1;e1=e2;e2=(sc-uuu);///10; //设定值-采集量
if(e2>=0)
{ direction=1;
if(e2>=20) //测得偏差值与设定偏差值进行比较,若不在设定范围内则满功率加热。
{TR0=0;PWM=1;}
else
{ du=10*e2;//(e2-e1)+ki*e2+kd*(e2-2*e1+e0); // PID算法
out1=du;//+out0;
TR0=1; //若到达设定范围则调用PID程序,进行有效功率加热.
}
}
else if(e2<0) //测得值与设定值比较,测得值大于设定值,关闭加热设备,停止加热。
{ direction=0;
if(e2<-20) //测得偏差值与设定偏差值进行比较,若不在设定范围内则满功率加热。
{TR0=0;PWM=1;}
else
{ du=10*e2;//(e2-e1)+ki*e2+kd*(e2-2*e1+e0); // PID算法
out1=-du;//+out0;
TR0=1; //若到达设定范围则调用PID程序,进行有效功率加热.
}
}
//{TR0=0;PWM=0;}
out0=out1;
}
/*********************PWM输出程序*********************/
/******
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4307 2016-07-09 15:23 基于单片机的流量控制器设计\C51_64.c
文件 175788 2016-07-09 15:25 基于单片机的流量控制器设计\C51_64.DSN
文件 4629 2016-07-07 20:31 基于单片机的流量控制器设计\C51_64.hex
文件 792 2016-07-09 15:25 基于单片机的流量控制器设计\C51_64.PWI
文件 175788 2016-07-09 15:22 基于单片机的流量控制器设计\Last Loaded C51_64.DBK
文件 539648 2016-07-15 21:57 基于单片机的流量控制器设计\報告.doc
目录 0 2016-07-15 21:58 基于单片机的流量控制器设计
----------- --------- ---------- ----- ----
900952 7
- 上一篇:WCAG 2.0实现技巧
- 下一篇:S7-200和ACS800
评论
共有 条评论