STC89C516RD单片机多功能温度控制系统开发

版权申诉
0 下载量 144 浏览量 更新于2024-10-27 收藏 795KB RAR 举报
资源摘要信息: "基于STC89C516RD单片机的多功能温度控制系统开发" 在信息技术和自动化控制领域,单片机(Microcontroller Unit, MCU)扮演着至关重要的角色。它是一种集成在单一芯片上的计算机系统,包含了处理器核心、存储器(RAM和ROM)、输入/输出接口等多种功能模块。单片机的应用广泛,涉及到家用电器、工业控制、汽车电子等多个方面。而在单片机的众多应用中,温度控制是其中一个非常重要的方面。 本资源所涉及到的单片机开发项目是围绕STC89C516RD这一特定型号的单片机进行的,目的是构建一个多功能的温度控制系统。STC89C516RD属于8051系列单片机,由STC(宏晶科技)生产,具有高性能、低功耗、简单易用的特点,广泛应用于多种控制场合。 在本资源的描述中,提到了“多功能温度控制”,这意味着该系统不仅仅能够测量温度,还应具备对温度进行调控的能力。在实现这一功能的过程中,涉及到的知识点主要包括以下几个方面: 1. 单片机基础:了解STC89C516RD单片机的基本结构、工作原理以及相关的编程技术。需要熟悉其指令集、寄存器、I/O端口、中断系统、定时器/计数器、串行通信等硬件特性。 2. 温度传感器的使用:在温度控制系统中,温度传感器是关键的输入设备,负责感知环境温度。常见的温度传感器有热电偶、热敏电阻、半导体温度传感器等。在本项目中,应研究如何选择合适的传感器,并将其与单片机进行接口连接,实现温度信号的采集。 3. 模拟到数字转换(ADC):由于单片机处理的是数字信号,而温度传感器提供的通常是模拟信号,因此需要使用模数转换器(ADC)将模拟信号转换成单片机能够处理的数字信号。研究ADC的原理和STC89C516RD单片机内置ADC模块的使用方法是实现温度测量的关键。 4. 温度控制算法:多功能温度控制系统需要根据温度变化执行相应的控制动作,比如开启或关闭加热器、风扇等。这通常涉及到控制算法,例如PID(比例-积分-微分)控制算法,它可以根据设定的目标温度与实际温度之间的差值(偏差)来计算控制量,实现精确控制。 5. 输出驱动:为了实现对温度的物理控制(如加热或冷却),系统需要驱动外部执行机构,如继电器、晶体管、可控硅等开关元件。这部分涉及到电路设计和驱动电路的知识。 6. 软件开发:使用C/C++语言进行单片机程序的编写。C/C++语言因其运行效率高、功能强大、易于硬件操作,成为开发单片机软件的首选语言。需要编写代码实现温度读取、控制算法运算、控制指令输出等功能。 7. 用户接口设计:为了便于操作人员设置温度参数、查看系统状态等,可能需要设计简单的用户接口,例如按键输入、LCD显示等。 8. 系统调试与测试:在系统开发完成后,进行必要的调试和测试是确保系统稳定运行的重要步骤。需要对系统进行现场测试,检验温度控制的准确性和稳定性,同时对软件进行优化,排除可能出现的故障。 综上所述,本资源涉及的知识点涵盖了从硬件选择与接口,到软件编程和系统测试的方方面面,是单片机应用开发领域一个综合性很强的项目实例。通过学习和掌握这些知识点,不仅能够提高在单片机开发领域的专业技能,也能够为设计和实现类似的温度控制系统打下坚实的基础。

