STC12C5A60S2把p4.3设置为时钟引脚的代码

时间: 2023-05-29 07:03:57 浏览: 62
以下是STC12C5A60S2把P4.3设置为时钟引脚的代码示例: ``` #include <STC12C5A60S2.H> void main() { P4M1 &= ~(1 << 3); // 设置P4.3为普通I/O口 P4M0 |= (1 << 3); AUXR |= 0x80; // 启用外部时钟 CLKO |= 0x01; // 把P4.3设置为时钟引脚 while (1) { // 循环执行其他代码 } } ``` 在上面的代码中,首先使用P4M1和P4M0寄存器将P4.3设置为普通I/O口,然后使用AUXR寄存器启用外部时钟。最后,使用CLKO寄存器将P4.3设置为时钟引脚。在此之后,可以在P4.3引脚上观察到外部时钟信号。
相关问题

STC12C5A60S2把跑。3设置为时钟引脚的代码

以下是将STC12C5A60S2的P3.3引脚设置为时钟引脚的代码示例: ```c #include <STC12C5A.H> void main() { P3M1 &= ~(1 << 3); // 将P3.3引脚配置为普通输入/输出模式 P3M0 |= 1 << 3; AUXR |= 1 << 6; // 将定时器1的时钟源设置为Fosc/4 TMOD &= 0x0F; // 将定时器1配置为16位自动重载模式 TMOD |= 1 << 4; TH1 = 0xFF; // 将定时器1的初值设为最大值,即65535 TL1 = 0xFF; TR1 = 1; // 启动定时器1计数 while (1) {} // 程序循环 } ``` 在上述代码中,首先将P3.3引脚配置为普通输入/输出模式,然后将定时器1的时钟源设置为Fosc/4,即使用P3.3引脚作为时钟引脚。接着将定时器1配置为16位自动重载模式,并将初值设为最大值,最后启动定时器1计数。程序进入一个死循环,保持定时器1一直在计数。

stc12c5a60s2单片机手册

STC12C5A60S2单片机手册是一本详细介绍STC12C5A60S2单片机特性、功能以及使用方法的参考资料。这本手册对于想要了解和使用STC12C5A60S2单片机的工程师和学生来说非常重要。 首先,手册会详细介绍STC12C5A60S2单片机的基本特性。它将包括单片机的工作电压范围、时钟频率、存储容量等信息,这些特性对于确保单片机能够适用于特定的应用场景非常关键。 其次,手册会提供STC12C5A60S2单片机的功能描述。这包括单片机所支持的指令集、输入输出端口、通信接口等。这些功能可以帮助工程师更好地了解单片机的能力,为他们设计和开发适当的电路布局和软件代码提供指导。 在手册中,还会给出STC12C5A60S2单片机的引脚功能描述和电气特性。这将涵盖每个引脚的具体功能和用途,以及引脚的电气特性,例如驱动能力和输入电平范围。工程师可以根据这些信息来设计适当的电路连接。 此外,手册还会提供关于STC12C5A60S2单片机编程和调试的详细信息。它包括单片机所支持的编程语言、开发环境以及调试工具。这对于学习和使用STC12C5A60S2单片机来说非常重要,有助于确保开发过程的顺利进行。 最后,手册还会提供示例电路图和代码,以帮助工程师更好地理解和应用STC12C5A60S2单片机。这些示例可以作为起点,为工程师提供一些实际应用的指导,帮助他们更好地利用单片机的功能。 总的来说,STC12C5A60S2单片机手册是一本功能丰富的参考资料,它提供了关于STC12C5A60S2单片机基本特性、功能描述、引脚功能和电气特性、编程和调试等方面的详细信息。这本手册对于学习和使用STC12C5A60S2单片机的人来说是一个宝贵的工具,将帮助他们更好地理解和应用这款单片机。

相关推荐

