C8051F020单片机实验接线表.
- 格式:doc
- 大小:3.30 MB
- 文档页数:17
目 录说明 (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学习开发板实验手册,本文档为作者劳动成果,未经作者同意,请忽用于商业目的。
/***************************************************************************** 本测试程序用来测试板上所以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列为字间距。
C8051F020开发板说明书V1.0.02012年3月22日目录第一章 概述 (1)第二章 开发板简介 (2)2.1 开发板原理框图 (2)2.2 开发板实物图 (2)2.2.1 本开发板的外扩展资源和扩展接口 (2)2.2.2 本开发板的平面图 (3)第三章 开发板硬件电路说明 (4)3.1 硬件电路简介 (4)3.2 电源电路 (4)3.3单片机复位电路 (4)3.4 ZLG7289电路原理图 (5)3.5 LED电路原理图 (6)3.6 LCD接口电路 (7)第四章 开发板注意事项 (8)4.1注意事项 (8)4.2开发板跳线使用方法 (8)第一章 概述本说明书是C8051F020开发板的硬件使用说明书,详细描述了020开发板的硬件构成、原理,以及它的使用方法。
开发板用USB JTAG对C8051F020芯片进行编程,C8051F020有64个I/O而我们开发板通过排针引出了其中的44个I/O口,板上有标识(也可查看原理图或PCB图)。
引出来的I/O口可以供用户配置。
第二章 开发板简介2.1 开发板原理框图本开发板主要用到了C8051F020芯片(内置A/D D/A和比较器等)和周立功的ZLG7289芯片,020芯片通过SPI方式和ZLG7289完成数据传递,ZLG7289控制按键和数码管显示。
原理框图如下:图2-1 开发板原理框图2.2 开发板实物图2.2.1 本开发板的外扩展资源和扩展接口部分接口说明:JTAG接口:本板卡和USB Debug Adaptor仿真器连接,通过本接口用户可实现在线仿真。
LCD接口: 本板液晶用MzL05-12864AD/DA接口:本板的AD/DA接口都来自020内置的AD/DA另外的外扩资源和接口如下图所示:数码管AD 接口比较器接口P7口P3.0~ P3.6P0口P2口P1口3.2 JTAG3.3V/GNDDAC 接口LCD 接口LED ZLG72895vGNDP6口C8051F0203.3V/GND 按键电源开关复位键开发板实物图2.2.2 本开发板的平面图平面图上的位置和板卡的位置一一对应,详细的说明请看后面章节的图2-2 说明。
提要:实验项目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单片机实验接线表(注:黑体部分已调试通过)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]控制看门狗的超时间隔。
C8051F020实验板使用要领
1.上电顺序:
注意电脑关机并将实验板上拨动开关打在关闭状态
接上电脑串口电缆(如电脑没有串口可使用高质量的USB→串口线)
连接EC5仿真器到板上的JTAG接口和电脑的空闲USB接口
连接自制的小板到对应模拟或数字端口,检查连接和电源的正确性
打开电脑,连接9v电源到实验板并打开实验板电源开关
电脑运行Keil UV2,编译自己的程序并进入调试状态
(此时可以看到EC5上的对应指示灯亮和程序在板上的执行)
运行串口调试精灵监控串口状态
2.关机顺序:
关闭串口调试精灵
停止并关闭UV2调试
关闭实验板电源
插拔自制小板
关闭电脑或断开USB虚拟串口
插拔串口电缆
3.注意事项
建议设置uv2调试结束断开仿真器EC5电源
没有关闭串口精灵的情况下切断通讯容易引起电脑串口被误占用
没有关闭uv2调试的情况下直接实验板断电会使uv2进入假死机
串口带电且无热插拔功能,串口在没有断开供电的情况下不允许插拔!
自制小板在接上实验板前后未通电情况下必须仔细检查有无短路或接错!
实验板GPIO引脚间在无特殊要求下不要短接,也不允许通过自制小板短接!
自制小板不能将电源(高压、大电流)通过连线直接接上实验板的GPIO端口!
以上2条也适合于实验板上引出的C8051F020的其他引脚(特别是模拟引脚)!
C8051F020的GPIO引脚建议禁止内部弱上拉,禁止推挽,通过510电阻连接小板。
基于C8051F020接口电路设计C8051F020是一个具有许多功能和丰富外设的8051系列单片机。
接口电路设计是将C8051F020与外部电路连接起来,以实现各种功能的设计。
本文将介绍基于C8051F020接口电路设计的一般步骤和常用接口电路的设计方法。
首先,我们需要确定设计的目标和需求。
在确定设计目标和需求时,需要考虑以下几个方面:1.外设要连接的设备或传感器:根据外设的种类和要求,确定需要设计的接口类型,比如串口、SPI、I2C或GPIO等。
2.外设和C8051F020之间的电气连接:确定电源电压和电平转换的要求,以及是否需要电源隔离等。
3.接口速率和协议:根据外设的通信速率和协议要求,确定时钟频率和通信方式。
接下来,我们将详细介绍几种常见的接口电路设计方法。
1.串口接口电路设计:串口是一种常用的通信接口,可以通过串口与计算机或其他设备进行数据交互。
在设计串口接口电路时,需要考虑串口的通信协议、波特率、数据位和停止位等设置。
常用的串口电路设计方法包括使用MAX232芯片进行电平转换、使用电阻分压电路进行电平转换等。
2. SPI接口电路设计:SPI(Serial Peripheral Interface)是一种串行外设接口标准,可以连接多个外设到单片机上。
在设计SPI接口电路时,需要考虑SPI主从模式、时钟频率和数据传输方式等。
常用的SPI接口电路设计方法包括使用三态门电路进行信号隔离、使用电平转换芯片进行电平转换等。
3. I2C接口电路设计:I2C(Inter-Integrated Circuit)是一种串行通信协议,可以连接多个设备到单片机上。
在设计I2C接口电路时,需要考虑I2C总线的速率、寻址方式和电气特性等。
常用的I2C接口电路设计方法包括使用I2C总线驱动芯片进行电平转换、使用电阻分压电路进行电平转换等。
4. GPIO接口电路设计:GPIO(General Purpose Input Output)是单片机的通用输入输出口,可以用于连接各种外设和传感器。
盛年不重来,一日难再晨。
及时宜自勉,岁月不待人。
单片机实验指导书目录第一章:实验设备简介 (1)1.1 系统实验设备的组成 (1)1.2 Silicon Labs C8051F 单片机开发工具简介 (1)1.3 DICE-C8051F嵌入式实验/开发系统简介 (3)第二章集成开发环境KEIL C软件使用指南 (7)2.1 KEIL C软件具体使用说明 (7)第三章实验指导 (20)3.1 C8051F 单片机I/O 口交叉开关设置 (20)3.2 数字I/O端口实验 (22)3.3 定时器实验 (24)3.4 外部中断实验 (27)3.5 键盘显示实验 (29)3.6 六位动态LED数码管显示实验 (31)3.7 RS3232串口通讯实验 (33)3.8 综合设计 (35)使用特别说明:(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仿真器和系统实验板三部分组成,应用该设备可进行片上系统单片机较典型应用的实验,请参见以下介绍。
一、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]控制看门狗的超时间隔。
超时间隔由下式给出:T WDT=43+WDTCN[2~0]×T SYSCLK其中TSYSCLK为系统时钟周期。
对于2MHz的系统时钟,超时间隔的范围是0.032~524ms。
在设置超时间隔是时,WDTCN.7必须为0。
读WDTCN将返回超时间隔的编程值。
在系统复位后,WDTCN.[2~0]为111b.四、实验程序框图五、实验步骤通过调整程序中的延时值(调整RO寄存器值),来判断是否使用WDT复位功能。
A:本程序中,当R0取值小于4F时,程序总的执行小于WDT定时器值,程序不会进入WDT复位,程序正常执行,由P0.0控制发光二极管L8闪烁。
B:当R0取值大于5F时,程序总的执行大于WDT定时器值,程序总是进入WDT复位,p0.0总是保持在低电平状态。
用导线将P0.0与发光二极管L8相连。
注:光盘已经提供源程序,可直接打开项目:路径:“DICE-C8051f实验例程”→“WDT看门狗实验”→项目名“WDT-RESET”→汇编源程序“WDT-RESET.ASM”。
六、程序清单文件名:WDT-RESET·ASM;程序看门狗(WDT)实验。
;R0值小于4F时,程序中我们取值3F,编译、运行程序,程序总的执行时间小于WDT定时器值,程序正常执行,P0.0控制发光二极管闪烁。
;R0值大于5F时,程序中我们取值6F,编译、运行程序,程序总的执行时间大于WDT定时器值,程序总是进入WDT复位,P0.0总是保持在低电平。
$INCLUDE(C8051F020.INC) ; Register definition file.ORG 0000HLJMP STARTORG 00B3H ;End of Interruper Vector spaceStart: MOV WDTCN, #07h ;设置WDT定时间隔MOV XBR0, #00h ;Initial XBR0MOV XBR1, #00h ;Disable all mapsMOV XBR2, #40h ;Enable the IO_CrossbarMOV P0MDOUT,#0FFHMOV OSCXCN, #00h ;Initial OSCXCNMOV OSCICN, #04h ;Initial OSCICN as 2.0MHzMOV CPT0CN, #8fh ;Enable comparator0(CPT0) and select P/N hysteresisCLR P0.0MOV WDTCN, #0a5h ;Reset WDTMOV R0, #3fh ;Set data in r0 less than 4fh can avoid reseting LCALL Delay ;and more than 5fh can cause reseting program Wait: SETB P0.0MOV R0, #3fh ;设置R0小于4FH可以避免进入WDT复位,程序正常工作LCALL Delay ;如果设置R0大于5FH,则使延时值大于WDT设置的定时间MOV WDTCN, #0a5h ;隔,使程序不断进入WDT复位状态LJMP Wait ;Wait hereDelay: MOV R1, #0fhDelay1: MOV R2, #0ffhDelay2: DJNZ R2, Delay2DJNZ R1, Delay1DJNZ R0, DelayRETEND3.9 定时器实验一、实验目的掌握C8051F020内部定时器/计数器的应用。
二、实验内容本文件是LED灯闪烁实验程序;使用定时器0定时1秒,LED灯每隔1秒亮1秒;使用外部22.1184MHz晶振。
三、实验原理介绍C8051F020内部有5个计数器/定时器T0,T1,T2,T3和T4。
这些计数器/定时器都是16位,其中T0、T1、T2与标准8051中的计数器/定时器兼容。
T3、T4可用于ADC、SMBus或作为通用定时器使用,T4还可用作C8051F02x中第二串口(UART1)的波特率发生器。
这些计数器/定时器可以用于测量时间间隔,对外部事件计数或产生周期性的中断请求。
定时器0和定时器1几乎完全相同,有4种工作方式。
定时器2增加了一些时器0和定时器1中所没有的功能。
定是器3与定时器2类似,但没有捕捉和波特率发生器方式。
定时器4与定时器2完全相同,可用作UART1的波特率发生器。
下表所列为定时器的工作方式:本实验中使定时器0工作在方式1(TMOD=0x01),TIM0定时器时钟为系统时钟的1/12(CKCON=0x00)。
具体寄存器定义请参照教科书。
四、实验程序框图五、实验步骤P3.5口接L1发光二极管。
调入程序、装载、运行,观察发光二极管是否每隔1秒亮1次。
注:光盘已经提供源程序,可直接打开项目:路径:“DICE-C8051f实验例程”→“timer_test”→项目名“TIMER”。
3.10 内部时钟选择实验一、实验目的掌握C8051F020内部系统时钟的使用。
二、实验内容本文件是LED灯闪烁实验程序;根据程序选用芯片内部不同的系统时钟。
三、实验原理介绍C8051Fxxx MCU有一个内部振荡器和一个外部振荡器驱动电路,每个驱动电路都能产生系统时钟。
MCU在复位后从内部振荡器启动,内部振荡器的启动是瞬间完成的。
内部振荡器可以被允许和禁止,其振荡频率可以通过对内部振荡控制寄存器(OSCICN)编程为2MHZ、4MHZ、8MHZ或者16MHZ。
位7 MSCLKE 时钟丢失检测器允许位0禁止时钟丢失检测器1允许时钟丢失检测器;检测到时钟丢失将触发复位位6~5 未用。
读=00b,写=忽略位4 IFRDY 内部振荡器频率准备好标志0内部振荡器频率不是按IFCN位指定的速度运行1内部振荡器频率按IFCN位指定的速度运行位3 CLKSL 系统时钟源选择位0选择内部时钟源作为系统时钟1选择外部时钟源作为系统时钟位2 IOSCEN 内部振荡器允许位0内部振荡器禁止1外部振荡器禁止位1~0 IFCN1~0 内部振荡器频率控制位00 内部振荡器频率控制为2MHZ01 内部振荡器频率控制为4MHZ02 内部振荡器频率控制为8MHZ03 内部振荡器频率控制为16MHZ四、实验程序框图五、实验步骤P3.5接L1发光二极管。
调入程序、装载、运行,观察发光二极管是否闪烁。
修改OSCICN 寄存器的值,可设置系统时钟分别工作在2、4、8、16MHZ,观察发光二极管L1在不同系统时钟下的闪烁速度。
OSCICN=0x87 ; 16MHZOSCICN=0x86 ; 8MHZOSCICN=0x85 ; 4MHZOSCICN=0x84 ; 2MHZ注:光盘已经提供源程序,可直接打开项目:路径:“DICE-C8051f实验例程”→“内部时钟选择实验”→项目名“SYSCLK”。
3.11 外部时钟选择实验一、实验目的掌握C8051F020外部系统时钟的使用。
二、实验内容本文件是LED灯闪烁实验程序;选用芯片外部晶振作为系统时钟三、实验原理介绍外部振荡器需要有外部振荡源连接到XTAL1/XTAL2引脚才能工作,外部振荡源可以是外部谐振器、并行方式的晶体、电容或RC网络。
通过对OSCXCN寄存器编程来选择振荡源,也可以使用一个外部CMOS时钟接到XTAL1引脚提供系统时钟。
即使在MCU已经切换到内部振荡器时,外部振荡器仍可保持允许状态并运行。
XTAL1和XTAL2引脚的耐压值是3.6V,而不是5V。
位7 XTLVLD 外部晶体振荡器有效标志(只在XOSCMD=11x是有效)0晶体振荡器未用或未稳定1晶体振荡器正在运行并且工作稳定位6~4 XOSCMD2~0 外部振荡器方式位00x 关闭。
XTAL1引脚内部接地010 系统时钟为来自XTAL1引脚的外部CMOS时钟011 系统时钟为来自XTAL1引脚的外部CMOS时钟的2分频10x RC/C振荡器方式2分频110晶体振荡器方式111晶体振荡器方式2分频位3 保留。
读=无定义,写=忽略位2~0 XFCN2~0 外部振荡器频率控制位四、实验程序框图五、实验步骤P3.5接L1发光二极管。
调入程序、装载、运行,观察发光二极管L1是否每隔1秒亮一次注:光盘已经提供源程序,可直接打开项目:路径:“DICE-C8051f实验例程”→“外部时钟选择实验”→项目名“SYSCLK”。
3.12 PCA(可编程计数器)频率输出一、实验目的熟悉PCA 的频率输出功能。
二、实验内容此程序利用捕捉/比较模块0 实现PCA 频率输出方式,将捕捉/比较模块0 的CEX0 配置在P0.0 口,用示波器测量P0.0 的波形,如果正确有不断变化频率的方波输出。