0.jpg (58.35 KB, 下载次数: 24)
下载附件 保存到相册
2018-3-14 05:20 上传
单片机源程序如下:
#include #include #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
设计资源 培训 开发板 精华推荐
- 使用 NXP Semiconductors 的 PCA9617A 的参考设计
- 使用 ON Semiconductor 的 FAN2510 的参考设计
- R1283K001 应用电路,CCD/OLED显示电源的2CH DC/DC转换器
- LT6656ACS6-3、3V 电压基准作为微功率稳压器的典型应用
- MIKROE-3474,用于 STM32 STM32F429ZI 的 MCU 卡
- M5253DEMO: MCF5253 经济型演示板
- MIC2019Y固定可调限流配电开关典型应用
- 具有高效、高功率因数电源的市电供电、24V、30W BLDC 电机驱动器
- 幸运转盘
- AD8337-EVAL-INV,双电源反相评估套件,为 AD8337 VGA 的测试和评估提供平台
- CGD和Qorvo将共同革新电机控制解决方案
- 是德科技 FieldFox 手持式分析仪配合 VDI 扩频模块,实现毫米波分析功能
- 贸泽开售可精确测量CO2水平的 英飞凌PASCO2V15 XENSIV PAS CO2 5V传感器
- 玩法进阶,浩亭让您的PCB板端连接达到新高度!
- 长城汽车研发新篇章:固态电池技术引领未来
- 纳芯微提供全场景GaN驱动IC解决方案
- 解读华为固态电池新专利,2030 叫板宁德时代?
- 让纯电/插混车抓狂?中企推全球首款-40℃可放电增混电池,不怕冷
- 智驾域控知多少:中低端车型加速上车,行泊一体方案占主体
- Foresight推出六款先进立体传感器套件 彻底改变工业和汽车3D感知
- 阅读TI工业应用方案精彩专题,开启任意宝箱,挑战答题抽好礼!
- 任选下载有礼|《新概念模拟电路》全五册合集/《ADI 参考电路合集》
- 《CoolSiC™英飞凌最佳的伺服驱动解决方案》白皮书下载
- 报名赢红包,到场抽开发板|2021 RT-Thread 开发者大会等你约!
- 【0元得开发板,还能赢T12焊台,报名倒计时】Follow me,与得捷一起解锁开发板超能力!
- 有奖直播|如何借助Mentor Xpedition AMS对汽车CAN总线进行仿真优化分析?
- 评论赢好礼|TI SK-AM64评估套件测评
- 有奖活动|TE无线连接,释放物联网无限潜能!
- 学《TIVA C Launchpad入门课程》 晒成绩 赢大礼!