导航:首页 > 编程知识 > 怎么编程算法

怎么编程算法

发布时间:2023-10-22 18:53:05

❶ 如何用PID算法编程,使单片机通过控制继电器来实现恒温功能。

/***********************************************************************
PID温度控制程序
程序说明:
系统上电后显示 “--温度”
表示需要先设定温度才开始进行温度检测
温度设定完毕后程序才开始进行PID温控
***********************************************************************/
#include <reg52.h>
#include <absacc.h>
#include"DS18B20.H"
#include"PID.H"
#define uchar unsigned char
#define uint unsigned int
unsigned char code tab[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF
}
;
/*个位0~9的数码管段码*/
unsigned char code sao[]=
{
0x7f,0xbf,0xdf,0xef
}
;
//扫描码
uchar set=30,keyflag=1 ; //set初始化为30° keyflag为进入温度设定的标志位
//4个按键使用说明
sbit key_out=P1^0 ; //用于温度设定后的退出
sbit key_up=P1^1 ; //设定温度加
sbit key_down=P1^2 ; //设定温度减
sbit key_in=P1^3 ; //在程序的运行中如需要重新设定温度 按下此键才能进入设置模式并且此时是停在温度控制的,按下key_out键后才表示设定完毕
void Show_key();
/***********************************************************/
void delays(unsigned char k)
{
unsigned char i,j ;
for(i=0;i<k;i++)
for(j=0;j<50;j++);
}
/*********************************************************
//数码管显示函数
P0口 作为数据口
P2口的低四位作为扫描口
变量 x表示扫描
d表示是否要加小数点 为1是 为0不加
y表示传递的数值
*********************************************************/
LCD_disp_char(uchar x,bit d,uchar y)
{
P2=0XFF ;
P0=0xFF ;
if(d==0)
P0=tab[y];
else
P0=tab[y]&0x7f ; //与上0x7f表示是否要加小数点
P2=sao[x]; //打开扫描端号

}
/*********************************************************
按键扫描
*********************************************************/
void keyscan(void)
{
if(key_in==0) //按键进入函数
{
delays(10); //延时消抖 (以下同)
if(key_in==0)
{
while(key_in==0)
{
Show_key(); //如果一直按着键不放 就一直显示在当前状态 (以下同)
}
keyflag=1 ; //按键标志位
}
}
/***********************/
if(key_out==0) //按键退出
{
delays(10);
if(key_out==0)
{
while(key_out==0)
{
Show_key();
}
keyflag=0 ;
set_temper=set ;
}
}
/*************************/
if(key_up==0) //设定温度的加
{
delays(10);
if(key_up==0)
{
while(key_up==0)
{
Show_key();
}
if(keyflag==1)
{
set++;
if(set>90) //如果大于90°就不在加
set=90 ;
}
}
}
/*************************/
if(key_down==0) //温度设定的减
{
delays(10);
if(key_down==0)
{
while(key_down==0)
{
Show_key();
}
if(keyflag==1)
{
set--;
if(set<30) //温度减到30°时不在往下减
set=30 ;
}
}
}
}
/*********************************************************************
按键按下时的显示函数
***********************************************************************/
void Show_key()
{
output=1 ;
LCD_disp_char(3,0,10); //显示 -
delays(3);
LCD_disp_char(2,0,10); //显示- (表示温度设定 )
delays(3);
LCD_disp_char(1,0,set/10); //显示温度十位
delays(3);
LCD_disp_char(0,0,set%10); //显示温度个位
delays(3);
}
/*****************************************************************/
void main()
{
unsigned int tmp ;//声明温度中间变量
unsigned char counter=0 ;
PIDBEGIN(); //PID参数的初始化
output=1 ; //关闭继电器输出
while(1)
{
keyscan();
if(keyflag)
{
Show_key(); //显示温度设定
}
else
{
if(counter--==0)
{
tmp=ReadTemperature();//每隔一段时间读取温度值
counter=20 ;
}
LCD_disp_char(3,0,tmp/1000); //显示温度十位
delays(3);
LCD_disp_char(2,1,tmp/100%10); //显示温度个位
//显示小数点
delays(3);
LCD_disp_char(1,0,tmp/10%10); //显示温度小数后一位
delays(3);
LCD_disp_char(0,0,tmp%10);//显示温度小数后二位
delays(3);
P2=0XFF ;
P0=0xff ;
compare_temper(); //比较温度

}
}
}
/**********************************************************************************************************************************************/
//PID算法温控C语言2008-08-17 18:58
#ifndef _PID_H__
#define _PID_H__
#include<intrins.h>
#include<math.h>
#include<string.h>
struct PID
{
unsigned int SetPoint ;
// 设定目标 Desired Value
unsigned int Proportion ;
// 比例常数 Proportional Const
unsigned int Integral ;
// 积分常数 Integral Const
unsigned int Derivative ;
// 微分常数 Derivative Const
unsigned int LastError ;
// Error[-1]
unsigned int PrevError ;
// Error[-2]
unsigned int SumError ;
// Sums of Errors
}
;
struct PID spid ;
// PID Control Structure
unsigned int rout ;
// PID Response (Output)
unsigned int rin ;
// PID Feedback (Input)

