C8051F020实验指导书
C8051F021单片机实验指导

提要:实验项目1、单片机的IO编程实验1 IO开关量输入实验实验2 IO输出驱动继电器(或光电隔离器)实验实验3 IO输入/输出------半导体温度传感器DS18B20实验2、单片机的中断系统实验1 外部外部中断----脉冲计数实验3、单片机的定时器/计数器实验1 计数器实验实验2 秒时钟发生器实验4、单片机的串口特点和编程实验1 P C机串口通讯实验实验2 R S485通讯实验5、存储器实验1 RAM存储器读写实验6、PWM发生器实验1 PWM发生器(模拟)实验实验1 PWM发生器(内部)实验7、WDG看门狗实验1 外扩WDG(MAX813)实验实验2 WDG(内部)实验8、SPI总线实验1 SPI(模拟)实验-----TLC2543 AD转换实验实验2 SPI(模拟)实验-----TLV5616 DA转换实验9、I2C总线实验1 I2C(模拟)实验-----AT24C01读写实验实验2 I2C(内部)实验-----AT24C01读写实验10、综合实验实验1 HD7279LED数码管显示实验实验2 HD7279键盘实验实验3 外部中断---电机转速显示实验11、步进电机正反转实验12、TFT液晶显示彩色条纹实验13、16X16LED点阵显示汉字实验一、单片机的IO编程实验1 IO开关量输入实验目的:学习单片机读取IO引脚状态的的方法。
内容:编程读取IO引脚状态。
设备:EL-EMCU-I试验箱、EXP-C8051F021 CPU板。
编程:首先要把相关的引脚设置在IO的输入状态,然后写一个循环,不停地检测引脚的状态。
步骤:1、将CPU板正确安放在CPU接口插座上,2、连线:用导线将试验箱上MCU部分的IO1--- IO8分别连接到SWITCH 的8个拨码开关的K1---K8的输出端子K1---K8上,连接好仿真器。
3、试验箱上电,在PC机上打开Keil C环境,打开试验程序文件夹IO_INPUT 下的工程文件IO_INPUT.Uv2编译程序,上电,在函数main()的最后一句设置断点,进入调试状态,打开窗口Peripherals-->IO-Port-->P3,改变开关状态,运行程序到断点处,观察窗口的数值与开关的对应关系。
c8051f020信号发生器设计报告

目录◆ 实验目的 ....................................................................................................................................................................... - 2 - ◆ 软件设计 ....................................................................................................................................................................... - 4 -第一节软件总体设计 .......................................................................................................................................... - 4 - 第二节软件功能设计 .......................................................................................................................................... - 4 -一、系统初始化程序设计 ......................................................................................................................... - 4 -二、键盘扫描及处理程序设计 ............................................................................................................... - 5 -三、中断服务程序设计 ............................................................................................................................- 12 -四、数据显示部分......................................................................................................................................- 14 -五、DAC0部分.............................................................................................................................................- 15 -六、附加模块................................................................................................................................................- 16 - ◆ 电路设计 .....................................................................................................................................................................- 20 -第一节电路总体设计 ........................................................................................................................................- 20 - 第二节电路功能设计 ........................................................................................................................................- 21 -一、总体电路模块......................................................................................................................................- 21 -二、电源模块................................................................................................................................................- 22 -三、开关电容滤波器模块 .......................................................................................................................- 22 -四、四象限乘法器模块 ............................................................................................................................- 23 -五、负载驱动模块......................................................................................................................................- 25 -六、负载模块................................................................................................................................................- 25 - ◆ 实验调试 .....................................................................................................................................................................- 26 -第一节程序调试..................................................................................................................................................- 26 -一、初始化程序...........................................................................................................................................- 26 -二、键盘扫描及处理程序设计 .............................................................................................................- 26 -三、显示程序................................................................................................................................................- 27 -四、定时器2、3服务程序及正弦波发生程序 .............................................................................- 28 -第二节电路调试..................................................................................................................................................- 28 -一、电源模块调试......................................................................................................................................- 28 -二、开关电容滤波器模块调试 .............................................................................................................- 29 -三、四象限乘法器模块调试 ..................................................................................................................- 30 -四、负载驱动及负载模块调试 .............................................................................................................- 30 - ◆ 实验结果 .....................................................................................................................................................................- 31 - ◆ 实验数据及分析.......................................................................................................................................................- 34 -第一节数/模转换MCU DAC输出................................................................................................................- 34 - 第二节低通滤波器输出 ...................................................................................................................................- 34 - 第三节低通滤波器时钟信号..........................................................................................................................- 35 - 第四节系统最终输出信号...............................................................................................................................- 35 - ◆ 实践总结、心得.......................................................................................................................................................- 36 - ◆ 附录一源程序.......................................................................................................................................................- 37 - ◆ 附录二电路原理图 .............................................................................................................................................- 52 -实验目的(1) 系统框图(2) 平台实验板实验室提供“电子系统设计实验平台板”,板上集成C8051F020处理器,该处理器内置DAC 等资源,合成信号即由该DAC 输出(电压信号)。
C8051F020实验

