📄 zhymokuai.c
字号:
#include <REG52.H>
#include <port.h> //mcu端口的使用定义
#include <temperature_control.h>
#include <led_display.h>
#include <key.h>
#include <pressure.h>
#include <serial_communication.h>
#include <ctype.h>
#include <stc89le516ad_adc.h>
#include <wtv.h>
#define Bodrate 0xFFDC // FFDC相对于11.0592M晶振下9600波特率
unsigned char code ASCII_TAB[17]=
{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,//0-9,的ASCII
0x2E,0x0a,0x20,0x0d, //小数点,换行符,空格,回车符,
0x2b,0x2d,0x09}; //正号,负号,制表符
unsigned char idata Buffer[20]; //串口通信缓冲区
unsigned char Dis_Buffer[8]; //显示缓冲区声明
//在pressure.c中定义的数据结构
struct Pressure{
unsigned int Pressure; //扩大100倍的水压值
unsigned char Pressure_Mode; //设定的水压级别
unsigned int Pressure_control_time_count; //压强调整超过一定的次数后
//仍不行,则报警
unsigned char xx; //当前角度
unsigned char yy; //目标角度
};
extern struct Pressure My_Pressure;
//在Temperature.c中定义的数据结构
typedef struct Temperature {
float SetPoint; // 设定目标 Desired Value
float tt; // 测量值
unsigned int j; //扩大100倍整型
float LastError; // 基本偏差 e[t]
float PrevError; // 上次偏差 e[t-1]
unsigned char Temperature_Control_Value; //温度控制量
};
extern struct Temperature My_Temperature;
//全局控制变量
bit Flag_Read_Pressure=1; //读压强标量
bit Flag_Read_Temperature=1; //读温度标量
bit Flag_UpData_Buffer=1; //显示缓冲区
bit Flag_Key_Scan; //按键检测标志
unsigned char User_Set_Temp_Dis_Count=0;//延时显示用户设定温度计数变量,此变量还在Key.c中引用
/*----------------------------------------------------------------------------------------------
温度分级
------------------------------------------------------------------------------------------------*/
unsigned char Temperature_Gread(unsigned int temp)
{
if(temp==355)
return(1);
else if(temp==360)
return(2);
else if(temp==365)
return(3);
else if(temp==370)
return(4);
else if(temp==375)
return(5);
else if(temp==380)
return(6);
else
return(0);
}
/*---------------------------------------------------------------------------------------
T1中断数码管显示程序(2ms)
-----------------------------------------------------------------------------------------*/
void T1_ISR_Display(void) interrupt 3
{
TL1=0xcc;
TH1=0XF8; //2ms定时初值
Led_Display(Dis_Buffer); //显示缓冲区起始地址
}
/*--------------------------------------------------------------------------------------
T0中断加热控制及电动阀门控制(基本周期为10ms)
-----------------------------------------------------------------------------------------*/
void Sample_Temperature_T0(void) interrupt 1
{
static unsigned char Copy_of_Temperature_Control_Value=0;
static unsigned char heat_count=0; //加热控制计数
static unsigned char Cycle_200ms_Count=0; //基本加热周期计数
static unsigned char xiaodou_count=0; //键盘消抖计数
static unsigned char Pressure_Control_Cycle=0; //压强控制周期计数
static unsigned char Motor_Run_Count; //电机动作一次的时间控制计数
TL0=0X00;
TH0=0Xdc; //10ms定时重装
User_Set_Temp_Dis_Count++; //延时显示用户设定温度计数变量
heat_count++;
Cycle_200ms_Count++; //基本加热周期计数值加1
xiaodou_count++; //键盘消抖计数
Pressure_Control_Cycle++;
Motor_Run_Count++;
/*电动阀门控制程序*/
// if(Motor_Run_Count==4){
// Motor_Run_Count=0;
// Pressure_Control();
// }
/*加热控制 */
if(heat_count<=Copy_of_Temperature_Control_Value) //判断是否继续加热
Heat_Control_Pin=0;
else{
Heat_Control_Pin=1;
}
/*每个加热周期结束前10ms读一次新的温度 */
if(Cycle_200ms_Count==19)
{
Flag_Read_Temperature=1; //置位读温度标志变量
}
/*一个周期结束200ms,新周期开始,更新参数 */
if(Cycle_200ms_Count==20)
{
Cycle_200ms_Count=0;
heat_count=0;
Copy_of_Temperature_Control_Value=My_Temperature.Temperature_Control_Value;//更新Copy_of_PID_Control_Value
}
/*每1秒电动机控制一次 */
if(Pressure_Control_Cycle==66){
Pressure_Control_Cycle=0;
Flag_Read_Pressure=1; //水压力控制标志变量 具体执行在主程序中
}
/*按键扫描及处理时间间隔不得小于200ms */
if(xiaodou_count>=20) {
xiaodou_count=0;
Flag_Key_Scan=1;
}
/*温度调整按键延时显示控制 2s */
if(User_Set_Temp_Dis_Count==100){
User_Set_Temp_Dis_Count=0;
Flag_UpData_Buffer=1;
}
}
/*---------------------------------------------------------------------------------------
显示缓冲区的更新
-----------------------------------------------------------------------------------------*/
void UpData_Dis_Buffer(void)
{
if(Flag_UpData_Buffer==1){
Dis_Buffer[0]=Temperature_Gread((unsigned int)(My_Temperature.SetPoint*10)); //LED温度辅助级别显示
Dis_Buffer[1]=My_Pressure.Pressure_Mode; //LED指示灯水压级别
Dis_Buffer[2]=My_Temperature.j/100;
Dis_Buffer[3]=My_Temperature.j/10%10;
Dis_Buffer[4]=My_Temperature.j%10; //更新温度数据
Dis_Buffer[5]=(My_Pressure.Pressure/100);
Dis_Buffer[6]=(My_Pressure.Pressure/10%10);
Dis_Buffer[7]=(My_Pressure.Pressure%10); //更新压强数据
}
}
/*----------------------------------------------------------------------------------------
串口通信发送缓冲区更新
------------------------------------------------------------------------------------------*/
void UpData_Buffer(void)
{
/*温度数据*/
Buffer[0] = ASCII_TAB[My_Temperature.j/100]; //取温度十位
Buffer[1] = ASCII_TAB[My_Temperature.j/10%10]; //取温度个位
Buffer[2] = ASCII_TAB[10]; //小数点
Buffer[3] = ASCII_TAB[My_Temperature.j%10]; //取温度小数点1位
Buffer[4] = ASCII_TAB[16];//插入制表符
/*PID_Control_Value数据 */
Buffer[5] = ASCII_TAB[My_Temperature.Temperature_Control_Value/10];
Buffer[6] = ASCII_TAB[My_Temperature.Temperature_Control_Value%10];
Buffer[7] = ASCII_TAB[16];//插入制表符
/*//Error数据
temp=(int)(Error*10);
if(temp>0)
Buffer[8] = ASCII_TAB[14]; //插入正号
else{
Buffer[8] = ASCII_TAB[15]; //插入负号
temp=-temp;
}
Buffer[9] =ASCII_TAB[temp/100];
Buffer[10]=ASCII_TAB[temp/10%10];
Buffer[11]=ASCII_TAB[10]; //插入小数点
Buffer[12]=ASCII_TAB[temp%10];
Buffer[13] = ASCII_TAB[16];//插入制表符
//dError数据
temp=(int)(dError*100);
if(temp>0)
Buffer[14] = ASCII_TAB[14]; //插入正号
else{
Buffer[14] = ASCII_TAB[15]; //插入负号
temp=-temp;
}
Buffer[15] = ASCII_TAB[temp/100];
Buffer[16] = ASCII_TAB[10]; //插入小数点
Buffer[17] = ASCII_TAB[temp/10%10];
Buffer[18] = ASCII_TAB[temp%10];
//返回压强
temp=8*My_Pressure.Jun_Pressure-5;
Buffer[14] = ASCII_TAB[14]; //插入正号
Buffer[15] = ASCII_TAB[temp/100];
Buffer[16] = ASCII_TAB[temp/10%10];
Buffer[17] = ASCII_TAB[10]; //插入小数点
Buffer[18] = ASCII_TAB[temp%10];*/
Buffer[19] = toascii('\0'); //字串数组结束标志
}
/*--------------------------------------------------------------------------------------
系统初始化
-----------------------------------------------------------------------------------------*/
void Sys_Init()
{
/*T0方式1,控温; T1方式1,用于数码管显示 */
TMOD=0X11;
TL0=0X00;
TH0=0Xdc;//10ms定时重装
// ET0=1; TR0=1;
TL1=0xcc;
TH1=0XF8; //2ms扫一位数码管
// ET1=1; TR1=1;
/*串口方式二,查询方式, 波特率由T2定时器提供 */
SCON=0X50;
/*T2用做波特率发生器 9600bps */
T2CON = 0x35; // 0b0011 0101 16位串行波特率
TH2 = (unsigned char )(Bodrate>>8) ;
TL2 = (unsigned char )(Bodrate & 0xff);
RCAP2H = (unsigned char )(Bodrate>>8) ;
RCAP2L = (unsigned char )(Bodrate & 0xff);
// TR2 = 1; // 启动时钟
magnet_valve3=1;
AD_Port_config();//AD端口配置
}
/*--------------------------------------------------------------------------------------
主程序
-----------------------------------------------------------------------------------------*/
void main(void)
{
EA=0;
Sys_Init();
EA=1;
while(1){
Led_Display(Dis_Buffer);
//if(Flag_Read_Temperature == 1){ //若应该进行读温度操作
// Flag_Read_Temperature=0;
// //Temperature_Control(); //计算PID_Control_Value 需要3ms
// UpData_Dis_Buffer(); //更新显示缓冲区
// //UpData_Buffer();
//}
//if(Flag_Read_Pressure==1){ //若应该进行读压力操作
// Flag_Read_Pressure=0;
// //Get_Pressure();
// //UpData_Dis_Buffer(); //更新显示缓冲区
// //Over_Pressure_Protecting(); //水管堵塞,压力突增保护
//}
//if(Flag_Key_Scan==1){
// Flag_Key_Scan=0;
// Key_Process();
//}
//serial_communication(Buffer); //串口通信函数,向PC机发送温度数值
} //end while等待中断
}//end main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -