1T 20PIN 25MHz超值8051MCU 39R16A3

[复制链接]
3382|6
手机看帖
扫描二维码
随时随地手机跟帖
FOSVOSSH|  楼主 | 2013-6-15 21:34 | 显示全部楼层 |阅读模式
本帖最后由 FOSVOSSH 于 2013-6-15 23:09 编辑

福跃电子提供相关技术开发方案:
SM39R16A3/OB39R16A3
Vcc: 1.8V~5.5V        Speed (Max) : 25MHz
ROM : 16K Bytes        ISP : Yes
RAM : 512 Bytes        ADC : Yes
I/O : 12/14/18        Package : 14L PDIP,14L SOP,16L SOP,16L PDIP,20L PDIP,20L SOP,20L SSOP

Features:

◆工作电压:1.8V ~ 5.5V
◆高速1T 架构,最高可达25MHz.
◆1~8T 模式可使用软件编程.
◆指令设置兼容 MCS-51.
◆内置22.1184MHz RC振荡器,及可程序化的分频器
◆16K 字节的片上闪存程序存储器
◆256 字节的标准的8052 RAM
◆双16-bit 数据指针 (DPTR0&DPTR1)
◆一个全双工通信的串行接口.附加波特率产生器
◆三个16-bit 的定时器/计数器(计时器0,1,2)
◆26 GPIOs(28L封装脚位),GPIOs 可选择四种型态(准双向口、推挽、开漏、只输入),默认准双向口(上拉)
◆具有四级优先权的外部中断0,1
◆可编程的看门狗定时器(WDT).
◆一个IIC 接口(主/从机模式)
◆一个SPI 接口(主/从机模式)
◆2路脉宽调制(PWM)
◆4路16bit 比较(PWM)/捕获/重载功能
◆8路10bit 模拟数字转换(ADC)
◆片上内建运算放大器及比较器
◆片上闪存存储器支持ISP/IAP/ICP及EEPROM 功能.
◆ISP服务程序存储空间设置为N*256 byte (N=0 to 16).
◆片上在线仿真功能(ICE)及片上在线调试功能(OCD).
◆键盘接口(KBI) 共4个的中断源.
◆ALE 输出选择.
◆低电压中断/低电压复位(LVI/LVR ).
◆管脚ESD性能超过4KV.
◆增强用户代码保护.
◆电源管理单元空闲及掉电模式.

技术支持:  

 如果您在使用福跃电子的产品过程中遇到问题,我们将为您提供全面的技术支持,您可以提出你的问题和下载相关资料,我们的技术论坛会帮助您解决问题。

相关帖子

FOSVOSSH|  楼主 | 2013-6-15 21:44 | 显示全部楼层
/*
//=========================================================================
// SyncMos/On-Bright MCU               
// FOSVOS.cn
// 021-58998693
// Driver file for SM39R16A3/OB39R16A3, SM39R08A3/OB39R08A3
//=========================================================================
*/
#include "SM39R16A3.h"
#include "ADC.h"

#define d_ADCnEN                 0x02
#define d_ADC_CLK_Sel        d_ADC_CLK_DIV64
unsigned int n_data;

void ADCstart(unsigned char n_ADC_CH)
{  
        ADCC2 &= 0x7F;                //ADC stop conversion
        ADCC2 = n_ADC_CH;        //Set a new channel
        ADCC2 |= 0x80;                //ADC start conversion
}

void ADCInit(unsigned char n_ADCnEN, unsigned char n_ADC_CLK)
{
        ADCC1 = n_ADCnEN;        //Set ADC channel
        ADCCS = n_ADC_CLK;        //Select ADC clock
        IEADC = 1;                        //Enable ADC interrupt.
        EA = 1;
}

unsigned int ADC_Read10()//10-bit ADC
{
        unsigned int n_ADCD10 = 0x0000;
        n_ADCD10 = (ADCDH<<2)|ADCDL;        //10-bit ADC
        return n_ADCD10;       
}
       
void ADCInterrupt(void) interrupt d_ADC_Vector        // ADC Interrupt Vector Address 0053h => interrupt 10
{
        n_data = ADC_Read10();        //Read ADC                               
}

