1、 长沙理工大学创新实验室 1 C8051F020实验指导书 电气与信息工程学院电工电子实验中心 (2007 年 7 月 5 日) 长沙理工大学创新实验室 2 目录 目录- 2 前言 -3 第一章 训练训练板组成与结构-4 1.1 训练设备的组成 -4 1.2 Silicon Labs C8051F 单片机开发工具简-4 1.2.1 开发工具概述-4 1.2.2 开发工具主要技术指标-5 1.2.3 IDE 软件运行环境 -5 1.2.4 开发工具与 PC 机硬 件连接-5 1.3 C8051F020 CPU 板简介-5 1.3.1 C8051F020 CPU 板概述 - 5 1.3.2 C80
2、51F020 片上系统单片机片内资源 -5 1.4.1 训练资源介绍: - 6 1.4 训练板组成与结构 -6 1.4.2 训练板原理图: -6 1.4.3 训练板上 IO 口分布图:-7 第 二章 C8051F020 基本训练 -10 训练一: 读写片内 4KXRAM - 10 训练二 IO 口输入输出训练 -10 训练三 I/O 口演奏电子音乐 - 11 训练四 定时器 T3 训练 - 17 训练五 比较器训练 -19 训练六 中断 INT6 与中断 INT7 训练 - 21 训练七 PCA0 测量方波的周期 - 22 训练八 PCA1 输出 8 位 PWM- 27 训练九 12 位 AD
3、C0 训练 - 29 训练十 UART0 方式 0 实现同步串行移位通信-32 训练十一 DAC0 输出方波锯齿波正弦波 -34 第 三章 C8051F 扩展训练 -37 训练十二 RS-232 异步串行通信 -37 训练十三 RS-RS-485 异步串行通信 -40 训练十四 SPI 总线- SST25VF16 存储芯片读写 - 43 实验十五 SMBUS 总线-AT24C02 训练-50 训练十六 ZLG7290 键盘显示 -56 长沙理工大学创新实验室 3 训练十七 LCD 显示 -63 训练十八 实时时钟 PCF8563 -69 训练十九 PS2 键盘 -76 训练二十 红外遥控-82
4、 前言 MCS-51 单片机及其衍生产品在我国乃至世界范围获得了非常广泛的应用, 尤其是在我国,大部分大专院校都采用 MCS-51 单片机作为教学机型,大部分 单片机系统工程师都熟悉 MCS-51 单片机。随着一些高集成度、高性能的 8 位 和 16 位 RISC 单片机的推出,基于标准 8051 内核的单片机正面临着退出市场 的境地。因此一些半导体公司开始对传统 8051 内核进行大的改造,主要是提 高速度和增加片内模拟和数字外设,以期大幅提高单片机的整体性能。Silicon Labs 集成产品公司推出的 C8051F 单片机的出现令业界人士耳目一新,使广大 单片机系统设计人员看到了 51
5、单片机新的曙光。 MCS-51 单片机引入教学已达 10 年之久,大家一直期盼着有更先进的单片 机引入教学,C8051F 已成为事实上 51 的升级换代产品,那么必然会成为经典 单片机教学的方向,做设备可为大专院校教学训练课提供多项训练,使得学生 和单片机的初学者建立单片机系统概念,并可完成基础应用的培训,使学生掌 握 C8051F 的基本应用。本训练设备充分利用了 C8051F 的片内资源,可做为 研究生教学选修课。也可起到为本科生提供了解当前测控领域前沿技术的引导 作用。 长沙理工大学创新实验室 4 第一章:训练设备简介 1.1 训练设备的组成 训练箱由 C8051F020 CPU 板和系
6、统训练板二部分组成,应用该设备可进 行片上系统单片机较典型应用的训练,请参见以下介绍。 1.2 Silicon Labs C8051F 单片机开发工具简介 1.2.1 开发工具概述 Silicon Labs 的开发工具实质上就是计算机 IDE 调试环境软件及计算机 核心板 电源 串口 跑马灯模块 液晶模块 61LV256 PCF8563 AT24C02 25VF16 数码管模块 ZLG7290 IO 口 4X5 键盘 扬声器 PS2 长沙理工大学创新实验室 5 USB 到 C8051F 单片机 JTAG 口的协议转换器(UEC5)的组合(此部分电路已经 集成到系统训练板上)。SiliconLa
7、bs C8051F 系列所有的单片机片内均设计有调 试电路,该调试电路通过边界扫描方式获取单片机片内信息,通过 4 线的 JTAG 接口与开发工具连接以便于进行对单片机在片编程调试。训练板中的 C8051F020 CPU 板上的单片机为 C8051F 系列中的 F020。适配器(UEC5)一端 与计算机相连,另一端与 C8051F 单片机 JTAG 口相连,应用 SiliconLabs 提 供的 IDE 调试环境或 Keil 的 uVision2 调试环境就可以进行非侵入式、全速的 在系统编程(ISP)和调试。Silicon Labs 开发工具支持观察和修改存储器和寄存 器支持断点、观察点、堆
8、栈指示器、单步、运行和停止命令。调试时不需要额 外的目标 RAM、程序存储器、定时器或通信通道,并且所有的模拟和数字外设 都正常工作。 1.2.2 开发工具主要技术指标 支持的目标系统:所有 C8051Fxxx 系列单片机。 系统时钟:最大可达 25Mhz。 通过 USB 接口与 PC 机连接。 支持汇编语言和 C51 源代码级调试。 第三方工具支持(Keil C) 。 1.2.3 IDE 软件运行环境 要求 PC 机能够运行开发工具软件并能与串行适配器通信。对 PC 机有 如 下系统要求: Windows 95/98/Me/NT/2000/XP 操作系统 32Mb RAM 40Mb 自由硬盘
9、空间 空闲的 USB 口 1.2.4 开发工具与 PC 机硬件连接 将 USB 串行电缆的一端与训练箱的 USB 连接; 连接 USB 串行电缆的另一端到 PC; 给目标系统上电; 插入 CD 并运行“SETUP.EXE” ,将 IDE 软件安装到您的 PC 机; 在 PC 机的开始菜单的 “程序”项中选择 Silicon Labs IDE 点击 Silicon Labs 图标,运行 IDE 软件。 1.3 C8051F020 CPU 板简介 1.3.1 C8051F020 CPU 板概述 C8051F020 CPU 板是为了便于安装而设计的;C8051F020 CPU 板是将 C8051F0
10、20 的所有引脚(100 个引脚)引到五个单排针 ;该五组单排针可与不 同用户设计的应用系统连接,如在该训练系统上将和系统训练板连接。 1.3.2 C8051F020 片上系统单片机片内资源 、模拟外设 长沙理工大学创新实验室 6 (1) 逐次逼近型 8 路 12 位 ADC0 转换速率最大 100ksps 可编程增益放大器 PGA 温度传感器 (2) 8 路 8 位 ADC1 输入与 P1 口复用转换速率 500ksps 可编程增益放大器 PGA (3) 两个 12 位 DAC (4) 两个模拟电压比较器 (5) 电压基准内部提供 2.43V 外部基准可输入 (6) 精确的 VDD 监视器
11、、高速 8051 微控制器内核流水线式指令结构速度可达 25MIPS22 个矢量中 断源 、存储器片内 4352 字节数据 RAM64KB Flash 程序存储器可作非易失性存储 外部可扩展的 64KB 数据存储器接口 、数字外设 8 个 8 位的端口 I/OI2C、SPI、2 个增强型 UART 串口可编程的 16 位计数器/定时器阵列(PCA)5 个通用 16 位计数器 /定时器专用的看门狗 WDT 更详细资料可参见 Silicon Labs C8051F02x datasheet 1.4 训练板组成与结构 1.4.1 训练资源介绍: 本训练板由电源.串口通信.跑马灯. 红外通信.126X
12、64 的液晶显示.PS/2 键盘. 实时时钟.外部存储器扩展.ZLG7290 键盘显示.IIC 总线.SPI 总线.蜂鸣器. AD.DA.以及外部 IO 扩展口等 15 个基本模块组成.训练所用的芯片资料见 随本指导书资料. 1.4.2 训练板原理图: 长沙理工大学创新实验室 7 1.4.3 训练板上 IO 口分布图: 长沙理工大学创新实验室 8 第 二章 C8051F020 基本训练 训练一: 读写片内 4KXRAM 1 训练目的: (1)学习使用 Silicon Labs 集成开发环境 IDE,包括 IED 安装,菜单功能及 单步调试程序的方法 (2)学会配置与片内 XRAM 相关的寄存器
13、,编程读写片内 4K XRAM; (3)学习使用数字交叉开关配置可编程 IO 口的方法。 2 训练设备 C8051F 开发平台一台,USB 电缆一条 ,在线调试 PC 机一台。 3 训练内容 (1)学习使用 Silicon Labs 集成开发环境 IDE,包括 IED 安装,菜单功能及单 步调试程序的方法 (2)熟悉与片上 XRAM 数据存储器配置有关的寄存器: EMIOCF,EMIOTC,EMIOCN; (3)熟悉交叉开关配置(XBR2=0x40 ) ; (4)看懂程序实例; (5)练习查看外部存储器窗口; 4 训练步骤 长沙理工大学创新实验室 9 (1)程序对片上数据存储器(4KB)操作,
14、程序运行时先丛片内外部 4KB XRAM 的首地址(0000H)开始依次写入 256 个数据,然后再从片内数据 存储器的首地址读出并与写入的 256 个数据比较看是否一致,不一致蜂鸣 器响一声。 (2)打开 IDE 的 EXTERNAL RAM 窗口,观测片内数据是否正确。 5 参考程序: /参考程序 B:/WXRAMB.C 程序对片内数据存储器(4K RAM)实现读/写操作, 先在地址/0000-00FFH 写入数据,再读出进行比较是否正确 ,若不正确蜂鸣器 响一声 #include / SFR declarations #include sbit BUZ = P35 ; / P35 位管理
15、蜂鸣器 unsigned char xdata *point; void PORT_Init (void); void sleep_ms(unsigned char count) /延时 unsigned char ii,jj; for(ii=0;ii0;timer-) _nop_(); /* 函数功能:ms 延时 输入参数:延时时间 timer 输出参数:无 */ void delay_ms(unsigned int i)/ms 沿时 while(-i) delay_us(10); void main () unsigned char a=0,i=1,j=1; WDTCN=0xde; WDT
16、CN=0xad;/关看门狗 while (1) if (P5=0x00)P5=0xff; if(a%2=0) if(i8)a+;i=0; delay_ms(100); P5=1; i+; if(a%2!=0) if(j8)a+;j=0; P50xfe PCA0CPH0=a; a+; if(a=0xfe)PWM_PAC=1; else /占空比由 0xfe 0 长沙理工大学创新实验室 29 PCA0CPH0=a; a-; if(a=0)PWM_PAC=0; for(b=0;b0xffffffff;b+)/延时 _nop_(); /配置 I/O 端口 void PORT_Init (void) X
17、BR0 = 0x08; /*CEX0P0.0*/ XBR2 = 0x40; /*使能交叉开关和弱闪拉*/ P0MDOUT |= 0x01; /*使能 P0.0 脚推挽输出 */ /配置 PCA 的 CEX0 输出 8 位 PWM 信号 void PCA_Init (void) PCA0CN = 0x40; PCA0CPM0 = 0x42; PCA0CPL0 = 0x00; PCA0CPH0 = 0x0 训练 训练九 12 位 ADC0 训练 1 训练目的 掌握 12 位数/模转换的原理和编程技术 学会使用与 ADC 有关的特殊功能寄 存器 结合 LCD 显示和定时器 3 综合应用多项技术 通过
18、编程实现 12 位 A/D 转换和 ADC 输出数据显示 2 训练设备 C80C8051F 开发平台 USB 电缆一条 ,在线调试 PC 机一台。 3 训练内容 掌握与 A/D 转换有关的寄存器 (具体细节参看数据手册) 4 训练步骤 长沙理工大学创新实验室 30 (1)按照原理图接好电路; (2)运行参考程序 (3)在 IDE 观测窗口中查看 ADC0 的采样值。 5 参考程序: /参考程序 B.WADC0.c 程序模/数转化通道 AIN0.0 的输入值,数码管显示两位. #include sfr16 TMR3RL = 0x92; sfr16 TMR3 = 0x94; sfr16 ADC0
19、= 0xbe; #define SYSCLK 2000000 bit LCDBit; unsigned long x; void PORT_Init (void); void Timer3_Init (int counts); void ADC_Init(void); void ADC_ISR (void); void LCD_Init(void); void main (void) unsigned char data1,i; unsigned char *lcdpoint; /指向 lcddata 数组的指针 unsigned char ADC0Data10=0x0a,0x0d,0x0c,
20、0x00,0x68,0x68; WDTCN = 0xde; WDTCN = 0xad; /禁止看门狗定时器 LCDBit=0; / PORT_Init(); LCD_Init(); Timer3_Init (SYSCLK / 12 /5 ); ADC_Init(); EA = 1; AMX0SL =0x00; /选择通道 0 for(x=0;x4) ADC0Data7=(ADC08) ADC0Data6=(ADC012) P6 = 0x05; /准备送数据 for(x=0;x0;i-) /显示第一行字符 data1=*lcdpoint; if(data1=0x0a) data1 += 0x37
21、; /将显示数据转化为液晶的显示字符码 else data1 += 0x30; P7 = data1; P6 = 0x04; P6 = 0x05; lcdpoint+; for(x=0;x LCD_RES,P3.3 LCD_REQ,P3.2 7290_/RES, /P3.0 OE574 四位设置为推拉输出方式; /P3.4 LCD_BUSY,P3.1PS2_DATA 两位设置为开 漏输出方式。 P74OUT = 0xFF;/将 P4,P6,P5,P7 口配置为推拉输出方式 P0MDOUT = 0x01;/将 TX0,TX1 设置为推拉输出方式 P1MDOUT = 0x01; XBR0 = 0x
22、DF;/按照配置表进行各个外设的配置 XBR1 = 0x1C; XBR2 = 0x44; /*额外的配置请在本行文字以下进行配置并请加详细注释 */ void Oscillator_Init(void) /晶振初始化 int i = 0; OSCXCN = 0x67; for (i = 0; i 16); Send_byte(Dst Send_byte(Dst Send_byte(byte); CE_High(); / 函数功能:擦除整个芯片数据 / 输入参数:无 / 输出参数:无 void Chip_Erase(void) CE_Low(); Send_byte(0xC7); CE_High
23、(); / 函数功能:擦除一个扇区数据 / 输入参数:擦除扇区地址 Dst 长沙理工大学创新实验室 48 / 输出参数:无 void Sector_Erase(unsigned long Dst) CE_Low(); Send_byte(0xD8); Send_byte(Dst Send_byte(Dst Send_byte(Dst CE_High(); / 函数功能:读状态寄存器返回状态寄存器的值 / 输入参数:无 / 输出参数:状态寄存器的值 unsigned char Read_Status_Register(void) unsigned char byte; CE_Low(); Sen
24、d_byte(0x05); byte=Get_byte(); CE_High(); return byte; / 函数功能:写一字节数据到状态寄存器 / 输入参数:待写入数据 DAT / 输出参数:无 void WRSR(unsigned char byte) CE_Low(); Send_byte(0x01); Send_byte(byte); CE_High(); / 函数功能: 在指定地址中读取一个字节数据 / 输入参数: 地址参数 Dst(3byte) / 输出参数: 读取到的字节数据 byte unsigned char Read(unsigned long Dst) unsigne
25、d char byte; CE_Low(); Send_byte(0x03); Send_byte(Dst Send_byte(Dst Send_byte(Dst byte=Get_byte(); 长沙理工大学创新实验室 49 CE_High(); return byte; /* / 函数功能:从指定地址开始连续读取 N 个数据 / 输入参数:地址参数 Dst(3byte),读取字节数 N(1-256) / 输出参数:无 */ void Read_Cont(unsigned long Dst,unsigned long N) unsigned long i=0; CE_low(); Send_
26、byte(0x03); Send_byte(Dst Send_byte(Dst Send_byte(Dst for(i=0;i16); Send_byte(Dst Send_byte(Dst Send_byte(0xFF); byte=Get_byte(); CE_High(); return byte; /* / 函数功能:从指定地址开始高速连续的读取 N 个字节数据 / 输入参数:地址参数 Dst,读取的字节个数 N(1-256) / 输出参数:无 长沙理工大学创新实验室 50 */ void HighSpeed_Read_Cont(unsigned long Dst,unsigned c
27、har N) unsigned long i; CE_Low(); Send_byte(0x0B); Send_byte(Dst Send_byte(Dst Send_byte(Dst Send_byte(0xFF); /*dummy byte*/ for(i=0;i LCD_REQ,P3.2 7290_/RES, /P3.0 OE574 四位设置为推拉输出方式; /P3.4 LCD_BUSY,P3.1PS2_DATA 两位设置为开 漏输出方式。 P74OUT = 0xFF;/将 P4,P6,P5,P7 口配置为推拉输出方式 P0MDOUT = 0x01;/将 TX0,TX1 设置为推拉输出方
28、式 P1MDOUT = 0x01; XBR0 = 0xDF;/按照配置表进行各个外设的配置 XBR1 = 0x1C; XBR2 = 0x44; /*额外的配置请在本行文字以下进行配置并请加详细注释 */ void Oscillator_Init() int i = 0; OSCXCN = 0x67; 长沙理工大学创新实验室 56 for (i = 0; i LCD_REQ,P3.2 7290_/RES, /P3.0 OE574 四位设置为推拉输出方式; /P3.4 LCD_BUSY,P3.1PS2_DATA 两位设置为 开漏输出方式。 P74OUT = 0xFF; /将 P4,P6,P5,P7
29、 口配置为推拉输出方式 P0MDOUT = 0x01; /将 TX0,TX1 设置为推拉输出方式 P1MDOUT = 0x01; XBR0 = 0xDF; /按照配置表进行各个外设的配置 长沙理工大学创新实验室 63 XBR1 = 0x1C; XBR2 = 0x44; /*额外的配置请在本行文字以下进行配置并请加详细注释 */ void Oscillator_Init() /系统时钟初始化 int i = 0; OSCXCN = 0x67; for (i = 0; i 0;timer-) _nop_(); /* 函数功能:ms 延时 输入参数:延时时间 timer 输出参数:无 */ void
30、 delay_ms(unsigned int i)/ms 沿时 while(-i) 长沙理工大学创新实验室 65 delay_us(500); /* 函数功能:LCD 初始化 输入参数:无 输出参数:无 */ void lcd_init(void) LCDRES=0; delay_ms(5); LCDRES=1; LCDREQ=0; LCDBUSY=0; delay_ms(5); /* 函数功能:写数据到 LCD 输入参数:写数据 (char) writedata 输出参数:无 */ void write_data(unsigned char data writedata) LCDBUSY=1
31、; while(LCDBUSY!=0); OE573=0; LCDDATA=writedata; delay_us(2); LCDREQ=1; delay_us(10); LCDBUSY=1; while(LCDBUSY=0); LCDREQ=0; OE573=1; /* 函数功能:显示 8*8ASCII 字符 输入参数:X 坐标 X 从 0x04 到 0x13 共 16 个字符以字符为单位递增; (0-15) Y 坐标 Y 从 0 到 0x3F 共 64 个点以点为单位递增 ; (0-63) 输出参数:无 */ void send_ascii8(unsigned char x,unsigne
32、d char y,unsigned char ascii) 长沙理工大学创新实验室 66 write_data(0xf1); write_data(x+0x04); write_data(y); write_data(ascii);/写要显示的 ASCII 码; /* 函数功能:显示 8*16ASCII 字符变量 输入参数:X 坐标 X 从 0x04 到 0x13 共 16 个字符以字符为单位递增; (0-15) Y 坐标 Y 从 0 到 0x3F 共 64 个点以点为单位递增 ; (0-63) 输出参数:无 */ void send_ascii16(unsigned char x,unsig
33、ned char y,unsigned char ascii) write_data(0xF9); write_data(x+0x04); write_data(y); write_data(ascii);/写要显示的 ASCII 码; /* 函数功能:显示 8*8ASCII 字符串 输入参数:X 坐标从 0x04 到 0x13 共 16 个字符以字节为单位递增 (0-15) Y 坐标从 0 到 0x3F 共 64 个点以点为单位递增 (0-63) 输出参数:无 */ void send_asc8str(unsigned char x,unsigned char y,unsigned char
34、 *ascii) while(*ascii)!=0) write_data(0xf1); write_data(x+0x04); write_data(y); write_data(*ascii);/写要显示的 ASCII 码; ascii+; if(x10) /接收到第一位通码时将开始处理键值 /置键值处理标志为 1,并将中断关闭。 count=0; 长沙理工大学创新实验室 81 flag=1; EX0=0; /* 函数功能:PS2 键值转换函数 输入参数:scanCode 输出参数:无 */ void Decode(unsigned char ScanCode) unsigned char
35、 TempCyc; if (!Key_UP) /当键盘松开时 switch (ScanCode) case 0xF0 : / 当收到 0xF0,Key_UP 置 1 表示断码开始 Key_UP = 1; break; default: if(!Shift) /如果 SHIFT 没按下 for (TempCyc = 0;(UnShiftedTempCyc0!=ScanCode) TempCyc+); /查表显 示 if (UnShiftedTempCyc0 = ScanCode) key=UnShiftedTempCyc1; break; else Key_UP = 0; flag = 0; /
36、标识字符处理完了 dat=0; /* 主函数*/ void main(void) 长沙理工大学创新实验室 82 WDTCN=0xde; WDTCN=0xad;/关看门狗 Init_Device(); lcd_init(); delay_ms(10); send_ascii16(4,16,5); do if (flag) Decode(dat); send_ascii16(4,16,key); else EX0 = 1; /开中断 while(1); 训练二十 红外遥控 1 训练目的: (1)用 C8051F 接收红外遥控器的数据并显示出来; (2)在实验和编程的过程中,熟悉红外收/发器的工作原
37、理,理解红外收 /发器 的电路设计 (3 练习有 C 语言编程 2 训练设备 C8051F 开发平台一台,USB 电缆一条 ,在线调试 PC 机一台。 3 训练内容 (1)看懂红外编码以及解码原理 (2)学会红外遥控技术 (3)熟悉 C8051F 编程技术 4 训练步骤 (1)按实验电路图连接电路 (2)运行参考程序 (3)观察数码管上的显示数据,验证程序。 5 参考程序: 长沙理工大学创新实验室 83 /*在这个程序里设了一个软件复位键,即 7290 键盘的 F3 和 PS2 的 ENTER 长按. /*PS2 的键值未加处理,可根据需要对健值进行处理,如设第二功能键之类 /*使用了奇偶校验,数据一般比较正确 /*由于用中断没有实现,所以是用的捕获 1,需用跳线把 PS2 的中断接到