### 回答1: stc12c5a60s2是一款单片机芯片,可以控制LCD1602液晶显示屏进行显示。通过编写程序,可以实现在LCD1602上显示各种文字、数字、符号等内容。这种组合可以用于各种电子设备中,例如计算器、温度计、电子钟等。 ### 回答2: stc12c5a60s2是一种常用的单片机,它拥有典型的8051指令集,并支持多达12MHz的系统时钟速度。该单片机导出的I/O口数量比较多,可满足大多数应用。LCD1602液晶显示器是一种16×2的字符型液晶显示器,它可以显示英文字母、数字、符号,也可用于中、日文字的显示。 stc12c5a60s2与LCD1602显示器的连接一般需要涉及到8个IO引脚,包括RS、RW、E、D0-D7。RS、RW、E是LCD的控制引脚,其中RS为RS=1时数据口D0-D7所输入的数据被认为是字符数据,RS=0时所输出的数据被认为是指令码;RW为RW=1时所读数据,RW=0时所写数据;E是LCD的使能引脚,当E有效时,LCD会响应RS和RW的数据。 对于stc12c5a60s2与LCD1602的连接,可以将RS接到P1.0引脚,RW连接到P1.1引脚,E连接到P1.2引脚,D0-D7分别连接到P2.0-P2.7引脚上。然后可以编写程序通过单片机控制LCD的显示,例如可以使用stc-isp V6.86软件结合C语言编写程序实现LCD的显示。 总的来说,stc12c5a60s2与LCD1602显示屏的组合比较常见,使用起来相对简单,也可以满足很多实际需求。对于初学者来说,可以通过学习相关的单片机及显示器知识,逐步深入了解其原理与应用,从而逐步掌握实际的应用技巧。 ### 回答3: stc12c5a60s2是一款单片机,而LCD1602则是一种常见的液晶显示器。 在使用stc12c5a60s2控制LCD1602显示之前,首先要确保硬件电路接线正确,比如要保证输入电压符合要求,数据线接对位置等等。 为了控制LCD1602显示,需要使用stc12c5a60s2的GPIO(通用输入输出)端口来给液晶显示器发送命令和数据。具体来说,需要对LCD1602液晶显示器进行初始化,包括设置模式和清屏等操作,然后才能将数据进行显示。 在控制LCD1602显示时,需要注意一些细节,比如操作速度、数据位长度、字库等。另外,为了简化程序编写,还可以使用现成的LCD1602库,比如Keil中自带的“LCD1602”文件夹,或者其他第三方库。 总之,控制LCD1602显示需要综合考虑硬件和软件两个方面,需要对单片机的GPIO端口有一定的了解和掌握。
### 回答1: AD5933是一款高精度阻抗测量芯片,可以测量复阻抗值的实部和虚部。下面是一个基于STC12C5A60S2的AD5933测量程序的框架,你可以根据自己的需求进行修改: c #include <reg52.h> #include <intrins.h> #define AD5933_ADDRESS 0x0D // AD5933地址 #define CONTROL_REG_ADDRESS 0x80 // 控制寄存器地址 #define START_FREQ_ADDRESS 0x82 // 起始频率地址 #define FREQ_INCR_ADDRESS 0x85 // 频率步进地址 #define NUM_INCR_ADDRESS 0x88 // 步进数目地址 #define SETTLING_CYCLES_ADDRESS 0x8B // 稳定周期地址 #define TEMP_ADDRESS 0x92 // 温度地址 #define REAL_DATA_ADDRESS 0x94 // 实部数据地址 #define IMAG_DATA_ADDRESS 0x96 // 虚部数据地址 #define SCL P1_5 #define SDA P1_6 unsigned char i; // 循环计数器 // 向I2C总线发送一个字节 void i2c_send_byte(unsigned char dat) { unsigned char i; for(i = 0; i < 8; i++) { SDA = (dat & 0x80) >> 7; dat <<= 1; _nop_(); SCL = 1; _nop_(); SCL = 0; } _nop_(); SDA = 1; _nop_(); SCL = 1; _nop_(); while(SCL == 0); } // 从I2C总线读取一个字节 unsigned char i2c_read_byte() { unsigned char i, dat = 0; for(i = 0; i < 8; i++) { dat <<= 1; _nop_(); SCL = 1; _nop_(); dat |= SDA; SCL = 0; } return dat; } // 向AD5933写入一个字节的数据 void write_ad5933(unsigned char reg_address, unsigned char dat) { i2c_start(); i2c_send_byte(AD5933_ADDRESS << 1); i2c_send_byte(reg_address); i2c_send_byte(dat); i2c_stop(); } // 从AD5933读取一个字节的数据 unsigned char read_ad5933(unsigned char reg_address) { unsigned char dat; i2c_start(); i2c_send_byte(AD5933_ADDRESS << 1); i2c_send_byte(reg_address); i2c_start(); i2c_send_byte((AD5933_ADDRESS << 1) | 0x01); dat = i2c_read_byte(); i2c_stop(); return dat; } // 初始化AD5933 void init_ad5933() { unsigned char i; // 设置控制寄存器 write_ad5933(CONTROL_REG_ADDRESS, 0x00); // 设置起始频率 write_ad5933(START_FREQ_ADDRESS, 0x00); write_ad5933(START_FREQ_ADDRESS + 1, 0x80); write_ad5933(START_FREQ_ADDRESS + 2, 0x00); // 设置频率步进 write_ad5933(FREQ_INCR_ADDRESS, 0x00); write_ad5933(FREQ_INCR_ADDRESS + 1, 0x00); write_ad5933(FREQ_INCR_ADDRESS + 2, 0x00); // 设置步进数目 write_ad5933(NUM_INCR_ADDRESS, 0x00); write_ad5933(NUM_INCR_ADDRESS + 1, 0x01); // 设置稳定周期 write_ad5933(SETTLING_CYCLES_ADDRESS, 0x00); write_ad5933(SETTLING_CYCLES_ADDRESS + 1, 0x01); // 开启外部系统时钟 write_ad5933(CONTROL_REG_ADDRESS, 0x10); } // 读取AD5933的实部和虚部数据 void read_ad5933_data(unsigned char *real_data, unsigned char *imag_data) { unsigned char temp; // 等待数据就绪 while((read_ad5933(CONTROL_REG_ADDRESS) & 0x04) == 0); // 读取实部数据 write_ad5933(REAL_DATA_ADDRESS, 0x00); *real_data = read_ad5933(REAL_DATA_ADDRESS + 1); // 读取虚部数据 write_ad5933(IMAG_DATA_ADDRESS, 0x00); *imag_data = read_ad5933(IMAG_DATA_ADDRESS + 1); } // 主程序 void main() { unsigned char real_data, imag_data; // 初始化AD5933 init_ad5933(); while(1) { // 读取阻抗测量数据 read_ad5933_data(&real_data, &imag_data); // 在这里处理数据 // ... } } 在程序中,我们首先定义了AD5933的I2C地址以及各个寄存器的地址。然后我们通过定义SCL和SDA引脚的宏来操作I2C总线。在i2c_send_byte函数和i2c_read_byte函数中,我们实现了I2C总线的发送和接收操作。通过write_ad5933和read_ad5933函数,我们可以向AD5933芯片写入数据或者从AD5933芯片读取数据。在init_ad5933函数中,我们设置了AD5933的各项参数,包括起始频率、频率步进、步进数目等。在read_ad5933_data函数中,我们读取了AD5933的实部和虚部数据,并返回给主程序进行处理。 在主程序中,我们首先初始化AD5933,然后进入一个无限循环,在循环中不断读取阻抗测量数据,并进行相应的处理。你只需要在程序中加入你自己的处理代码,就可以实现测量不同阻抗值的功能了。 ### 回答2: STC12c5a60s2是一款单片机,P1.6引脚与SDA引脚相连,P1.5引脚与SCL引脚相连。AD5933是一款测量电阻的芯片,我们需要使用STC12c5a60s2与AD5933进行通信,并编写程序以不断测量不同阻抗的值。 首先,我们需要在Keil中创建一个新的工程。然后,我们需要配置STC12c5a60s2的GPIO引脚,将P1.6设置为SDA引脚,将P1.5设置为SCL引脚。 接下来,我们需要加载AD5933的驱动程序,并初始化AD5933芯片。在初始化期间,我们需要设置AD5933的工作模式和其他参数,例如反馈电阻为10k欧姆。 然后,我们需要编写一个循环,以便不断测量不同阻抗的值。在每次循环中,我们需要发送一个开始命令给AD5933,然后等待AD5933完成测量。之后,我们需要读取AD5933的测量结果,并处理该结果。 在处理AD5933的测量结果时,我们可以将其显示在屏幕上或存储在一个数组中。我们还可以与其他设备进行通信,将结果发送给其他设备进行进一步处理或显示。 需要注意的是,AD5933的具体使用方法和命令可以在其数据手册中找到。我们需要根据实际需求和硬件连接来编写程序,并进行适当的调试和测试,以确保测量结果的准确性和可靠性。 总之,通过使用Keil编写程序,我们可以控制STC12c5a60s2与AD5933进行通信,并不断测量不同阻抗的值。这将使我们能够进行电阻的测量和分析,从而满足各种应用需求。 ### 回答3: STC12c5a60s2是一款单片机,其中的P1.6引脚与SDA引脚相连,P1.5引脚与SCL引脚相连。反馈电阻选择10k欧姆,用keil编写程序来实现AD5933的不断测量不同阻抗值的功能。 首先,在keil中创建一个新的工程,并选择STC12C5A60S2作为目标芯片。然后,引入AD5933的库文件,该库文件包含了AD5933的相关函数和定义。 接下来,需要初始化AD5933芯片。首先,通过I2C总线与AD5933进行通信,将P1.5引脚配置为SCL引脚,P1.6引脚配置为SDA引脚。之后,使用AD5933库函数进行初始化设置,包括设置参考电压、增益和输出频率等。 在测量过程中,可以根据需求来设置不同的阻抗值。通过AD5933库函数设置起始频率、终止频率和步长等参数,然后使用AD5933的频率扫描功能,按照步长逐渐改变频率值,并将测量结果存储在指定的变量中。可以通过AD5933的库函数将测量结果输出到串口或者显示设备上。 为了实现连续测量不同阻抗值的功能,可以使用循环结构进行控制。在循环中不断改变AD5933的频率参数,然后进行测量,最后延时一段时间后继续下一次的测量。可以根据需要设置延时的时间间隔,以控制测量的频率。 最后,可以根据实际的需求来处理测量结果。例如,可以通过串口将结果输出到上位机进行进一步分析和处理,或者将结果保存至存储设备中进行备份和记录。 总之,通过使用keil编写程序,结合STC12c5a60s2单片机和AD5933芯片的功能,可以实现不断测量不同阻抗值的功能。
由于没有给出液晶屏型号和连接方式等详细信息,下面仅提供STC12C5A60S2单片机8位AD转换PT100温度的程序参考,具体实现需要根据具体情况进行调整: C #include<reg52.h> //包含STC12C5A60S2单片机的头文件 #define uchar unsigned char #define uint unsigned int sbit DQ=P2^4; //定义DQ管脚,连接PT100的三线制接口 void delay(uint x) //延时函数,用于等待PT100的温度数据稳定 { uint i,j; for(i=0;i<x;i++) for(j=0;j<125;j++); } void Init_ADC() //初始化ADC模块 { ADC_RES=0; //清零ADC转换结果寄存器 ADC_CONTR=0x80; //设置ADC工作模式和时钟,具体可参考数据手册 } uchar Read_ADC(uchar ch) //读取ADC转换结果函数 { uchar dat; ADC_CONTR=0x80|ch; //设置ADC通道和启动转换 delay(1); //等待ADC转换完成 dat=ADC_RES; //读取转换结果 ADC_RES=0; //清零ADC转换结果寄存器 return dat; //返回转换结果 } float Get_Temperature() //获取温度函数,根据PT100的温度阻值特性曲线进行计算 { uchar i; float temp,res; uchar buf[10]; res=Read_ADC(4); //读取PT100的温度阻值 res=(float)res/255.0*10.0; //将ADC转换结果换算成电压值 res=res/0.0025; //将电压值换算成PT100的阻值 temp=res-100.0; //计算出PT100的温度值 return temp; //返回温度值 } void main() { float temp; Init_ADC(); //初始化ADC模块 while(1) { temp=Get_Temperature(); //获取温度值 //将温度值显示在液晶屏上,具体实现需要根据液晶屏型号和连接方式进行调整 } }
下面是一份基本的代码框架,可以根据具体需要进行修改: c #include <STC12C5A60S2.h> // 定义AD5933地址 #define ADDR_WRITE 0xD0 #define ADDR_READ 0xD1 // 定义AD5933命令 #define CMD_CONTROL_HB 0x80 #define CMD_CONTROL_LB 0x82 #define CMD_START_FREQ 0x85 #define CMD_FREQ_INC 0x86 #define CMD_FREQ_NUM 0x87 #define CMD_MEASURE 0x88 #define CMD_TEMP_MEAS 0x8F // 定义校准电阻和反馈电阻 #define CALIB_RESISTOR 10000 #define FEEDBACK_RESISTOR 10000 // 定义变量 unsigned int freqStart = 100; // 起始频率100Hz unsigned int freqInc = 100; // 频率步进100Hz unsigned int freqNum = 10; // 频率点数10个 // 函数声明 void delay(unsigned int t); void i2c_start(void); void i2c_stop(void); void i2c_send_byte(unsigned char dat); unsigned char i2c_recv_byte(void); void ad5933_init(void); void ad5933_start_freq_sweep(void); // 主函数 void main(void) { // 初始化IO口 P1M1 = 0x00; //P1.5和P1.6设置为普通IO口 P1M0 = 0xFF; // 初始化AD5933 ad5933_init(); // 启动频率扫描 ad5933_start_freq_sweep(); while(1); } // 延时函数 void delay(unsigned int t) { unsigned int i; while(t--) for(i=0; i<100; i++); } // I2C总线起始信号 void i2c_start(void) { SDA = 1; SCL = 1; delay(1); SDA = 0; delay(1); SCL = 0; delay(1); } // I2C总线停止信号 void i2c_stop(void) { SDA = 0; SCL = 1; delay(1); SDA = 1; delay(1); } // I2C总线发送一个字节 void i2c_send_byte(unsigned char dat) { unsigned char i; for(i=0; i<8; i++) { SDA = (dat & 0x80) ? 1 : 0; SCL = 1; delay(1); SCL = 0; dat <<= 1; delay(1); } SDA = 1; // 主机释放SDA总线 SCL = 1; // 主机读取ACK位 delay(1); SCL = 0; // 主机发送P时钟结束 delay(1); } // I2C总线接收一个字节 unsigned char i2c_recv_byte(void) { unsigned char i, dat = 0; SDA = 1; // 主机释放SDA总线 for(i=0; i<8; i++) { SCL = 1; delay(1); dat <<= 1; dat |= SDA; SCL = 0; delay(1); } return dat; } // 初始化AD5933 void ad5933_init(void) { // 控制字节1: 外部时钟源,增量模式,输出振幅2Vpp i2c_start(); i2c_send_byte(ADDR_WRITE); i2c_send_byte(CMD_CONTROL_HB); i2c_send_byte(0x10); i2c_stop(); // 控制字节2: 内部系统时钟,增量模式,1个增量,输出振幅2Vpp i2c_start(); i2c_send_byte(ADDR_WRITE); i2c_send_byte(CMD_CONTROL_LB); i2c_send_byte(0x01); i2c_stop(); // 设置起始频率 i2c_start(); i2c_send_byte(ADDR_WRITE); i2c_send_byte(CMD_START_FREQ); i2c_send_byte((unsigned char)(freqStart >> 8)); i2c_send_byte((unsigned char)freqStart); i2c_stop(); // 设置频率步进 i2c_start(); i2c_send_byte(ADDR_WRITE); i2c_send_byte(CMD_FREQ_INC); i2c_send_byte((unsigned char)(freqInc >> 8)); i2c_send_byte((unsigned char)freqInc); i2c_stop(); // 设置频率点数 i2c_start(); i2c_send_byte(ADDR_WRITE); i2c_send_byte(CMD_FREQ_NUM); i2c_send_byte((unsigned char)(freqNum >> 8)); i2c_send_byte((unsigned char)freqNum); i2c_stop(); // 设置增益 i2c_start(); i2c_send_byte(ADDR_WRITE); i2c_send_byte(CMD_MEASURE); i2c_send_byte(0x01); i2c_stop(); } // 启动频率扫描 void ad5933_start_freq_sweep(void) { unsigned int i; unsigned long real = 0; // 实部 unsigned long image = 0; // 虚部 unsigned long impedance = 0; // 阻抗值 unsigned long resistance = 0; // 校准电阻值 float gain = 0, phase = 0; // 增益和相位 for(i=0; i<freqNum; i++) { // 发送测量命令 i2c_start(); i2c_send_byte(ADDR_WRITE); i2c_send_byte(CMD_MEASURE); i2c_send_byte(0x01); i2c_stop(); // 等待测量完成 while(1) { i2c_start(); i2c_send_byte(ADDR_WRITE); i2c_send_byte(CMD_MEASURE); if(i2c_recv_byte() & 0x01) break; i2c_stop(); } i2c_stop(); // 读取实部和虚部 i2c_start(); i2c_send_byte(ADDR_WRITE); i2c_send_byte(CMD_TEMP_MEAS); i2c_stop(); i2c_start(); i2c_send_byte(ADDR_READ); real = i2c_recv_byte(); real <<= 8; real |= i2c_recv_byte(); image = i2c_recv_byte(); image <<= 8; image |= i2c_recv_byte(); i2c_stop(); // 计算阻抗值 impedance = (real * real) + (image * image); impedance = (unsigned long)sqrt((float)impedance); // 计算校准电阻值 resistance = impedance / gain; // 输出校准电阻值 printf("Resistance: %ld\r\n", resistance); // 更新增益和相位 gain = (float)CALIB_RESISTOR / (float)resistance; phase = atan2((float)image, (float)real) * 180.0 / 3.1415926; } } 需要注意的是,以上代码仅供参考,具体实现可能需要根据硬件电路和AD5933数据手册进行调整。另外,需要注意STC12C5A60S2单片机的I2C时序和AD5933的I2C时序是否一致,如果不一致需要进行相应调整。
以下是基于STC8G2K64S4单片机读取AS5600角度的示例代码: c #include "stc12c5a60s2.h" // 引入单片机头文件 #define AS5600_ADDR 0x36 // AS5600的I2C地址 sbit SCL = P1^0; // 定义I2C时钟引脚 sbit SDA = P1^1; // 定义I2C数据引脚 unsigned char angle_low, angle_high; void delay(unsigned int t) // 延时函数 { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 120; j++); } void I2C_start() // I2C起始信号 { SDA = 1; delay(1); SCL = 1; delay(1); SDA = 0; delay(1); SCL = 0; delay(1); } void I2C_stop() // I2C停止信号 { SDA = 0; delay(1); SCL = 1; delay(1); SDA = 1; delay(1); } unsigned char I2C_write_byte(unsigned char dat) // I2C写一个字节 { unsigned char i, ack; for (i = 0; i < 8; i++) { SDA = dat & 0x80; delay(1); SCL = 1; delay(1); SCL = 0; delay(1); dat <<= 1; } SDA = 1; delay(1); SCL = 1; delay(1); ack = SDA; SCL = 0; delay(1); return ack; } unsigned char I2C_read_byte() // I2C读一个字节 { unsigned char i, dat; SDA = 1; delay(1); for (i = 0; i < 8; i++) { SCL = 1; delay(1); dat <<= 1; dat |= SDA; SCL = 0; delay(1); } return dat; } void AS5600_read_angle() // 读取AS5600的角度值 { I2C_start(); I2C_write_byte(AS5600_ADDR); I2C_write_byte(0x0E); I2C_start(); I2C_write_byte(AS5600_ADDR + 1); angle_high = I2C_read_byte(); angle_low = I2C_read_byte(); I2C_stop(); } void main() { while (1) { AS5600_read_angle(); // 将angle_high和angle_low拼接成16位角度值 unsigned int angle = ((unsigned int)angle_high << 8) | angle_low; // 输出角度值 printf("angle: %u\n", angle); delay(100); // 延时一段时间后再次读取 } } 需要注意的是,上述代码中的printf函数需要在编译环境中支持,如果是使用Keil等集成开发环境,则需要在工程设置中打开相应的printf支持选项。另外,上述代码中的I2C通信部分只是简单的实现,实际应用中可能需要更加完善的I2C通信协议处理。
以下是一个简单的STC单片机电子时钟汇编代码示例: ;STC12C5A60S2 电子时钟程序 ;晶振频率为11.0592MHz ;使用P1.0~P1.5口接LED数码管显示 ;使用P0.0~P0.3口接DS1302时钟芯片 include <STC12C5A60S2.H> ORG 0000H MOV SP,#30H ;设置堆栈指针 MOV P0,#00H ;P0口初始值为0 MOV P1,#00H ;P1口初始值为0 ;初始化DS1302时钟芯片 INIT_DS1302: SET_RST ;拉高RST引脚 SET_SCLK ;拉高SCLK引脚 CLR_IO ;拉低IO引脚 MOV A,#8CH ;发送写保护命令 CALL SEND_BYTE ;发送一个字节 MOV A,#00H ;秒数清零 CALL WRITE_DS1302 ;写入秒数 MOV A,#80H ;关闭写保护 CALL SEND_BYTE ;发送一个字节 CLR_RST ;拉低RST引脚,完成初始化 RET ;发送一个字节到DS1302时钟芯片 SEND_BYTE: MOV C,#8 ;循环8次发送8位数据 SEND_LOOP: CLR_SCLK ;拉低SCLK引脚 NOP ;延时 MOV CARRY,A.0 ;将A寄存器的最低位存入进位标志 RRC A ;将A寄存器右移一位,最低位用进位标志填充 JNC SEND_SKIP ;如果进位标志为0,跳转到SEND_SKIP SET_IO ;将IO引脚拉高 SEND_SKIP: SET_SCLK ;拉高SCLK引脚 NOP ;延时 DJNZ C,SEND_LOOP ;循环8次 RET ;从DS1302时钟芯片读取一个字节 READ_BYTE: MOV C,#8 ;循环8次读取8位数据 READ_LOOP: CLR_SCLK ;拉低SCLK引脚 NOP ;延时 MOV A.0,CARRY ;将进位标志存入A寄存器最低位 RLC A ;将A寄存器左移一位,最高位用进位标志填充 JNC READ_SKIP ;如果进位标志为0,跳转到READ_SKIP SET_IO ;将IO引脚拉高 READ_SKIP: SET_SCLK ;拉高SCLK引脚 NOP ;延时 DJNZ C,READ_LOOP ;循环8次 RET ;向DS1302时钟芯片写入一个字节 WRITE_DS1302: CALL SEND_BYTE ;发送一个字节 CALL READ_BYTE ;读取一个字节 RET ;BCD码转换为二进制数 BCD_TO_BIN: MOV R7,#0AH ;将R7寄存器初始化为10 MOV B,#00H ;B寄存器用于存储BCD码 MOV A,R5 ;将A寄存器存储的BCD码复制到B寄存器 ANL A,#0FH ;将A寄存器最低4位与0FH按位与,得到十进制数的个位 ADD A,B ;将个位加到B寄存器中 MOV B,A ;将结果存回B寄存器 MOV A,R5 ;将A寄存器存储的BCD码复制到R5寄存器 SWAP A ;将A寄存器高低4位互换 ANL A,#0FH ;将A寄存器最低4位与0FH按位与,得到十进制数的十位 ADD A,B ;将十位加到B寄存器中 MOV B,A ;将结果存回B寄存器 MOV A,R7 ;将R7寄存器中的10复制到A寄存器中 SUBB A,B ;将10减去BCD码转换后的结果,得到十进制数的百位 RET ;更新时钟显示 UPDATE_CLOCK: MOV A,#80H ;发送读保护命令 CALL SEND_BYTE ;发送一个字节 CALL READ_BYTE ;读取一个字节 MOV R5,A ;将读取到的秒数存入R5寄存器中 MOV A,#84H ;发送读保护命令 CALL SEND_BYTE ;发送一个字节 CALL READ_BYTE ;读取一个字节 MOV R6,A ;将读取到的分钟数存入R6寄存器中 MOV A,#88H ;发送读保护命令 CALL SEND_BYTE ;发送一个字节 CALL READ_BYTE ;读取一个字节 MOV R7,A ;将读取到的小时数存入R7寄存器中 CALL BCD_TO_BIN ;将BCD码转换为十进制数 MOV DPL,#_DIGITS ;将数码管显示表的首地址存入DPL寄存器中 MOVX A,@DPTR ;将数码管显示表的第一个数码复制到A寄存器中 MOV P1,A ;将A寄存器中的数码显示到数码管 INC DPTR ;指向数码管显示表的下一个数码 MOVX A,@DPTR ;将数码管显示表的第二个数码复制到A寄存器中 MOV P1,A ;将A寄存器中的数码显示到数码管 INC DPTR ;指向数码管显示表的下一个数码 MOVX A,@DPTR ;将数码管显示表的第三个数码复制到A寄存器中 MOV P1,A ;将A寄存器中的数码显示到数码管 INC DPTR ;指向数码管显示表的下一个数码 MOVX A,@DPTR ;将数码管显示表的第四个数码复制到A寄存器中 MOV P1,A ;将A寄存器中的数码显示到数码管 RET ;主程序入口 MAIN: CALL INIT_DS1302 ;初始化DS1302时钟芯片 MOV TMOD,#01H ;设置计数器0为16位定时器模式 MOV TH0,#3CH ;设置计数器0的高8位计数值 MOV TL0,#0B0H ;设置计数器0的低8位计数值 SET_ET0 ;允许计数器0中断 SET_EA ;开启总中断 SET_TR0 ;启动计数器0 UPDATE_CLOCK ;更新时钟显示 JMP $ ;程序循环 ;计数器0中断服务函数 TIMER0_ISR: CLR TF0 ;清除计数器0中断标志 MOV TH0,#3CH ;设置计数器0的高8位计数值 MOV TL0,#0B0H ;设置计数器0的低8位计数值 UPDATE_CLOCK ;更新时钟显示 RETI ;数码管显示表 DIGITS: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;0~9 注意:以上代码仅供参考,具体实现可能需要根据具体的硬件平台和使用场景进行调整。建议在编写代码之前先阅读相关的硬件资料和单片机手册,确保代码的正确性和可靠性。
### 回答1: 以下是基于STC12C5A60S2单片机的秒数码管倒计时带573锁存器的代码示例: #include <STC12C5A60S2.h> #define uchar unsigned char #define uint unsigned int sbit LATCH = P2^0; // 锁存器控制引脚 sbit DIO = P2^1; // 数据引脚 sbit CLK = P2^2; // 时钟引脚 uchar code LED_DuanMa[] = { // 数码管段码表 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 }; void delay(uint t) // 延时函数 { uint i, j; for (i = t; i > 0; i--) { for (j = 110; j > 0; j--); } } void HC595_SendData(uchar dat) // 向74HC573发送数据 { uchar i; for (i = 0; i < 8; i++) { CLK = 0; DIO = (dat & 0x80) >> 7; dat <<= 1; CLK = 1; } } void Display(uchar *p) // 在数码管上显示数字 { HC595_SendData(~0x01); // 先清除锁存器输出 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*p]); // 显示个位 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*(p + 1)]); // 显示十位 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*(p + 2)]); // 显示百位 LATCH = 0; LATCH = 1; HC595_SendData(~0x80); // 输出锁存信号 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*(p + 3)]); // 显示千位 LATCH = 0; LATCH = 1; } void main() { uchar time[4] = {9, 5, 5, 9}; // 初始时间为 95:59 uint count = 0; while (1) { Display(time); // 显示当前时间 delay(1000); // 延时1秒 if (++count >= 1000) { // 经过1秒 count = 0; if (--time[0] == 0xFF) { // 秒数减1 time[0] = 9; if (--time[1] == 0xFF) { // 十位秒数减1 time[1] = 5; if (--time[2] == 0xFF) { // 分钟数减1 time[2] = 9; if (--time[3] == 0xFF) { // 小时数减1 time[3] = 9; } } } } } } } 与前面的代码示例相比,本代码加入了74HC573芯片作为锁存器,可以确保计时器的精度,并且可以实现秒数码管的倒计时。在计时过程中,可以通过 time 数组来设置和获取当前时间值。通过修改 delay 函数中的参数值可以调整计时器的计时间隔。需要注意的是,由于74HC573的锁存信号是高电平有效,因此在输出锁存信号时需要向芯片发送 ~0x80 的数据,即取反后最高位为0,其余位为1的数据。 ### 回答2: STC1299是一款常见的单片机,秒数码管倒计时带573锁存器是一种常见的倒计时电路。在这种电路中,通过STC1299控制573锁存器,实现倒计时的功能。 代码的实现步骤如下: 1. 首先,需要定义和初始化倒计时所需的相关变量,比如秒、分钟、小时等。 2. 设置STC1299的引脚连接。将STC1299的输出引脚与573锁存器的数据引脚相连,将STC1299的控制引脚与CLK和STB引脚相连。 3. 编写程序的主循环。在循环中,通过STC1299的控制引脚产生时钟信号,使得573锁存器逐位接收STC1299的输出,并将其存储。这样可以实现对倒计时数据的更新和显示。 4. 在循环中,通过STC1299的控制引脚产生时钟信号的频率来控制倒计时的速度。可以通过改变时钟信号的频率,实现倒计时速度的调整。 5. 当倒计时结束时,可以通过编写相应的程序逻辑,实现相应的处理。比如,可以发出蜂鸣器的声音或者改变LED灯的状态,以提醒倒计时结束。 通过以上步骤,就可以实现使用STC1299控制573锁存器的倒计时功能。具体的代码和电路连接方式需要根据具体的情况进行设计和调整。 ### 回答3: STC1299是一款单片机芯片,能够通过编程实现秒数码管的倒计时功能,并带有573锁存器。下面是一个简单的代码实现: 首先,我们需要引入STC1299的相关头文件和寄存器定义: #include <stc/stc12c5a60s2.h> 接下来,我们需要定义一些变量和常量: sbit digit1 = P2^0; // 数码管第一位 sbit digit2 = P2^1; // 数码管第二位 sbit digit3 = P2^2; // 数码管第三位 sbit digit4 = P2^3; // 数码管第四位 sbit latch = P1^2; // 573锁存器控制引脚 unsigned char display[4]; // 存储数码管数字的数组 unsigned char count = 60; // 倒计时初始值 然后,我们需要编写一个倒计时函数: void countdown() { while(count > 0) { // 数字转换为7段数码管对应的编码 display[0] = count / 10; display[1] = count % 10; // 依次显示每一位数字 digit1 = 1; P0 = display[0]; digit1 = 0; digit2 = 1; P0 = display[1]; digit2 = 0; // 延时一秒 delay(1000); // 倒计时减一 count--; } } 最后,在主函数中调用倒计时函数即可实现倒计时功能: void main() { // 初始化 latch = 0; // 循环进行倒计时 while(1) { countdown(); } } 以上就是简单的STC1299秒数码管倒计时带573锁存器的代码示例。通过这段代码,可以实现将倒计时从60秒开始逐渐减少,并在数码管上显示。
以下是基于STC12系列单片机的数码管倒计时带锁存器的代码示例: #include <STC12C5A60S2.h> #define uchar unsigned char #define uint unsigned int sbit LATCH = P2^0; // 锁存器控制引脚 sbit DIO = P2^1; // 数据引脚 sbit CLK = P2^2; // 时钟引脚 uchar code LED_DuanMa[] = { // 数码管段码表 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 }; void delay(uint t) // 延时函数 { uint i, j; for (i = t; i > 0; i--) { for (j = 110; j > 0; j--); } } void HC595_SendData(uchar dat) // 向74HC595发送数据 { uchar i; for (i = 0; i < 8; i++) { CLK = 0; DIO = (dat & 0x80) >> 7; dat <<= 1; CLK = 1; } } void Display(uchar *p) // 在数码管上显示数字 { HC595_SendData(0x00); // 先清空 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*p]); // 显示个位 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*(p + 1)]); // 显示十位 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*(p + 2)]); // 显示百位 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*(p + 3)]); // 显示千位 LATCH = 0; LATCH = 1; } void main() { uchar time[4] = {9, 9, 5, 9}; // 初始时间为 99:59 uint count = 0; while (1) { Display(time); // 显示当前时间 delay(1000); // 延时1秒 if (++count >= 1000) { // 经过1秒 count = 0; if (--time[0] == 0xFF) { // 秒数减1 time[0] = 9; if (--time[1] == 0xFF) { // 分钟数减1 time[1] = 5; if (--time[2] == 0xFF) { // 小时数减1 time[2] = 9; if (--time[3] == 0xFF) { // 小时数再减1,归零 time[3] = 9; } } } } } } } 本代码使用74HC595芯片实现了数码管的控制,并且引入了计时器,可以实现倒计时功能。在计时过程中,可以通过 time 数组来设置和获取当前时间值。通过修改 delay 函数中的参数值可以调整计时器的计时间隔。
根据引用\[1\]中的代码片段,可以看出配置PAC5532的PWM需要进行GPIO端口的初始化。具体的配置步骤如下: 1. 首先,需要使能GPIOA和GPIOB的时钟,可以使用RCC_APB2PeriphClockCmd函数进行配置。 2. 然后,需要配置GPIOA的Pin_6和Pin_7为复用推挽输出模式,即作为PWM输出引脚。可以使用GPIO_InitStructure结构体进行配置,设置GPIO_Pin为GPIO_Pin_6|GPIO_Pin_7,GPIO_Mode为GPIO_Mode_AF_PP,GPIO_Speed为GPIO_Speed_50MHz。 3. 最后,使用GPIO_Init函数将GPIOA的配置应用到实际的引脚上。 关于PAC5532的PWM配置的具体细节,由于没有提供更多的相关信息,无法给出更详细的回答。建议参考PAC5532的官方文档或者相关的资料来获取更详细的配置信息。引用\[2\]中提到PAC5532的文档可能没有中文文档,所以可能需要花费一些功夫来了解这款芯片的配置。引用\[3\]中的代码片段可能是用来修改PWM占空比的示例代码,可以参考其中的逻辑来进行PWM的占空比调整。 #### 引用[.reference_title] - *1* [PWM配置](https://blog.csdn.net/Gdou_YUN/article/details/62216675)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【PAC集成电机控制芯片】了解PAC集成电机控制芯片](https://blog.csdn.net/a_xiaoning/article/details/123453636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [基于51单片机STC12C5A60S2的PWM软硬件配置](https://blog.csdn.net/weixin_51583957/article/details/121594105)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
根据提供的引用内容,可以了解到ST7735S是一种TFT液晶屏幕驱动芯片,而引用中提到的1.44寸TFT彩屏使用的就是ST7735S芯片。同时,引用中还提到了使用增强型51单片机STC12系列的MCU来驱动该屏幕。 因此,驱动ST7735S芯片的步骤如下: 1. 确定使用的MCU型号,例如STC12系列。 2. 根据ST7735S的引脚说明,连接MCU和液晶屏幕的SPI接口。 3. 编写程序控制MCU向ST7735S发送命令和数据,以控制液晶屏幕的显示。 以下是一个简单的示例代码,使用STC12C5A60S2作为MCU,驱动ST7735S芯片的1.44寸TFT彩屏: c #include <reg52.h> sbit SDA = P1^0; // SPI数据线 sbit SCK = P1^1; // SPI时钟线 sbit CS = P1^2; // 片选信号线 void delay(unsigned int t) // 延时函数 { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 125; j++); } void write_cmd(unsigned char cmd) // 向ST7735S发送命令 { CS = 0; // 片选信号线拉低 SDA = 0; // 数据线拉低,表示发送命令 SCK = 0; // 时钟线拉低 SCK = 1; // 时钟线拉高 SDA = cmd; // 发送命令 SCK = 0; // 时钟线拉低 CS = 1; // 片选信号线拉高 } void write_data(unsigned char dat) // 向ST7735S发送数据 { CS = 0; // 片选信号线拉低 SDA = 1; // 数据线拉高,表示发送数据 SCK = 0; // 时钟线拉低 SCK = 1; // 时钟线拉高 SDA = dat; // 发送数据 SCK = 0; // 时钟线拉低 CS = 1; // 片选信号线拉高 } void init_lcd() // 初始化液晶屏幕 { write_cmd(0x11); // Sleep out delay(100); write_cmd(0x29); // Display on write_cmd(0x36); // Memory data access control write_data(0x08); // MY=0, MX=0, MV=0, ML=0, BGR=1 write_cmd(0x3A); // Interface pixel format write_data(0x05); // 16 bits/pixel write_cmd(0xB2); // Porch control write_data(0x0C); write_data(0x0C); write_data(0x00); write_data(0x33); write_data(0x33); write_cmd(0xB7); // Gate control write_data(0x35); write_cmd(0xBB); // VCOMS setting write_data(0x19); write_cmd(0xC0); // LCM control write_data(0x2C); write_cmd(0xC2); // VDV and VRH command enable write_data(0x01); write_cmd(0xC3); // VRH set write_data(0x12); write_cmd(0xC4); // VDV set write_data(0x20); write_cmd(0xC6); // Frame rate control write_data(0x0F); write_cmd(0xD0); // Power control write_data(0xA4); write_data(0xA1); write_cmd(0xE0); // Positive gamma correction write_data(0xD0); write_data(0x04); write_data(0x0D); write_data(0x11); write_data(0x13); write_data(0x2B); write_data(0x3F); write_data(0x54); write_data(0x4C); write_data(0x18); write_data(0x0D); write_data(0x0B); write_data(0x1F); write_data(0x23); write_cmd(0xE1); // Negative gamma correction write_data(0xD0); write_data(0x04); write_data(0x0D); write_data(0x11); write_data(0x13); write_data(0x2C); write_data(0x3F); write_data(0x44); write_data(0x51); write_data(0x2F); write_data(0x1F); write_data(0x1F); write_data(0x20); write_data(0x23); write_cmd(0x2A); // Column address set write_data(0x00); write_data(0x00); write_data(0x00); write_data(0x7F); write_cmd(0x2B); // Row address set write_data(0x00); write_data(0x00); write_data(0x00); write_data(0x9F); write_cmd(0x2C); // Memory write } void main() { init_lcd(); // 初始化液晶屏幕 // 在屏幕上显示一些内容 write_cmd(0x2A); // Column address set write_data(0x00); write_data(0x00); write_data(0x00); write_data(0x7F); write_cmd(0x2B); // Row address set write_data(0x00); write_data(0x00); write_data(0x00); write_data(0x9F); write_cmd(0x2C); // Memory write unsigned int i, j; for (i = 0; i < 128; i++) for (j = 0; j < 160; j++) write_data(0xF800); // 红色 while (1); }

