/******************************************************************************
* 标题: MCU51-JZ01单片机开发系统演示程序
* 文件: ADC1.C
* 日期: 2008-8-22
* 版本: 1.0
********************************************************************************
* 描述: *
* ADC单步采集,采集数据通过串口UART发送出 *
* *
* *
********************************************************************************/
#include <aduc812.H> //包含头文件
#include<stdio.h>
#include<ctype.h> //"ctype.h"
#include<stdlib.h> //"stdlib.h"
#define uchar unsigned char
#define uint unsigned int
#define ADC_CHANNEL0 0x00 //ADC通道选择设定
#define ADC_CHANNEL1 0x01
#define ADC_CHANNEL2 0x02
#define ADC_CHANNEL3 0x03
#define ADC_CHANNEL4 0x04
#define ADC_CHANNEL5 0x05
#define ADC_CHANNEL6 0x06
#define ADC_CHANNEL7 0x07
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7;
sbit up=P2^0;
sbit down=P2^1;
sbit startup=P2^2;
sbit function_key=P2^3;
sbit safe_keep=P2^4;
sbit alarm=P2^5;
uchar count,s1num,num1;
char miao,shi,fen;
uchar code table[]="G00.00v F00.00v";
uchar code table1[]="S0000mA Z0000mA";
uint ary[3];
uint conv_val,conv_val2,conv_val3;
uint display_value;
/*延时程序 */
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*显示命令写入子程序 */
void write_com(uchar com)//xie
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*显示数据写入子程序 */
void write_date(uchar date)//写指令
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
} /*显示初始化*/
void DISPLAYinit()//初始化
{
uchar num;
dula=0;
wela=0;
lcden=0;
//fen=59;
// miao=53;
// shi=23;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(20);
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table1[num]);
delay(20);
}
}
/***********************************/
/*第一行显示子程序 */
/*add为起始地址,data为要显示的数据*/
/***********************************/
void write_sfm(uchar add,int date)
{
uchar qw,bw,sw,gw;
qw=date/1000;
bw=(date%1000)/100;
sw=(date%100)/10;
gw=date%10;
write_com(0x80+0x40+add);
write_date(0x30+qw);
write_date(0x30+bw);
write_date(0x30+sw);
write_date(0x30+gw);
}
/***********************************/
/*第二行显示子程序 */
/*add为起始地址,data为要显示的数据*/
/***********************************/
void write_v(uchar add,int date)
{
uchar qw,bw,sw,gw;
qw=date/1000;
bw=(date%1000)/100;
sw=(date%100)/10;
gw=date%10;
write_com(0x80+add);
write_date(0x30+qw);
write_date(0x30+bw);
write_com(0x80+add+3);
write_date(0x30+sw);
write_date(0x30+gw);
}
/*-----------------------------------------------
adc init and DAC init
-----------------------------------------------*/
void DACinit()
{
ADCCON1 = 0x64; // 0110 0100;
DACCON = 0x0D ; //DA 12位输出模式
DAC0H = 0x00; //初始化DA值
DAC0L = 0x00;
}
/* ========================================================
ADC Initialize Function (ADuc812)
======================================================== */
void ADC_Init(void)
{
ADCCON1 = 0x7C;
ADCCON2 = 0x10;
ADCCON3 = 0x00;
}
/* ========================================================
AD Conversion Function (ADuc812)
======================================================== */
unsigned int AD_Convert(unsigned char channel)
{
unsigned int ConvVal;
ConvVal = 0x0000;
ADCCON2 = channel;
SCONV = 1;
while(ADCCON3 & 0x80);
ConvVal = ADCDATAL | ((ADCDATAH & 0x0F) << 8);
return(ConvVal);
}
unsigned int AD_Conversion(unsigned char channel)
{
unsigned char i;
unsigned int sum;
sum = 0;
for(i=0 ; i<20 ; i++){sum += AD_Convert(channel);}
sum /= 20;
return(sum);
}
//////////////////////////////////////////////
void main()
{
uint daoutk2,dislpay_conv,conv_val1;
double ek1,ek2,daoutk3,a,b;
double standard_ad,dislpay_conv_val;
int sum1=0,sum2=0,sum3=0;
uint set_value=500;
uchar j=0;
bit station=1;
DISPLAYinit();//显示初始化
DACinit();//DA初始化
ADC_Init();//AD初始化
up=1;
down=1;
function_key=1;
startup=1;
safe_keep=0;
alarm=1;
a=0.1;
b=0.07;
write_sfm(1,set_value);//显示设定值
standard_ad=0.00002*set_value*set_value+1.9868* set_value-11.114;//用多项式拟合实现设置量set_value与单片机标准量的转换
while(startup)
{;}
while(1)
{
/*对不同输出值调整PID参数*/
a=0.3;b=0.07;
/*if(set_value>=1000){a=0.3;b=0.07;};
if(set_value<1000&&set_value>=800){a=0.3;b=0.01;};
if(set_value<800&&set_value>=400){a=0.1;b=0.01;};
if(set_value<400&&set_value>=100){a=0.08;b=0.008;};
if(set_value<100){a=0.05;b=0.005;};
*/
/*实现短路输出断路输出保护及报警*/
/*
if(startup)
{
if(conv_val<=0||conv_val==3500)
{alarm=0;safe_keep=1;}
else{alarm=1;safe_keep=0;}
}
*/
//standard_ad=0.00002*set_value*set_value+1.9935* set_value-14.205;
/*对AD通道6口、0口、1口采样*/
conv_val=AD_Conversion(ADC_CHANNEL6);
conv_val2=AD_Conversion(ADC_CHANNEL0);
conv_val3=AD_Conversion(ADC_CHANNEL1);
/*实现多次采样,最后求均值 */
sum1=sum1+conv_val;
sum2=sum2+conv_val2;
sum3=sum3+conv_val3;
j++;
if(j==10)
{sum1=sum1/10;
sum2=sum2/10;
sum3=sum3/10;
conv_val1=(uint)sum1;
/*各种显示的更新*/
dislpay_conv_val=-0.000002*conv_val1*conv_val1+0.5031*conv_val1+5.35;//使用多项式拟合对恒流输出显示进行修正
dislpay_conv=(uint)dislpay_conv_val;
if(conv_val==0)
{dislpay_conv=0;}
write_sfm(9,dislpay_conv);//更新设定值显示
conv_val2=(uint)sum2;
conv_val2=conv_val2*0.788;//对给定电压显示的修正
conv_val3=(uint)sum3;
conv_val3=0.3246*conv_val3-14.455; //对输出电压显示的修正
write_v(1,conv_val2); //更新供给电压显示
write_v(9,conv_val3); //更新负载输出电压显示
sum1=0;
sum2=0;
sum3=0;
j=0;
}
/*数字PID控制 */
ary[1]=ary[2];
ary[2]=ary[3];
ary[3]=conv_val;
ek1=standard_ad-ary[1];
ek2=standard_ad-ary[2];
daoutk3=daoutk3+a*ek2-b*ek1;
/*把控制量给DA*/
daoutk2=(int)daoutk3;//数据类型强制转换
DAC0H=(daoutk2>>8);
DAC0L=daoutk2;
/*实现10MA步进和1MA步进切换功能*/
// collectionAD();
if(!function_key)
{station=~station;
delay(500);
}
if(!up)//up键加
{
if(station==1)
{set_value=set_value+10;}
if(station==0)
{set_value=set_value+1;}
delay(100);
write_sfm(1,set_value);
standard_ad=0.00002*set_value*set_value+1.9868* set_value-11.114;//用多项式啮合实现设置量set_value与单片机标准量的转换
}
if(!down&&set_value!=0)//down键减
{
if(station==1)
{set_value=set_value-10;}
if(station==0)
{set_value=set_value-1;}
delay(100);
write_sfm(1,set_value);
standard_ad=0.00002*set_value*set_value+1.9868* set_value-11.114;//用多项式啮合实现设置量set_value与单片机标准量的转换
}
} }
单片机控制开关电源源程序
4星 · 超过85%的资源 需积分: 47 22 浏览量
2013-09-11
18:13:26
上传
评论 3
收藏 29KB RAR 举报
u012088235
- 粉丝: 1
- 资源: 3
最新资源
- NetOps-py通过sftp替换网络设备启动文件
- STM32单片机FPGA毕设电路原理论文报告任务驱动教学法在单片机课程教学中的应用
- STM32单片机FPGA毕设电路原理论文报告任务驱动法在单片机教学中的应用
- STM32单片机FPGA毕设电路原理论文报告人造金刚石压机智能化压力测控系统设计
- 以某列为依据匹配多项(Excel版)
- STM32单片机FPGA毕设电路原理论文报告人体短臂离心机实验台的显示控制系统
- STM32单片机FPGA毕设电路原理论文报告人工气候室监控系统的环境控制器研究
- STM32单片机FPGA毕设电路原理论文报告染整自动线张力控制系统的设计
- 数据挖掘与机器学习-实验
- 基于Linux系统Nginx的动态网站的LNMP环境源码包
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页