资讯详情

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

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

首先,给你一个中文C8051资料,每天看英文资料,人头大。下面是中文资料的下载地址:

http://www.brsbox.com/filebox/down/fc/c6d338b86f235a163cbf6d0eda21d213(pdf格式的)

本文简要介绍了以标准8051为核心的新型单片机 Cygnal C详细说明了8051的功能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 FLASH256B~4KB内部数据RAM、片内电源 监控,片内看门狗定时器,片内时钟源,I2C/SMBus、SPI、1~ 2 个UART串行总线等。片内JTAG模拟电路提供全速、非插入式(非插入式) 模拟电路中使用的片资源)。片内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波。 通过对交叉开关控制寄存器XBR有效设置0,CEXn上的PWM 波就由P0 或P1 口的相关端口输出。

三、基于C8051单片机三相交流变频调速系统流变频调速系统 计

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

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

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

C8051F320单片机简介

1.功能部件及特点

(1)模拟外设 10位的ADC(±1LSB INL):最大可编程转换率可达2000kbps,内置温度传感器可多达17个外部输入,可编程为单端输入或差异输入(±3℃);两个模拟比较器;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;16位计数器/定时器阵列有4个可编程;通用16位计数器/定时器有5个捕捉/比较模块。

(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口。内有输入/输出的电路单元通过相应的配置寄存器控制的交叉开关配置到所选择的端口上。

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

C8051F在8位单片机中,320率先配置了标准EC2接口(IEEE1149.1)。在上位机软件的支持下,通过串行EC2接口直接模拟和调试产品系统。C8051的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[]=

{

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

标签: j14a矩形连接器j14t闭环电流传感器专用hw

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台