void PWM_THREAD(void* arg) { uint16_t t = 0; uint16_t key = 0; adc_init(); /* 初始化ADC */ chanl_init(); atmr_tmrx_npwm_chy_init(AUTOLOAD - 1, PRE_DIVIDER - 1); /* 初始化高级定时器PWM输出模式 */ dsp_mos_init(); dsp_rd_init(); DSP_MOS1(1); DSP_MOS2(1); DSP_MOS3(1); DSP_MOS4(1); Temp_data.pwm_ch=5; Temp_data.pwmdutyr=AUTOLOAD/4; // Temp_data.mos_ch = 2; Temp_data.mos_enable = 1; while (1) { osMutexAcquire(tempmutex,osWaitForever); key++; /* 输出5个PWM波(控制TMR8_CH1, 即PC6输出5个脉冲) */ t++; osDelay(1); if (t >= 10) /* 控制LED0闪烁, 提示程序运行状态 */ { t = 0; atmr_tmrx_npwm_chy_set(100); /* 高级定时器设置输出PWM个数 最多255个*/ } if(key>2000) { key=0; if(Temp_data.pwm_ch > 5) Temp_data.pwm_ch=0; Temp_data.tempmax = Temp_data.test_temp[0]; for(uint8_t i =0;i<8;i++) { if(Temp_data.test_temp[i]>Temp_data.tempmax) Temp_data.tempmax = Temp_data.test_temp[i]; } if(Temp_data.receivebuf[1]==WRITEDUTYR||(dutyr>0&&dutyr<AUTOLOAD)) { sutyrcrc = crc16_modbus(Temp_data.receivebuf,6); dutyrcrc_H = (uint16_t)((sutyrcrc&0xFF00)>>8); dutyrcrc_L = (uint16_t)(sutyrcrc&0x00FF); if((dutyrcrc_H == Temp_data.receivebuf[6])&&(dutyrcrc_L == Temp_data.receivebuf[7])) { pwmdutyr_H = (uint16_t)(Temp_data.receivebuf[4]&0xFF00); pwmdutyr_L = (uint16_t)Temp_data.receivebuf[5]; Temp_data.pwmdutyr = (pwmdutyr_H<<8)|pwmdutyr_L; if(Temp_data.pwmdutyr>AUTOLOAD) { Temp_data.pwmdutyr=AUTOLOAD; } if(Temp_data.pwmdutyr==0) { Temp_data.pwmdutyr=(AUTOLOAD/100)*20; } pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(dutyr>0&&dutyr<AUTOLOAD) { Temp_data.pwmdutyr = dutyr; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } } else { if(Temp_data.tempmax>25) { Temp_data.pwmdutyr = (uint32_t)(Temp_data.tempmax*2); pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(Temp_data.tempmax<25) { Temp_data.pwmdutyr=(AUTOLOAD/100)*20; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(Temp_data.tempmax>50) { Temp_data.pwmdutyr = AUTOLOAD; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } // Temp_data.pwm_RD[Temp_data.pwm_ch-1] = readfault_channel(Temp_data.pwm_ch); } readRD(Temp_data.pwm_RD); } osMutexRelease(tempmutex); } },解析这段代码

2023-07-15 上传

void app_rs485_thread(void *arg) { uint32_t var_displace; uint16_t crcsenddata; Temp_data.baudrate = 115200; rs485_init(Temp_data.baudrate); while(1) { osMutexAcquire(tempmutex,osWaitForever); rs485_receive_data(Temp_data.receivebuf,&Temp_data.rs485_receivelen); if(Temp_data.rs485_receivelen>0&&Temp_data.rs485_receivelen<RS485_BUFLEN) { if (Temp_data.receivebuf[1] == WRITEBAUDRATE) { uint16_t baudratecrc = crc16_modbus(Temp_data.receivebuf,6); uint16_t baudratecrc_H = (uint16_t)((baudratecrc&0xFF00)>>8); uint16_t baudratecrc_L = (uint16_t)(baudratecrc&0x00FF); if((baudratecrc_H == Temp_data.receivebuf[6])&&(baudratecrc_L == Temp_data.receivebuf[7])) { uint16_t baudrate_H = (uint16_t)(Temp_data.receivebuf[4]&0xFF00); uint16_t baudrate_L = (uint16_t)Temp_data.receivebuf[5]; Temp_data.baudrate = (baudrate_H<<8)|baudrate_L; rs485_init(Temp_data.baudrate); } } else if (Temp_data.receivebuf[1] == READTEMPDATA) { crcreceivedata = crc16_modbus(Temp_data.receivebuf,Temp_data.rs485_receivelen-2); if(((uint8_t)((crcreceivedata&0xFF00)>>8) == Temp_data.receivebuf[Temp_data.rs485_receivelen-2])&&((uint8_t)(crcreceivedata&0xFF) == Temp_data.receivebuf[Temp_data.rs485_receivelen-1])) { Temp_data.sendbuf[0] = 0x01;//addr Temp_data.sendbuf[1] = 0x03;//Function code Temp_data.sendbuf[2] = 0x00; Temp_data.sendbuf[3] = 0x08; temp485_send = (uint32_t)(Temp_data.tempmax*10000); for(uint8_t i =4;i<8;i++) { var_displace = (7-i)*8; Temp_data.sendbuf[i] = (uint8_t)((temp485_send&(0xFF<<var_displace))>>var_displace);//i=4 1111 1111<<(3*8)24 = 1111 1111 0000 0000 0000 0000 0000 0000 } for(uint8_t i =8;i<12;i++) { Temp_data.sendbuf[i] = Temp_data.pwm_RD[i-8]; } crcsenddata = crc16_modbus(Temp_data.sendbuf,12); Temp_data.sendbuf[12] = (crcsenddata&0xFF00)>>8; Temp_data.sendbuf[13] = (crcsenddata&0xFF); osDelay(500); rs485_send_data(Temp_data.sendbuf,14); osDelay(500); } } } osMutexAcquire(tempmutex,osWaitForever); } },解析这段代码

2023-07-15 上传