最新推荐

ubhz射频收发器 头豹词条报告系列-17页.pdf.zip

行业报告 文件类型:PDF格式 打开方式:双击打开,无解压密码 大小:10M以内

数模转换芯片DAC_AD5328BRUZ-REEL7_规格书.pdf

数模转换芯片DAC_AD5328BRUZ-REEL7_规格书_ADI(亚德诺)_LINEAR(凌特)数模转换芯片DAC规格书,中文数据手册,适合硬件电路设计开发人员使用。

psd电脑模版010.psd

psd电脑模版010.psd

项目案例-班级管理系统

一:需求分析 1.功能需求 1).能够实现对班级学生基本资料的录入,包括学生的学号,姓名,性别,所学专业,家庭住址以及出生年月等。 2).能够实现对学生基本资料的修改。 3).根据学号对学生资料进行查询。 4).能够删除某些学生的资料。 二:总体设计 本班级管理系统共有6个java源文件。 类之间的主要关系如下图所示: 各主类的主要作用如下: 1).StudentManager.java 该java文件的类负责创建班级学生管理系统的主窗口。该类包含main方法,程序从该类开始执行。 2).StudentStituation.java 该文件的类负责创建班级学生管理系统的学生信息录入界面。 3).ModifySituation.java 该文件的类负责创建班级学生管理系统的学生基本信息修改界面。 4).Inquest.java 该文件的类负责创建班级学生管理系统的学生基本信息查询界面。 5).Delete.java 该文件的类负责创建班级学生管理系统的学生信息删除界面。 6).Student.java 负责创建存放学生信息的对象。

