ent en et的区别

本文详细解释了不同类型的网络接口名称,包括物理网卡设备名如ent1,逻辑网络接口名如en0或et0,标准以太网接口enx以及IEEE802.3以太网接口et0的区别。

ent1之类的是物理网卡的设备名,en0或是et0是网络接口名(逻辑上的),enx(x是一个数字,代表第几块网卡)是标准以太网接口,et0是IEEE 802.3以太网接口。

en0是Ethernet II protocal interface

et0是802.3 protocal interface 

ent0是Hardware device interface

#include <reg52.h> #include <intrins.h> #include <math.h> #include <stdio.h> #include <string.h> #define uint unsigned int #define uchar unsigned char /* 硬件接口定义 */ sbit ADC_CS = P2^3; // ADC0804控制引脚 sbit ADC_RD = P2^4; sbit ADC_WR = P2^5; sbit ADC_INTR = P2^6; #define ADC_DATA P1 sbit DS18B20_DQ = P3^7; // DS18B20数据线 sbit TRIAC_CTRL = P2^7; // 可控硅控制引脚 sbit LCD_RS = P3^3; // LCD1602接口 sbit LCD_RW = P3^4; sbit LCD_EN = P3^5; #define LCD_DB P0 sbit BUZZER = P2^0; // 蜂鸣器 sbit KEY_UP = P3^0; // 按键 sbit KEY_DOWN = P3^1; sbit KEY_ENT = P3^2; /* 系统参数 */ #define SET_STEP 10.0 #define MAX_TEMP 1200.0 #define HYSTERESIS 3.0 #define SAFE_MARGIN 50.0 #define V_REF 5.0 #define ADC_MAX 255.0 #define GAIN 100.0 // AD620增益 #define K_TC_SLOPE 0.041 // K型热电偶灵敏度(41μV/℃) #define SAMPLE_TIME 200 // 200ms控制周期 /* PID参数 */ float Kp=2.5, Ki=0.02, Kd=0.8; float integral=0, last_err=0; /* 全局变量 */ idata char lcd_buf[16]; float current_temp=0.0, set_temp=600.0, ambient_temp=25.0; bit alarm_flag=0, set_mode=0; /* 温度查表数据 */ code float K_TC_Table[] = { 0.0, 0.0, // 0mV → 0℃ 4.095, 100.0, // 4.095mV → 100℃ 12.207, 300.0, 24.902, 600.0, 48.838, 1200.0 // 48.838mV → 1200℃ }; /* 函数声明 */ void sys_init(void); void lcd_init(void); void lcd_display(float now_temp, float set_temp); void keyscan(void); void pid_control(void); void alarm_check(void); void delay_ms(uint ms); void delay_us(uint us); uchar read_adc(void); float read_ds18b20(void); float adc_to_temp(uchar adc_val); float lookup_temperature(float voltage); void lcd_show_error(char *msg); bit ds18b20_reset(void); void ds18b20_write_byte(uchar dat); uchar ds18b20_read_byte(void); void write_cmd(uchar cmd); void write_data(uchar dat); void lcd_busy(void); /******************** 主函数 ********************/ void main() { sys_init(); lcd_init(); while(1) { ambient_temp = read_ds18b20(); // 读取冷端温度 current_temp = adc_to_temp(read_adc()); // 读取热电偶温度 keyscan(); // 按键处理 pid_control(); // PID温度控制 alarm_check(); // 安全检测 lcd_display(current_temp, set_temp); delay_ms(SAMPLE_TIME); // 系统周期 } } /******************** 系统初始化 ********************/ void sys_init() { // 外设初始化 ADC_CS = 1; ADC_RD = 1; ADC_WR = 1; TRIAC_CTRL = 0; BUZZER = 0; // 定时器0用于系统时钟 TMOD |= 0x01; // 模式1 TH0 = 0xFC; // 1ms定时 TL0 = 0x66; ET0 = 1; TR0 = 1; EA = 1; } /******************** 定时器0中断服务 ********************/ void timer0_isr() interrupt 1 { TH0 = 0xFC; // 重装初值 TL0 = 0x66; } /******************** PID控制算法 ********************/ void pid_control() { float err, output; err = set_temp - current_temp; // 积分抗饱和处理 if(fabs(err) < 100) { integral += err * SAMPLE_TIME / 1000.0; } // PID计算 output = Kp * err + Ki * integral + Kd * (err - last_err) * 1000.0 / SAMPLE_TIME; // 输出限幅和死区处理 if(output > 95.0) output = 95.0; else if(output < 5.0) output = 0.0; // PWM相位控制(周期20ms) if(output > 5.0) { TRIAC_CTRL = 1; delay_ms((uint)(output / 5.0)); TRIAC_CTRL = 0; delay_ms(20 - (uint)(output / 5.0)); } else { TRIAC_CTRL = 0; } last_err = err; } /******************** 温度计算与处理 ********************/ float adc_to_temp(uchar adc_val) { static uchar samples[16]; static uchar idx=0; uint sum=0; uchar i; float voltage, temp; // 滑动窗口滤波 samples[idx++%16] = adc_val; for(i=0; i<16; i++) sum += samples[i]; voltage = (sum >> 4) * V_REF / ADC_MAX / GAIN; // 冷端补偿 voltage += ambient_temp * K_TC_SLOPE / 1000.0; // 查表法温度转换 temp = lookup_temperature(voltage); // 传感器故障检测 if(adc_val < 5 || adc_val > 250) { lcd_show_error("SENSOR ERROR"); return -999.9; } return temp; } float lookup_temperature(float voltage) { uint i; voltage *= 1000; // 转换为mV for(i=2; i<sizeof(K_TC_Table)/sizeof(float); i+=2) { if(voltage <= K_TC_Table[i]) { float x1 = K_TC_Table[i-2]; float y1 = K_TC_Table[i-1]; float x2 = K_TC_Table[i]; float y2 = K_TC_Table[i+1]; return y1 + (voltage - x1) * (y2 - y1) / (x2 - x1); } } return MAX_TEMP; // 超量程 } /******************** DS18B20完整驱动程序 ********************/ float read_ds18b20(void) { uchar temp_l, temp_h; int temp; float t; if(!ds18b20_reset()) { // 复位失败处理 lcd_show_error("DS18B20 ERROR"); return -999.9; } ds18b20_write_byte(0xCC); // 跳过ROM命令 ds18b20_write_byte(0x44); // 启动温度转换 delay_ms(750); // 等待转换完成(12位精度) if(!ds18b20_reset()) { // 再次复位 return -999.9; } ds18b20_write_byte(0xCC); // 跳过ROM ds18b20_write_byte(0xBE); // 读取暂存器 temp_l = ds18b20_read_byte(); // 读取温度低字节 temp_h = ds18b20_read_byte(); // 读取温度高字节 temp = (temp_h << 8) | temp_l; t = temp * 0.0625; // 转换为实际温度 return t; } bit ds18b20_reset() { DS18B20_DQ = 0; delay_us(480); DS18B20_DQ = 1; delay_us(60); return (DS18B20_DQ == 0); } void ds18b20_write_byte(uchar dat) { uchar i; for(i=0; i<8; i++) { DS18B20_DQ = 0; delay_us(2); DS18B20_DQ = dat & 0x01; delay_us(60); DS18B20_DQ = 1; dat >>= 1; } } uchar ds18b20_read_byte() { uchar i, dat=0; for(i=0; i<8; i++) { DS18B20_DQ = 0; delay_us(2); DS18B20_DQ = 1; delay_us(8); dat >>= 1; // 修正位移方向 if(DS18B20_DQ) dat |= 0x80; delay_us(50); } return dat; } /******************** ADC0804驱动程序 ********************/ uchar read_adc() { uchar val; ADC_CS = 0; ADC_WR = 0; _nop_(); _nop_(); ADC_WR = 1; while(ADC_INTR == 1); // 等待转换完成 ADC_RD = 0; val = ADC_DATA; ADC_RD = 1; ADC_CS = 1; return val; } /******************** LCD1602驱动程序 ********************/ void lcd_init() { delay_ms(15); write_cmd(0x38); write_cmd(0x0C); write_cmd(0x06); write_cmd(0x01); } void lcd_display(float now_temp, float set_temp) { uchar i; if(now_temp < 0) { sprintf(lcd_buf, "NOW:----.-%cC ", 0xDF); } else { sprintf(lcd_buf, "NOW:%5.1f%cC", now_temp, 0xDF); } write_cmd(0x80); for(i=0; lcd_buf[i]; i++) write_data(lcd_buf[i]); sprintf(lcd_buf, "SET:%5.1f%cC", set_temp, 0xDF); write_cmd(0xC0); for(i=0; lcd_buf[i]; i++) write_data(lcd_buf[i]); } void lcd_show_error(char *msg) { uchar i; write_cmd(0x01); write_cmd(0x80); for(i=0; msg[i]; i++) write_data(msg[i]); } void write_cmd(uchar cmd) { lcd_busy(); LCD_RS = 0; LCD_RW = 0; LCD_DB = cmd; LCD_EN = 1; _nop_(); LCD_EN = 0; delay_ms(2); } void write_data(uchar dat) { lcd_busy(); LCD_RS = 1; LCD_RW = 0; LCD_DB = dat; LCD_EN = 1; _nop_(); LCD_EN = 0; delay_ms(1); } void lcd_busy() { LCD_DB = 0xFF; LCD_RS = 0; LCD_RW = 1; do { LCD_EN = 1; _nop_(); LCD_EN = 0; } while (LCD_DB & 0x80); } /******************** 按键扫描程序 ********************/ void keyscan() { static bit key_lock = 0; if(!KEY_ENT && !key_lock) { delay_ms(20); if(!KEY_ENT) { set_mode = ~set_mode; key_lock = 1; BUZZER = 1; delay_ms(50); BUZZER = 0; } } else if(KEY_ENT) { key_lock = 0; } if(set_mode) { if(!KEY_UP) { delay_ms(20); if(!KEY_UP) { set_temp += SET_STEP; if(set_temp > MAX_TEMP) set_temp = MAX_TEMP; while(!KEY_UP); } } if(!KEY_DOWN) { delay_ms(20); if(!KEY_DOWN) { set_temp -= SET_STEP; if(set_temp < 0) set_temp = 0; while(!KEY_DOWN); } } } } /******************** 报警与安全系统 ********************/ void alarm_check() { static uchar alarm_cnt = 0; if(current_temp < 0 || current_temp > MAX_TEMP) { BUZZER = 1; TRIAC_CTRL = 0; alarm_flag = 1; } else if(fabs(current_temp - set_temp) > SAFE_MARGIN) { if(++alarm_cnt > 10) { BUZZER = ~BUZZER; alarm_cnt = 0; } alarm_flag = 1; } else { BUZZER = 0; alarm_flag = 0; alarm_cnt = 0; } } /******************** 延时函数 ********************/ void delay_ms(uint ms) { uint i, j; for(i=0; i<ms; i++) for(j=0; j<114; j++); } void delay_us(uint us) { while(us--) { _nop_(); _nop_(); _nop_(); _nop_(); } }根据此代码找出LCD不显示的原因
05-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值