C8051F020单片机实验接线表.

合集下载

C8051F020实验

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单片机完成16路信号源的输出

C8051F020单片机完成16路信号源的输出
个数字 I/O 引脚;具有 12 位 100kps 的 8 通道 ADC,带 PGA 和多路模拟开关 ; 具有 2 个 12 位 DAC,具有可编程数据更新方式;64K 可在系统编程的 FLASH 存储 器;4352 字节的片内 RAM;可寻址 64K 字节地址空间的数据存储器接口:2 个 UART 串行接口。基于以上优良特性,故选用该单片机。
二、系统方案论证
本系统有 DA 输出部分、AD 反馈部分、串口输出部分组成,系统框图下:
URAT输 出
电脑上 位机
DA
单片机
AD
多路模 拟开关
跟随输 入
采样保 持部分
滤波电 路
放大部 分
16选1开 关
16路信 号输入
输出
1.单片机部分
图 1.系统流程图
单片机选用 C8051F020,是完全集成的混合信号系统级 MCU 芯片,具有 64
图 14.放大输出电路
图 15.仿真波形
5.串行通信方式的选择与上位机的选择
单片机通过 URAT 发送数据至上位机长采用以下 2 种方法即通过蓝牙或 TTL 转串口线将单片机数据发送到电脑上位机。其中由于蓝牙使用较为方便, 故采用集成蓝牙模块。上位机需要直观显示单片机发出数据,故采用 Serial_Digital_Scope V2。
系统集成与应用 实验报告
2013/2014 学年第 2 学期
学生姓名:
*杰
学 号:
*
学 院:
仪器与电子学院
专 业:
电子科学与技术
题 目 : 用 C8051F020 单片机完成 16 路信号源的输出
指导教师: 焦新泉 2014 年 5 月 15 日
一、 设计任务与要求

C8051F020例程

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列为字间距。

C8051F020单片机说明

C8051F020单片机说明

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 说明。

C8051F021单片机实验指导

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单片机实验接线表

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]控制看门狗的超时间隔。

C8051F020实验板使用要领.

C8051F020实验板使用要领.

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开发板电路图

DGND
A
DGND
DGND
DGND
DGND
3
2
1
输入电容应当尽量靠近Ui和地。
对于LM2576-5.0V: Ui=+9V、L=100uH,ILmax=2.0A; Ui=+9V、L=68uH,ILmax=3.0A!
L1 BEAD J14 JUMPER 1 2 U2 1 VIN LM2576V FB OUT + 3 5 C20 100uF/50V C18 0.1uF C19 0.01uF GND ON/OFF 1000uF/25V D4 1N5822 4 L2 68uH + C17 C21 0.1uF C22 0.01uF 2 1 J8 2 VDD=+5V TE VDD=+5V
75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51
5 6 7 8 5 6 7 8 5 6 7 8 DVDD=+3.3V DGND 5 6 7 8 5 6 7 8 5 6 7 8
4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1
100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76
1 3 5 7 9 11 13 15 17 19
2 4 6 8 10 12 14 16 18 20
DGND IOVDD P4.1 P4.3 P4.5 P4.7 P5.1 P5.3 P5.5 P5.7
D
DGND
P4_5 DVDD=+3.3V J4 DGND
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、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 的波形,如果正确有不断变化频率的方波输出。

相关文档
最新文档