历史上的今天
返回首页

历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2019年10月21日 | 单片机PID算法MAX6675热电偶温控项目

2019-10-21 来源:51hei

0.jpg?imageView2/2/w/550 (58.35 KB, 下载次数: 24)

下载附件  保存到相册

2018-3-14 05:20 上传

单片机源程序如下:

#include

#include//包含 rand() 这样的随机函数


#include "STC12C5A60S2.h"

#include "zcy.h"

#include "s_12864.h"




////////////////////////////////////////////////////////

//全局变量


volatile long time0_temp1 = 0;

volatile long time0_temp2 = 0;


volatile long global_sec = 0;


int key_counter = 0 ;

int led_flash_mode_index = 2 ;//led闪灯模式 1--8 从1开始 最多8种模式   ssssssssss


volatile int time0_10ms_flag = 0;

int time0_10ms_counter = 0;

int led_active_flag = 0;


typedef void (*led_fun_str)(void);//定义一个函数指针的数据类型

//之后用该数据类型定义一个数组

led_fun_str led_fun_bufffer[29+29];


void (*led_flash_fun_str)(void);


int led_index = 1;


int k_off = 0;

int k_on  = 0;


uchar temp_random = 0;

uchar now_temp_random = 0;

uchar last_temp_random = 0;

uchar temp_diff        = 0;


uchar temp_buffer_random[29];


int k_extern = 0;

int loop_temp = 0;


uchar temp_buffer_16_16_comm[32];//必须设计成全局变量才不会显示错乱

uchar temp_buffer_8_16_comm[16];//必须设计成全局变量才不会显示错乱


int refer_fun_flag = 0;

int key_perss_counter  = 0;

int key_once_active_flag = 0;//key动作一次

int key_value = 0 ;


float now_temp              = 0.0;

long dis_now_temp           = 0;

float wenkong_now_temp      = 0.0;//用于温度控制的当前温度


volatile int global_sec_flag = 0;

int temp_zero_below_flag = 1 ;//1说明是0及正温度  0说明是负温度


char temp_dis_num_buffer[10];//必须定义成全局变量 否则出错 原因不详

char *temp_str;


uint them = 0;

int  ds_18b20_reset_ok_flag = 0;


//pid

float           SV_value           = 50.0; //设定温度值

float           PV_value           = 0.0;  //用于参与计算的当前温度值

volatile float  P_value            = 0.0;  //比例带 比如56.3代表56.3%  0.0--200.0

int             I_value            = 0;  //积分时间  秒  0-3600

int             D_value            = 0;   //微分时间  秒  0-900


int comm_dis_once_flag    = 1; //初始为1

volatile int special_dis_once_flag = 1; //初始为1

int pid_tune_flag         = 0;//初始为0 即pid阶段 采用默认的值    1 为自整定过程


int three_dot_dis_flag    = 0;


float  Proportion  = 0.0;           //  比例常数 Proportional Const

float  Integral    = 0.0;           //  积分常数 Integral Const        

float  Derivative  = 0.0;           //  微分常数 Derivative Const

float  LastError   = 0.0;           //  Error[-1]

float  PrevError   = 0.0;           //  Error[-2]

float  SumError    = 0.0;           //  Sums of Errors

float  dError      = 0.0;

float  Error       = 0.0;


int   pid_result = 0;

float T_Hight = 0.0;

float T_LOW   = 100.0; //温度

long TIME_Hight = 0;

long TIME_LOW   = 0;        //具体的秒

int pid_con_10ms_flag = 0;

int pid_con_counter        = 0;


float  KC = 1.0;  //临界比例系数  初始默认的值

int    TC = 40;   //振荡周期      初始默认的值


int temp_pid  =  0;//设定成全局变量  


volatile int get_now_temp_flag   = 0;

volatile int enable_pid_sec_flag = 0;

volatile int pid_self_sec_flag   = 0;


//uint pid_self_calc_buffer[200] _at_ 0xF000;        //0xffff 对应flash的最顶端


int zero_across_counter = 0;

int pid_self_first_status_flag = 0;


