基于51单片机的温度检测上传电脑(RS232/USB)proteus仿真原理图PCB

时间:2025-03-07 12:05:55
#include "" #define T25 (273.15+25) //T25 #define Bx (4050.0) //B值 #define Ka (273.15) //绝对零度 #define Rp (10000.0) //ntc串联电阻 #define ntcR25 (10000.0) //25度时电阻 /*******************变量定义*********************/ float f_tempVolt = 0; //温度对应电压 float f_temp = 0.0; //温度值 bit dispFlag = 1; //显示刷新标志 bit sendFlag = 1; //串口发送标志 char dis[25]; /******************************************************** 函数名称:void mian() 函数作用:主函数 参数说明: ********************************************************/ void main() { Timer0_Init(); //初始化定时器0 UART_Init(); //初始化串口 LCD_Init(); //初始化液晶 DelayMs(200); //延时有助于稳定 LCD_DispStr(4, 0, "Welcome!"); DelayS(1); LCD_Clear(); //清屏 while (1) //死循环 { if (dispFlag == 1) { dispFlag = 0; DispNormal(); } if (sendFlag == 1) { sendFlag = 0; SendData(); } } } void DispNormal(void) { float current = 0; float Rt = 0; LCD_DispStr(0, 0, "The Temperature "); f_tempVolt = 5 * (float)ReadADC(AIN0_GND) / 255; //读取电压 current = (5 - f_tempVolt) / Rp; //计算电流值 Rt = f_tempVolt / current; //计算电阻值 f_temp = ((Bx * T25) / (T25 * (log(Rt) - log(ntcR25)) + Bx)) - Ka; sprintf(dis, "%5.1f", f_temp); LCD_DispStr(4, 1, dis); LCD_DispOneChar(9, 1, 0xdf); LCD_DispOneChar(10, 1, 'C'); } void SendData(void) { sprintf(dis, "The Temperature:%5.1f℃\r\n", f_temp); UART_SendStr(dis, 25); } /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ void Timer0_Init(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH0 = (65536 - 9216) / 256; //重新赋值 10ms TL0 = (65536 - 9216) % 256; EA = 1; //总中断打开 ET0 = 1; //定时器中断打开 TR0 = 1; //定时器开关打开 } /*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Timer0_Interrupt(void) interrupt 1 { static unsigned int time10ms = 0; TH0 = (65536 - 9216) / 256; //重新赋值 10ms TL0 = (65536 - 9216) % 256; time10ms++; if (time10ms % 50 == 0) //500ms刷新一次 { dispFlag = 1; //显示标志 } if (time10ms > 500) //5s发送一次 { sendFlag = 1; //串口发送标志 time10ms = 0; } } /************************* 串口配置 *************************/ void UART_Init(void) { SCON = 0x50; TH2 = 0xFF; TL2 = 0xFD; RCAP2H = 0xFF; //(65536-(FOSC/32/BAUD)) BAUD = 115200 FOSC = 11059200 RCAP2L = 0xFD; /*****************/ TCLK = 1; RCLK = 1; C_T2 = 0; EXEN2 = 0; /*****************/ TR2 = 1; ES = 0; //关闭串口中断 EA = 1; //打开总中断 } /************************* 串口发送字节 *************************/ void UART_SendByte(unsigned char dat) //串口发送单字节数据 { unsigned char time_out; time_out = 0; SBUF = dat; //将数据放入SBUF中 while ((!TI) && (time_out < 100)) //检测是否发送出去 { time_out++; DelayUs10x(2); } //未发送出去 进行短暂延时 TI = 0; //清除ti标志 } /************************* 串口发送字符串 *************************/ void UART_SendStr(unsigned char *s, unsigned char length) { unsigned char num; num = 0x00; while (num < length) //发送长度对比 { UART_SendByte(*s); //放松单字节数据 s++; //指针++ num++; //下一个++ } } //void UART_Interrupt(void) interrupt 4 //串行中断服务程序 //{ // if (RI)//判断是接收中断产生 // { // RI = 0; //标志位清零 // } //}