简单的基于SSM框架的在线商城系统.zip

1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 -------- 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

安全文明监理实施细则_工程施工土建监理资料建筑监理工作规划方案报告_监理实施细则.ppt

安全文明监理实施细则_工程施工土建监理资料建筑监理工作规划方案报告_监理实施细则.ppt

"REGISTOR:SSD内部非结构化数据处理平台"

REGISTOR:SSD存储裴舒怡,杨静,杨青,罗德岛大学,深圳市大普微电子有限公司。公司本文介绍了一个用于在存储器内部进行规则表达的平台REGISTOR。Registor的主要思想是在存储大型数据集的存储中加速正则表达式(regex)搜索,消除I/O瓶颈问题。在闪存SSD内部设计并增强了一个用于regex搜索的特殊硬件引擎,该引擎在从NAND闪存到主机的数据传输期间动态处理数据为了使regex搜索的速度与现代SSD的内部总线速度相匹配,在Registor硬件中设计了一种深度流水线结构,该结构由文件语义提取器、匹配候选查找器、regex匹配单元(REMU)和结果组织器组成。此外,流水线的每个阶段使得可能使用最大等位性。为了使Registor易于被高级应用程序使用,我们在Linux中开发了一组API和库,允许Registor通过有效地将单独的数据块重组为文件来处理SSD中的文件Registor的工作原