sbit output=P1^4;
unsigned char high_time,low_time,count=0 ;
//占空比调节参数
unsigned char set_temper ;
void PIDInit(struct PID*pp)
{
memset(pp,0,sizeof(struct PID)); //PID参数初始化全部设置为0
}
unsigned int PIDCalc(struct PID*pp,unsigned int NextPoint)
{
unsigned int dError,Error ;
Error=pp->SetPoint-NextPoint ;
// 偏差
pp->SumError+=Error ;
// 积分
dError=pp->LastError-pp->PrevError ;
// 当前微分
pp->PrevError=pp->LastError ;
pp->LastError=Error ;
//比例
//积分项
return(pp->Proportion*Error+pp->Integral*pp->SumError+pp->Derivative*dError);
// 微分项
}
/***********************************************************
温度比较处理子程序
***********************************************************/
void compare_temper()
{
unsigned char i ;
//EA=0;
if(set_temper>temper)
{
if(set_temper-temper>1)
{
high_time=100 ; //大于1°不进行PID运算
low_time=0 ;
}
else
{ //在1°范围内进行PID运算
for(i=0;i<10;i++)
{
//get_temper();
rin=s;
// Read Input
rout=PIDCalc(&spid,rin); //执行PID运算
// Perform PID Interation
}
if(high_time<=100) //限制最大值
high_time=(unsigned char)(rout/800);
else
high_time=100;
low_time=(100-high_time);
}
}
/****************************************/
else if(set_temper<=temper) //当实际温度大于设置温度时
{
if(temper-set_temper>0)//如果实际温度大于设定温度
{
high_time=0 ;
low_time=100 ;
}
else
{
for(i=0;i<10;i++)
{
//get_temper();
rin=s ;
// Read Input
rout=PIDCalc(&spid,rin);
// Perform PID Interation
}
if(high_time<100) //此变量是无符号字符型
high_time=(unsigned char)(rout/10000);
else
high_time=0 ;//限制不输出负值
low_time=(100-high_time);
//EA=1;
}
}
}

/*****************************************************
T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期
******************************************************/
void serve_T0()interrupt 1 using 1
{
if(++count<=(high_time))
output=0 ;
else if(count<=100)
{
output=1 ;
}
else
count=0 ;
TH0=0x2f ;
TL0=0xe0 ;
}
void PIDBEGIN()
{

TMOD=0x01 ;
TH0=0x2f ;
TL0=0x40 ;

EA=1 ;
ET0=1 ;
TR0=1 ;

high_time=50 ;
low_time=50 ;
PIDInit(&spid);
// Initialize Structure
spid.Proportion=10 ;
// Set PID Coefficients
spid.Integral=8 ;
spid.Derivative=6 ;
spid.SetPoint=100 ;
// Set PID Setpoint

}
#endif

