访问手机版页面
你的位置:老古开发网 > 51单片机 > 51单片机的应用 > 正文  
C8051单片机在交流变频调速系统中的应用(收集)
内容导读:

C8051单片机在交流变频调速系统中的应用

 首先,先给大家一个中文的C8051的资料,天天看英文资料,看的人头都大了。下边是中文资料的下载地址:

(pdf格式的)

  本文简要介绍了以标准8051为内核的新型单片机 Cygnal C8051的功能,详细说明了以C8051单片机为控制核心构 成闭环变频调速系统的方法。经过测试,系统安全可靠,控制性 能优良。

一、Cygnal C8051单片机概述

     C8051 是美国Cygnal公司生产的、与标准51兼容的高速单片机, 是全集成混合信号SOC(system on chip)单片机。Cygnal C8051 单 片机片内资源主要有:高速的(20~25MIPS)与8051全兼容的微控制 器内核、8/12 位8 通道输入ADC、2 路12 位DAC、16 位可编程定时/ 计数器列陈(PCA)、3~5 个通用定时器、8~64 个通用I/O 口、8~ 64KB FLASH内部程序存储器、256B~4KB内部数据RAM、片内电源 监测、片内看门狗定时器、片内时钟源以及带有I2C/SMBus、SPI、1~ 2 个UART串行总线等。片内JTAG仿真电路提供全速、非插入式(不 使用在片资源)的电路内仿真。C8051F 的JTAG接口不仅支持Flash ROM的读/ 写操作及非侵入式在系统调试,它的JTAG逻辑还为在系 统测试提供边界扫描功能。通过边界寄存器的编程控制,可对所有器 件引脚、SFR 总线和I/O口弱上拉功能实现观察和控制。 C8051单片机采用开关网络以硬件方式实现I/O端口的灵活配置。 在这种通过交叉开关配置的I/O 端口系统中,单片机外部为通用I/O 口,如P0 口、P1 口和P2 口。内有输入/ 输出的电路单元通过相应的 配置寄存器控制的交叉开关配置到所选择的端口上。

二、C8051的PWM功能实现原理

     C8051单片机有PWM功能和捕捉功能,这些功能都包含在一个称 为可编程计数器列陈PCA 中。PCA 包含一个16 位的定时/ 计数器和 5个捕捉/比较模块。16位的PCA专用定时/计数器由PCA0H和PCA0L 组成,其时钟可以为系统时钟的12 分频、系统时钟的4 分频、定时器 0溢出、被定义ECI引脚的外部时钟源,可通过设置PCA0MD寄存器获 得。每个捕捉/ 比较模块都有一个1 6 位的模块寄存器,分别为 PCA0CPHn和PCA0CPLn,都有边沿触发捕捉、比较、高速输出、PWM 四种工作方式,通过PCA0CPMn进行设置。 在PWM工作方式中,系统不断将PCA计数器的PCA0L的值与该 模块的PCA0CPLn的常数值进行比较。当两者相等时,在CEXn引脚上 输出“1”,当PCA0L溢出时,在CEXn 引脚上输出“0”,并且自动将 保存在PCA0CPHn中的常数值送入PCA0CPLn。 在引脚CEXn引脚上输出的PWM波实际是对计数器的PCA时钟的 256 分频,其占空比α为 α=[256 -(PCA0CPLn)]/256 可见,8 位PWM波的分辨率为1/256。利用高速输出工作方式和 软件可实现8~16 位的PWM波。 通过对交叉开关控制寄存器XBR0的有效设置,CEXn上的PWM 波就由P0 或P1 口的有关端口输出。

三、基于C8051单片机的三相交流变频调速系统主要硬件设 计

     交流变频调速系统原理框图如图所示,从结构上主要分为控制部 分和执行部分。 控制部分主要由C8051 单片机、时钟电路、通讯接口、键盘与显 示电路、光电耦合、IPM逆变器、整流模块、转速检测和故障检测、报 警电路等组成。执行部分为三相异步交流电动机。 系统的工作原理为:电机的转速由转速传感器转换成矩形脉冲信 号,经光电隔离后进入单片机计数器,由计数器值获得电机的实际转 速,与设定转速比较,经Fuzzy-PID控制器调节后,单片机产生的PWM 波经6N137线性光耦进行电气隔离后作用于逆变模块IPM(intelligent Power module),实现电机的闭环变频调速。霍尔电流、电压传感器 将检测到的逆变模块的三相输出电流、电压信号,经采样保持后进入 单片机,完成A/D转换后,由CPU进行处理。逆变模块工作时所需要 的直流电压信号由整流电路对380V电源进行全桥整流得到。

 

 C8051F320单片机简介

C8051F320是由美国Cygnal公司推出的C8051F系列单片机中的一款小型单片机。它是集成的混合信号片上系统SOC(System on chip),具有与MCS-51内核及指令集完全兼容的微控制器,除了具有标准8051的数字外设部件之外,片内还集成了数据采集和控制系统中常用的模拟部件和其它数字外设及功能部件。内部Flash存储器可实现在系统编程,既可作程序存储器也可作非易失性数据存储。片内JTAG仿真电路提供全速的电路内仿真,不占用片内用户资源。支持断点、单步、观察点、运行和停止等调试命令,并支持存储器和寄存器校验和修改。

C8051F320片内自带有USB收发器和控制处理器是它区别与同一系列产品的一大特点。用C8051F320来进行USB技术开发既方便又快捷。

C8051F320单片机简介

1.功能部件及特点

(1)模拟外设 10位的ADC(±1LSB INL):其最大可编程转换速率可达200kbps,可多达17个外部输入,可编程为单端输入或差分输入,内置一个温度传感器(±3℃);2个模拟比较器;2.4V的内部电压基准;精确的Vdd监视器和欠压检测器。

(2)USB功能控制模块 满足USB2.0协议;可在全速(12 Mbps)或低速(1.5 Mbps)下运行;集成有一个时钟恢复源,对于全速或低速传输均可不用外部晶振;支持8个灵活通用的端点;内置一个1K的USB专用缓冲存储器;集成了一个USB接收器,不需要外部电阻。

(3)片内调试模块 片内调试电路提供全速、非侵入式的在系统调试(不需仿真器);支持端点、单步、观察点、堆栈监视器;可以观察/修改存储器和寄存器;比使用仿真芯片、目标仿真头和仿真插座的仿真系统有更好的性能。

(4)工作温度范围:0~70℃

(5)高速8051微控制器内核 采用流水线指令结构,其70%的指令的执行时间为一个或两个系统时钟周期;速度可达25 MIPS(时钟频率为25MHz时)。

(6)存储器 1280字节的内部数据RAM(1K+256);16K字节的可以在系统编程的Flash闪速存储器。

(7)数字外设 25个字节宽的端点I/O;所有口线均耐5V电压;可同时使用UART串口、硬件SMBusTM、SPITM;带有4个可编程的16位计数器/定时器阵列;带有5个捕捉/比较模块的通用16位计数器/定时器。

(8)时钟源 内部晶振,精度为0.25;支持所有USB和UART模式;外部晶振器:晶体、RC、C或外部时钟;内置一个针对USB控制器的片上时钟乘法器。

(9)供电电压 片上的参考电源校准器支持USB总线电源操作;校准器的Bypass模式支持USB内部电源操作。

(10)性能特点 C8051F320在保持CISC结构及指令系统不变的情况下,对指令运行实行流水作业,推出了CIP-51的CPU模式,从而大大提高了指令运行速度,使8051兼容机系列进入了8位高速单片机行列。