目 录说明 (3)MT020学习开发板/MT-UDA仿真器说明 (4)一 C8051F020/120单片机学习开发板(MT020)简介 (5)1.1 MT020单片机学习开发板特色 (5)1.2 MT020与国内同类产品比较 (5)1.3 MT020与同类产品实物图比较 (7)二 电路原理图 (8)2.1 MT020电路原理图 (8)2.2 MT020学习开发板TopLayer图 (13)三 快速运行第一个程序 (15)3.1 Keil C51 的安装 (15)3.1.1 系统要求 (15)3.1.2 软件的安装 (15)3.2 MT-UDA调试仿真器驱动程序的安装 (17)3.3 μVision2 集成开发环境 (18)3.3.1 μVision2 集成工具 (18)3.3.2 菜单栏命令、工具栏和快捷方式 (18)3.4 Keil C51使用及与仿真器连调 (23)3.4.1 创建第一个Keil C51 应用程序 (23)3.4.2 程序文件的编译、链接 (29)3.4.3 程序调试 (32)四 MT020学习开发板基础实验 (37)4.1 I/O口控制实验(蜂鸣器驱动实验) (37)4.2 精确延时程序实现 (38)4.3 数码管显示实验 (39)4.4 键盘扫描实验 (40)4.5 中断按键实验 (41)4.6 软件模拟I2C总线实验(EEPROM AT24C01) (42)4.7 利用SMBUS实现基于I2C器件操作实验(读写EEPROM AT24C01) (43)4.8 字符型液晶1602显示实验 (44)4.9 图型液晶12864显示实验 (45)4.10 串口通信实验 (46)4.11 数字温度传感器DS18B20实验 (47)4.12 ADC0片上温度采集实验 (48)4.13 ADC0电压采集实验 (49)4.14 DAC0输出正弦实验 (50)4.15 DAC0输出DTMF信号实验 (51)4.16 比较器(CP)实验 (52)4.17 硬件SPI接口控制跑马灯实验 (53)4.18 用PCA硬件单元实现PWM实验 (54)4.19 用PCA硬件单元实现边沿捕捉实验 (55)4.20 红外数据收发实验 (56)说 明本电子文档是MT020学习开发板实验手册,本文档为作者劳动成果,未经作者同意,请忽用于商业目的。
C8051F020单片机实验接线表.

一、C8051F020单片机实验接线表(注:黑体部分已调试通过)3.8 WDT看门狗实验一、实验目的熟悉汇编语言编程,掌握C8051F020内部WDT的应用。
二、实验内容通过改变延时程序的延时值,使延时值分别小于和大于WDT设置的定时间隔,运行程序,观察P0.0控制的发光二极管L8的变化。
三、实验原理介绍MCU内部有一个使用系统时钟的可编程看门狗定时器(WDT)。
当看门狗定时器溢出时,WDT将强制CPU进入复位状态。
为了防止复位,必须在溢出发生前由应用软件重新触发WDT。
如果系统出现了软件/硬件错误,使应用软件不能重新触发WDT,则WDT将溢出并产生复位,这样可以防止系统失控。
WDT是一个使用系统时钟的21位定时器。
该定时器检测对其控制寄存器的两次写操作的时间间隔。
如果这个时间间隔超过了编程的极限值,将产生WDT复位。
可以根据需要用软件允许和禁止WDT,或根据需要将其设置为永久性允许状态。
可以通过看门狗定时器控制寄存器(WDTCN)控制看门狗的功能。
(1)允许/复位WDT看门狗定时器的允许和复位是通过向WDTCN寄存器写入0xA5来实现的。
用户的应用软件应周期性地向WDTCN写入0xA5,以防止看门狗定时器溢出。
每次系统复位都将允许并启动WDT。
(2)禁止WDT向WDTCN寄存器写入0xDE后再写入 0xAD将禁止WDT。
下面的代码说明禁止WDT的过程:CLR EA ;禁止所有中断MOV WDTCN,#0DEh ;禁止看门狗定时器MOV WDTCN,#0ADhSETB EA ;重新允许中断必须在4个时钟周期之内写0xDE和写0xAD,否则禁止操作将被忽略。
在这个过程期间应禁止中断,以避免两次写操作之间延时。
(3)锁定WDT向WDTCN写入0xFF将使禁止功能无效。
WDT一旦被锁定,在下一次复位之前禁止操作将被忽略,写0xFF并不允许或复位看门狗定时器。
如果应用程序想一直使用看门狗,则应在初始化代码中向WDTCN写入0Xff.(4)设置WDT定时间隔WDTCN.[2~0]控制看门狗的超时间隔。
C8051F系列实验指导书

第二章 C8051单片机实验内容
三 实验硬件电路,LED电路见图2-1,开关电 路见图2-2,
图2-1 八位LED灯电路图
第二章 C8051单片机实验内容
图2-2 拨档开关电路图
第二章 C8051单片机实验内容
C8051F020/1/2/3 内部有5 个计数器/定时器:其中三个16 位 计数器/定时器与标准8051 中的计数器/定时器兼容,还有两个 16 位自动重装载定时器可用于ADC、SMBus、UART1 或作为 通用定时器使用。
第一章:单片机实验设备简介
(5)、下载代码到FLASH: • 简单地按下生成工具栏中的下载按钮 或 使用Debug 菜单中的“Download”命令,就可 以下载程序到目标处理器的flash 中(注意: 只有在执行“Connect”命令后才能下载代码 到目标硬件)。 • 下载成功之后,点击运行/终止键(绿色圆点/ 红色)运行程序,再点即终止运行,终止后可 修改程序。
单片机与PLC技术实验指导书
实验地点: 一区主楼623房间 指导教师:胡振坤
进实验室领取C8051及PLC实验报告 带相关数据手册或课件,需要查阅。 不用带鞋套。
第一章:单片机实验设备简介
1.1 C8051F系统实验设备的组成 • NCD-CIP51F020 综合实验设备由 C8051F020 CPU 板和系统实验板二部分组 成,见图1-1,应用该设备可进行片上系统 单片机较典型应用的实验。
图2-3 定时器列表
第二章 C8051单片机实验内容
定时器3 是一个16 位的计数器/定时器,由两个8位的SFR组成, TMR3L(低字节)和TMR3H (高字节)。
图2-4 定时器3的工作方式
第二章
1 6 2 10
c8051f020SPI-ATT7022通信