转自他人程序。

❷ 新手怎么学代码编程

熟悉以下关键东西,可以边学边做,定期训练,经常思考,长期积累:

1、语法。

2、基础理论(数学、数据结构、算法等)。

3、设计方法(编程原则、设计模式、框架设计等)。

4、库(核心、基础、UI、扩展、游戏引擎等)。

5、计算机相关(操作系统、网络、图形学等)。

6、领域知识(游戏设计、网站设计等)。

7、开发工具(编辑器、IDE、自动部署等)。

8、项目管理(进度管理、分工协作、Bug管理、版本控制等)。

(2)怎么编程算法扩展阅读:

编译方式下,首先通过一个对应于所用程序设计语言的编译程序对源程序进行处理,经过对源程序的词法分析、语法分析、语意分析、代码生成和代码优化等阶段将所处理的源程序转换为用二进制代码表示的目标程序,然后通过连接程序处理将程序中所用的函数调用、系统功能调用等嵌入到目标程序中,构成一个可以连续执行的二进制执行文件。调用这个执行文件就可以实现程序员在对应源程序文件中所指定的相应功能。

❸ 编程算法是什么

程序算法是对特定问题求解过程的描述,是指令的有限序列,每条指令完成一个或多个操作。通俗地讲,就是为解决某一特定问题而采取的具体有限的操作步骤。

在有限的操作步骤内完成。有穷性是算法的重要特性,任何一个问题的解决不论其采取什么样的算法,其终归是要把问题解决好。如果一种算法的执行时间是无限的,或在期望的时间内没有完成,那么这种算法就是无用和徒劳的,我们不能称其为算法。

相关信息:

算法的时间复杂度是指算法需要消耗的时间资源。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做T(n)=Ο(f(n));因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

❹ 编程算法有哪些

具体算法如下:

1、快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(nlogn)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。

2、堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

3、归并排序(Mergesort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(DivideandConquer)的一个非常典型的应用。

4、二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束。

5、BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分析,BFPRT可以保证在最坏情况下仍为线性时间复杂度。

6、深度优先搜索算法,是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。

❺ 电脑编程怎么计算

电脑编程是根据编程者设计的算法,将需要实现的计算步骤,按照一定的语法规则,编写成相应的程序代码,交给计算机编译成为计算机能够理解和执行的机器代码,再运行程序实现计算的。
所以要求编程者熟练地掌握一门计算机程序设计语言,根据该程序设计语言的语法规则编写好想你的代码。设计完成以后还需要上机进行编译调试,检查是否有语法错误和逻辑上的错误,漏洞和问题,全部调试完成以后再提交答案。
在实际使用的过程中,可能会发现新的思考不周到的地方,也就是我们俗称的。

阅读全文

与怎么编程算法相关的资料

热点内容
微信视频不能转发朋友圈 浏览:596
影视后期的app有哪些 浏览:956
电子保单数据出错什么意思 浏览:368
如何以文件下载音乐 浏览:438
计算机网络章节练习 浏览:999
单片机的外部中断程序 浏览:48
表格批量更名找不到指定文件 浏览:869
js的elseif 浏览:584
3dmaxvray视频教程 浏览:905
imgtool工具中文版 浏览:539
java帮助文件在哪里 浏览:965
win10切换输入语言 浏览:696
haier电视网络用不了怎么办 浏览:361
苹果6手机id怎么更改 浏览:179
米家扫地机器人下载什么app 浏览:82
如何在编程猫代码岛20种树 浏览:915
手机基础信息存储在哪个文件 浏览:726
如何查找手机备份文件 浏览:792
内存清理工具formac 浏览:323
iphone过滤骚扰电话 浏览:981

友情链接