传统的单片机I/O端口大都是固定为某个特殊功能的输入/输出口,可以是单功能或多功能,I/O端口可编程选择为单向/双向以及上拉、开漏等。这种固定方式既占用较多引脚,配置又不够灵活。C8051F320采用开关网络以硬件方式实现I/O端口的灵活配置,如图1所示。在这种通过交叉开关配置的I/O端口系统中,单片机外部为通用I/O口,如P0口、P1口和P2口。内有输入/输出的电路单元通过相应的配置寄存器控制的交叉开关配置到所选择的端口上。

C8051F320还提供了一个完整而先进的时钟系统,如图2所示。在这个系统中,片内设置有一个可编程的时钟振荡器(无需外部器件),可提供2、4、8和16 MHz时钟的编程设定。外部振荡器可选择4种方式。当程序运行时,可实现内外时钟的动态切换。编程选择的时钟输出CYSCLK除供片内使用外,还可从随意选择的I/O端口输出。

C8051F320在8位单片机中率先配置了标准的EC2接口(IEEE1149.1)。在上位机软件支持下,通过串行的EC2接口直接对产品系统进行仿真调试。C8051F的EC2接口不仅支持Flash ROM的读/写操作及非侵入式在系统调试,还为在系统测试提供边界扫描功能。通过边界寄存器的编程控制,可对所有器件引脚、SFR总线和I/O口弱上拉功能实现观察和控制。

C8051F320把80C51单一的外部复位发展成多源复位:上电复位、掉电复位、外部引脚复位、软件复位、时钟检测复位、比较器0复位和引脚配置复位。众多的复位源为保障系统的安全、操作的灵活性以及零功耗系统设计带来极大的好处。

2.引脚及封装

图3为其引脚图。其中,Vdd为数字电源;GND为模拟地;REGIN为5V校准器的输入端;RST/C2CK为设备的复位引脚或EC2调试接口的时钟信号;P3.0/C2D为端口3.0或EC2调试接口的双向信号引脚;VBUS为USB总线输入脚;D+为USB的D+;D-为USB的D-;P0.2/XTAL1为端口0.2或外部晶振输入;P0.3/XTAL2为端口0.3或外部晶振输出;P0.6/CNVSTR为端口0.6或ADC0外部转换开始输入脚;P0.7/VRFF为端口0.7或外部参考电源的输入端或输出端;P0.0、P0.1、P0.4、P0.5、P1.0~P1.7、P2.0~P2.7 均为相应的端口引脚。

3.电气特性

校准器的输入电压(REGIN引脚)为4.0~5.25V;Vdd(电压校准器的输出)为3.0~3.6V(通常取3.3V);VREG偏流(电压校准器有效时)为70μA;CPU和USB运行时的供给电流为18mA(CPU时钟为24MHz,USB时钟为48MHz时)或9mA(CPU时钟为12MHz,USB时钟为6 MHz时);内部晶振频率为12.0MHz;USB时钟频率为48.0MHz(全速)、6.0MHz(低速)。

典型的USB应用

C8051F320是一款完全集成的混合信号系统级芯片,片内集成了数据采集和控制系统中常用的模拟部件和其它数字外设及功能部件。其中值得我们注意的是,它集成有一个USB接口,所以我们也可将其看成是一款带USB接口的微处理器。C8051F320与市场上同类带USB接口的微处理器相比较,它内部强大的功能模块大大简化了USB技术的开发,还能很好地缩短开发周期。下面介绍它的一个典型的USB技术应用。

在这个应用中,主机通过C8051F320芯片中USB接口与C8051F320通讯,来控制信号灯的状态,检测开关按钮的状态,并采集分压器和片内温度传感器中的数据。在整个通讯中,我们还要使用EC2适配器来进行系统调试。系统的电路原理图见图4。

在该应用系统中,SW1按钮开关连接到C8051F320的复位引脚。按一下SW1,设备将进入硬件复位状态。将J15跳线的两引脚连接上后,C8051F320就在外部电源的模式下开始工作。如果要让320在自己供电的模式下运行,就需在断开J15的同时,连接上J12的两个引脚。J4是该应用系统的调试接口。将串行适配器EC2通过该接口连接到C8051F320,可实现在线调试和Flash编程的写入和擦除(EC2的说明和使用请参见Cygnal公司的产品数据手册)。J14是USB(通用串行总线)连接器,通过它就可将USB接口和C8051F320芯片连接起来。我们常将USB电缆的一端接上J14,另一端接在计算机的USB通讯口上。这样就能实现数据传输任务。将J12跳线的两引脚连接上后,外部电容就连接到了C8051F320的P0.7脚。C8051F320的P1.7引脚上连接有一个滑动电阻,只要将J13接上,C8051F320就可从P1.7脚采集到逻辑信号。实际应用中,我们要进行USB技术开发和应用,其硬件部分可在图4的基础上根据需要进行扩展。

完整的USB应用系统除了必要的硬件部分,还包括软件部分,图5、图6为主程序流程图及USB中断服务程序流程图。软件部分分为三大块:在C8051F320设备上运行的固件程序,在主机上运行的USB设备驱动程序,一个主机应用程序。主机应用程序通过USB接口与C8051F320通讯,允许用户观察并改变C8051F320设备上的I/O外设的状态。在运行主机应用程序前,我们要先安装设备的USB驱动程序。当设备通过USB接口与主机连接好后,应用程序就开始枚举,并通过端点0、1和2来完成设备与主机之间的数据传输。在USB协议中,端点0数据包被定义为控制数据包,端点1和2分别用来输入数据和输出数据。数据包用来显示各个端口引脚上的逻辑值。在上述应用系统中,P1.7脚上分压器的输出逻辑值就通过应用程序中的端点1数据包来传输到主机,从而主机读出数据并在用户界面上显示出来。在本刊的网站上给出了源程序,供读者参考。

C8051F320是一款性能优化的SOC高速单片机,也是一个功能强大的USB接口器件。在开发和应用其USB技术时,与同类产品相比,它在性能、速度、方便性以及成本等方面都具有很大的优势。

   //-----------------------------------------------------------------------------

// Blinky.c

//-----------------------------------------------------------------------------

// Copyright (C) 2005 Silicon Laboratories, Inc.

//

// AUTH: HF

// DATE: 06 NOV 02

//

// MOD: BD

// DATE: 12 APR 04

// - changed TImer 2 setup of CKCON

//    from:    CKCON  &= ~0x60;

//    to:      CKCON  &= ~0x30;

//

// This program flashes the green LED on the C8051F32x target board about

// five TImes a second using the interrupt handler for TImer2.

//

// Target: C8051F32x

//

// Tool chain: KEIL Eval 'c'

//

//-----------------------------------------------------------------------------

// Includes

//-----------------------------------------------------------------------------

#include <c8051f320.h>                    // SFR declaraTIons

//-----------------------------------------------------------------------------

// 16-bit SFR Definitions for 'F32x

//-----------------------------------------------------------------------------

sfr16 TMR2RL   = 0xca;                    // Timer2 reload value

sfr16 TMR2     = 0xcc;                    // Timer2 counter

//-----------------------------------------------------------------------------

// Global CONSTANTS

//-----------------------------------------------------------------------------

#define SYSCLK       24500000 / 8         // SYSCLK frequency in Hz

sbit LED = P2^2;                          // LED='1' means ON

sbit SW2 = P2^0;                          // SW2='0' means switch pressed

//-----------------------------------------------------------------------------

// Function PROTOTYPES

//-----------------------------------------------------------------------------