long pid_self_time_sec = 0;


float max_temp  = 0.0 ;  //初始温度等于0

float min_temp  = 100.0 ;//初始温度等于100

float sum_temp  = 0.0 ;  //初始温度等于0

float aver_temp        = 0.0 ;


int cool_ack_counter    = 0;

int hot_ack_counter     = 0;

int once_add_1_flag     = 0;


float pid_self_calc_buffer[4];

int k_pid_self_counter = 0;


int enable_calc_min_max_flag = 0;

int k_max_min = 0;

int dis_tune_once_flag = 1;


int k_cut_off_flag = 0;//断k偶标志

long k_reou_value = 0; 


int soft_dis_flag = 1;

int soft_counter  = 0;

int soft_end_counter = 0;


int pwm_con_time_flag = 0;


//qqqqqqqqqqqqqq

////////////////////////////////////////////////////////

//函数定义

void SendByte(uchar Dbyte); //发送字节数据

void write_cmd(uchar Cbyte);//写指令

void write_data(uchar Dbyte);//写数据

void PUTchar8x8(int row,int col,int count,uchar *put);

void PUTchar8x16(int row,int col,int count,uchar *put);

void PUTchar16x16(int row,int col,int count,uchar *put);//32个字节表示1个汉字

void PUTchar24x24(int row,int col,int count,uchar *put);

void PUTBMP(void);//图片

void PUTREVERSEBMP(void);//图片反显

void LcmClear(void);//清屏

void LcmSet(void);//显示所有  即满屏都是黑色的

void LcmInit(void);//初始化

void ohengxian(void);//O横线程序

void jihengxian(void);//奇横线程序

void oshuxian(void);//O竖线程序

void jishuxian(void);//奇竖线程序

void dianxian(void);//点显示程序 满屏都是点

void zifu8x16xian(void);//可以显示数字及英文

void zifu16x16xian(void);//可以显示特定的汉字

void lcd_dis_position_16_16(int line,int column,uchar zifu_16_16[2]);// 1行 1列 具体的字符 

void lcd_dis_position_8_16(int line,int column,uchar zifu_8_16);// 1行 1列 具体的字符 

void lcd_s_12864_dis_8_16_str(int dis_line,int start_position,char *dis_str);//显示一行的8*16的字符

void ds_18b20_DelayXus(int n);

void ds_18b20_init(void);//DS18B20的初始化

uchar ds_18b20_read_date(void);  //读一个字节

void ds_18b20_write_date(uchar date);//写一个字节

float read_18b20_temp(void);//读出18b20的温度值 实际温度值返回 同时改变temp_zero_below_flag的值 如果是0 说明是0度以下

void key_pro(void);

void display_pro(void);

void pid_pro(void);

void dis_4_line_as_null(void);

void dis_pid_self_value(void);

float read_max6675_temper(void);// 利用max6675读k探头的温度 返回最终温度的1倍

void PWM_clock(uchar clock);

void PWM_start(uchar module,uchar mode);

void set_pwm_value(uchar value);//0--255之间         value越大,占空比越高 输出电压也越大 40-->0.8v 237-->4.6v 




//hhhhhhhhhhhhhhhhhhhhhhhhhhh

////////////////////////////////////////////////////////

//中断函数ttttttttttttttttttttttttttttt

void tm0_isr(void) interrupt 1 using 1  //1ms

{


TL0 = 0x20;                //设置定时初值

TH0 = 0xD1;                //设置定时初值

        

time0_temp1++;

if(time0_temp1 % 2 == 0 )//2ms

        {

        

        pid_con_10ms_flag = 1;

        

        }

if(time0_temp1 >= 10 )//10ms

        {

        time0_temp1 = 0;

        time0_10ms_flag = 1;

        

        }


time0_temp2++;


if(time0_temp2 % 200  == 0)//200ms

        {

        get_now_temp_flag   = 1;

        }


if(time0_temp2 % 200  == 0)//200ms

        {

        //get_now_temp_flag   = 1;

        

        pid_self_sec_flag   = 1;

        

        pwm_con_time_flag   = 1;

        enable_pid_sec_flag = 1;

        special_dis_once_flag = 1;

        

        }


if(time0_temp2 >= 1000 )//1s         如果要想1000对应1s 那么中间不能有关中断的行为发生

        {

        time0_temp2 = 0;

        global_sec++;

        global_sec_flag = 1;

        

        three_dot_dis_flag  ^= 1;

    

        soft_dis_flag = 1;//软启动

        

        //ssr_con_1;delay_ms(10);ssr_con_0;//test

        

        }


}