void ADC_stop(void)
{
        ADCC2 &= 0x7F;        //ADC stop conversion
        IEADC = 0;                //Disable ADC interrupt
}

void ADC(void)
{
        if (d_ADCnEN & 0x01)
        {
                ADCstart(d_ADC_CH0_IN);
                while(!ADCIF);       
        }
        if (d_ADCnEN & 0x02)
        {                       
                ADCstart(d_ADC_CH1_IN);
                while(!ADCIF);
        }
        if (d_ADCnEN & 0x04)
        {
                ADCstart(d_ADC_CH2_IN);
                while(!ADCIF);
        }
        if (d_ADCnEN & 0x08)
        {                       
                ADCstart(d_ADC_CH3_IN);
                while(!ADCIF);
        }
        if (d_ADCnEN & 0x10)
        {               
                ADCstart(d_ADC_CH4_IN);
                while(!ADCIF);
        }
        if (d_ADCnEN & 0x20)
        {               
                ADCstart(d_ADC_CH5_IN);
                while(!ADCIF);
        }
        if (d_ADCnEN & 0x40)
        {
                ADCstart(d_ADC_CH6_IN);
                while(!ADCIF);
        }
        if (d_ADCnEN & 0x80)
        {               
                ADCstart(d_ADC_CH7_IN);
                while(!ADCIF);
        }
}

使用特权

评论回复
FOSVOSSH|  楼主 | 2013-6-15 22:35 | 显示全部楼层
/*
//=========================================================================
// SyncMos/On-Bright MCU               
// 上海福跃电子FOSVOS.cn
// 021-58998693
// Driver file for SM39R16A3/OB39R16A3, SM39R08A3/OB39R08A3
//=========================================================================
*/
#include "SM39R16A3.h"
#include "IIC.h"

//===============================
//IIC DEFINITIONs
//===============================
#define        d_DEVICE_ID                        0xA0                                // user modify

#define d_BR32                                0x00
#define d_BR64                                0x01
#define d_BR128                                0x02
#define d_BR256                                0x03
#define d_BR512                                0x04
#define d_BR1024                        0x05
#define d_BR2048                        0x06
#define d_BR4096                        0x07
#define d_IIC_BR                        d_BR512                // user modify

#define d_MASTER                        0x40
#define d_SLAVE                                0x00
#define d_MODE_SEL                        d_MASTER        // use master mode
#define d_IIC_EN                        0x80
#define        d_NACK                                1
#define        d_ACK                                0
#define        d_WRITE                                0
#define        d_READ                                1

#define d_BB_DIS                        0x00
#define d_BB_EN                                0x08
#define d_BUS_BUSY                        d_BB_EN
#define d_AR_DIS                        0x00
#define d_AR_EN                                0x10
#define d_ARBITRATION                d_AR_EN

#define        d_CMD_RW                        0x40
#define        d_CMD_Start                        0x80
#define        d_CMD_Stop                        0xC0

//===============================================================
//OWNED SUBROUTINES
//===============================================================

void IIC_interrupt(void) interrupt d_IIC_Vector
{                         
        if(TXIF)
        {       
                TXIF = 0;                                        // Clear interrupt flag
        }
        if(RXIF)
        {       
                RXIF = 0;                                        // Clear interrupt flag
        }                       
        if(MPIF)
        {
                MPIF=0;                                                // Clear interrupt flag
        }
}

void IIC_Init_master(void)
{
        IICA1         = d_DEVICE_ID;
        IICS         = 0x00;                                // Clear IIC all status
        IEN0        |= 0x80;                                 // Enable interrupt All
        IEN1        |= 0x20;                                 // Enable interrupt IIC
        IICCTL         = d_IIC_EN | d_MODE_SEL | d_ARBITRATION | d_BUS_BUSY | d_IIC_BR;       
}

void IIC_Disable(void)
{
        IICCTL         = 0x00;                                // Disable IIC all function
        IEN1        &= 0xDF;                                 // Disable interrupt IIC
        IICS         = 0x00;                                // Clear IIC all status
}