此程序实验板已调试通过/*此程序接收UR0寄存器地址读取此寄存器内容并从UR0口发出,以数组方式进行(按寄存器读发)*//*主意事项:1、作为输入脚一定要设置成推挽方式2、SPI只有发时才有时钟,所以读数据时一定要先发0以激发时钟信号。
/**********************************************文件描述:三相电测量上报功能说明:测量A TT7022B完成PCF8563上报定时(需校时)FM24C256转换数据存储UART0口用于RS232读数据UART1控制无线模块上报数据创建:2006年12月5日/**********************************函数:main.*入口:无*出口:无*功能说明:接收UART端口命令执行读A TT7022B的数据进行处理、存储和回发数据********************************///*****************************//包含的文件//******************************#include <c8051f020.h>#include <main.h>#include <intrins.h>//*************************************************//函数:init_sysclk(void)//功能:时钟初始化//入口:无//出口:无//说明:使用外部时钟12M//*************************************************void init_sysclk (void){uint i=0;OSCXCN=0x67; //external oscillator with 12MHz crystalfor(i=0;i<256;i++); // XTLVLD blankingwhile(!(OSCXCN & 0x80)); // Wait for crystal osc. to settleOSCICN=0x88; //时钟丢失检测,选择外部时钟CKCON = 0x00; //时钟分频}/*********************************函数:void enable_wdog(void)void disable_wdog(void)功能:使能、禁止wdog入口:无出口:无说明:********************************/void enable_wdog(void){WDTCN=0xA5;//允许看门狗定时器工作}void disable_wdog(void) //禁止看门狗定时器工作{WDTCN=0xDE;WDTCN=0xAD;}/***********************************函数:void init_ioport()功能:端口配置及端口位定义入口:无出口:无说明:*************************************/void init_ioport(){XBR0=0x07; //TXD0-P0.0 RXD0-P0.1,SPI_SCK-P0.2,SPI_MISO-P0.3//SPI_MOSI-P0.4,SPI_NSS-P0.5,SDA-P0.6,SCL-P0.7, XBR1=0X10; //INT1使能INT1--P1.2XBR2=0x44; //端口I/O弱上拉允许,TX1-P1.0,RXD-P1.1交叉开关允许P0MDOUT=0x08; //端口0输出方式寄存器:0--漏极开路P1MDIN=0XFF; //端口1输入方式寄存器:0--配置为数字输入P1MDOUT=0x00; //端口1输出方式寄存器,0--漏极开路P1=0xff;P2MDOUT=0x00; //端口2输出方式寄存器:0--漏极开路P2=0xff;P3MDOUT=0X00; //端口3输出方式寄存器:0--漏极开路P3=0xff;P74OUT=0x00; //端口7-4输出方式寄存器:0--漏极开路P4=0xff;P5=0xff;P6=0xff;P7=0xff;}//--------------------------------------------------------------//函数:void Delay_ms (unsigned ms)//功能:实现延时功能Timer0_ms//---------------------------------------------------------------///* Configure Timer0 to delay <ms> */void Delay_ms (unsigned ms){uchar i; // millisecond counterTCON &= ~0x30; // STOP Timer0 and clear overflow flag TMOD |= 0x01; // configure Timer0 to 16-bit mode CKCON |= 0x08; // Timer0 counts SYSCLKsfor (i = 0; i < ms; i++) // count milliseconds{TR0 = 0; // STOP Timer0TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1msTL0 = -SYSCLK/1000;TR0 = 1; // START Timer0while (TF0 == 0); // wait for overflowTF0 = 0; // clear overflow indicator }}//-------------------------------------------------------//函数:void Delay_us (unsigned us)//功能:实现延时功能Timer0_us//-------------------------------------------------------///* Configure Timer0 to delay <us>*/void Delay_us (unsigned us){uchar i; // microseconds counterTCON &= ~0x30; // STOP Timer0 and clear overflow flagTMOD |= 0x01; // configure Timer0 to 16-bit modeCKCON |= 0x08; // Timer0 counts SYSCLKs for (i = 0; i < us; i++) // count microseconds{TR0 = 0; // STOP Timer0TH0 = (-SYSCLK/1000000) >> 8; // set Timer0 to overflow in 1usTL0 = -SYSCLK/1000000;TR0 = 1; // START Timer0while (TF0 == 0); // wait for overflowTF0 = 0; // clear overflow indicator}}//***************************************//函数:unsigned char my_add(uchar my_add)//功能:读开关状态确定子地址//入口:无//出口:子地址//说明:子地址存于myadd中(即设备号)//****************************************void my_add(void){P74OUT |=0XD0;myadd =P5;}//******************************************//函数:void jiaob(A TT_JB[])//功能:写校表寄存器//说明:UART口接收校表时间并存于FM24C256中//*****************************************void jiaob (void){}main()disable_wdog(); //关看门狗init_sysclk (); //时钟初始化init_ioport(); //交叉开关配置my_add(); //读设备子地址设置UART0_Init(); //UART0初始化SPI0_Init ();EX1= 1; //开INT1EA = 1; //开中断SPIEN=1;uart0_flag=0;while(1){if(uart0_flag){uart0_flag=0;A TT_Read (ur0_rxd[0]);m=&ur0_rxd[0];txd_string(m,3);}}}//---------判断本设备命令及命令内容执行命令-------//-----------------------------------------------------------------------------// SPI0_Init//-----------------------------------------------------------------------------//// Configure SPI0 for 8-bit, 200K SCK, Master mode, data// sampled on SCK 2st edge.//void SPI0_Init (void){SPI0CFG = 0x87; // data sampled on SCK 2st edge// 8-bit data words,MSB 1st SPI0CN = 0x02; // Master mode; SPI enabled; flags// clearedSPI0CKR = 0x2F; // SPI clock <= 200kHz (limited by// EEPROM spec.)EIE1 &= 0XFE; // spi关//开漏}//-----------------------------------------------------------------------------// A TT_Read//-----------------------------------------------------------------------------//// This routine reads and returns a single A TT7022 byte whose address is// given in <Addr>.//void A TT_Read (uchar x){uchar n=0;A TT_CS = 0; // select att7022SPIF = 0;Delay_us (1); // wait at least 250ns (CS setup time) SPI0DA T = x;while (SPIF==0);Delay_us (3);SPIF = 0;for(n=0;n<=3;n++){SPI0DA T = 0;while (SPIF==0);SPIF = 0;ur0_rxd[n]= SPI0DA T; // read data from SPI} // read data from SPIDelay_us (1); // wait at least 250ns (CS hold time)A TT_CS = 1; // de-select EEPROMDelay_us (1); // wait at least 500ns (CS disable time) }//-----------------------------------------------------------------------------// A TT_Write//-----------------------------------------------------------------------------//void A TT_Write (uchar A TT_W ADD, uchar att_wd[]){uchar n;A TT_WADD = A TT_W|A TT_W_ADD;A TT_CS = 0; // select att7022Delay_us (1); // wait at least 250ns (CS setup time)// transmit Write opcodeSPIF = 0;SPI0DA T = A TT_W|A TT_W_ADD;while (SPIF == 0);SPIF = 0;SPI0DA T = att_wd[n];while (SPIF == 0);n = ++n;SPIF = 0;SPI0DA T = att_wd[n];while (SPIF == 0);n = ++n;SPIF = 0;SPI0DA T = att_wd[n];while (SPIF == 0);Delay_us (1); // wait at least 250ns (CS hold time)A TT_CS = 1;}//-----------------------------------------------------//串口初始化//--------------------------------------------------------void UART0_Init(void){SCON0 = 0x50; //串口方式1,波特率可变PCON |= 0x00; //SMOD = 0TMOD = 0x20; //选择T1方式2,TH1 = 0xe8; //T1初值,TL1 = 0xe8;ES0 = 1; //UART0中断开启TR1 = 1; //启动定时器T1}//----------------------------------------------------------//发送单个字符//---------------------------------------------------------void txd_char(unsigned char ch){SBUF0 = ch; //送入缓冲区while(TI0 == 0); //等待发送完毕TI0 = 0; //软件清零}//-----------------------------------------------------//发送字符串,调用Send_Char() len字符串长度//----------------------------------------------------void txd_string(unsigned char * str,unsigned char len){unsigned char k = 0;do{txd_char(*(str+k) );k++;} while(k < len);}//--------------------------------------------------------//UART0中断服务程序. 接收字符//--------------------------------------------------------void uart0_isr(void) interrupt 4 using 1{unsigned char rxch;rxd_str=0;if(RI0) //中断标志RI0=1 数据完整接收{RI0 = 0;uart0_flag=1;//软件清零rxch = SBUF0; //读缓冲ur0_rxd[rxd_str] = rxch; //存入数组,供发送}}。
C8051F020入门指导解读