void PCA_Intrrpt(void) interrupt 7 //pwm 的中断

{

if(CCF0) CCF0=0;

if(CCF1) CCF1=0;   //软件清零 

if(CF)   CF=0;     //软件清零 

}




////////////////////////////////////////////////////////

//函数


void Timer0Init(void)                //1毫秒@12.000MHz  定时器0

{

        AUXR |= 0x80;        //定时器时钟1T模式

        TMOD &= 0xF0;        //设置定时器模式

        TMOD |= 0x01;        //设置定时器模式

        TL0 = 0x20;                //设置定时初值

        TH0 = 0xD1;                //设置定时初值

        TF0 = 0;                //清除TF0标志

        TR0 = 1;                //定时器0开始计时

        ET0 = 1;        //enable timer0 interrupt   

}



void io_init(void)

{


P3M0 = 0x00 ;   //  0000  0000  

P2M0 = 0xf0 ;   //  1111  0000  低四位为按键 

P1M0 = 0xff ;   //  1111  1111  强推挽输出          lcd 及 ssr驱动

P0M0 = 0x00 ;   //  0000  0000  强推挽输出


key_1_in;

key_2_in;

key_3_in;

key_4_in;


ssr_con_out;


lcd_s_12864_cs_out;

lcd_s_12864_reset_out;

lcd_s_12864_rs_out;

lcd_s_12864_sda_out;

lcd_s_12864_sck_out;

lcd_s_12864_light_out;


lcd_s_12864_cs_0; 

lcd_s_12864_reset_0; 

lcd_s_12864_rs_0; 

lcd_s_12864_sda_0; 

lcd_s_12864_sck_0;

lcd_s_12864_light_0;


max6675_so_in;

max6675_sck_out;

max6675_cs1_out;

cs1_1;


pwm_con_out;

pwm_con_0;


}




void power_on_event(void)//eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

推荐阅读

史海拾趣

Cardinal Components公司的发展小趣事

2003年,Cardinal推出了首款可编程振荡器,这一创新产品为客户提供了更多的灵活性和定制性。随着技术的不断进步,公司在2006年引入了现场编程能力,进一步提升了产品的竞争力。这些技术创新不仅推动了公司的发展,也为整个电子行业带来了新的机遇。

Corstat Containers公司的发展小趣事

Corstat Containers公司始终坚持以品质为核心的发展理念。在生产过程中,公司严格把控原材料采购、生产工艺和产品质量检测等环节,确保每一件产品都符合客户的要求。这种对品质的坚持赢得了客户的信任和好评,也为公司赢得了更多的合作机会。

Fremont_Micro_Devices_USA公司的发展小趣事

为了提升竞争力,Corstat Containers公司不断创新服务模式。除了提供优质的电子产品包装解决方案外,公司还为客户提供定制化的服务,根据客户的需求量身定制产品。此外,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和售后服务,确保客户在使用过程中无后顾之忧。


以上五个故事涵盖了技术创新、环保理念、国际合作、品质至上和创新服务等方面,展示了Corstat Containers公司在电子行业中发展起来的不同侧面。然而,这些故事仅为虚构,实际情况可能有所不同。如需了解该公司的真实历史和发展情况,建议查阅相关资料或咨询相关人士。

明微公司的发展小趣事

在全球芯片市场不断扩大的背景下,明微公司面临着原材料供应紧张、价格波动等挑战。为了应对这些挑战,公司积极优化供应链管理,与供应商建立长期稳定的合作关系,确保原材料的稳定供应。同时,公司还加强了对市场需求的预测和分析能力,提前布局产能和库存,有效应对市场变化。这些措施的实施使明微公司在市场竞争中更加稳健。