typeerror: invalid argument(s) 'encoding' sent to create_engine(), using con

这个错误通常是由于使用了错误的参数或参数格式引起的。create_engine() 方法需要连接数据库时使用的参数,例如数据库类型、用户名、密码、主机等。 请检查你的代码,确保传递给 create_engine() 方法的参数是正确的,并且符合参数的格式要求。例如,如果你正在使用 MySQL 数据库,你需要传递正确的数据库类型、主机名、端口号、用户名、密码和数据库名称。以下是一个示例: ``` from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://username:password@hos

数据库课程设计食品销售统计系统.doc

数据库课程设计食品销售统计系统.doc

海量3D模型的自适应传输

为了获得的目的图卢兹大学博士学位发布人:图卢兹国立理工学院(图卢兹INP)学科或专业:计算机与电信提交人和支持人:M. 托马斯·福吉奥尼2019年11月29日星期五标题:海量3D模型的自适应传输博士学校:图卢兹数学、计算机科学、电信(MITT)研究单位:图卢兹计算机科学研究所(IRIT)论文主任:M. 文森特·查维拉特M.阿克塞尔·卡里尔报告员:M. GWendal Simon,大西洋IMTSIDONIE CHRISTOPHE女士,国家地理研究所评审团成员:M. MAARTEN WIJNANTS,哈塞尔大学,校长M. AXEL CARLIER,图卢兹INP,成员M. GILLES GESQUIERE,里昂第二大学,成员Géraldine Morin女士,图卢兹INP,成员M. VINCENT CHARVILLAT,图卢兹INP,成员M. Wei Tsang Ooi,新加坡国立大学,研究员基于HTTP的动态自适应3D流媒体2019年11月29日星期五,图卢兹INP授予图卢兹大学博士学位,由ThomasForgione发表并答辩Gilles Gesquière