首页 从MCS51 向AVR 的快速转换

从MCS51 向AVR 的快速转换

举报
开通vip

从MCS51 向AVR 的快速转换 从MCS51向AVR的快速转换 很多网友原来搞MCS-51单片机的开发应用,看到AVR单片机确实不错,想 转到搞AVR单片机的开发应用,不知怎样下手,现转发本公司AVR技术支持工程 师詹卫前的工作实践体会 詹卫前 ATMEL的AVR系列单片机是一个优秀的RISC结构单片机系列 与MCS51相 比其有以下一些典型特点 AVR的机器周期为1个时钟周期 绝大多数指令为单周期指令 因此每MHZ 时钟有接近1MIPS的性能 程序存贮器与数据存贮器有分开的总线 程序可以高效地执行 8MHZ...

从MCS51 向AVR 的快速转换
从MCS51向AVR的快速转换 很多网友原来搞MCS-51单片机的开发应用,看到AVR单片机确实不错,想 转到搞AVR单片机的开发应用,不知怎样下手,现转发本公司AVR技术支持工程 师詹卫前的工作实践体会 詹卫前 ATMEL的AVR系列单片机是一个优秀的RISC结构单片机系列 与MCS51相 比其有以下一些典型特点 AVR的机器周期为1个时钟周期 绝大多数指令为单周期指令 因此每MHZ 时钟有接近1MIPS的性能 程序存贮器与数据存贮器有分开的总线 程序可以高效地执行 8MHZ频率下 工作的AVR相当于224MHZ频率下工作的MCS51 内置可重复编程的FLASH程序存贮器和EEPROM数据存贮器 支持对单片 机的在系统编程 ISP 在生产中可以 先装配后编程 从而缩短工艺流程 和节约购买万用编程器的费用 并且可以方便地升级或修改程序 内置上电复位电路和看门狗定时器 WatchDog电路 在提高产品可靠性的 同时降低了电路的成本 部分AVR单片机与MCS51系列单片机管脚兼容 如AT90S1200/2313对应 AT89C1051/2051AT90S4414/8515对应AT89C51/52因此可以做到一套 PCB板对应两套电路 增加了用户备货的可选择性和灵活性(见四说AVR单片 机) 定时/计数器的功能大大增强 串口通信时波特率发生不占用定时器 注 在本文中AVR的C语言是指ICCAVR6.0标准版 如需向其它版本的AVR C语言 如IAR A90CodeVision AVR转换 可与双龙电子公司联系 1. AVR和MCS51存贮器配置的对比 1. 存贮器布置 MCS51的存贮器从使用角度看分三个地址空间 三个空间分别用MOV MOVX和MOVC指令访问 而AVR的存贮器在物理结构上可分为五个部分 AT90S8515为例 1 程序空间 000H~FFFH访问时用LPM指令访问 2 片内数据存贮器 0060H~025FH访问时用STSLDS和ST LD指令访问 3 片外数据存贮器 0260H~FFFFH访问时用STSLDS和ST LD指令访问 4 32个通用寄存器R0~R31它们之间数据传送可使用MOV指令 5 I/O寄存器 00H~3FH使用INOUT指令访问 看了以上介绍 仔细的读者可能发现有一部分数据存贮器的地址 0000H~005FH是空闲的 其实这部分地址空间并不空闲 其被映射 为通用寄存器 R0~R31和I/O寄存器的数据空间地址 具体为 32个 通用寄存器 直接映射到数据存贮器的0000H~001FH64个I/O寄存器 直接映射到数据存贮器空间的0020H~005FH这种映射关系大大增强了 AVR指令的灵活性 一方面对寄存器可以象SRAM一样地访问 另一方 面对寄存器的访问时 也可以使用X Y和Z寄存器作为索引 从而大大 提高了访问寄存器的灵活性 2. 堆栈工作方式 MCS51的堆栈是一个由堆栈指针寄存器SP 单字节 控制的向上生长 型堆栈 即将数据压入堆栈时SP增大 在AVR系列单片机的堆栈同样是受SP寄存器控制 而堆栈的生长方向 与MCS51是不相同的 其向下生长 即将数据压入堆栈时SP减小 另 外要注意以下几点 1 MCS51的堆栈空间只能放置在片内的SRAM中 而AVR的堆栈空 间既可以放置的片内SRAM中 也可以放置在片外SRAM中 2 AVR的SP寄存器 对不支持外部SRAM的单片机为一个字节长度 对支持外部SRAM的单片机为两个字节长度 SPLSPH 3 为了提高速度 一般在初始化SP时 将其定位于内部SRAM的顶 部 如对8515为025FH 4 AT90S1200不支持软件堆栈 即由SP控制堆栈 其包含了一个 三级深度的硬件堆栈 5 在对AVR编程时一定要对SP进行初始化 否则很可能出现 在 AVR Studio中模拟调试正常 而程序下载到芯片后程序却不工作 的现 象 3. 外部 SRAM的配置 在MCS51中外部SRAM是使用专用的 MOVX指令访问的 而在AVR 中访问片内或片外SRAM使用相同的指令 当访问数据空间的地址超过 片内SRAM范围时 会自动选择片外的SRAM空间 但为了正常工作 还必须对寄存器MCUCR的SRED7 SRW D6位进行设置 SRE SRW SE SM ISC11 ISC10 ISC01 ISC00 MCUCR寄存器 当SRE=1时 使能外部SRAM如汇编指令SBI MCUCRSRE SRE=0时 禁止外部SRAM如汇编指令CBI MCUCRSRE 当SRW=1时 在访问外部SRAM中插入一个等待周期 如汇编指令SBI MCUCRSRW 当SRW=0时 在访问外部SRAM中不插入一个等待周期 如汇编指令 SBI MCUCRSRW 在C语言中 可以直接用MCUCR|=0xC0 或MCUCR&=0x3F来配置外 部SRAM 4. 程序空间的访问 MCS51的程序存贮器是以字节为单位的 地址也是按字节进行寻址的 使用 MOVC指令访问程序ROM和指令寄存器访问程序ROM没有什么区别 在AVR中 程序存贮器的总线为16位 即指令寄存器访问程序ROM时是以字 双字节 为单位的 即一个程序地址对应两个字节 而AVR的数据存贮器的 总线为8位 当用户使用LPM指令访问程序ROM时是以字节为单位进行读取 的 此时Z寄存器中的一个地址只对应一个字节 因此要注意这两个地址的换 算 否则很容易产生错误 具体的换算是LPM指令使用的Z寄存器中的地址应 该是程序地址的两倍 如 ldi ZHhigh(F_TABLE*2) ldi ZLlow(F_TABLE*2)初始化Z指针 . lpm st Y+R0 . F_TABLE .db 0,1 ;表的起点(20 bytes) . .db 18,19 2. AVR输入/输出端口的使用 MCS51单片机的I/O端口大部分是准双向口 在复位时全部输出高电平 对端口的输入和输出操作也是直接通过I/O端口的地址进行的 而AVR的I/O端口为标准双向口 在复位时所有端口处于没有上拉电阻 的输入状态 高阻态 管脚电平完全由外部电路决定 这在强调复位状 态的场合是很有用的 AVR的每一个端口对应三个地址 即DDRX PORTX和PINXX针对不同的单片机可从A~F中分别取不同的符号 注意只有PINX可取F DDRXn PORTXn I/O 上拉 备注 0 0 输入 关闭 高阻态 0 1 输入 打开 提供弱上拉 低电平必须 由 外电路位低 此时输出电 流 1 0 输出 关闭 推挽输出0 1 1 输出 关闭 推挽输出1 表一 端口功能配置表 X=A~En=0~7 DDRX为端口方向寄存器 当DDRX的某一位置1时 相应端口的引脚 作为输出使用 当DDRX的某一位清0时 相应端口的引脚作为输入使 用 PORTX为端口数据寄存器 当引脚作为输出使用时 PORTX的数据由 相应引脚输出 当引脚作为输入使用时 POTRX的数据决定相应端口的 引脚是否打开弱上拉 具体可参考表一 PINX为相应端口的输入引脚地址 如果希望读取相应引脚的逻辑电平值 一定要读取PINX而不能读取PORTX这与MCS51是有区别的 注意 在使用AVR单片机之前 一定要根据引脚功能定义 对相应的端 口初始化 否则端口很可能在用作输出时不能正常工作 如设置端口B 的高四位为输出 低四位为输入 汇编语言 ldi R16$F0 out DDRBR16 在C语言中 DDRB=0xF0 3. AVR和MCS51定时器的对比 1. 功能比较 在MCS51中 定时/计数器有两种基本用法 即以晶振频率的十二分频 信号为输入的定时器工作方式 和以外部引脚INT0INT1上的信号为输 入的计数器工作方式 在AVR中有两个定时器T0和T1AT90S1200只有一个T0 T0的功 能与MCS51相似 而T1 的功能很强 除了普通的定时/计数功能外,还 有一些增强的功能 如 比较匹配A 比较匹配B 由ICP引脚或模拟比 较器触发的捕捉功能 8~10位的PWM调制器 AVR的定时/计数器用作定时器时 其输入信号为晶振频率的某一个分频 信号 分频比为1 8 642561024五种 作为计数器使用时 既可 上升沿触发 也可下降沿触发 2. T0的使用 在AVR中T0为八位长度 其由TCCR0寄存器控制 TCCR0组成如下图所示 X X X X X CS02 CS01 CS00 TCCR0的作用如下表所示 CSX2 CSX1 CSX0 说明 CSX2 CSX1 CSX0 说明 0 0 0 T0停止工作 1 0 0 CK/256定时器 0 0 1 CK 定时器 1 0 1 CK/1024定时器 0 1 0 CK/8定时器 1 1 0 计数器(下降沿触发) 0 1 1 CK/64定时器 1 1 1 计数器(上升沿触发) 表二 TCCR0功能表 X=01 例1 定时器T0用作定时器 晶振频率4M 定时时间10ms可以这样对T0 初始化 汇编语言 LDI R16$D9 OUT TCNT0R16定时常数到定时寄存器TCNT0 LDI R16$05 OUT TCRR0R16 1024分频比 C语言 TCNT0=0xD9 TCRR0=0x05 说明 TCNT0为定时计数寄存器 例2 定时器T0用作计数器 下降沿触发 可以这样对T0初始化 汇编语言 LDI R1600 OUT TCNT0R16TCNT0清零 LDI R16$06 OUT TCRR0R16计数器方式工作下降沿触发 C语言 TCNT0=0 TCRR0=0x06 3 T1的使用 在AVR中 T1是16位的 其控制寄存器有TCCR1A和TCCR1B两个 TCCR1A 组成如下图所示 COM1A1 COM1A0 COM1B1 COM1B0 X X PWM 11 PWM 10 各位的功能如表三所示 COM1X1 COM1X0 说明 PWM11 PWM10 说明 0 0 与输出OC1X不连接 0 0 禁止PWM操作 0 1 OC1X电平翻转 0 1 8位PWM 1 0 OC1X为低电平 1 0 9位PWM 1 1 OC1X为高电平 1 1 10位PWM 表三 TCCR1A功能表 TCCR1B的组成如下图所示 其中CS10~CS12的用法同T0见表二所示 ICNC1 ICES1 X X CTC1 CS12 CS11 CS10 ICNC1置1时使能输入捕捉噪声消除 清0 时禁止输入捕捉噪声消除 ICES1置1时在ICP的上升沿时发生定时器捕捉 清0 时在ICP的下降沿发 生定时器捕捉 CTC1置1时 当比较匹配A发生时将TCNT1清0 清0时TCNT1继续计 数 直至它被停止 清除 溢出为止 注意 只有比较匹配A有效 另外在PWM 方式下该位无效 例1 定时器1用比较匹配A方式 在OC1A引脚输出一个50HZ的方波 晶 振频率为4MHZ可以这样对T1初始化 汇编语言 LDI R16$20 OUT DDRDR16引脚OC1A输出 LDI R16$00 OUT TCNT1HR16 OUT TCNT1LR16TCNT1清0 LDI R16$02 OUT OCR1AHR16 LDI R16$71 OUT OCR1ALR16送入对应10ms的比较常数 LDI R16$40 OUT TCCR1AR16T1和OC1A相连 比较匹配时OC1A翻 转 LDI R16$0B OUT TCCR1BR16T1以定时器方式工作 分频比为64 比较匹配后自动清除TCNT1 C语言 DDRD=0x20//引脚OC1A输出 TCNT1=0x00 //TCNT1清0 OCR1A=0x271//送入对应10ms的比较常数 TCCR1A=0x40//T1和OC1A相连 比较匹配时OC1A翻转 TCCR1B=0x0B//T1以定时器方式工作 分频比为64比较匹配后 // 自动清除TCNT1 注意 1 由于T1的TCNT1OCR1AOCR1B和ICR1均为16 位的定时器 为 了正确地写入和读出 在写入数据时应先写入高位字节 后写入低位字节 在读 取数据时 应先读取低位字节 后读取高位字节 2 T1的捕捉方式 可用于ICP引脚上频率或周期的测量 在使用时只需使 能捕捉中断即可 对T1 的设置可参考定时的用法 四 AVR和MCS51中断系统的对比 MCS51有六个中断源 5个中断入口地址 分两个优先级 并且是通过IE寄 存器控制中断的使能 通过IP控制中断的优先等级 而在AVR中 根据不同的单片机有不同数量的中断源 典型的AT90S8515有 12个中断源 这12个中断源各自有自己的中断向量入口地址 如表四所示 AVR通过寄存器GIMSK和TIMSK及SREG来控制中断使能 其中SREG的 D7位I是全局中断使能标志 在AVR中只有全局中断控制位和某一特定中断控 制位同时使能 中断才会起作用 GIMSK和TIMSK的功能见下图 INT1 INT0 X X X X X X GIMSK TOIE1 OCIE1A OCIE1B X TICIE1 X TOIE0 X TIMSK INT0INT1外部中断请求0 1使能 置1时开放中断 清0 时禁止中断 外部中断的触发方式由MCUCR的D0~D3位控制 如表五所示 TOIE0TOIE1定时器0 1的溢出中断使能 OCIE1AB 定时器1的比较匹配A B中断使能 TICIE1定时器1的输入捕捉中断使能 向量号 入口地址 中断源 说明 1 $000 RESET 硬件复位和看门狗复位 2 $001 INT0 外部中断请求0 3 $002 INT1 外部中断请求1 4 $003 TIMER1 CAPT 定时器1捕捉中断 5 $004 TIMER1 COMPA 定时器1比较匹配A中断 6 $005 TIMER1 COMPB 定时器1比较匹配B中断 7 $006 TIMER1 OVF 定时器1溢出中断 8 $007 TIMER0 OVF 定时器0溢出中断 9 $008 SPISTC SPI传送完成 10 $009 UARTRX 串行通信接收完成 11 $00A UARTUDRE 串行通信数据寄存器空 12 $00B UARTTX 串行通信发送完成 13 $00C ANA_COMP 模拟比较器中断 表四 中断向量名称与入口地址 ISCX1 ISCX0 说明 ISCX1 ISCX0 说明 0 0 低电平触发中断 1 0 下降沿触发中断 0 1 高电平触发中断 1 1 上升沿触发中断 表五 外部中断触发方式 X=01 在AVR中没有专门的中断优先级控制寄存器来区分中断的优先等级 用户可在 中断服务程序中通过使能全局中断I来使系统响应高优先级的中断 具体的做法 是当AVR单片机响应任何一个中断时 硬件会禁止全局中断I从而禁止系统响 应其它中断 而当从中断服务程序中退出时硬件重新使能全局中断I而当我们 在中断服务程序中用SEI指令打开全局中断使能时 系统在没有退出中断服务 程序的情况下又恢复了对中断的响应能力 从而可以响应高优先级的中断 另外 在同一优级中入口地址较低的中断优先级较高 例 系统使能定时器1溢出中断和外部INT0中断 其中INT0的优先级较高 此时可以这样对MCU初始化 汇编语言 LDI R16$40 OUT GIMSKR16使能INT0中断 LDI R16$80 OUT TIMSKR16使能T1溢出中断 SEI 使能全局中断 . . timer1_ovf T1溢出中断服务程序 SEI 在T1溢出中断服务程序中开放全局中断 保证INT0的优先级 RETI 注意 在AVR的子程序中硬件不保护SREG状态寄存器 应根据实际情况由软 件进行保护 C语言 #pragma interrupt_handler timer17 //声明timer1( )为中断处 //理函数 #pragma interrupt_handler int02 //声明_int0( )为中断处理 //函数 void main (void) { GIMSK=0x40//使能INT0中断 TIMSK=0x80//使能T1溢出中断 _SEI( )//使能全局中断 . } void timer1(void)//T1溢出中断服务程序 { _SEI( ) //在T1溢出中断服务程序中开放全局中断 //保证INT0的优先级 . } 在C语言的中断服务程序 中断处理函数 中 会自动保护中断服务程序使用 过的所有寄存器 五 AVR和MCS51位操作功能的对比 MCS51和AVR都有较强的位操作功能 在汇编语言写的AVR源程序中对端口 的某一位置1可用SBI指令 清0可用CBI指令 在C语言程序中 可用位运算或在线汇编完成上述功能 如置PORTB的D2位 为1 清PORTB的D6位为0 PORTB|=(1<<2)//D2位置1 PORTB&=~(1<<6)//D6位清0 或 ASM(SBI 0x182 )//D2位置1 ASM(CBI 0x186 ) //D6位清0 六 AVR单片机内置EEPROM的使用 AVR是通过三个寄存器来访问MCU内置的EEPROM的 一个寄存器是EEAR 存放访问EEPROM的地址 其根据片内EEPROM的多少可能有不同的长度 另一个是8位的EEDR用于存放访问EEPROM的数据 第三个是EECR用 于控制对EEPROM的读写 EECR的结构如下图所示 X X X X X EEMWE EEWE EERE EEMWEEEPROM主写使能 只有在其置1后的4个时钟周期内将EEWE置 1 才能完成EEPROM写入 否则写操作无效 EEMWE被置1 后 在4个周 期后由硬件自动清除 EEWEEEPROM写入使能 EEREEEPROM读取使能 例 写数据到片内EEPROM中子程序 汇编语言 .def EEdwr =r16 写入EEPROM的数据 .def EEawr =r17 EEPROM的地址低位 .def EEawrh =r18 EEPROM的地址高位 EEWritesbic EECREEWE rjmp EEWrite 等待EEPROM就绪 out EEARHEeawrh out EEARLEEawr 送入EEPROM地址 out EEDREEdwr 送入写入EEPROM的地址 sbi EECR,EEMWE 设置EEPROM主写使能 sbi EECR,EEWE 设置EEPROM 写使能 ret C语言 注意应包含头文件eeprom.h int EEPROMwrite( int location, unsigned char); int location 片内 EEPROM的地址 unsigned char 写入 EEPROM的数据 七 AVR单片机内置看门狗电路 WatchDog的使用 AVR系列单片机内置看门狗电路 其由寄存器WDTCR控制 WDTCR的结构 如下图所示 X X X WDTOE WDE WDP2 WDP1 WDP0 WDTOE看门狗关闭使能 只有在该位被置1 后的4个时钟周期内将WDE清0才能关闭看门狗电路 否 则看门狗电路不会被关闭 WDTOE在被置1后 在4个周期后由硬件自动清0 WDE 置1时 使能看狗电路 清0时关闭看门狗电路 注意关闭看门狗电路 应在对WDTOE置1后4个时钟周期内进行 WDP0~WDP2看门狗电路的分频系数 产生复位所需要的振荡周期数 其 影响看门狗电路复位的时间 如表六所示 WDP 2 WDP 1 WDP 0 分频系数 DC3V时 产生复位所需时间 DC5V约1MHZ 产生复位所需时间 0 0 0 16K 47ms 15ms 0 0 1 32K 94ms 30ms 0 1 0 64K 0.19s 60ms 0 1 1 128K 0.38s 0.12s 1 0 0 256K 0.75s 0.24s 1 0 1 512K 1.5s 0.49s 1 1 0 1024K 3.0s 0.97s 1 1 1 2048K 6.0s 1.9s 注意 看门狗电路的振荡器为内部RC振荡器 其振荡频率受电压影响 在DC5V 时 约为1MHZ 在AVR中有一条指令WDR来清除看门狗定时器 在C语言中对应为_WDR( ) 或WDR( )函数 八 AVR和MCS51中串口通信UART功能的对比 在MCS51中串口通信的波特率发生需要使用一个定时器 而且支持的波特率也 较低 AVR单片机可以有较高的波特率 最高波特率可达115200而且有专用 的波特率发生器 注意AT90S1200没有UART只能用软件模拟串口通信 在AVR中用于UART的寄存器主要有以下几个 接收和发送数据寄存器UDR 状态寄存器USR控制寄存器UCR和波特率寄存器UBRR UDR寄存器由两个物理上分开的寄存器共享同一个地址 写入数据时是写到发 送寄存器 读出数据时是读取接收寄存器 USR如下图所示 其反映了UART的状态 RXC TXC UDR FE OR X X X RXCUART接收完成 TXCUART发送完成 UDRUART数据寄存器空标志 FE帧出错 OR 超越出错 UCR控制UART的工作 其组成如下图所示 RXCIE TXCIE UDRIE RXEN TXEN CHR9 RXB8 TXB8 RXCIE接收中断使能 TXCIE发送中断使能 UDRIEUART数据寄存器空中断使能 RXEN接收使能 TXEN发送使能 CHR9发送9位字符 RXB8接收到的第8位字符 TXB8发送的第8位字符 UBRR控制UART的波特率 其与波特率的计算公式为 BAUD=FCK/[16(UBRR+1)] 其中 BAUD表示波特率 FCK表示晶振频率 UBRR表示UBRR寄存器中的 常数 注意 波特率的计算值与标准波特率相差不能超过2% 否则会影响串行通信 例1 在8MHZ晶振下以19200波特率和PC机通信 可这样对AVR初始化 汇编语言 LDI R1625 OUT UBRRR16 LDI R16$18 OUT UCRR16 C语言 UBRR=25 UCR=0x18 例2 在8MHZ晶振下以19200波特率与PC机通信 每接收到一个非0字节 发送一个 OK #include #include void main(void) { unsigned char temp; UBRR = 25; UCR=0x18; puts("Hello World!"); putchar(0x0d); putchar(0x0a); while (1) { temp=getchar(); if (temp!=0) { puts("OK!"); putchar(0x0d); putchar(0x0a); temp=0; } } } 九 C51的源代码向ICCAVR的快速转换 熟悉C51的读者看了以上内容 完全可以很快写出AVR的C源程序来 下面 再将C51向ICCAVR的转换进行一次 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 1. 头文件 对C51中定义寄存器的头文件如reg51.hat89x51.h等替换成相应的 AVR头文件 如io8515.h io2313.h等 2. 中断处理函数 在C51 中以interrupt关键字来说明某一个函数为中断处理函数 在 ICCVAR中可采用#pragma interrupt_handler预处理命令在程序开始处 声明 具体用法如下 #pragma interrupt_handler <中断处理函数名> <中断向量号> 注意 对原C51源程序中的interrupt 和using关键字应当删除 3. 对 C51中的 bit和 sbit数据类型的处理 在ICCAVR中不支持bit和sbit数据类型 对这两种类型可用unsigned char来代替 对有关位运算用标准C的位运算功能进行处理 也可采取在线汇编处理 4. 对中断系统 定时器初始化 需重新根据相应控制寄存器的功能给其赋值 方法与C51相同 具体如下 对MCS51中TMODTCON的处理改为对AVR的TCCR0TCCR1ATCCR1B TIFR的处理 对MCS51中IEIP的处理改为对AVR中GIMSKTIMSKMCUCRSREG 的处理 5 将原C51中有关对看门狗电路 外部EEPROM的处理改为对AVR芯片内 部看门狗电路 内部EEPROM的处理 6 对MCS51UART的初始化改为对UCR和UBRR和被始化 7 如果使用片外SRAM应当对MCUCR初始化 如果有引脚作为输出引脚使 用 应当对其方向寄存器进行初始化 8 对C51中符合ANSI标准的C语言 原则上不需要进行修改 除非为了程序 结构的优化 下期四说AVR单片机 <>
本文档为【从MCS51 向AVR 的快速转换】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_571449
暂无简介~
格式:pdf
大小:109KB
软件:PDF阅读器
页数:21
分类:互联网
上传时间:2011-03-27
浏览量:24