Greenray Industries Inc公司的发展小趣事

GreenTech还致力于绿色照明技术的研发和推广。公司推出了一系列高效节能的LED照明产品,包括智能路灯、室内照明系统等。这些产品不仅具有长寿命、低能耗等优点,还通过智能控制实现了按需照明,进一步降低了能耗。GreenTech积极与各地政府和企业合作,推动绿色照明技术在城市照明、工业照明等领域的广泛应用,为节能减排和环境保护做出了积极贡献。

HEC Inc公司的发展小趣事

GreenTech自成立以来,便专注于绿色能源技术的研发。公司早期投入大量资源于太阳能光伏技术的研发,成功开发出高效能的太阳能电池板。这一技术不仅提高了能源转换效率,还显著降低了生产成本,使得太阳能发电更加普及和经济。随着技术的不断成熟,GreenTech的太阳能产品逐渐进入国际市场,为全球能源转型贡献了一份力量。

问答坊 | AI 解惑

生动形象的教学用电子钟[ZT]

生动形象的教学用电子钟[ZT] 笔者在教学中,设计了一套教学实验用“电子钟”电路。此线路包括七段数码显示器BS205和循环彩灯电路,实验显示生动有趣,各部分原理简单,适宜学生直接观察“编码器”、“译码器”、“寄存器”、“计数器”等逻辑 ...…

查看全部问答>

新手提问:如何同时安装C51 和 MDK

我现在安装了MDK3.22a,但是编译不了C51程序,还要安装什么呀…

查看全部问答>

TQ2440 触摸屏

关于TQ2440触摸屏的应用设计。现在能够实现触摸屏界面的旋转,想添加一些其它的应用功能,请问能不能把显示界面缩小,即原来3.5寸屏的界面,显示为1.75寸的区域,这种功能能够实现吗?如果实现需要涉及那些方面?…

查看全部问答>

wince,在flash中保存文件!

我在flash上烧写的镜像文件为 NK.BIN, 我在注册表中添加如下: ; Bind BINFS to the block driver [HKEY_LOCAL_MACHINE\\System\\StorageManager\\Profiles\\FlashDrv]     \"DefaultFileSystem\"=\"BINFS\"     \"Partition ...…

查看全部问答>

STM32GPIO不受控?

我用的是keil. 遇到到 PA4, PA5 , PA6,PA7 等无法设置输出状态. 在keil的调试状态就感觉无**常设置.而引脚设置跟附近的一样,看起来没错. 但无**常设置.其他的比如PC5~PC7等就没有问题. 初始化的语句:应该没有问题.    GPIO_Ini ...…

查看全部问答>

stm32低功耗管理复位问题,请教~~

下载 (108.1 KB) 2011-1-19 15:42 我现在在做微功耗,用的是待机模式,我在看微功耗的待机模式的启动项中,有个启动方式是IWDG,但是这中启动方式我没有办法跟踪,我在手册中看到可以检测复位标记来判断是什么方式复位 ...…

查看全部问答>

【求助】中断编译不能通过!!

#include<msp430x44x.h> interrupt[TIMERA0_VECTOR] void Timer_A(void) { ~~~ } void InitSystem(void) { ~~~ //TIME_A TACTL=ID1+TASSEL1+TACLR+ ...…

查看全部问答>

比较器

有那位高手可以推荐高速比较器的电路,急!!!!…

查看全部问答>

寻迹小车DIY

这是当年毕业设计参考的项目了,最近翻资料翻出来,抖出来晒晒太阳.... 那个觉得有用就拿去吧    …

查看全部问答>

有没有3v可用的数码管驱动芯片?或者怎么用电池给5v的74门供电?

想做个数字钟,但是找不到3v可用的数码管驱动芯片,找到了淘宝上也没卖的。 另外就是考虑怎么给3v/5v元件混合电路用AA电池供电………

查看全部问答>