void SYSCLK_Init (void);

void PORT_Init (void);

void Timer2_Init (int counts);

void Timer2_ISR (void);

//-----------------------------------------------------------------------------

// MAIN Routine

//-----------------------------------------------------------------------------

void main (void) {

   // disable watchdog timer

   PCA0MD &= ~0x40;                       // WDTE = 0 (clear watchdog timer

                                          // enable)

   SYSCLK_Init ();                        // Initialize system clock to

                                          // 24.5MHz

   PORT_Init ();                          // Initialize crossbar and GPIO

   Timer2_Init (SYSCLK / 12 /2);        // Init Timer2 to generate

                                          // interrupts at a 10Hz rate.

   EA = 1;                                // enable global interrupts

   while (1) {                            // spin forever

   }

}

//-----------------------------------------------------------------------------

// SYSCLK_Init

//-----------------------------------------------------------------------------

//

// This routine initializes the system clock to use the internal 24.5MHz / 8

// oscillator as its clock source.  Also enables missing clock detector reset.

//

void SYSCLK_Init (void)

{

   OSCICN = 0x80;                         // configure internal oscillator for

                                          // its lowest frequency

   RSTSRC = 0x04;                         // enable missing clock detector

}

//-----------------------------------------------------------------------------

// PORT_Init

//-----------------------------------------------------------------------------

//

// Configure the Crossbar and GPIO ports.

// P3.3 - LED (push-pull)

//

void PORT_Init (void)

{

   XBR0     = 0x00;                       // no digital peripherals selected

   XBR1     = 0x40;                       // Enable crossbar and weak pull-ups

   P2MDOUT |= 0x04;                       // enable LED as a push-pull output

}

//-----------------------------------------------------------------------------

// Timer2_Init

//-----------------------------------------------------------------------------

//

// Configure Timer2 to 16-bit auto-reload and generate an interrupt at

// interval specified by <counts> using SYSCLK/48 as its time base.

//

void Timer2_Init (int counts)

{

   TMR2CN  = 0x00;                        // Stop Timer2; Clear TF2;

                                          // use SYSCLK/12 as timebase

   CKCON  &= ~0x30;                       // Timer2 clocked based on T2XCLK;

   TMR2RL  = -counts;                     // Init reload values

   TMR2    = 0xffff;                      // set to reload immediately

   ET2     = 1;                           // enable Timer2 interrupts

   TR2     = 1;                           // start Timer2

}

//-----------------------------------------------------------------------------

// Interrupt Service Routines

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

// Timer2_ISR

//-----------------------------------------------------------------------------

// This routine changes the state of the LED whenever Timer2 overflows.

//

void Timer2_ISR (void) interrupt 5

{

   TF2H = 0;                              // clear Timer2 interrupt flag

   LED = ~LED;                            // change state of LED

}

c8051f020的smbus总线完全符合国际系统管理总线IEE 1.1版标准,与I2C完全兼容,可方便地与smbus总线接口和I2C接口器件通信,它由一根双向数据线sdl 和scl时钟线构成,可与不同速度的器件通信,因此具有很好的兼容性(通过延长scl低电平时间实现),smbus可工作在主发送器/主接收器/从接收器/从发送器几种模式.c8051f320的smbus具有五个SFR,它们是:SMBUS0CN SMBUS0STA SMBUS0ADDR SMBUS0CR SMBUS0DA,下面是它的工作过程.

(1)先复习一下I2C总线协议,I2C总线可工作在两种方试,从主器件到从器件的写,从从器件到主器件的读,两种操作都由主器件发起,不过,没有必要指定一个器件为主器件,任何一个发起指令的器件都将成为主器件,一次操作包括一个开始条件(以SCL的高电平,SDL的低电平表示),一个地址字节(7-1为7位器件地址,0为方向位:1为读,0为写),一个或多个字节数据,和一个停止条件(由SCL的高电平,SDL的高电平表示)组成.另外,每个器件在接收到数据后必需应答(ACK),用SCL高电平SCL的低电平表示,否则回答NACK,用SCL高电平SDL的高电平来表示.其时序如下图

(2)关于总线仲裁

主器件只有在总线空闲时才能占用总线,(一个停止位后或当SCL和SDL保持高电平超过一定时间,我们就认为总线是空闲的,此时总线可以发起操作),当两个或多个器件同时发起操作时,总线仲裁机制将保证有且只有一个器件赢得总线,具体的过程是它们继续发起条件,直到当一个器件发送高电平,而另一个器件发送低电平时,由于总线是开漏输出,于是总线被拉低,于是发送高电平的器件检测到低电平而主动放弃总线而变成从器件,而发送低电平的器件赢得总线并继续发送数据.

(3)AUX开关

在使用smbus总线时,需要根据器件优先权正确设置交叉开关,例:如果使用UART0而不使用SPI总线,则SMBUS占用P0^2和P0^3,具体情况具体处理.优先权译码表如下图所示.

(4)SFR描述

1.SMB0CN:SMBus0 控制寄存器

                                                                     复位值

BUSY ENSMB STA STO SI   AA   FTE TOE 00000000

位7   位6        位5    位4   位3 位2    位1    位0

                                                             (可位寻址)

SFR地址:

0xC0

位 7: BUSY:忙状态标志

0:SMBus0 空闭

1:SMBus0 忙

位 6: ENSMB:SMBus0 使能

该位使能/禁止 SMBus0 串行接口

0:禁止 SMBus

1:使能 SMBus

位 5: STA:SMBus0 起始标志

0:不发送起始条件。

1:当作为主器件时,若总线空闭,则发送出一个起始条件。 (如果总线不空闲,

在收到停止条件后再发送起始条件。 )如果 STA 被置 1,而此时已经发送或接

收了一个或多个字节并且没有收到停止条件,则发送一个重复起始条件。为保

证操作正确,应在对 STA位置 1 之前,将 STO标志清 0。

位 4: STO:SMBus0 停止标志

0:不发送停止条件。

1:将 STO置为逻辑 1 将发送一个停止条件。当收到停止条件时,硬件将 STO

清为逻辑 0。如果 STA 和 STO 都被置位,则发送一个停止条件后再发送一个

起始条件。在从方式,置位 STO标志将导致 SMBus 的行为象收到了停止条件

一样。

位 3: SI:SMBus0 串行中断标志

当 SMBus0 进入 27 种可能状态之一时该位被硬件置位。 (状态码 0xF8 不使 SI

置位。 )当 SI 中断被允许时,该位置 1 将导致 CPU 转向 SMBus0 中断服务程

序。该位不能被硬件自动清 0,必须用软件清除。

位 2: AA:SMBus0 确认标志

该位定义在 SCL 线应答周期内返回的应答类型。

0:在应答周期内返回“非确认” (SDA线高电平) 。

1:在应答周期内返回“确认” (SDA线低电平) 。

位 1: FTE:SMBus0 空闭定时器使能位

0:无 SCL 高电平超时。

1:当 SCL 高电平时间超过由 SMB0CR 规定的极限值时发生超时。

位 0: TOE:SMBus0 超时使能位

0:无 SCL 低电平超时。

1:当 SCL 处于低电平的时间超过由定时器 3(如果被允许)定义的极限值时

发生超时。

2.SMB0CR:SMBus0 时钟速率寄存器

R/W R/W R/W R/W R/W R/W R/W R/W 复位值

                                                              00000000

位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xCF

位 7-0: SMB0CR.[7:0]:SMBus0 时钟速率预设值

SMB0CR 时钟速率寄存器用于控制主方式下串行时钟 SCL 的频率。存储在

SMB0CR 寄存器中的 8位字预装一个专用的 8位定时器。该定时器向上计数,

当计满回到 0x00 时 SCL 改变逻辑状态。

SMB0CR[7:0]的值应根据下面的方程设置,其中 SMB0CR 是 SMB0CR 寄存器

中的 8 位无符号数值。SYSCLK 是系统时钟频率(单位为 Hz) 。

SMB0CR<(288-0.85xSYSCLK)/1.125E6

SCL 信号的高电平和低电平时间由下式给出:

TLOW=(256-SMB0CR)/SYSCLK

THIGH=(258-SMB0CR)/SYSCLK+625NS

使用相同的 SMB0CR 值,总线空闲超时周期由下式给出。

TBFT=10X(256-SMB0CR)+1/SYSCLK

(3)SMB0DAT:SMBus0 数据寄存器

R/W R/W R/W R/W R/W R/W R/W R/W 复位值

                                                              00000000

位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xC2

  

位 7-0: SMB0DAT:SMBus0 数据

SMB0DAT 寄存器保存要发送到 SMBus0 串行接口上的一个数据字节,或刚从

SMBus0 串行接口接收到的一个字节。一旦 SI 串行中断标志(SMB0CN.3)被

置为逻辑 1,CPU 即可读或写该寄存器。当 SI 标志位不为 1 时,系统可能正

在移入/移出数据,此时 CPU不应访问该寄存器。

(4)SMB0ADR:SMBus0 地址寄存器

  

                                                                            复位值

SLV6 SLV5 SLV4 SLV3 SLV2 SLV1 SLV0 GC 00000000

位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xC3  

位 7-1: SLV6-SLV0:SMBus0 从地址

这些位用于存放 7 位从地址,当器件工作在从发送器或从接收器方式时,

SMBus0 将应答该地址。SLV6 是地址的最高位,对应从 SMBus0 收到的地址

字节的第一位。

位 0: GC:全局呼叫地址使能

该位用于使能全局呼叫地址(0x00)识别。

0:忽略全局呼叫地址。

1:识别全局呼叫地址。

(5) SMB0STA:SMBus 状态寄存器

  

                                                                                复位值

STA7 STA6 STA5 STA4 STA3 STA2 STA1 STA0 11111000

位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xC1

位 7-3: STA7-STA3:SMBus0 状态代码

这些位含有 SMBus0 状态代码。共有 28 个可能的状态码,每个状态码对应一

个 SMBus 状态。在 SI 标志(SMB0CN.3)置位时,SMB0STA 中的状态码有

效。 当 SI标志为逻辑 0时, SMB0STA 中的内容无定义。 任何时候向 SMB0STA

寄存器写入将导致不确定的结果。

位 2-0: STA2-STA0:当 SI 标志位为逻辑 1 时,这三个 SMB0STA 最低位的读出值总

是为逻辑 0。

下面是smbus0的状态码,用这个状态码去判断中断服务程序该做什么

下面是例程,由于小弟才能力有限,未免有过多错误,还请多多指教,这个程序是读取pcf8563的秒时间,并把它显示在s012864上面.(由于字数限制,接下篇)

 

接上篇c8051f020smbus总线应用

2008-05-04 22:45

#include <c8051f020.h>

sbit    a0 =P2^0;     

sbit    wr_rw=P2^4;  

sbit    cs1=P2^1;     

sbit    rd_EN=P2^3;  

sbit    rst=P2^5;

sbit    bal=P3^0;   

//-----------------------------------------------//

//---------define smbus0/i2c state constant------//

//-----------------------------------------------//

#define SMB_BUS_ERROR 0x60 //BUS error

#define SMB_BUS_DSACK_R 0x28 //Data sent and recive ACK

#define SMB_BUS_DSNACK_R 0x30 //Data sent and recive NACK

#define SMB_BUS_STR 0x08   //Start condition sent and recive ACK

#define SMB_BUS_STRR 0x10 //repeat start condition

#define SMB_BUS_ADD_W_ACK 0x18 //address and write

#define SMB_BUS_ADD_R_ACK 0x40 //address and reader

#define SMB_BUS_NACK 0x30 //DATA sent reciver NACK

#define SMB_BUS_ADD_W_NACK 0x20 //address sent and recive NACK

#define SMB_BUS_ADD_R_NACK 0x48 //address sent and recive NACK

#define SMB_BUS_DRACK_t 0x50 //Data recive and ACK sent

#define SMB_BUS_DRNACK_t 0x58 //Data recive and NACK sent

#define SMB_BUS_CMLOST 0X38 //can not get the bus free

bit smb_busy;

char OUT;

char OUTADD;

char IN;

char watch;

char count;

char intdata;

//------------------define pcf8563 address----------------------//

#define PCF8563_READ 0xa3 //PCF8563 READ COMMAND

#define PCF8563_WRITE 0xa2 //PCF8563 WRITE COMMAND

#define PCF8563_CONTROLA 0X00 //Pcf8563 control reg1

#define PCF8563_CONTROLB 0X01 //pcf8563 control reg2

#define PCF8563_CLKOUT   0x0d   //pcf8563 clkout reg

#define PCF8563_TCON     0X0E //CONTENT CONTROL reg

#define PCF8563_TCT      0x0f   //TIMER value

#define PCF8563_SEC      0X02   //SECOND CON

#define PCF8563_MIN      0X03   //MIN    con

#define PCF8563_HOU      0x04   //HOU con

#define PCF8563_DAY      0x05   //DAY con

#define PCF8563_WEK      0X06   //WEK con

#define PCF8563_MON      0x07   //MON CON

#define PCF8563_YEAR     0X08   //YEAR con

#define PCF8563_MINALR   0x09   //MIN alarming

#define PCF8563_HOUALR   0X0A   //HOUR alarming

#define PCF8563_DAYALR   0X0B   //DAY alarming

#define PCF8563_WEKALR   0X0C   //WEK alarming

//--------------predeine time const----------//

void SM_SEND(char address,char outpackage)

{

while (smb_busy);

smb_busy=1;

SMB0CN=0X44;

OUTADD=address;

OUT=outpackage;

STA=1;

}

char SM_RECEIVE(char addr)

{

while (smb_busy);      // 等待总线空闲

smb_busy = 1;       //占用SMBus(设置为忙)

SMB0CN = 0x44;       // 允许SMBus,应答周期发ACK

OUTADD=addr;

STA = 1;        // 启动传输过程

while (smb_busy);      // 等待传输结束

return IN;

}

void SMBUS_ISR(void) interrupt 7

{

  

watch=SMB0STA;

switch(watch)

{

case SMB_BUS_STR:

SMB0DAT=OUTADD;

STA=0;

break;

case SMB_BUS_ADD_W_ACK:

SMB0DAT=OUT;

break;

case SMB_BUS_ADD_W_NACK:

STO=1;

STA=1;

break;

case SMB_BUS_DSACK_R:

STO=1;

smb_busy=0;

break;

case SMB_BUS_DSNACK_R:

STO=1;

STA=1;

break;

case SMB_BUS_CMLOST:

STO=1;

STA=1;

break;

case SMB_BUS_ADD_R_ACK:

AA=0;

break;

case SMB_BUS_ADD_R_NACK:

STA=1;

break;

case SMB_BUS_DRACK_t:

STO=1;

smb_busy=0;

break;

case SMB_BUS_DRNACK_t:

IN=SMB0DAT;

STO=1;

smb_busy=0;

break;

default:

STO=1;

smb_busy=0;

break;

}

SI=0;

}

void Delayl(void)

{

   int x;

   for(x = 0;x < 5000;x)

      x++;

}

void delay()

{

unsigned char data i=5;

while(i-->0);

}

void wdata80(unsigned char dat)

{

   cs1=0;

   a0=1; //数据

   wr_rw=0;//写

   rd_EN=1;

   delay();

   P1=dat;

   delay();

   rd_EN=0;

}

void w_com80(unsigned char x)

{

   cs1=0;

   a0=0;//命令

   wr_rw=0;//写

   rd_EN=1;//ENABLE

   delay();

   P1=x;

   delay();

   rd_EN=0;

}

void w_com(unsigned char x)

{

   w_com80(x);

}

void display_clr(void)//P是图片数据的首地址

{

    unsigned char seg;

    unsigned char page;

    for(page=0xb0;page<0xb9;page++) //写页地址共 8 页 0xb0----0xb8

    {  

            w_com(page);                      

      w_com(0x10); //列地址,高低字节两次写入,从第 0 列开始

            w_com(0x00);             

      for(seg=0;seg<128;seg++)//写 128 列

      {

    cs1=0;

       a0=1; //数据

       wr_rw=0;//写

      rd_EN=1;

      delay();

      P1=0x00;

      delay();

      rd_EN=0;

  

  

   }

    }

}

void display_map(unsigned char *p)//P是图片数据的首地址

{

    unsigned char seg;

    unsigned char page;

    for(page=0xb0;page<0xb3;page++) //写页地址共 8 页 0xb0----0xb8

    {  

            w_com(page);                      

      w_com(0x10); //列地址,高低字节两次写入,从第 0 列开始

            w_com(0x00);             

      for(seg=0;seg<10;seg++)//写 128 列

      { wdata80(*p++); }

    }

}

unsigned char code Bmp0[]=

