版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
“十二五”职业教育国家规划教材经全国职业教育教材审定委员会审定制作数字电压表任务14
单片机的fosc=11.0592MHz,用三总线方式扩展并行A/D转换芯片ADC0804,在ADC0804的模拟量输入端(VIN+、VIN-端)加入0~5V的直流电压。单片机采用方式1以4800bps的波特率与计算机进行串行通信,将当前的模拟量输入电压发送到计算机中进行显示。任务要求相关知识1、单片机的三总线数据总线、地址总线和控制总线。单片机片外扩展数据存储器、并行I/O接口芯片或者程序存储器(简称外部扩展芯片)时,需要使用三总线数据总线:由P0口的8根线构成,P0.0~P0.7分别对应数据总线中的D0~D7。单片机的数据总线为双向三态总线。单片机的外部并行扩展芯片时,P0.0~P0.7引脚直接与扩展芯片的数据引脚D0~D7相接。此时,单片机的P0口不能作普通的并行I/O口使用。控制总线:由
、
、
3根线构成。为程序存储器读控制线。单片机片外扩展程序存储器时,线与程序存储器的输出允许脚(一般为脚或脚)相接。为片外扩展数据存储器和并行I/O接口芯片的读控制线为片外扩展数据存储器和并行I/O接口芯片的写控制线。单片机片外扩展数据存储器或并行I/O接口芯片时,这2根控制线分别与接口芯片的读写控制引脚相接。此时,单片机的P3.7、P3.6引脚不能作I/O口使用。地址总线:共16根,分别为A0~A15。其中高8位地址线A8~A15由P2口直接引出,此时,P2口不能作普通的并行I/O口使用。低8位地址线A0~A7由P0口经74LS373锁存而形成,由74LS373的Q0~Q7引脚输出。相关知识74LS373是地址锁存器,用来从P0口的输入/输出信号中分离出低8位地址A0~A7。74LS373的内部由8个独立的D锁存器组成,引脚是8D锁存器的控制端,LD是8D锁存器的时钟输入端,D0~D7是8D锁存器的输入端,Q0~Q7是8D锁存器的输出端。74LS373的控制逻辑如下表所示:
1、单片机的三总线LDQ说明00Qn-1输出不变,为锁存时刻的输入信号01D输出随输入变化而变化0锁存锁存输入信号1×高阻输出为高阻态
由表可以看出,=0时,若LD端出现下降沿,74LS373会将输入端的信号锁存,而且在LD=0期间输出一直保持不变相关知识
单片机访问外部扩展芯片时,P2口输出高8位地址A8~A15。P0口分时地输出低8位地址A0~A7和输入/输出所读写的数据。ALE引脚输出地址锁存控制信号,并且在P0口输出低8位地址期间,ALE引脚上会出现由高到低的下降沿,P0口输入/输出数据时,ALE引脚的信号为下降沿之后的低电平。
将单片机的ALE引脚与74LS373的LD相接,单片机的P0.0~P0.7引脚与74LS373的D0~D7相接,74LS373的
引脚接地,单片机访问外部扩展芯片时,74LS373会将低8位地址锁存并从Q0~Q7引脚输出,保证了P0口输入/输出数据时16位的地址A0~A15均存在。相关知识74LS373与单片机的实用连接电路74LS373的D0~D7交叉后再与单片机的P0.0~P0.7相接74LS373的LD脚与单片机的ALE相接74LS373的脚接地相关知识2、C51中外部端口的访问方法①根据硬件电路找出端口的地址。②在程序的开头处将存储器访问宏的宏定义头文件absacc.h包含到程序文件中。其语句如下:#include <absacc.h>③在程序的开头处用下列宏定义语句定义外部端口:#define端口名
XBYTE[端口地址]其中,XBYTE是absacc.h头文件中定义的一个宏名字,定义中的方括号“[]”是一种书写形式,并不是可选项的表示。相关知识2、C51中外部端口的访问方法例如,若ADC0804芯片的地址为0x7fff,则ADC0804端口的定义如
下:#define padc0804 XBYTE[0x7fff]④在程序中,把“端口名”视作无符号字符型变量的变量名,需要对外部端口写数时,直接对“端口名”赋值;需要从外部端口中读取数据时,直接用“端口名”参与运算。
举例:padc0804=0xff; //写端口:向ADC0804写入数据0xffx=padc0804; //读端口:从ADC0804中读取AD转换值并保存至变量x中相关知识3、A/D转换器的基本知识A/D转换器(简称ADC)的功能是将连续的模拟信号转换成数字信号。按照器件与微处理器的接口形式,ADC可分为串行ADC和并行ADC,按照转换原理可分为双积分式和逐次逼近式。选择ADC芯片时,常涉及到的技术指标有分辨率、转换时间等。
分辨率:表示输出数字量增减1所需要的输入模拟量的变化值,它反映了ADC能够分辨最小的量化信号的能力。设ADC的位数为n,转换的满量程电压为U,则其分辨率为U/(2n-1)。
例如,满量程电压为5V,如果是用10位ADC转换器,则它的分辨率为5000mV/(210-1)≈5mV,如果是用12位ADC转换器,则它的分辨率为5000mV/(212-1)≈1mV。可见ADC的位数越多,其分辨率就越高。
转换时间:指从启动ADC进行AD转换开始到转换结束并得到稳定的数字量输出为止所需要的时间。转换时间的快慢将会影响ADC与CPU交换数据的方式。相关知识⑴引脚功能引脚分布如图相关知识4、并行ADC0804的应用特性相关知识4、并行ADC0804的应用特性CLKIN、CLKR引脚(4脚、19脚):时钟信号输入、输出引脚。ADC0804内部集成有振荡电路,CLKIN为内部振荡电路的输入端,CLKR为内部振荡电路的输出端,在CLKIN和CLKR引脚间接上如图下图所示的RC电路后,内部振荡电路就会产生AD转换所需要的时钟信号。图中时钟信号的频率fCLK=1/1.7RC。不用内部振荡器时,需从CLKIN引脚输入1KHz~30KHz的时钟信号,ADC0804才能进行AD转换。相关知识4、并行ADC0804的应用特性VIN+、VIN-:模拟信号输入引脚。AGND:模拟地。VREF:二分之一参考电压输入引脚。该点的电压决定着AD转换的输出值adval,其关系如下:DGND:数字地。D0~D7:数字量输出引脚。VCC:电源引脚,接+5V电源。相关知识端口地址分析第1步:从芯片与单片机地址总线的连接电路中找出与芯片的片选脚相接的地址线以及与芯片的端口地址脚相接的地址线。第2步:将未参与芯片选择控制也没参与端口选择控制的地址线所对应的地址位用任意值表示。⑵ADC0804与单片机的接口电路相关知识⑵ADC0804与单片机的接口电路第3步:根据芯片的操作功能,找出芯片及其端口被选中时地址线上的地址码。第4步:将2、3步中的地址码按照从A15到A0的顺序排列,并用1或者0表示可为任意值的地址位,写出16位的地址码,此地址码就是端口的地址。单片机访问ADC0804的地址定义#include <absacc.h>#define padc0804 XBYTE[0x7fff]相关知识⑶ADC0804的访问方法①启动A/D转换方法:向ADC0804的端口写入任意数。
设ADC0804的端口名为padc0804,启动ADC0804进行A/D转换的程序如下:padc0804=0xff; //启动ADC0804进行A/D转换
程序中,赋值符号右边的数可为任意数。相关知识⑶ADC0804的访问方法②读取A/D转换结果方法:直接从ADC0804的端口地址中读数。举例:读取A/D转换结果并保存在变量adval中adval=padc0804;
注意事项必须在ADC0804结束了A/D转换之后,即引脚变为低电平时,才能读转换结果。相关知识⑶ADC0804的访问方法③采用查询方式访问ADC0804方法:ADC0804的与单片机的某根I/O口线相接,在程序中不断地查询该I/O口线的状态,仅当该I/O口线为低电平时才读取A/D转换的结果。查询方式程序如下:#include <reg51.h>#include <absacc.h>#define padc0804 XBYTE[0x7fff] sbit INTR=P3^2; //定义INTR引脚unsigned char adval;void main(void){/*此处放系统软硬件初始化代码*/while(1){padc0804=0xff;INTR=1;while(INTR==1);adval=padc0804;/*此处放其他事务处理代码*/ }}相关知识5、数字滤波作用:用软件程序滤除干扰信号,使A/D转换结果回归真实值。
常用算法有程序判断滤波、中值滤波、算术平均值滤波、去极值滤波、加权平均滤波、滑动平均值滤波、低通滤波等滑动平均值滤波的设计思想:将本次A/D转换值与过去连续的n-1次A/D转换值一起求平均值,用该平均值作为本次的A/D转换的使用值相关知识5、数字滤波其实现方法:在idata区定义一个数组adarr和一个指针变量fp,adarr、fp均为全局变量。数组adarr依次存放n个A/D转换值,fp指向数组adarr中最后一个赋值的元素,每获得一个新的A/D转换值时就将该值存放到fp所指向的元素中,即更新数组中最老的A/D转换值,并调整指针变量fp的值,使其指向数组中下一个元素,若当前指针指向的是数组中最后一个元素,则将其指向数组的首元素。这样数组中始终是最近n个新的A/D转换值,然后对这n个元素求平均值。相关知识5、数字滤波滑动平均值滤波程序uchar filt(ucharadval){uint sum=0; uchar idata *idata tp;*fp=adval;fp++;if(fp>=adarr+N)fp=adarr;for(tp=adarr;tp<adarr+N;tp++){sum+=*tp; }sum=sum/N ;return sum;}相关知识6、标度转换作用:将ADC的输出值转换成被测物理量的实际值,以便于后续程序的处理。标度转换程序的编写方法:根据传感器的输出特性,找出被测物理量与A/D转换值之间的关系式,然后按照此关系式编写转换程序举例:写出下图中被测物理量Vx与A/D转换值adval之间的关系
答案
相关知识6、标度转换若R1=R2=5.1KΩ,VREF=2500mV,则Vx=10000×adval/255(mV)标度转换程序如下:uchar adval;uint vx;......vx=adval*10000L/255;任务实施1、搭建硬件电路2、编写软件程序任务实施#include <reg51.h>#include <absacc.h>#define N 16#define uchar unsigned char#define uint unsigned int#define padc0804 XBYTE[0x7fff]sbit INTR=P3^2;uchar idata adarr[N];uchar idata *idata fp;uchar filt(char); //数字滤波函数void display(uint); //显示电压值void delay(void); //延时0.5svoid main(void){uchar adval;uint vx;SCON=0x40;TMOD=0x20;TH1=TL1=0xfa; TR1=1; fp=adarr;while(1) {padc0804=0xff; //22启动A/D转换INTR=1; //23端口写1,准备读端口while(INTR==1);//24等待INTR引脚变成低电平adval=padc0804; //保存A/D转换值adval=filt(adval); //26数字滤波vx=adval*5000L/255;//27标度转换display(vx); //28显示电压值delay(); //29延时0.5s}}2、编写软件程序任务实施void display(uint vx){unsigned char a[5],i;a[3]=vx%10; //34求个位值vx=vx/10; //35缩小10倍a[2]=vx%10; //36求十位值vx=vx/10; //37缩小10倍a[1]=vx%10; //38求百位值vx=vx/10; //39缩小10倍a[0]=vx%10; //40求千位值a[4]=0x5a; //41分隔符for(i=0;i<5;i++) //42用串口发送5个数据{SBUF=a[i]; //43发送一个数while(TI==0); //44等待发送结束TI=0; //TI清0,为下次发送作准备}}uchar filt(ucharadval) //48滑动平均值滤波函数{ /*详见前面的filt函数体*/ }//49void delay(void) //50延时0.5s函数{unsigned long i; //51for(i=0;i<30000;i++);}2、编写软件程序应用总结与拓展
单片机的三总线由数据总线、地址总线和控制总线组成。从P0口直接引出的8根线是数据总线,P0口经地址锁存器74LS373锁存输出的8根线是地址总线的低8位地址线,由P2口直接引出的8根线是地址总线的高8位地址线。单片机只有3根控制线,片外程序存储器的读控制线是
,片外扩展数据存储器或者并行I/O接口芯片的读控制线是
,写控制线是
。程序存储器与片外数据存储器采用独立编址,它们用不同的控制线控制存储器的访问,即使它们的地址相同,也不会出现访问混淆。片外数据存储器与并行I/O接口芯片的访问控制线相同,它们采用统一编址,一个I/O端口占用一个外部存储单元的地址。采用三总线方式扩展I/O接口芯片时,要注意I/O接口芯片的地址选取,不能将I/O接口芯片的地址设计在片外实际扩展的数据存储器的地址范围内。应用总结与拓展
面向三总线扩展芯片的方法是,芯片的数据引脚接在数据总线上,读写控制引脚与控制总线上的读写线相接,芯片的片选引脚接在地址总线的高位地址线上,芯片的端口地址引脚接在地址总线上的低位地址线上。对于无片选引脚的简单芯片,可用门电路将地址总线上的某根高位地址线与读写控制线组合,用地址信号与读写控制信号的组合信号控制芯片的读写操作。
用三总线方式扩展芯片时,无论P0、P2口是否接有芯片,这2个口均不能作普通的I/O口使用,P3.6、P3.7分别作读写控制线,它们也不能做普通的I/O口使用。C51采用绝对存储器访问宏对端口进行访问,存储器访问宏的定义位于头文件absacc.h中。用C51程序访问外部端口时,需要在程序的开头处将头文件absacc.h包含至程序文件中,并在程序的开头处用宏定义语句“define端口名XBYTE[地址]”对端口进行定义。在C51程序中,访问外部端口的方法是,把“端口名”当作无符号的字符型变量的变量名,直接对其读数或者写数。主编:李文华“十二五”职业教育国家规划教材经全国职业教育教材审定委员会审定制作液晶显示的数字电压表任务15单片机的fosc=11.0592MHz,用I/O端口扩展并行A/D转换芯片ADC0804和液晶显示器1602,在ADC0804的模拟输入端输入0~5V的模拟电压,用液晶显示器实时显示ADC0804所输入的模拟电压。任务要求相关知识1、用I/O端口扩展并行接口芯片(1)接口电路1、用I/O端口扩展并行接口芯片举例STC89C51采用I/O端口的方式扩展ADC0804和8255AP1口充当数据口P2.0、P2.1分别充当读写控制线
P2.3、P2.4充当低位地址线P2.2、P2.5充当高位地址线
1、用I/O端口扩展并行接口芯片(2)访问程序写芯片操作程序的编写①先产生片选信号:将与接口芯片片选脚相接的I/O口线置为低电平②产生地址信号(若接口芯片无地址引脚,则跳过此步):按照接口芯片的操作原理,将与接口芯片的端口地址引脚相接的I/O口线置为高电平或者低电平,使接口芯片的端口选中。③写入数据:将待写入的数据写入并行口。④产生写控制信号:在与写控制引脚相接的I/O口线上产由高至低、再由低至高的脉冲信号。⑤撤销片选:将与接口芯片片选脚相接的I/O口线置为高电平。1、用I/O端口扩展并行接口芯片(2)访问程序写芯片操作程序的编写void wr0804(uchar m){CS=0; //片选置0,选中ADC0804P_DATA=m; //数据写入数据口WR_0804=0; //产生写控制下降沿WR_0804=1; //产生写控制上升沿CS=1; //片选置1,撤销片选}1、用I/O端口扩展并行接口芯片读芯片操作程序的编写
①先产生片选信号:将与接口芯片片选脚相接的I/O口线置为低电平。
②产生地址信号(若接口芯片无地址引脚,则跳过此步):同写操作的第2步。
③产生读控制下降沿:将与接口芯片读控制脚相接的I/O口线置为低电平。
④读取数据:从数据口中读取数据至指定的变量中
⑤产生读控制上升沿:将与接口芯片读控制脚相接的I/O口线置为高电平。
⑥撤销片选:将与接口芯片片选脚相接的I/O口线置为高电平。1、用I/O端口扩展并行接口芯片读芯片操作程序的编写uchar rd0804(void){ uchar m; //定义变量
P_DATA=0xff; //数据口写1,准备读数
CS=0; //片选置0,选中ADC0804 RD_0804=0; //产生读控制下降沿
m=P_DATA; //从数据口中读数至m中
RD_0804=1; //产生读控制上升沿
CS=1; //片选置1,撤销片选
return m; //返回所读取的值}2、字符型液晶显示器1602的应用特性液晶显示器(LCD)分字符型液晶显示器和图形液晶显示器2类。1602液晶显示器是常用的字符型液晶显示器,其控制器是日立公司生产的HD44780及其兼容芯片,驱动芯片为HD44100及其兼容芯片,可显示2×16个字母、数字、符号等字符,每行16个字符,每个字符由5×7点阵组成。目前市面上的1602液晶显示器已经模块化,包括液晶显示片、HD44780芯片和HD44100芯片等,如图。其中,HD44780也是其他字符型液晶显示器中常用的控制器,研究1602液晶显示器的应用主要是研究控制器HD44780的应用控制。2、字符型液晶显示器1602的应用特性(1)1602液晶显示模块的引脚功能及其与单片机的接口电路控制器HD44780共有80个引脚,但在1602液晶显示模块上,这80个引脚中绝大多数引脚用于与液晶显示片和驱动芯片相连,并没有对用户开放,用户也不必深究,只有与单片机和外部电源相接的少数几个引脚才以模块引脚的形式对外开放,供用户搭建电路之用。1602液晶显示模块的引脚分布如图所示2、字符型液晶显示器1602的应用特性1602液晶显示模块的引脚各引脚的功能2、字符型液晶显示器1602的应用特性采用I/O端口控制1602液晶显示模块的电路电路的连接方法:液晶显示器的数据口与单片机的某个并行口相接,液晶显示器的RS、R/W、E引脚分别与单片机的3根I/O口线相接,5V电源经可调电阻分压后给液晶显示器提供反视度电压,液晶显示器的背光电源显示接5V电源。2、字符型液晶显示器1602的应用特性(2)HD44780的编程结构
主要由数据显示RAM(DDRAM)、字符发生器ROM(CGROM)、字符发生器RAM(CGRAM)、指令寄存器(IR)、数据寄存器(DR)、忙标志(BF)和地址计数器(AC)等几部分组成2、字符型液晶显示器1602的应用特性(2)HD44780的编程结构存放待显示字符的ASCII码。HD44780共有80字节的数据显示RAM,每个字节对应液晶屏上的一个字符位,最多可控制液晶屏显示4行共80个字符,每行20个字符。相当于数码管显示中的字符笔型码表。用来存放192个5×7的点阵字模,包括阿拉伯数字、常用的符号、英文大小写字母和日文假名等,字模的排列方式与标准的ASCII码相同。单片机向DDRAM中写入数据m,HD44780就会以m为依据到CGROM中读取对应的点阵字模,并控制相关电路在液晶屏上进行显示。功能类似于CGROM,用来存放用户自造字符的点阵字模2、字符型液晶显示器1602的应用特性(2)HD44780的编程结构存放单片机写入的指令代码暂存单片机与HD44780所交换的数据指示HD44780的当前工作状态。BF=1时,表示HD44780当前正在处理数据,不能接收单片机发来的指令和数据记录单片机所访问DDRAM或者CGRAM单元的地址,具备自动加1或者减1功能2、字符型液晶显示器1602的应用特性(3)HD44780的访问命令①清屏命令功能:将DDRAM的内容全部更新为0x20(空格的ASCII码),液晶显示的内容被清除,地址计数器(AC)的值设置为0,光标移至左上角(第0行第0列处)。2、字符型液晶显示器1602的应用特性②光标归位命令功能:
将光标移至左上角;地址计数器(AC)的值设置为0;DDRAM的内容不变,即液晶显示的内容不变。2、字符型液晶显示器1602的应用特性③设置字符进入模式命令I/D:设置数据写入DDRAM或者CGRAM后,地址计数器的值是递增还是递减。I/D=0:AC递减;I/D=1:AC递增。S:设置屏幕上的字符是否移动。S=0:数据写入DDRAM后,显示字符不移动;S=1:数据写入DDRAM后,显示字符向左(I/D=1)或者向右(I/D=0)移动一格,光标位置不变。I/D位与S位组合的含义如下2、字符型液晶显示器1602的应用特性④显示器开关命令D:显示屏打开/关闭控制位。D=1:打开显示屏;D=0:关闭显示屏。C:光标显现控制位。C=1:光标出现在地址计数器所指的位置;C=0:不显示光标。B:光标闪烁控制位。B=1:光标出现后会闪烁;B=0:光标不闪烁。2、字符型液晶显示器1602的应用特性⑤显示光标移位命令S/C、R/L位的含义如下:2、字符型液晶显示器1602的应用特性⑥功能设置命令DL:数据长度选择位。DL=1:每次数据传输为8位(DB7~DB0);DL=0:每次数据传输为4位,使用DB7~DB4位分2次传输一个完整的字符数据。N:显示屏为单行或双行选择。N=1:双行显示;N=0:单行显示。F:大小字符显示选择。F=1:用5×10点阵字符显示(有些产品无此功能);F=0:用5×7点阵字符显示。2、字符型液晶显示器1602的应用特性⑦CGRAM地址设置命令其中,A5~A0为所要访问的CGRAM单元的地址。⑧DDRAM地址设置命令其中,A6~A0为所要访问的DDRAM单元的地址2、字符型液晶显示器1602的应用特性⑨读忙标志和AC计数值命令该命令是在RS=0的条件下从HD44780中读取数据,所读得数据的最高位为BF,低7位为地址计数器(AC)的值,其值表示CGRAM或者DDRAM的地址,至于到底是哪一种地址值则取决于最后一次写入的地址设定指令。若最后一次写入的地址设定指令为DDRAM地址设定指令,则AC的值为DDRAM的地址。2、字符型液晶显示器1602的应用特性⑩写数据至CGRAM或者DDRAM中命令D7~D0为待写的数据。该命令用在设定CGRAM地址或者设定DDRAM地址命令之后,用来将指定的数据写入AC计数器所指定的地址单元中。2、字符型液晶显示器1602的应用特性⑪从CGRAM或者DDRAM中读数命令D7~D0为所读得的数据。该命令用在设定CGRAM地址或者设定DDRAM地址命令之后,用来读取AC计数器所指定的地址单元中的数据。2、字符型液晶显示器1602的应用特性(4)HD44780的操作时序读操作时序图
其中,在数据有效时RS为0的时序为读BF时序,其RS的初态为1;在数据有效时RS为1的时序为读数据时序,其RS的初态为0。2、字符型液晶显示器1602的应用特性(4)HD44780的操作时序HD44780的读时序参数符号含义最小值最大值单位tc使能周期1000
nstw使能脉冲宽度450
nstsp1地址建立时间140
nsthd1地址保持时间10
nstd数据延迟时间
320nsthd2数据保持时间10
ns2、字符型液晶显示器1602的应用特性(4)HD44780的操作时序时序图的理解①读操作之前,E为低电平,R/W可为任意状态,若是读BF和AC计数值,RS为高电平,若是读数据,RS为低电平。2、字符型液晶显示器1602的应用特性(4)HD44780的操作时序时序图的理解②RS有效时(读BF:RS=0,读数据:RS=1),R/为高电平,RS有效后至少要过tSP1时间才能产生E信号的上升沿。因此,进行读操作时,单片机应先将R/置为高电平,然后置RS信号,延时tSP1时间后再产生E信号的上升沿。2、字符型液晶显示器1602的应用特性(4)HD44780的操作时序时序图的理解③在E信号的上升沿,HD44780将内部数据输送到数据引脚上,由于存在数据延迟,E信号上升沿后td时间,数据线上出现有效数据。单片机产生E信号上升沿后应延时td时间才能从数据线上读取数据。2、字符型液晶显示器1602的应用特性(4)HD44780的操作时序时序图的理解④使能脉冲宽度tw的最小值为450ns,单片机产生E信号上升沿后至少要延迟tw时间才能产生E信号的下降沿。2、字符型液晶显示器1602的应用特性(4)HD44780的操作时序时序图的理解⑤E信号下降沿后,至少要过thd1时间才能复位RS信号(读BF:RS=1,读数据:RS=0)。复位RS时,R/为高电平。RS复位后,R/可为任意态。因此,E信号下降沿后可以不设置R/的状态。2、字符型液晶显示器1602的应用特性读取BF和AC计数值的流程图读取BF及AC计数值的程序uchar rd1602bf(void){ uchar m; RW1602=1; RS1602=0; EN1602=1; PD1602=0xff; m=PD1602; EN1602=0; RS1602=!RS1602; return m;}#define PD1602 P1sbit RS1602=P2^0;sbit RW1602=P2^1;sbit EN1602=P2^2;此句改为“RS1602=1;”,则变成了读DDRAM或者CGRAM数据程序2、字符型液晶显示器1602的应用特性写操作操作时序包括写指令和写数据2种操作,它们的差别仅仅只是所选择的寄存器不同而已,即RS引脚的状态不同。在数据有效时RS为0的时序为写指令时序,其RS的初态为1;在数据有效时RS为1的时序为写数据时序,其RS的初态为0。2、字符型液晶显示器1602的应用特性写时序参数表符号含义最小值最大值单位tc使能周期1000
nstw使能脉冲宽度450
nstsp1地址建立时间140
nsthd1地址保持时间10
nstsp2数据建立时间195
nsthd2数据保持时间10
ns2、字符型液晶显示器1602的应用特性写HD44780的流程图向HD44780入数据m的程序void wr1602dat(uchar m){ while(rd1602bf()&0x80); RW1602=0; RS1602=1; EN1602=1; PD1602=m; EN1602=0; RS1602=0;}此句改为“RS1602=0”则变成写命令程序2、字符型液晶显示器1602的应用特性(5)1602液晶显示器的应用程序
包括初始化液晶显示器、设置字符的显示位置、显示字符等,这些程序是通过调用HD44780的读写程序来实现的。
①初始化液晶显示器程序
功能:选择数据传输的位数、显示屏的行数、显示字符点阵的大小,设置字符进入的模式、光标的起始位置,打开显示屏。编程方法:调用wr1602cmd()函数向HD44780写入命令6、命令3、命令1和命令4。2、字符型液晶显示器1602的应用特性(5)1602液晶显示器的应用程序初始程序代码:void initlcd(void){ wr1602cmd(0x38); //命令6,功能设置。8位数据传输,双行显
示,5*7点阵 wr1602cmd(0x06); //命令3,输入模式设置。AC地址增,显示
屏不移动 wr1602cmd(0x01); //命令1,清显示。0x01:复位显示 wr1602cmd(0x0c); //命令4,显示开关设置。打开屏,禁止光
标闪烁显示}2、字符型液晶显示器1602的应用特性(5)1602液晶显示器的应用程序②设置显示起始位置程序功能:按照图7-22的对应关系,将字符在屏幕上显示的位置坐标转换成DDRAM的地址,然后组合成DDRAM地址设置命令,并向HD44780写入该命令。程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}2、字符型液晶显示器1602的应用特性(5)1602液晶显示器的应用程序程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}③显示字符程序实质:向DDRAM的单元中写入待显示字符的ASCII码。
编程方法:先定义一个数组disstr[],然后将待显示字符的ASCII码存入数组中,需要显示字符时,就将数组中各元素的值写入DDRAM中。
注意事项:在调用显示字符程序之前,先用setpos()函数设置字符显示的位置。2、字符型液晶显示器1602的应用特性(5)1602液晶显示器的应用程序程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}举例在液晶显示屏的(0,0)位置处开始显示“china”void display(uchar * str); //显示字符函数说明uchar distr[17]={"china"}; //定义显示数组,初始字符为chinavoid main(void) //main函数{ initlcd(); //初始化液晶显示屏 setpos(0,0); //设置显示位置
display(distr);
//调用display显示distr中的字符 while(1); //死循环}2、字符型液晶显示器1602的应用特性(5)1602液晶显示器的应用程序程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}举例在液晶显示屏的(0,0)位置处开始显示“china”//显示字符程序void display(uchar * str){ uchar * tp; //定义指针变量tp for(tp=str;*tp!=0;tp++) //指针指向数组首元素,若当
//前元素非空,则执行循环体 wr1602dat(*tp); //循环体:将指针所指元素的
//值写入DDRAM中}任务实施程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}1、搭建硬件电路电路图如下:任务实施程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}2、编写软件程序(1)流程图:任务16的程序框架与任务15相同。但在任务16中,ADC0804采用I/O端口控制,而不是三总线控制,电压值采用的是液晶显示,而不是通过串口回送至计算机中显示。任务实施程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}(1)流程图:任务实施程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}任务16的程序代码如下:#include <reg51.h> #define uchar unsigned char #define uint unsigned int #define N 8 #define P_DATA P2 #define PD1602 P2 sbit CS=P1^0; //7ADC0804的片选线定义,接P1.0sbit RD_0804=P1^1; //8ADC0804的读控制线定义,接P1.1sbit WR_0804=P1^2; //9ADC0804的写控制线定义,接P1.2sbit INTR=P3^2; //10ADC0804的INTR引脚定义,接P3.2sbit RS1602=P1^3; //111602的RS端定义,接P1.3sbit RW1602=P1^4; //121602的读写控制端RW的定义,接P1.4sbit EN1602=P1^5; //131602的使能控制端E的定义,接P1.5任务实施程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}任务16的程序代码如下:uchar idata adarr[N]; //14定义数组(保存N个AD值)uchar idata * idata fp; //15定义指针变量(指向当前AD值存放的位置)uchar distr[]={"Volt:0000mV"}; //16定义显示字符数组,并赋初值uchar filt(char); void wr0804(uchar m); uchar rd0804(void); void initlcd(void); uchar rd1602bf(void); void wr1602dat(uchar m); void wr1602cmd(uchar cmd);void setpos(uchar x,uchar y);void display(uchar *str);任务实施程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}void main(void) //26main函数{uint volt; //27定义变量volt(当前电压值)uchar adval; //28定义变量adval(A/D转换值)SP=0x5f; //29定义堆栈
fp=adarr; //30指针变量fp指向数组的首元素
initlcd(); //31初始化1602液晶显示器
while(1) //32死循环
{ wr0804(0xff); //33向ADC0804写入0xff:启动A/D转换
INTR=1; //34INTR端口写1,准备读端口
while(INTR==1); //35等待INTR引脚变成低电平
adval=rd0804(); //36读A/D转换值并保存至adval中
adval=filt(adval); //37数字滤波,结果存入adval中
volt=adval*5000L/255; //38A/D值变成电压值,并存入volt distr[8]=volt%10+0x30; //39求电压值的个位数,转换成ASCII码
//后存显示数组中任务实施程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}volt=volt/10; //40缩小10倍
distr[7]=volt%10+0x30; //41求电压值的十位数,转换成ASCII码
//后存显示数组中
volt=volt/10; //42缩小10倍
distr[6]=volt%10+0x30; //43求电压值的百位数,转换成ASCII码
//后存显示数组中
volt=volt/10; //44缩小10倍
distr[5]=volt%10+0x30; //45求电压值的千位数,转换成ASCII码
//后存显示数组中
setpos(0,0); //46设置字符显示的起始位置:0行0列
display(distr); //47显示字符串"Volt:xxxxmV"} //48死循环结束} //49main函数结束任务实施程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}volt=volt/10; //40缩小10倍
distr[7]=volt%10+0x30; //41求电压值的十位数,转换成ASCII码
//后存显示数组中
volt=volt/10; //42缩小10倍
distr[6]=volt%10+0x30; //43求电压值的百位数,转换成ASCII码
//后存显示数组中
volt=volt/10; //44缩小10倍
distr[5]=volt%10+0x30; //45求电压值的千位数,转换成ASCII码
//后存显示数组中
setpos(0,0); //46设置字符显示的起始位置:0行0列
display(distr); //47显示字符串"Volt:xxxxmV"} //48死循环结束} //49main函数结束应用总结与拓展程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}用I/O端口扩展并行接口芯片的方法是,用单片机的一个并行I/O口充当数据口,用几根I/O口线分别充当读、写控制线和片选线、地址线,然后用软件模拟产生三总线时序。编写读、写程序时要特别注意读数和写数的时刻。单片机写数时,先模拟产生片选信号、地址选择信号,然后写入数据,再产生写控制脉冲,最后撤销片选信号,写数发生在产生写控制脉冲的下降沿之前。读数时,先模拟产生片选信号、地址选择信号,然后产生读控制脉冲的下降沿,再读取数据,最后产生读控制脉冲的上升沿,并撤销片选信号,读数发生在读脉冲下降沿之后。应用总结与拓展程序代码:void setpos(uchar x,uchar y){ //x:行坐标,值为0-15,y:列坐标,值为0-1 x=x&0x0f; //容错,行坐标为0-15,高4位无效 y=y&0x01; //容错,列坐标为0-1,高7位无效 if(y) x=x+0x40; //计算显存地址,或者x=y*0x40+x wr1602cmd(x|0x80); //形成DDRAM地址设置命令 //(命令8),并写入HD44780}1602液晶显示的控制芯片是HD4480,它也是其他字符型液晶显示器中常用的控制芯片,内含有80字节的DDRAM,可控制液晶显示器显示4×20个字符。在1602液晶显示中它控制液晶显示器显示2×16个字符,向HD44780的不同地址单元中写入字符的ASCII码,液晶显示屏的对应位置上就可以显示不同的字符,对1602液晶显示器的应用编程实际上是对控制器HD44780的应用编程,编写HD44780的控制程序的依据是HD44780的读写时序,因此必须认真领会时序图的真正含义,要特别注意有效数据出现的条件和出现的时刻以及持续的时间。主编:李文华“十二五”职业教育国家规划教材经全国职业教育教材审定委员会审定制作波形发生器任务16
单片机的fosc=11.0592MHz,用P1.0、P1.1、P1.2三根I/O口线分别充当SPI总线的数据线、时钟线和片选线,外接带有SPI总线接口的串行D/A转换芯片TLC5615,用单片机控制TLC5615产生频率为100Hz、最大值为4V、最小值为0V的正弦波。任务要求相关知识1、D/A转换器的基础知识
⑴分辨率:输入数字量变化1时,对应的输出模拟量的变化量。分辨率反映了输出模拟量的最小变化值。设DAC的数字量的位数为n,则DAC的分辨率=满量程电压/(2n-1)。对于同等的满量程电压,DAC的位数越多,则分辨率越高。因此,分辨率也常用DAC的数字量的位数来表示。
⑵转换时间:从数字量输入至DAC开始到DAC完成转换并输出对应的模拟量所需要的时间。转换时间反映了DAC的转换速度。
⑶满刻度误差:数字量输入为满刻度(全1时),实际输出的模拟量与理论值的偏差。2.TLC5615的应用特性TLC5615是TI公司生产的10位串行电压输出型D/A转换器,数据更新率高达1.21MHz,采用+5V单电源供电,最大功耗为1.75mW,具有简化的SPI总线接口,转换结果采用缓冲电压输出,可变输出电压为0~5V,最大线性误差为±1/2LSB。(1)TLC5615的引脚功能引脚分布如图串行数据输入串行时钟输入片选级联数据输出模拟地参考电压输入转换电压输出电源电压输入2.TLC5615的应用特性⑵TLC5615与单片机的接口电路TLC5615的时钟脚、片选脚、数据输入脚分别与单片机的I/O口线相接2.TLC5615的应用特性⑶TLC5615的内部结构
由16位的移位寄存器、10位的DAC寄存器、D/A转换器DAC、2倍电压放大器、控制逻辑等几部分组成。16位的移位寄存器是TLC5615与外部交换数据的寄存器,在CS、SCLK的作用下,DIN引脚输入的数据被移入16位移位寄存器,同时将移位寄存器内部的数据从DOUT引脚移出。数据移位的方向是高位在先低位在后。高4位无效,可为任意数,低2位为0,中间的10位(D2~D11位)为DAC转换代码。单片机向TLC5615写数时(数据移入TLC5615),每次写入的数据可为12~16位中的任意一种形式,常用的是一次写入12位或者16位;如果要同时向TLC5615写数和读数,则每次传输的数位必须是16位。2.带有SPI接口的D/A转换器TLC5615的应用特性⑶TLC5615的内部结构从上图可以看出:①16位的移位寄存器是TLC5615与外部交换数据的寄存器,在
、SCLK的作用下,DIN引脚输入的数据被移入16位移位寄存器,同时将移位寄存器内部的数据从DOUT引脚移出。数据移位的方向是高位在先低位在后。②在16位移位寄存器中,高4位无效,可为任意数,低2位为0,中间的10位(D2~D11位)为DAC转换代码。单片机向TLC5615写数时(数据移入TLC5615),每次写入的数据可为12~16位中的任意一种形式,常用的是一次写入12位或者16位;如果要同时向TLC5615写数和读数,则每次传输的数位必须是16位。2.带有SPI接口的D/A转换器TLC5615的应用特性⑶TLC5615的内部结构
③设10位转换数位于变量daval中,采用12位移位输入数据时,应先将daval左移6位,以保证daval中有效的DA转换数据的最高位位于daval的最高位,12位传输后刚好位于移位寄存器的MSB位。其实现代码如下:
daval=daval<<6; //获取采用12位移位输入的正确数据采用16位输入数据时,应先将daval左移2位,其实现代码如下:
daval=daval<<2; //获取采用16位移位输入的正确数据2.带有SPI接口的D/A转换器TLC5615的应用特性⑶TLC5615的内部结构
④TLC5615内部带有2倍电压放大器,设REFIN引脚输入的参考电压为VREF,10位的DAC转换代码的值为daval,则TLC5615的转换输出电压VOUT为:
由于输出电压VOUT的最大值为5V,在实际应用中,参考电压的输入值不得高于2.5V。2.带有SPI接口的D/A转换器TLC5615的应用特性⑷TLC5615的操作时序
所谓操作时序,是指单片机对接口芯片进行读写操作时,接口芯片的各引脚信号之间的时序关系。包括上升沿、下降沿出现的先后次序、间隔的时间、数据线上出现数据的时刻及先后次序等。芯片的时序图是编写芯片访问程序的依据。2.带有SPI接口的D/A转换器TLC5615的应用特性⑷TLC5615的操作时序TLC5615的时序参数参数含义参数值单位最小典型最大tCSS片选建立时间1
nstCSH0SCLK下降沿到片选下降沿保持时间1
nstCSH1SCLK下降沿到片选上升沿保持时间0
nstCHSCLK高电平宽度25
nstCLSCLK低电平宽度25
nstDSDIN建立时间45
nstDHDIN保持时间0
nstDODOUT(级联输出)传输延时间
50nstCSW片选高电平宽度20
nstCS1片选上升沿到SCLK上升沿建立的时间间隔50
ns2.带有SPI接口的D/A转换器TLC5615的应用特性⑷TLC5615的操作时序时序图的含义
①CS=1时,DIN引脚上的数据不能移入TLC5615,只有CS=0时,数据才能移入TLC5615;出现上升沿时,TLC5615将内部16位移位寄存器中的DAC转换代码(移位寄存器寄存器中的D2~D11位)传输至10位的DAC寄存器,并更新DAC。2.带有SPI接口的D/A转换器TLC5615的应用特性⑷TLC5615的操作时序②CS的下降沿之前,SCLK为低电平,SCLK的下降沿与下降沿的时间间隔为tCSH0(至少为1ns);上升沿之前SCLK也为低电平,SCLK的下降沿与下降沿的时间间隔tCSH1(至少0ns)。在启动数据传输时,应先产生SCKL下降沿,延时tCSH0时间后再产生的下降沿,在结束数据传输时,应先产生SCLK下降沿,延时tCSH1时间后再产生上升沿。
③CS=0时,在SCLK的上升沿TLC5615将DIN引脚上的数据移入内部移位寄存器,DIN数据的建立时间为tDS。所以向TLC5615写数时,应先将数位写入DIN引脚上,延时tDS时间后,再产生SCLK的上升沿。2.带有SPI接口的D/A转换器TLC5615的应用特性⑷TLC5615的操作时序④CS=0时,在SCLK的下降沿TLC5615将移位寄存器的最高位移至DOUT引脚上,DOUT的数据建立时间为tDOUT(最大50ns)。从TLC5615中读取数据时,应先产生时钟上降沿,延时tDOUT时间后,再从DOUT引脚上读数。⑤TLC5615的移位的次序为高位在先,低位在后。将daval中的数据写入TLC5615时,每发送一位数据后应将daval中的数据左移一位;从TLC5615读取数据时,每接收一位数,应将保存接收数据的变量左移一位。2.带有SPI接口的D/A转换器TLC5615的应用特性⑷TLC5615的操作时序
⑥时钟(SCLK)的高低电平持续时间的最小值为25ns。时钟上升沿后,至少要过25ns才能产生时钟的下降沿;时钟的下降沿后,至少要过25ns才能产生时钟的上升沿。如果单片机的速度过快,指令周期小于25ns,必须在产生时钟的上升沿、下降沿的语句之间适当地加入若干条“_nop_();”语句进行延时,以保证时钟脉冲的宽度符合要求。2.带有SPI接口的D/A转换器TLC5615的应用特性(5)TLC5615的访问程序编写原则:按照TLC5615的操作时序来编写编写方法:用软件模拟产正确的片选信号和时钟信号,并在恰当的时间将待写入的数据发送到DIN线上。例子:采用12位方式传输,将m中的10位D/A转换数据写入TLC5615的流程图如图所示,将m中的D/A转换数据写入TLC5615,同时将TLC5615中前次转换的数据读入n中的流程图2.带有SPI接口的D/A转换器TLC5615的应用特性(5)TLC5615的访问程序程序代码:void TLC5615(uint m){uchar i; m=m<<6;CS=1;SCLK=0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB65T8011-2024建设工程人工材料设备机具数据分类标准及编码规则
- 数控技术试题库含答案
- 管道泵维护保养规程
- 劳动关系协调员题库及答案
- 污水处理工试题库及答案
- 环境微生物检测记录表
- 机械运转测试题及答案
- 2026年垃圾分类宣传物料制作合同协议
- CN119910347A 一种安全识别汽车生产系统及其安全识别方法
- 2026年跨境电商平台维护服务合同协议
- 淇河流域水文地球化学环境对缠丝鸭蛋形成的影响探究
- 乐山国有资产投资运营(集团)有限公司乐山产业投资(集团)有限公司2026年社会公开招聘考试备考试题及答案解析
- 海南省海口市2024-2025学年八年级下学期期中考试道德与法治试卷(含答案)
- 膀胱癌靶区勾画的精准放疗多学科策略
- 软件项目初验与试运行报告范文
- 电磁感应现象的“双棒”模型(模型与方法)-2026年高考物理一轮复习原卷版
- 河南地理会考题库及答案
- 河南省2025工勤技能岗公路养护工复习题及答案
- 子宫脱垂术后护理课件
- 上帝掷骰子吗量子物理史话:升级版
- 中国特色社会主义理论体系的形成发展PPT2023版毛泽东思想和中国特色社会主义理论体系概论课件
评论
0/150
提交评论