//===============================================================
//This function will send out the Start or Re-Start pulse and CONTROL byte.
//===============================================================
bit IIC_SendStart(unsigned char ControlByte)
{
        IICA1        = ControlByte;                // MAS = 0
               
        IICEBT = d_CMD_Start;                // generate a start condition
        while(IICEBT != 0x00)
        {
                ;
        }
        return RXAK;
}

//===============================================================
//This function will send out the Stop pulse
//===============================================================
void IIC_SendStop(void)
{
        IICEBT = d_CMD_Stop;                        // generate a stop condition
        while(IICEBT != 0x00)                        // waiting data recive finish
        {
                ;
        }
}
//===============================================================
//This function will wait and receive one byte, then feedback ACK or NACK.
//===============================================================
unsigned char IIC_ReceiveByte(bit ACKStatus)
{
        unsigned char        temp;
        TXAK        = ACKStatus;                        // Feedback ACK/d_NACK to slave
        IICEBT        = d_CMD_RW;                                // Ready for receive

        while(IICEBT != 0x00)                        // waiting data recive finish
        {
                ;
        }
        temp        = IICRWD;
        //Delay(100);                                        // finetune by user
        return(temp);
}

void IIC_TransmitByte(unsigned char TxData)
{
        IICRWD        = TxData;                                // load data
        IICEBT        = d_CMD_RW;                                // trans. data
        while(IICEBT != 0x00)                        // waiting data trans. finish
        {
                ;
        }
        //Delay(100);                                        // finetune by user
}

void IIC_Page_Write( char Crtl_byte, unsigned char Addr, char LEN)
{
        unsigned char counter=0;

        IIC_SendStart(Crtl_byte | d_WRITE);                                // -- Send CONTROL byte --

        if(RXAK==d_ACK)
        {
                IIC_TransmitByte( Addr );                                        // -- Send ADDRESS --
                                                  
                for (counter=0; counter<LEN; counter++)                // -- Write N bytes --
                {
                        if(RXAK==d_ACK)
                        {
                                IIC_TransmitByte(Addr + counter);        // -- Transmit one byte --
                        }
                        else
                        {
                                ;                                                                        // error process
                        }
       
                }
        }
        else
        {
                ;                                                                                        // error process
        }
        IIC_SendStop();                                        // -- Send STOP -- MStart= 0
}

void IIC_Random_Read( char Crtl_byte, unsigned char Addr, char LEN)
{
        unsigned char Temp[16];       
        unsigned char counter=0;

        IIC_SendStart(Crtl_byte | d_WRITE);                                // -- Send CONTROL byte --       
        if(RXAK==d_ACK)
        {
                IIC_TransmitByte(Addr);                                                // -- Send ADDRESS --
       
                if(RXAK==d_ACK)
                {
                        IIC_SendStart(Crtl_byte | d_READ);                // -- Send CONTROL byte --       
               
                        for(counter=0; counter<LEN; counter++)        // -- Read N byte --
                        {
                                if(RXAK==d_ACK)
                                {
                                        if(counter<(LEN-1))
                                        {
                                                Temp[counter] = IIC_ReceiveByte(d_ACK);        // Receive one byte
                                        }
                                        else
                                        {
                                                Temp[counter] = IIC_ReceiveByte(d_NACK);// Receive last byte
                                        }
                                }
                                else
                                {
                                        ;                                                                // error process
                                }
                        }
                }
                else
                {
                        ;                                                                                // error process
                }
        }
        else
        {
                ;                                                                                        // error process
        }
        IIC_SendStop();                                                                        // -- Send STOP -- MStart= 0
}

void Check_Arbitration(void)                // multi-master use
{
        // arbitration lost, set by H/W
        // clear by S/W
        while(LAIF)
        {
                LAIF = 0;
        }
}

void Check_Busy(void)                                // multi-master use
{
        // Bus busy, BB set by H/W
        // Bus ready, BB clear by H/W or S/W
        while(BB)
        {
                ;
        }
}

使用特权