MCU 的程序存储器包含64K 字节的FLASH。该存储器 以512 字节为一个扇区,可以在系统编程,且不需特别的 外部编程电压。
1.3 JTAG 调试和边界扫描
C8051F020系列具有片内JTAG边界扫描和调试电路, 通过4脚JTAG接口并使用安装在最终应用系统中的产品器 件就可以进行非侵入式、全速的在系统调试。 该JTAG接口完全符合IEEE1149.1规范,为生产和测试 提供完全的边界扫描功能。 Silicon Labs的调试系统支持观察和修改存储器和寄 存器,支持断点、观察点、堆栈指示器和单步执行。
在一个标准的8051 中,除MUL 和DIV 以外所有指令 都需要12 或24 个系统时钟周期,最大系统时钟频率为 12-24MHz。 而对于CIP-51 内核,70%的指令的执行时间为1 或2 个系统时钟周期,只有4 条指令的执行时间大于4 个系统 时钟周期。
1.1.3 增加的功能
扩展的中断系统向CIP-51 提供22 个中断源(标准8051 只有7 个中断源),允许大量的模拟和数字外设中断微控 制器。 MCU 可有多达7 个复位源:一个片内VDD 监视器、一 个看门狗定时器、一个时钟丢失检测器、一个由比较器0 提供的电压检测器、一个软件强制复位、CNVSTR 引脚 及/RST 引脚。 MCU 内部有一个独立运行的时钟发生器,在复位后被默 认为系统时钟。如果需要,时钟源可以在运行时切换到外 部振荡器,外部振荡器可以使用晶体、陶瓷谐振器、电容、 RC 或外部时钟源产生系统时钟。
1.4 可编程数字I/O 和交叉开关
该系列MCU具有标准8051的端口(0、1、2和3)。在 F020/2中有4个附加的端口(4、5、6和7),因此共有64 个通用端口I/O。 每个端口I/O引脚都可以被配置为推挽或漏极开路输出。 数字交叉开关。
C8051F020例程