{

/*------------------------------------------------------------------------------

; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。

; 源文件 / 文字 : 0

; 宽×高(像素): 10×

; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/30字节

; 数据转换日期 : 2008-4-19 13:56:21

------------------------------------------------------------------------------*/

//宽的像素数,高的像素数,宽的字节数,参数设置可选

0x00,0x00,0xE0,0x78,0x08,0x04,0x08,0xF0,0x00,0x00,0x00,0x00,0x1F,0x78,0x40,0x40,

0x60,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

unsigned char code Bmp1[]=

{

/*------------------------------------------------------------------------------

; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。

; 源文件 / 文字 : 1

; 宽×高(像素): 10×

; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/30字节

; 数据转换日期 : 2008-4-19 13:50:59

------------------------------------------------------------------------------*/

//宽的像素数,高的像素数,宽的字节数,参数设置可选

0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x7F,0x40,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

unsigned char code Bmp2[]=

{

/*------------------------------------------------------------------------------

; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。

; 源文件 / 文字 : 2

; 宽×高(像素): 10×19

; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/30字节

; 数据转换日期 : 2008-4-19 13:51:30

------------------------------------------------------------------------------*/

//宽的像素数,高的像素数,宽的字节数,参数设置可选

0x00,0x00,0x18,0x08,0x0C,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x60,0x70,0x4C,0x46,

0x41,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

unsigned char code Bmp3[]=

{

/*------------------------------------------------------------------------------

; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。

; 源文件 / 文字 : 3

; 宽×高(像素): 10×

; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/30字节

; 数据转换日期 : 2008-4-19 13:52:05

------------------------------------------------------------------------------*/

//宽的像素数,高的像素数,宽的字节数,参数设置可选

0x00,0x00,0x00,0x08,0x08,0x08,0xD8,0x20,0x00,0x00,0x00,0x00,0x40,0x40,0x41,0x41,

0x63,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

unsigned char code Bmp4[]=

{

/*------------------------------------------------------------------------------

; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。

; 源文件 / 文字 : 4

; 宽×高(像素): 10×

; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/30字节

; 数据转换日期 : 2008-4-19 13:53:00

------------------------------------------------------------------------------*/

//宽的像素数,高的像素数,宽的字节数,参数设置可选

0x00,0x00,0x00,0xC0,0x20,0x10,0xFC,0x00,0x00,0x00,0x00,0x0C,0x0F,0x0C,0x0C,0x0C,

0x7F,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

unsigned char code Bmp5[]=

{

/*------------------------------------------------------------------------------

; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。

; 源文件 / 文字 : 5

; 宽×高(像素): 10×19

; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/30字节

; 数据转换日期 : 2008-4-19 13:53:33

------------------------------------------------------------------------------*/

//宽的像素数,高的像素数,宽的字节数,参数设置可选

0x00,0x00,0xC0,0xF0,0x88,0x88,0x08,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x41,

0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

unsigned char code Bmp6[]=

{

/*------------------------------------------------------------------------------

; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。

; 源文件 / 文字 : 6

; 宽×高(像素): 10×19

; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/30字节

; 数据转换日期 : 2008-4-19 13:54:18

------------------------------------------------------------------------------*/

//宽的像素数,高的像素数,宽的字节数,参数设置可选

0x00,0x00,0xC0,0x60,0x10,0x08,0x08,0x04,0x00,0x00,0x00,0x00,0x3F,0x41,0x41,0x41,

0x63,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

unsigned char code Bmp7[]=

{

/*------------------------------------------------------------------------------

; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。

; 源文件 / 文字 : 7

; 宽×高(像素): 10×19

; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/30字节

; 数据转换日期 : 2008-4-19 13:54:57

------------------------------------------------------------------------------*/

//宽的像素数,高的像素数,宽的字节数,参数设置可选

0x00,0x00,0x18,0x08,0x08,0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x07,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

unsigned char code Bmp8[]=

{

/*------------------------------------------------------------------------------

; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。

; 源文件 / 文字 : 8

; 宽×高(像素): 10×19

; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/30字节

; 数据转换日期 : 2008-4-19 13:55:21

------------------------------------------------------------------------------*/

//宽的像素数,高的像素数,宽的字节数,参数设置可选

0x00,0x00,0x78,0x88,0x04,0x08,0xF8,0x20,0x00,0x00,0x00,0x00,0x7C,0x43,0x43,0x47,

0x4C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

unsigned char code Bmp9[]=

{

/*------------------------------------------------------------------------------

; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。

; 源文件 / 文字 : 9

; 宽×高(像素): 10×19

; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/30字节

; 数据转换日期 : 2008-4-19 13:55:48

------------------------------------------------------------------------------*/

//宽的像素数,高的像素数,宽的字节数,参数设置可选

0x00,0x00,0xF0,0x08,0x04,0x08,0x38,0xE0,0x00,0x00,0x00,0x00,0x03,0x42,0x64,0x32,

0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

void config (void) {

//Local Variable Definitions

//----------------------------------------------------------------

// Watchdog Timer Configuration

//

// WDTCN.[7:0]: WDT Control

//   Writing 0xA5 enables and reloads the WDT.

//   Writing 0xDE followed within 4 clocks by 0xAD disables the WDT

//   Writing 0xFF locks out disable feature.

//

// WDTCN.[2:0]: WDT timer interval bits

//   NOTE! When writing interval bits, bit 7 must be a 0.

//

// Bit 2 | Bit 1 | Bit 0

//------------------------    

//    1   |   1   |   1      Timeout interval = 1048576 x Tsysclk

//    1   |   1   |   0      Timeout interval = 262144 x Tsysclk

//    1   |   0   |   1      Timeout interval =   65636 x Tsysclk

//    1   |   0   |   0      Timeout interval =   16384 x Tsysclk

//    0   |   1   |   1      Timeout interval =    4096 x Tsysclk

//    0   |   1   |   0      Timeout interval =    1024 x Tsysclk

//    0   |   0   |   1      Timeout interval =     256 x Tsysclk

//    0   |   0   |   0      Timeout interval = 64 x Tsysclk

//

//------------------------

WDTCN = 0x07; // Watchdog Timer Control Register

    WDTCN = 0xDE;   // Disable WDT

    WDTCN = 0xAD;

    WDTCN = 0xFF;   // Disable WDT Lockout

//----------------------------------------------------------------

// CROSSBAR REGISTER CONFIGURATION

//

// NOTE: The crossbar register should be configured before any

// of the digital peripherals are enabled. The pinout of the

// device is dependent on the crossbar configuration so caution

// must be exercised when modifying the contents of the XBR0,

// XBR1, and XBR2 registers. For detailed information on

// Crossbar Decoder Configuration, refer to Application Note

// AN001, "Configuring the Port I/O Crossbar Decoder".

//----------------------------------------------------------------

// Configure the XBRn Registers

XBR0 = 0x05; // XBAR0: Initial Reset Value

XBR1 = 0x00; // XBAR1: Initial Reset Value

XBR2 = 0xC0; // XBAR2: Initial Reset Value

// Select Pin I/0

// NOTE: Some peripheral I/O pins can function as either inputs or

// outputs, depending on the configuration of the peripheral. By default,

// the configuration utility will configure these I/O pins as push-pull

// outputs.

                      // Port configuration (1 = Push Pull Output)

    P0MDOUT = 0x00; // Output configuration for P0

    P1MDOUT = 0xff; // Output configuration for P1

    P2MDOUT = 0xff; // Output configuration for P2

    P3MDOUT = 0x03; // Output configuration for P3

    P74OUT = 0xff; // Output configuration for P4-7

    P1MDIN = 0xff; // Input configuration for P1

// View port pinout

   // The current Crossbar configuration results in the

   // following port pinout assignment:

   // Port 0

   // P0.0 = unassigned      (Open-Drain Output/Input)

   // P0.1 = unassigned      (Open-Drain Output/Input)

   // P0.2 = unassigned      (Open-Drain Output/Input)

   // P0.3 = unassigned      (Open-Drain Output/Input)

   // P0.4 = unassigned      (Open-Drain Output/Input)

   // P0.5 = unassigned      (Open-Drain Output/Input)

   // P0.6 = unassigned      (Open-Drain Output/Input)

   // P0.7 = unassigned      (Open-Drain Output/Input)

   // Port 1

   // P1.0 = unassigned      (Open-Drain Output/Input)(Digital)

   // P1.1 = unassigned      (Open-Drain Output/Input)(Digital)

   // P1.2 = unassigned      (Open-Drain Output/Input)(Digital)

   // P1.3 = unassigned      (Open-Drain Output/Input)(Digital)

   // P1.4 = unassigned      (Open-Drain Output/Input)(Digital)

   // P1.5 = unassigned      (Open-Drain Output/Input)(Digital)

   // P1.6 = unassigned      (Open-Drain Output/Input)(Digital)

   // P1.7 = unassigned      (Open-Drain Output/Input)(Digital)

     

   // Port 2  

   // P2.0 = unassigned      (Open-Drain Output/Input)

   // P2.1 = unassigned      (Open-Drain Output/Input)

   // P2.2 = unassigned      (Open-Drain Output/Input)

   // P2.3 = unassigned      (Open-Drain Output/Input)

   // P2.4 = unassigned      (Open-Drain Output/Input)

   // P2.5 = unassigned      (Open-Drain Output/Input)

   // P2.6 = unassigned      (Open-Drain Output/Input)

   // P2.7 = unassigned      (Open-Drain Output/Input)

   // Port 3  

   // P3.0 = unassigned      (Open-Drain Output/Input)

   // P3.1 = unassigned      (Open-Drain Output/Input)

   // P3.2 = unassigned      (Open-Drain Output/Input)

   // P3.3 = unassigned      (Open-Drain Output/Input)

   // P3.4 = unassigned      (Open-Drain Output/Input)

   // P3.5 = unassigned      (Open-Drain Output/Input)

   // P3.6 = unassigned      (Open-Drain Output/Input)

   // P3.7 = unassigned      (Open-Drain Output/Input)

    EMI0CF = 0x20;    // External Memory Configuration Register

//----------------------------------------------------------------

// Comparators Register Configuration

//

// Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0

//------------------------------------------------------------------    

// R/W   |    R   | R/W   | R/W   | R/W | R/W | R/W | R/W

//------------------------------------------------------------------

// Enable | Output | Rising | Falling| Positive     | Negative   

//        | State | Edge   | Edge   | Hysterisis   | Hysterisis   

//        | Flag   | Int.   | Int.   | 00: Disable | 00: Disable

//        |        | Flag   | Flag   | 01: 5mV     | 01: 5mV

//        |        |        |        | 10: 10mV     | 10: 10mV

//        |        |        |        | 11: 20mV     | 11: 20mV

// ----------------------------------------------------------------

CPT0CN = 0x00; // Comparator 0 Control Register

CPT1CN = 0x00; // Comparator 1 Control Register

//Comp1 marker

     

//----------------------------------------------------------------

// Oscillator Configuration

//----------------------------------------------------------------

OSCXCN = 0x00; // EXTERNAL Oscillator Control Register

OSCICN = 0x07; // Internal Oscillator Control Register

//----------------------------------------------------------------

// Reference Control Register Configuration

//----------------------------------------------------------------

REF0CN = 0x00; // Reference Control Register

//----------------------------------------------------------------

// ADC Configuration

//----------------------------------------------------------------

AMX0CF = 0x60; // AMUX Configuration Register

AMX0SL = 0x00; // AMUX Channel Select Register

ADC0CF = 0xF8; // ADC Configuration Register

ADC0CN = 0x00; // ADC Control Register

ADC0LTH = 0x00; // ADC Less-Than High Byte Register

ADC0LTL = 0x00; // ADC Less-Than Low Byte Register

ADC0GTH = 0xFF; // ADC Greater-Than High Byte Register

ADC0GTL = 0xFF; // ADC Greater-Than Low Byte Register

    AMX1SL = 0x00; // AMUX1 Channel Select Register

    ADC1CF = 0xF8; // ADC1 Configuration Register

    ADC1CN = 0x00; // ADC1 Control Register

//----------------------------------------------------------------

// DAC Configuration

//----------------------------------------------------------------

DAC0CN = 0x00; // DAC0 Control Register

DAC0L = 0x00; // DAC0 Low Byte Register

DAC0H = 0x00; // DAC0 High Byte Register

DAC1CN = 0x00; // DAC1 Control Register

DAC1L = 0x00; // DAC1 Low Byte Register

DAC1H = 0x00; // DAC1 High Byte Register

//----------------------------------------------------------------

// SPI Configuration

//----------------------------------------------------------------

SPI0CN = 0x00; // SPI Control Register

SPI0CFG = 0x00; // SPI Configuration Register

SPI0CKR = 0x00; // SPI Clock Rate Register

//----------------------------------------------------------------

// UART Configuration

//----------------------------------------------------------------

    SCON0 = 0x00;       // Serial Port Control Register

    SADEN0 = 0x00;      // Serial 0 Slave Address Enable

    SADDR0 = 0x00;      // Serial 0 Slave Address Register

    PCON = 0x00;        // Power Control Register

    SCON1 = 0x00;       // Serial Port 1 Control Register  

    SADEN1 = 0x00;      // Serial 1 Slave Address Enable

SADDR1 = 0x00;      // Serial 1 Slave Address Register

//----------------------------------------------------------------

// SMBus Configuration

//----------------------------------------------------------------

SMB0CN = 0x40; // SMBus Control Register

SMB0ADR = 0x00; // SMBus Address Register

SMB0CR = 0xEC; // SMBus Clock Rate Register

//----------------------------------------------------------------

// PCA Configuration

//----------------------------------------------------------------

    PCA0MD = 0x00;       // PCA Mode Register

    PCA0CN = 0x00;      // PCA Control Register

    PCA0H = 0x00;       // PCA Counter/Timer High Byte

    PCA0L = 0x00;       // PCA Counter/Timer Low Byte

    //Module 0

    PCA0CPM0 = 0x00;    // PCA Capture/Compare Register 0

    PCA0CPL0 = 0x00;    // PCA Counter/Timer Low Byte

    PCA0CPH0 = 0x00;    // PCA Counter/Timer High Byte

    //Module 1

    PCA0CPM1 = 0x00;    // PCA Capture/Compare Register 1

    PCA0CPL1 = 0x00;    // PCA Counter/Timer Low Byte

    PCA0CPH1 = 0x00;    // PCA Counter/Timer High Byte

    //Module 2

    PCA0CPM2 = 0x00;    // PCA Capture/Compare Register 2

    PCA0CPL2 = 0x00;    // PCA Counter/Timer Low Byte

    PCA0CPH2 = 0x00;    // PCA Counter/Timer High Byte

    //Module 3

    PCA0CPM3 = 0x00;    // PCA Capture/Compare Register 3

    PCA0CPL3 = 0x00;    // PCA Counter/Timer Low Byte

    PCA0CPH3 = 0x00;    // PCA Counter/Timer High Byte

    //Module 4

    PCA0CPM4 = 0x00;    // PCA Capture/Compare Register 4

    PCA0CPL4 = 0x00;    // PCA Counter/Timer Low Byte

    PCA0CPH4 = 0x00;    // PCA Counter/Timer High Byte

//----------------------------------------------------------------

// Timer Configuration

//----------------------------------------------------------------

    CKCON = 0x00;   // Clock Control Register

    TH0 = 0x00;     // Timer 0 High Byte

    TL0 = 0x00;     // Timer 0 Low Byte

    TH1 = 0x00;     // Timer 1 High Byte

    TL1 = 0x00;     // Timer 1 Low Byte

    TMOD = 0x00;    // Timer Mode Register

    TCON = 0x00;    // Timer Control Register

    RCAP2H = 0x00; // Timer 2 Capture Register High Byte

    RCAP2L = 0x00; // Timer 2 Capture Register Low Byte

    TH2 = 0x00;     // Timer 2 High Byte

    TL2 = 0x00;     // Timer 2 Low Byte

    T2CON = 0x00;   // Timer 2 Control Register

  

    TMR3RLL = 0x00; // Timer 3 Reload Register Low Byte

    TMR3RLH = 0x00; // Timer 3 Reload Register High Byte

    TMR3H = 0x00;   // Timer 3 High Byte

    TMR3L = 0x00;   // Timer 3 Low Byte

    TMR3CN = 0x00; // Timer 3 Control Register

    RCAP4H = 0x00; // Timer 4 Capture Register High Byte

    RCAP4L = 0x00; // Timer 4 Capture Register Low Byte

    TH4 = 0x00;     // Timer 4 High Byte

    TL4 = 0x00;     // Timer 4 Low Byte

    T4CON = 0x00;   // Timer 4 Control Register

//----------------------------------------------------------------

// Reset Source Configuration

//

// Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0

//------------------------------------------------------------------    

//    R |   R/W | R/W   | R/W   |   R   |   R   | R/W | R

//------------------------------------------------------------------

// JTAG |Convert | Comp.0 | S/W    | WDT   | Miss. | POR   | HW

// Reset |Start   | Reset/ | Reset | Reset | Clock | Force | Pin

// Flag   |Reset/ | Enable | Force | Flag | Detect| &     | Reset

//        |Enable | Flag   | &      |       | Flag | Flag | Flag

//        |Flag    |        | Flag   |       |       |       |

//------------------------------------------------------------------

// NOTE! : Comparator 0 must be enabled before it is enabled as a

// reset source.

//

// NOTE! : External CNVSTR must be enalbed through the crossbar, and

// the crossbar enabled prior to enabling CNVSTR as a reset source

//------------------------------------------------------------------

RSTSRC = 0x00; // Reset Source Register

//----------------------------------------------------------------

// Interrupt Configuration

//----------------------------------------------------------------

    IE = 0x80;          //Interrupt Enable

    IP = 0x00;          //Interrupt Priority

    EIE1 = 0x02;        //Extended Interrupt Enable 1

    EIE2 = 0x00;        //Extended Interrupt Enable 2

    EIP1 = 0x00;        //Extended Interrupt Priority 1

    EIP2 = 0x00;        //Extended Interrupt Priority 2

 

// other initialization code here...

}   //End of config

void init_pcf8563(void)

{

    intdata=0x00;

    count=0x01;

    SM_SEND(PCF8563_WRITE,PCF8563_CONTROLA);

while (smb_busy);

intdata=0x00;

    count=0x01;

    SM_SEND(PCF8563_WRITE,PCF8563_CONTROLB);

    while (smb_busy);

intdata=0x80;

    count=0x01;

    SM_SEND(PCF8563_WRITE,PCF8563_CLKOUT);//CLK输出频率32.768K

    while (smb_busy);

    intdata=0x00;

    count=0x01;

    SM_SEND(PCF8563_WRITE,PCF8563_MINALR);//分报警无效

    while (smb_busy);

intdata=0x00;

    count=0x01;

    SM_SEND(PCF8563_WRITE,PCF8563_HOUALR);//时报警无效

    while (smb_busy);

    intdata=0x00;

    count=0x01;

    SM_SEND(PCF8563_WRITE,PCF8563_DAYALR);//日报警无效

    while (smb_busy);

intdata=0x00;

    count=0x01;

    SM_SEND(PCF8563_WRITE,PCF8563_WEKALR);//星期报警无效

}

void main(void)

{

char IND;

char CHG;

config();

rst=0;

delay();

   rst=1;

delay();

w_com80(0xaf);

w_com80(0x40);

w_com80(0xa0);

w_com80(0xa6);

w_com80(0xa4);

w_com80(0xa2);

w_com80(0xc8);

w_com80(0x2f);

w_com80(0x25);

w_com80(0x81);

w_com80(0x15);

display_clr();小弟不知道为什么每次配置好so16824以后,每次都要全屏清空一下,不然会花屏;

P3=0x02;

smb_busy=0;

while(1)

{

SM_SEND(PCF8563_WRITE,PCF8563_SEC);

IND=SM_RECEIVE(PCF8563_READ);

   CHG=IND&0x0f;

switch (CHG)

{

case 0x00:

display_map(&Bmp0);

break;

case 0x01:

display_map(&Bmp1);

break;

case 0x02:

display_map(&Bmp2);

break;

case 0x03:

display_map(&Bmp3);

break;

case 0x04:

display_map(&Bmp4);

break;

case 0x05:

display_map(&Bmp5);

break;

case 0x06:

display_map(&Bmp6);

break;

case 0x07:

display_map(&Bmp7);

break;

case 0x08:

display_map(&Bmp8);

break;

case 0x09:

display_map(&Bmp9);

break;

default:

   break;

}

}

}

 

BTF320开发评估板

1

BTF320开发评估板使用说明书

Version: 1.0

目录

一BT F320开发评估板功能简介……………………2

二BT F320开发评估板范例

三Silicon Laboratories IDE安装配置…………5

四BT F320开发评估板使用方法……………………6

五BT F320开发评估板原理图………………………7

BTF320开发评估板

2

一.BT F320开发评估板功能简介

1.产品简介

BT F320评估板是新华龙电子有限公司针对

推出的一款开发,评估板.集成了C8051F320单片机的基本外围电路和典型应用电路,开

发者可通过评估板上具有的各功能扩展接口及附带光盘提供的完整的演示程序,迅速的掌握

C8051F320单片机的软硬件设计(特别是USB通信的相关设计),达到缩短产品开发周期的

目的.

2.功能简介:(可完成的实验项目)

·USB通信(片上集成了USB控制器)·SMBUS,SPI接口

·AD转换·UART通信

·FRAM读写(FM24系列)·可编程电压比较器

·PCA(可编程计数器阵列)·PWM输出

·2X2键盘扫描·2X16LCD驱动

3. C8051F320片上资源:

·16k FLASH·1280byte RAM

·USB2.0控制器·4个16位定时器/计数器

·内置温度传感器·SMBUS,增强型SPI接口

·UART串口·16位的可编程计数阵列(PCA)

·可编程片内电压比较器

4.开发板组成

●BT F320开发评估板一块

●交叉串口线一条

●9V直流电源一个

BTF320开发评估板

3

●附带光盘一张

5.BT F320评估板的跳线说明

J1 I/O口

J2 USB接口

J3 ADC输入接口(信号经由运放电路LM324)

J4经由LM324整理后的模拟信号与AD输入引脚的连接跳线

J5 CP输入引脚

J6电位器(R15)输出与P1.7连接跳线

J7 1脚,1602LCD背光控制位2脚,P2.5 3脚,D3正极

J8 UART接口

J9外部VREF(+2.5V)

J10 1脚,P2.6 2脚,D4正极

J11 C2接口

二.BT F320开发评估板测试程序详细说明

1,本公司提供的测试程序已经应用Silicon Laboratories IDE软件编译通过.IDE配置

参考"三.Silicon Laboratories IDE安装配置"内容.

2,晶振的选择:由于C8051F320片内集成有高精度的可编程内部振荡器,附带光盘中提供的

范例程序都采用内部晶振.但评估板上仍留有外部晶振电路,开发者可根据开发需要自行

选用.

3,测试程序说明

所有测试程序在附带光盘的…BTF\BTF320\...目录下,

(1)温度测量程序(例程:adc_temp.c和lcd1602a.c)

摘要:本程序使用C8051F320芯片的片内温度传感器,实现对芯片表面温度进行测量,

测量值通过LCD显示且从UART发送至PC机.

(2)模拟量(电压)的采样(例程:ADC1.C和lcd1602a.c)

BTF320开发评估板

4

摘要:本程序主要实现对模拟量(电压)的采样,AD转换,LCD显示并通过UART发送

到PC机.实验时短接以下跳线:J4.1—J4.2;J7.1—J7.2;J9.1—J9.2

注:LMV324只对两个通道的信号进行调整,做ADC0应用实验时一定要注意以下问题:

.在信号调理的输入端J3-4脚(J3的第4脚)可以输入+6/-6的电压经过LMV324调

理后进行采样,也就是该输入通道能对调理后的+6/-6V的电压信号进行采样.

.在信号调整的输入端J3-1(J3的第1脚)可以输入4~20毫安的电流经过电压跟随

器输入到芯片的AIN0.1脚进行采样.(特别强调:该通道不能输入+6/-6V的电压,

虽然LMV324进行了信号的调整,但LMV324组成的电路仅是一个电压跟随器,在J11-1

脚输入多大的电压或电流都是直接加到芯片的ADC输入引脚.如果用户不按该原则做

实验,而损坏芯片本公司概不负责.)

(3)比较器(例程:CP1.c)

功能:由CP的CP+,CP-的高低来控制红色LED(D4)亮/灭(CP+>CP-则LED亮,相反灭).

可在中断程序中设断点观察.

(4)LCD显示(例程:lcd1602a.C)

摘要:本程序是LCD测试程序.用NLS595的并行输出脚作为LCD的数据引脚.实验时短接

以下跳线:J7.1—J7.2

功能:运行程序,显示两行字符"BT F320V1.0"和"www.xhl.com.cn"

(5)FRAM读写(例程: 24c04test.c)

摘要:本程序是I2C(SMBUS)读写程序,实现FM24C04A的读写操作.

(6)8位PWM(例程: pwm8.c)

摘要:PCA工作在8位脉宽调制器工作方式,在PWM引脚输出一个占空比为00xfe的PWM

信号且重复输出,可用示波器观察占空比变化.

(7)键盘扫描(例程: key.c和lcd1602a.c)

摘要:这个程序扫描KEY1—KEY4.有按键按下后,返回相应按键的字符:'1','2',

'3','4',并在LCD上显示出来.实验时短接以下跳线:J7.1—J7.2

(8)USB测试

摘要:测试前先将J6短路环连好,把USB线接上.然后在IDE里装载"

BTF320开发评估板

5

USBDEMO"中的项目文件,进行编译,连接,下载并运行此程序.打

开USBtest.exe(该程序在IDE根目录下)运行界面如图3.

图3

按下S2按键,第一个Button变亮,再按一下变暗.

按下S3按键,第二个Button变亮,再按一下变暗.

选LED1,板上D4灯闪烁,选LED2,板上D3灯闪烁.

用手拨动R15电位器,Pot指针随之改变.

Temp指针显示CPU内部温度传感器采样值.

三.Silicon Laboratories IDE安装配置

1.IDE安装:自动运行附带光盘,点击"安装Silabs IDE",按提示进行安装即可.

2.CP210X驱动的安装:仅在选用U_EC2或使用CP210X芯片时需要安装此驱动程序.

自动运行附带光盘,点击"安装CP210X驱动",按提示进行安装即可

3.安装结束,打开IDE集成开发环境,在新建或打开原有的项目后,点击主菜单

"Options"选择"ConnectionOptions.."选项(如图2所示),进入图3界面.

BTF320开发评估板

6

图2

(1)若调试器使用U_EC3/U_EC5,选择与图3相同选项,点击OK即可进行连接,程序

下载和在线调试.

(2)若调试器使用U_EC2,图3中"Serial

Adapter"框选"RS232 Serial Adapter…."一项.

其中,"COMPORT"的选择要参照"设备管理器"的端

口选项(图4中红色圆圈).已知红色圆圈内容后,点

击"COMPORT"复选框,选择"Other COM"项,输入

与"设备管理器"中相同的COM口值(如"3".注:

只输入"3"),则"COMPORT"复选框的内容为"COM3".

点击OK即可进行连接,程序下载和在线调试.

图3

图4

BTF320开发评估板

7

四BT F320评估开发板使用方法:

1.将调试器用10芯扁平电缆连接到评估板的C2口.

2.给评估板供电.接通电源的正确顺序:首先连接好调试器和评估板,然后接通评估板电

源.不可以先提供评估板电源,再连接调试器.

3.打开IDE开发环境,选择好调试口.使用调试器对C8051F320芯片编程和在线调试

标签:51单片机,
来源:网络整理 作者:佚名 时间:2017/11/24 4:23:00
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