评论回复
FOSVOSSH|  楼主 | 2013-6-15 22:37 | 显示全部楼层
/*
//=========================================================================
// SyncMos/On-Bright MCU               
// 上海福跃电子FOSVOS.cn
// 021-58998693
// Driver file for SM39R16A3/OB39R16A3, SM39R08A3/OB39R08A3
//=========================================================================
*/
#include "SM39R16A3.h"
#include "IIC.h"

//=====================================================================
#define        d_IIC_Adress_1                0xA0                        // user modify
#define        d_IIC_Adress_2                0x60                        // user modify

#define        d_ACK                                0
#define        d_NACK                                1
#define        d_Write                                0
#define        d_Read                                1
#define        d_null                                0
#define        d_CMD_RW                        0x40
#define d_SAVE_ADDR                        10
#define d_SAVE_DATA                        20
//=====================================================================
bit RXfinish=0;
unsigned char n_RW                        = d_null;
unsigned char n_Addr                = d_null;
unsigned char n_Next_Step        = d_null;
unsigned char n_DAT[16];

//=====================================================================

void IIC_interrupt() interrupt d_IIC_Vector
{
        if(RXIF)
        {
                if ((IICA1 & 0x01) | (IICA2 & 0x01))        //match
                {
                        n_Next_Step        =        d_SAVE_ADDR;
                        n_RW = RW;
                        if (n_RW == d_Write)
                                IICEBT = d_CMD_RW;                        // IIC bus ready
                }       
                else if (n_Next_Step == d_SAVE_ADDR)
                {
                        n_Addr = IICRWD;
                        n_Next_Step        =        d_SAVE_DATA;
                        IICEBT        = d_CMD_RW;                        // IIC bus ready
                }
                else if (n_Next_Step == d_SAVE_DATA)
                {
                        n_DAT[n_Addr++] = IICRWD;
                        n_Next_Step        =        d_SAVE_DATA;
                        IICEBT        = d_CMD_RW;                        // IIC bus ready
                }
                RXIF = 0;
        }
       
        if (TXIF)
        {
                //TXIF = 0;                                        // Clear interrupt flag
        }
}

void IIC_init_slave()
{
        IFCON        |= 0x80;                                // MCU 1T       
        IICS        = 0x00;                                        // init IICS
        IRCON        = 0x00;                                        // init IRCON
        IICEBT        = d_CMD_RW;                                // IIC bus ready
        IICA1        = d_IIC_Adress_1;                // Control Byte 1
        IICA2        = d_IIC_Adress_2;                // Control Byte 2
        IEN1         |= 0x20;                                 // Enable interrupt IIC
        IEN0        |= 0x80;                                 // Enable interrupt All
        IICCTL         = 0x80;                                // Enable IIC module, slave mode, use IICA1
}

void TXIIC(char dd)
{
        IICRWD = dd;
        IICEBT        = d_CMD_RW;                                // IIC bus ready
        while(IICEBT != 0x00)
        {
                ;
        }
        TXIF=0;
}

使用特权

评论回复
FOSVOSSH|  楼主 | 2013-6-16 00:07 | 显示全部楼层
#include "SM39R16A3.h"
#include "LVI_LVR.h"

#define d_LVI_EN        0x00
#define d_LVR_EN        0x01

void LVI_EN(void)
{
        LVC |= 0x80;
        IELVI = 1;
        EA = 1;
}

void LVR_Disable(void)
{  
        LVC &= 0xDF;
}

void LVI(void) interrupt d_LVI_Vector
{

}
/*
//=========================================================================
// SyncMos/On-Bright MCU               
// 上海福跃电子FOSVOS.cn
// 021-58998693
// Driver file for SM39R16A3/OB39R16A3, SM39R08A3/OB39R08A3
//=========================================================================
*/

使用特权

评论回复
Tomcute| | 2017-5-19 12:22 | 显示全部楼层
樓主問您一個問題方便回答嗎?是這樣的,我目前正在開發一款遙控器是用這一款IC,但是平常不用時想進入睡眠模式,先將LVR給關閉後便進入睡眠模式,但是電流仍有約6uA的耗電量,目前IC是放在洞洞板上,接腳都沒用,因為使用手冊上是說明在3V時,電流可至約1uA的狀態,所以想請教一下樓主是否還有可調整的項目。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

46

帖子

0

粉丝