/***************************************************************************** 本测试程序用来测试板上所以I/O连接状况外接LED共阳数码管实验时将跳线帽接至+3V淘宝地址/*****************************************************************************/#include <c8051f020.h>#define uchar unsigned char#define uint unsigned intuchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P0MDOUT =0xff;P1MDOUT =0xff;P2MDOUT =0xff;P3MDOUT =0xff;P74OUT =0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/void main (void){uchar i;WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();while(1){for(i=0;i<10;i++){P0=tab[i];P1=tab[i];P2=tab[i];P3=tab[i];P4=tab[i];P5=tab[i];P6=tab[i];P7=tab[i];delay(500);}}}/***************************************************************************** 闪烁灯实验本实验采用P3.4口输出短接J11 实验时将跳线帽接至+3V淘宝地址/*****************************************************************************/ #include <c8051f020.h>#define uchar unsigned char#define uint unsigned intsbit LED=P3^4;void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P3MDOUT =0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/void main (void){WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();while (1){LED=0;delay(500);LED=1;delay(500);}}/***************************************************************************** 流水灯实验本实验采用P0口输出外接LED 实验时将跳线帽接至+3V淘宝地址/*****************************************************************************/#include <c8051f020.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intvoid PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P0MDOUT =0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/void main (void){uchar i;WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器i=0xfe;PORT_Init ();P0=i;while(1){delay(500);i = _crol_(i,1); //循环右移1位,点亮下一个LEDP0 = i;}}/***************************************************************************** 数码管实验本实验采用P0口输出外接LED共阳数码管实验时将跳线帽接至+3V淘宝地址/*****************************************************************************/#include <c8051f020.h>#define uchar unsigned char#define uint unsigned intuchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P0MDOUT =0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/void main (void){uchar i;WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();while(1){for(i=0;i<10;i++){P0=tab[i];delay(500);}}}/****************************************************************************** **********按键实验本实验采用P2.0和P2.1作为输入P0外接LED共阳数码管输出实验时将跳线帽接至+3V淘宝地址/******************************************************************************* *********/#include <c8051f020.h>#define uchar unsigned char#define uint unsigned intsbit K1 = P2^0;sbit K2 = P2^1;uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P0MDOUT = 0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/void main (void){uchar i;WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();while(1){if(K1==0){delay(10);if(K1==0){if(i==9)i=9;elsei++;while(!K1);}}if(K2==0){delay(10);if(K2==0){if(i==0)i=0;elsei--;while(!K2);}}P0=tab[i];}}/***************************************************************************** 串口通讯实验本实验采用UART0输出数据到PC机实验时将跳线帽接至+3V复位一次,单片机发送256个数据波特率为9600淘宝地址/*****************************************************************************/#include <c8051f020.h>#define uchar unsigned char#define uint unsigned intvoid SYSCLK_Init();void PORT_Init();void UART0_Init();void SYSCLK_Init(){unsigned int i;OSCXCN=0X67; //0X67=0110,0111for(i=0;i<256;i++); //等待>1mswhile(!(OSCXCN&0X80)); //等待XTLVLD变为1OSCICN=0X88; //时钟失效监测器,选择外部时钟源作为系统时钟}void PORT_Init(){XBR0 = 0x04;XBR2 = 0x40;}void UART0_Init(){SCON0=0x50; //串口方式1TMOD=0X20; //选用定时器1作为波特率发生器TH1=0xF4;TL1=0xF4;PCON=0x80; //波特率为9600TR1=1; //定时器启动}void main(){unsigned int i;WDTCN=0XDE;WDTCN=0XAD;SYSCLK_Init();PORT_Init();UART0_Init();for(i=0;i<256;i++){SBUF0=i;while(!TI0);TI0=0;}while(1);}/***************************************************************************** LCD1602并口显示实验本实验采用P6为数据口和P1为控制口实验时将跳线帽接至+5V淘宝地址/*****************************************************************************/ #include <c8051f020.h>#define uchar unsigned char#define uint unsigned int#define DataPort P6sbit LCM_VO=P1^7;sbit LCM_RS=P1^6;sbit LCM_RW=P1^5;sbit LCM_EN=P1^4;sbit LED=P3^4;uchar code TAB1[] = "C8051F-020";uchar code TAB2[] = "QQ:123514611";uchar aa,bb;/*******************************/void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P1MDOUT =0xff;P3MDOUT =0xff;P74OUT |= 0xff; /*推挽输出*/}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************//*******************************///写指令void WriteCommandLCM(uchar CMD){LCM_RS=0;LCM_RW=0;DataPort=CMD;LCM_EN=1;delay(50);LCM_EN=0;}/*******************************///写数据void WriteDataLCM(uchar dataW){LCM_RS=1;LCM_RW=0;DataPort=dataW;LCM_EN=1;delay(50);LCM_EN=0;}/***********************************/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) {Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码0x40;X |= 0x80; // 算出指令码WriteCommandLCM(X); //这里不检测忙信号,发送地址码WriteDataLCM(DData);}//-----------------------------------------------------------------------------//按指定位置显示一串字符//-----------------------------------------------------------------------------void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/***********************************/void InitLcd(){WriteCommandLCM(0x38); //8位数据,双行显示,5X7字型WriteCommandLCM(0x08); //WriteCommandLCM(0x01); //WriteCommandLCM(0x06); //WriteCommandLCM(0x0c); //}/***********************************/void main (void){WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();OSCICN |= 0x01;delay(5000);LCM_VO=0;InitLcd ();aa=0x41;for(bb=0;bb<26;bb++){LED=0;delay(500);WriteDataLCM(aa);aa++;if(aa==0x51){WriteCommandLCM(0xc0);}if(aa==0x5b){break;}LED=1;delay(500);}delay(2000);WriteCommandLCM(0x01);for(bb=0;bb<10;bb++){LED=0;delay(500);DisplayListChar(3, 0, TAB1);DisplayListChar(2, 1, TAB2);LED=1;delay(500);}delay(5000);}/****************************************************************************** **********LCD12864 ST7920控制芯片测试程序本实验采用P3口和P0口驱动实验时将跳线帽接至+3V淘宝地址/******************************************************************************* *********/#include <c8051f020.h>#define uchar unsigned char#define uint unsigned int#include <intrins.h>#include <string.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned long//------------------------------------void PORT_Init (void);void delay(uint z);//-----------------------------------#define LCDBUS P3sbit RS = P0^0;sbit RW = P0^1;sbit E = P0^2;sbit PSB = P0^3;sbit RST = P0^4;void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P3MDOUT =0xff;P0MDOUT =0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/uchar code symbo[]={/*-- 调入了一幅图像:D:\guoq files\technic support\pic\128x32 Symbo.bmp --*//*-- 宽度x高度=128x32 --*/0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x1F,0xC0,0x03,0xE0,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x00,0x20,0x40,0x04,0x10,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x40,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x80,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x02,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x04,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x88,0x00,0x80,0x04,0x10,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x50,0x01,0x00,0x03,0xE0,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00, 0x1F,0xFC,0x01,0xFF,0xDF,0xFF,0xFF,0xFF,0xC1,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x80,0x00,0x08,0x1F,0xFF,0xFF,0xF8, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x40,0x00,0x10,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x20,0x00,0x20,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x08,0x00,0x80,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x20,0x00,0x20,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x40,0x00,0x10,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x80,0x00,0x08,0x1F,0xFF,0xFF,0xF8, 0x1F,0xFC,0x01,0xFF,0xDF,0xFF,0xFF,0xFF,0xC1,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x50,0x01,0x00,0x03,0xE0,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x88,0x00,0x80,0x04,0x10,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x04,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x02,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x80,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x40,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x00,0x20,0x40,0x04,0x10,0x00, 0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x1F,0xC0,0x03,0xE0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };//-----------------------------------// Delay Routine//-----------------------------------void delay100us(void) //delay TIMER1*1 ms for 12MHz{uchar data i;for(i=0;i<=10;i++){_nop_();_nop_();}}void delayms( uint m ) // 12MHz Xtal, close to ms value {uint j;uint i;for(i=0; i<m; i++)for(j=0; j<109; j++)_nop_();}void SdCmd(uchar Command) //send command{RS = 0;RW=0;LCDBUS = Command;E = 1;E = 0;delay100us();}void SdData(uchar DData) //send display data{RS = 0;RS=1;RW=0;LCDBUS = DData;E = 1;E = 0;delay100us();}uchar RdData(){uchar DData;RS = 0;RW = 1;RS=1;LCDBUS=0xff;E=1;DData = LCDBUS;E = 0;return(DData);}//-----西文写入函数----------------void PrintASCII(uint x,y,uchar *pstr) //通用函数{uint addr;y=y<<4;addr=y|0x80+x;SdCmd(addr);while(*pstr>0){SdData(*pstr++);}}//----中文写入函数-----------------void PrintGB(uchar x,y,uchar *pstr){uint addr;y=y<<4;addr=y|0x80+x;SdCmd(addr);while(*pstr>0){SdData(*pstr++);delayms(300); //演示用}}//----初始化函数-----------------void initLCM(){RST=0;delayms(5);RST=1;delayms(800);SdCmd(0x30); /* 设置工作方式(8位总线) */ SdCmd(0x06); /* 设置输入方式*/SdCmd(0x0f); /* 设置显示方式*/SdCmd(0x01); /* 清屏*/delayms(2);}//----清屏函数------------------void ClearRAM(){uchar i,j;SdCmd(0x34);for(i=0;i<32;i++){SdCmd(i|0x80);SdCmd(0x80);for(j=0;j<16;j++){SdData(0x00);//SdData(0x00);}}SdCmd(0x30);}//---- 画图函数-----------------------------void ShowBmp(uchar x,y, width,high,uchar *bmp) {uchar i,j;SdCmd(0x34);SdCmd(0x36);for(i=y;i<(y+high);i++){if (i<32){SdCmd(0x80|i);SdCmd(0x80|x);}else{SdCmd(0x80|(i-32));SdCmd(0x80|(x+8));}for(j=0;j<width;j++){SdData(*bmp++);SdData(*bmp++); //}}SdCmd(0x30);}//---画点函数----------------void Draw_Dot(uint x,y){uchar m,n;uint k;if(y>=32){y=y-32;x=x+128;}SdCmd(y|0x80);k=x/16;SdCmd(k|0x80);k=0x8000;k=k>>x%16;m=RdData();m=RdData()|k>>8;n=RdData()|k;k=x/16;SdCmd(y|0x80);SdCmd(k|0x80);SdData(m);SdData(n);}//--- 画线函数---------------void Draw_Line(uint x1,y1,x2,y2) {uint temp;int dalt_x,dalt_y,err=0;if (y1>y2){temp=x1;x1=x2;x2=temp;temp=y1;y1=y2;y2=temp;}Draw_Dot(x1,y1);dalt_x=x2-x1;dalt_y=y2-y1;if(dalt_x>=0){if(dalt_y>dalt_x)//k>1{while(y1<y2){if(err<0){x1=x1+1;y1=y1+1;err=err+dalt_y-dalt_x;}else{y1=y1+1;err=err-dalt_x;}Draw_Dot(x1,y1);}}else // 0<=k=<1{if (dalt_y==0)y1=y1-1;while(x1<x2){if(err<0){x1=x1+1;err=err+dalt_y;}else{y1=y1+1;x1=x1+1;err=err+dalt_y-dalt_x;}Draw_Dot(x1,y1);}}}else{dalt_x=x1-x2;if(dalt_y>dalt_x)//k<-1{while(y1<y2){if(err<0){x1=x1-1;y1=y1+1;err=err+dalt_y-dalt_x;}else{y1=y1+1;err=err-dalt_x;}Draw_Dot(x1,y1);}}else //0>k>=-1{if (dalt_y==0)y1=y1-1;while(x1>x2){if(err<0){x1=x1-1;err=err+dalt_y;}else{x1=x1-1;y1=y1+1;err=err+dalt_y-dalt_x;}Draw_Dot(x1,y1);}}}}//--功能演示函数-------------------------void quxian1(){SdCmd(0x06);PrintGB( 0,0,"画面不动光标地址加1 指令代码为06");delayms(3000);SdCmd(0x01);delayms(2);SdCmd(0x04);PrintGB( 15,0,"画面不动光标地址减1 指令代码为04");delayms(3000);SdCmd(0x01);delayms(2);SdCmd(0x07);PrintGB( 0,0,"画面整体左移1 位指令代码为07");delayms(3000);SdCmd(0x01);delayms(2);SdCmd(0x05);PrintGB( 15,0,"画面整体右移1 位指令代码为05");delayms(3000);SdCmd(0x06);}//----做图演示函数------------------------------------void quxian2(){uint code data1[48]={88,89,85,87,89,90,89,89,88,86,87,86,88,89,90,94,95,96,96,97,99,99,101,103,101,101,100,103,105,113,113,117,117,116,114,107,110,114,113,112,115,112,113,119,120,125,124,128};uint a1,b1,a2,b2,i;SdCmd(0x01);delayms(2);SdCmd(0x0c);PrintASCII(0,0," Time");PrintASCII(14,1,"Temp");SdCmd(0x34);SdCmd(0x36);Draw_Line(1, 60, 125,60);// 设置坐标X coordinate Draw_Line(1, 15, 1, 60);// 设置坐标Y coordinatedelayms(1000);a1=1;for ( i=0;i<40;i++){b1=data1[i]-70;Draw_Dot(a1,b1);//画点a1=a1+3;}delayms(3000);a1=1;for ( i=0;i<40;i++){b1=data1[i]-70;b2=data1[i+1]-70;a2=a1+3;Draw_Line(a1,b1,a2,b2);//画线a1=a2;}SdCmd(0x32);}//-----------------------------------// Main Program//-----------------------------------void main(){WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();SP=0x60;EA=0;PSB=1; //并行接口选择LCDBUS=0xff; // 初始化接口RW=1;E =0;initLCM();while(1){SdCmd(0x01); /* 清屏*/delayms(2);ClearRAM();//-- 字库字符显示PrintASCII(8,0," ST7920 演示程序");delayms(3000);//-- 图画显示SdCmd(0x01); /* 清屏*/delayms(2);ClearRAM();ShowBmp(0,0,8,32,symbo);ShowBmp(0,32,8,32,symbo);delayms(3000);//-- 写入功能展示SdCmd(0x01);delayms(2);quxian1();delayms(3000);//-- 做图功能展示ClearRAM();quxian2(); // 仅在并行接口使用delayms(3000);}}/****************************************************************************** **********LCD12864 ST7565控制芯片AD转换测试程序本实验采用P0串口驱动实验时将跳线帽接至+3V淘宝地址/******************************************************************************* *********/#include <c8051f020.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned long#define SYSCLK 22118400bit aa;uchar count=0;ulong AD;ulong mm;uchar temp_l;uchar temp_h;uchar xdata dispbuf[4];uchar ContrastLevel; // for contrast setting level// 串行通讯方式驱动程序uchar bdata transdata; //该变量可为位操作之变量sbit transbit = transdata^7;sbit _CS = P0^0;sbit _RES = P0^1;sbit A0 = P0^2;sbit SCLK = P0^6;sbit SDA = P0^7;/*******************************/void delayms(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}void OSCILLATOR_Init (void){int i; /*延时计数器*/OSCXCN = 0x67; /*打开外部晶体振荡器*/for (i=0; i < 256; i++) ; /*延时*/while (!(OSCXCN & 0x80)) ; /*查询外部晶体是否稳定起振*/OSCICN = 0x88; /*用外部晶体作为系统时钟,并使能时钟丢失检测*/}void PORT_Init (void){P0MDOUT = 0xff;XBR2 = 0x40;}//------------- ASCII字符库----------------------------------------------------------------//说明:该字库为5*7点阵字符字模库,但字库格式为8*8点阵字模数据,第8行为行间距,// 第6-8列为字间距。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机实验指导书目录第一章:实验设备简介 (1)1.1 系统实验设备的组成 (1)1.2 Silicon Labs C8051F 单片机开发工具简介 (1)1.3 DICE-C8051F嵌入式实验/开发系统简介 (3)第二章集成开发环境KEIL C软件使用指南 (7)2.1 KEIL C软件具体使用说明 (7)第三章实验指导 (19)3.1 C8051F 单片机I/O 口交叉开关设置 (19)3.2 数字I/O端口实验 (21)3.3 定时器实验 (23)3.4 外部中断实验 (25)3.5 键盘显示实验 (27)3.6 六位动态LED数码管显示实验 (29)3.7 RS3232串口通讯实验 (31)3.8 综合设计 (33)使用特别说明:(1) 每次实验前,请仔细阅读实验指导,连线完毕,检查无误后,方可打开电源。
即连线时必须在断电状态下。
(2) 程序运行过程中,不要关闭电源,如果要断电,必须停止运行程序,并且退出程序调试状态,否则会引起KEIL C软件非正常退出,甚至引起DICE-EC5仿真器工作异常。
(3) 如出现上述(2)的的误操作,引起DICE-EC5仿真器工作异常,可对DICE-EC5仿真器进行复位。
(在光盘中找到文件夹“USB Reset”中的“USB Debug Adapter Firmware Reset”文件,双击运行,在弹出的对话框中点击“Update firmware”按钮,在提示成功后,点击“OK”按钮,退出复位程序。
DICE-EC5仿真器即可正常工作。
在下一次调试、下载程序时会提示“Do you want to update serial adapter now? ”,点击“确定”即可。
第一章:实验设备简介1.1 系统实验设备的组成DICE-C8051F嵌入式实验/开发系统由C8051F020 CPU 板、DICE-EC5仿真器和系统实验板三部分组成,应用该设备可进行片上系统单片机较典型应用的实验,请参见以下介绍。
1.2 Silicon Labs C8051F 单片机开发工具简介1.2.1 开发工具概述Silicon Labs 的开发工具实质上就是计算机IDE 调试环境软件及计算机USB 到C8051F单片机JTAG 口的协议转换器(DICE-EC5)的组合。
Silicon Labs C8051F 系列所有的单片机片内均设计有调试电路,该调试电路通过边界扫描方式获取单片机片内信息,通过4 线的JTAG接口与开发工具连接以便于进行对单片机在片编程调试。
DICE-C8051F嵌入式实验/开发系统中的C8051F020 CPU 板上的单片机为C8051F 系列中的F020。
仿真器(DICE-EC5)一端与计算机相连,另一端与C8051F 单片机JTAG 口相连,应用Keil 的uVision2 调试环境就可以进行非侵入式、全速的在系统编程(ISP)和调试。
Silicon Labs 开发工具支持观察和修改存储器和寄存器支持断点、观察点、堆栈指示器、单步、运行和停止命令。
调试时不需要额外的目标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 自由硬盘空间●空闲的USB 口1.2.4 开发工具与PC 机硬件连接在系统编程和调试环境如图下所示。
硬件连接及软件安装:●将USB 串行电缆的一端与教学机的DICE-EC5仿真器USB接口连接;●连接USB 串行电缆的另一端到PC;●给目标系统上电;●插入CD 并运行“SETUP.EXE”,将IDE 软件安装到您的PC 机;●在PC 机的开始菜单的“程序”项中选择keil uVision2 图标,运行IDE 软件。
1.3 DICE-C8051F嵌入式实验/开发系统简介1.3.1 C8051F020 CPU 板概述C8051F020 CPU 板是为了便于安装而设计的;C8051F020 CPU 板是将C8051F020的所有引脚(100 个引脚)引到四个双排针;该四组双排针可与不同用户设计的应用系统连接,如在该教学系统上将和系统实验板连接。
说明: C8051F020 CPU 板是将C8051F020的所有引脚(100 个引脚)引到四个双排针,分别为JX1、JX2、JX3、JX4,四个双排针的内圈100个排针(内圈每个引脚注明引脚含义)与C8051F020芯片的对应引脚连接。
而四个双排针的外圈100个排针(外圈标有引脚号)部分引脚悬空,而大部分引脚已经与实验仪上的实验模块连接。
(具体连接请看硬件连接原理图)。
因此,本实验/开发系统大部分实验模块只要将其相应引脚的短路块插好,即可实现与C8051F020单片机系统的连接。
而一部分独立实验模块,必须通过导线与C8051F020单片机连接,连接前把要用到的引脚上的短路块拔掉,然后用导线将内圈对应引脚与外部模块连接。
实验完毕后再把相应的短路块插好。
1.3.2 C8051F020 片上系统单片机片内资源①、模拟外设(1) 逐次逼近型8 路12 位ADC0转换速率最大100ksps可编程增益放大器PGA温度传感器(2) 8 路8 位ADC1 输入与P1 口复用转换速率500ksps可编程增益放大器PGA(3) 两个12 位DAC(4) 两个模拟电压比较器(5) 电压基准内部提供2.43V外部基准可输入(6) 精确的VDD 监视器②、高速8051 微控制器内核流水线式指令结构速度可达25MIPS22 个矢量中断源③、存储器片内4352 字节数据RAM64KB Flash 程序存储器可作非易失性存储外部可扩展的64KB 数据存储器接口④、数字外设8 个8 位的端口I/OI2C、SPI、2 个增强型UART 串口可编程的16 位计数器/定时器阵列(PCA)5 个通用16 位计数器/定时器专用的看门狗WDT更详细资料可参见Silicon Labs C8051F02x datasheet1.3.3 DICE-C8051F嵌入式实验/开发系统硬件组成(1)CPU板:CPU核心模块采用C8051F020芯片,该芯片是C8051F系列单片机中功能最为其全的一款;(2)片内:64K FLASH,4K XRAM片外扩展:256K FLASH,32K XRAM(3)CPU板C8051F020芯片I/0引脚全部引出,可以和用户外部电路连接;(4)实验系统带有JTAG接口,并配有DICE-EC3型USB高速通讯仿真器,通过4脚的JTAG接口可以进行非侵入式、全速的在线系统调试、仿真;(5)4*4阵列式键盘;(6)8位逻辑电平开关输出、8位LED逻辑电平显示;(7)6位动态八段LED数码管;(8)2路单脉冲信号发生电路和1路8MHZ时钟发生电路;(9)时钟分频电路;(10)模拟量发生器电路和逻辑笔电路;(11) 8*8LED点阵及驱动电路;(12) 128*64 LCD液晶显示屏;(13)蜂鸣器电路;(14)直流电机测速电路;(15)四相步进电机及驱动电路;(16)继电器电路及接口;(17)双通道RS-232 接口;(18)SPI 接口,LED 数码管显示;(19)IIC 接口,接24C01 串行EEPROM;(20)IIC 接口,PCF8563日历时钟;(21)8 路12 位AD,2 路12 位DA 接口;(22)D12 USB 从机通信;(23)SL811 USB 主机通信;(24)RTL8019 10M 以太网通信;1.3.4 DICE-C8051F嵌入式实验/开发系统地址及初始化说明●地址分配如下:0x0000-0x7fff,数据存储器SRAM地十范围0x8000-0x87ff,D12_CS片选0x8800-0x8fff,SL811_CS片选0x9000-0x97ff,RTL8019_CS片选0x9800-0x9fff,LCD_CS片选0xA000-0xA7ff,保留0xA800-0xAfff,保留0xB000-0xB7ff,保留0xB800-0xBfff,保留0xc000-0xffff(x16),Flash,片选地址由P4 低4 位端口确定●系统初始化:C8051F020 CPU板使用外部22.1184M 晶振,系统初始化后应用外部22.1184M 晶振,如果不进行系统初始化,系统将使用内部晶振,默认值为2M,也可以通过设置OSCICN 寄存器改变内部晶振的大小(可选值为2M、4M、8M、16M)。
●端口初始化:我们根据c8051F020 CPU板及实验系统设计方案,配置交叉开关,为UART0、SPI、SMBus、UART1、CEX0、CP0、T0、T1、INT0、INT1、INT2 和INT3 分配端口引脚。
另外,我们将外部存储器接口配置为复用方式并使用高端口。
配置步骤如下:(1) 按CP0E=1,ECI0E=0,PCA0ME=001,UART0EN=1,SPI0EN=1,SMB0EN=1 设置XBR0=0x8f;(2) 按SYSCKE=0,T2EXE=0,T2E=0,INT1E=1,T1E=1,INT0E=1,T0E=1,CPI1E=0 设置XBR1=0x1e;(3) 按WEAKPUD=0,XBARE=1,位5为0 用T4EXE=0,T4E=0,UART1E=1,EMIFLE=0,CNVSTE=0 设置XBR2=0x44(4) 将外部存储器接口配置为复用方式,并使用高端口,有PRTSEL=1,EMD2=0。
(5) 将作为数字输入的端口1 引脚配置为数字输入方式,设置P1MDIN 为0xFF。
(6) 通过设置P0MDOUT=0x34 、P1MDOUT=0xfd 、P2MDOUT= 0xf0 、P3MDOUT =0xff,将低端口输出方式设置为推挽方式。
设置高端口输出方式P74OUT=0xf7;总线输出方式应考虑工作频率和驱动能力,在高速和高驱动时总线应设置为推挽方式,在低速和低驱动时漏极开路也可满足要求,但稳定性不高。
(7) 设置外部存储器配置EMI0CF=0x2d;设置外部存储器时序控制EMI0TC=0x9e;如果LCD 不能正常显示可以使EMI0CF=0x2f,EMI0TC=0xff 设置为最大值;也可以减小外部晶振或使用内部晶振。