Вс фев 12, 2017 22:28:32
Вс мар 12, 2017 07:29:13
Вс мар 12, 2017 08:21:24
Вс мар 12, 2017 09:59:43
Вс мар 12, 2017 12:20:11
Вс мар 12, 2017 22:52:22
Пн мар 13, 2017 05:23:32
Пн мар 13, 2017 06:18:53
c2n писал(а):Комрады! что за чудо КМ1816ВЕ51.
в лабазах есть либо КР... либо вообще без букв в начале и с ромбиком, но по скотской цене.Спойлер
Дали задачку(курсовик) решить на этом вымершем чуде. Препод возрастом с эти кристаллы, то что наши кое как научились клепать клоны AVR, и лицензировались в ARM...и писать на АСМе уже не есть "хороший тон" - воспринимать не хочет... ну да и пущай подавицц0... мне не жалько
соответствено возникло пару вопросов:
0. Отличие КМ от КР и "без буквы" с точки зрения комманд.
1. чем компилировать/в чем писать?
2. чем и как шьется это чудо, если я таки да! соберу прототипЪ.
3. иностранные аналоги?/Модели в Proteus ?
Заранее спасибо за ответы
Пн мар 13, 2017 06:59:09
0. Отличие КМ от КР и "без буквы" с точки зрения комманд.
1. чем компилировать/в чем писать?
2. чем и как шьется это чудо, если я таки да! соберу прототипЪ.
3. иностранные аналоги?/Модели в Proteus ?
Пн мар 13, 2017 08:26:16
Пн мар 13, 2017 09:24:40
Пт мар 17, 2017 20:46:33
Пт мар 17, 2017 21:14:07
Вс мар 26, 2017 12:30:13
sbit OS0=P5^2;
sbit OS1=P0^4;
sbit OS2=P0^3;
sbit RANGE=P0^2;
sbit CONVST=P0^1;
sbit ADC_RST=P0^0;
sbit RD_SCK=P4^6; //SPI=SCLK
sbit ADC_CS1=P7^5; //U19
sbit ADC_CS2=P4^5; //U15
sbit FRSTDAT=P7^6; //indicate when the Read Channel 1(V1)data=1;
sbit HBEN=P4^3; //DB14,select output: 1=output high 8 bits, after the output of the low 8-bit
sbit BUSY=P7^7; //at high level to read data
sbit AD_DoutA=P2^0; //DB7,Serial mode is used,the output data Dout A
sbit AD_DoutB=P4^4; //DB8,Serial mode is used,the output data Dout B
/*
*****************************************************************************
* Function name: ad7606_Reset
* Function Description: hardware reset, the AD7606
* Arguments: none
* Return value: none
*****************************************************************************
*/
void ad7606_Reset(void)
{
/* The AD7606 is a high-level reset bit, the requirements of the minimum pulse width 50ns */
ADC_RST=0;
ADC_RST=1;
ADC_RST=1;
ADC_RST=1;
ADC_RST=1;
Delay1ms();
ADC_RST=0;
}
/*
*********************************************************************************************************
* Function name: ad7606_StartConv
* Function Description: start the AD7606 ADC conversion
* Arguments: none
* Return value: none
*********************************************************************************************************
*/
void ad7606_StartConv(void)
{
/* Rising edge starts the conversion, the low level duration of at least 25ns */
CONVST=0;
CONVST=0;
CONVST=0; /* continuous implementation of the 2 times, a low level of about 50ns */
Delay10us();
CONVST=1;
Delay100us();
Delay100us();
// Delay100us();
}
//******************************************************************************//
void AD7606_init()
{
Delay1ms();
ad7606_Reset();
OS2=1;OS1=1;OS0=0; //set oversampling
ADC_CS1=1;
ADC_CS2=1;
P2=0x80;
RD_SCK=1;
CONVST=1;
RANGE=0; //select+/- 5V input
HBEN=0; //DB14,select output: 1=output high 8 bits, after the output of the low 8-bit
}
//***************************************************************************
void AD7606C(uchar acch)//(unsigned int *adcdat)
{
uint DoutA[4],DoutB[4];
uint i,j,n;
uchar TempAH,TempBH,TempAL,TempBL;
OS2=1;OS1=1;OS0=0; //set oversampling
RANGE=1; //Select+/- 10V input
select_CH(acch);
P51=1; P35=0;
delayms(50);
for(j=0;j<100;j++)
{
ad7606_StartConv(); //start the AD7606 ADC conversion
while(BUSY){;}
ADC_CS1=0;
ADC_CS2=1;
TempAH=0; TempBH=0;
TempAL=0; TempBL=0;
for(n=0;n<4;n++)
{
TempAH=TempAH<<1;
TempBH=TempBH<<1;
RD_SCK=0;
if(AD_DoutA)TempAH|=0x01;
if(AD_DoutB)TempBH|=0x01;
RD_SCK=1;
for(i=0;i<7;i++)
{
RD_SCK=0;
RD_SCK=1;
TempAH=TempAH<<1;
TempBH=TempBH<<1;
if(AD_DoutA)TempAH|=0x01;
if(AD_DoutB)TempBH|=0x01;
}
for(i=0;i<8;i++)
{
RD_SCK=0;
RD_SCK=1;
TempAL=TempAL<<1;
TempBL=TempBL<<1;
if(AD_DoutA)TempAL|=0x01;
if(AD_DoutB)TempBL|=0x01;
}
DoutA[n]=MakeWord(TempAL,TempAH); //MakeWord(L,H);
DoutB[n]=MakeWord(TempBL,TempBH);
}
//..............................................
ADC_CS1=1;
}
}
//////////////////////////////////////////////////////////////////////////////////
//sbit scl = P3^2;
//sbit sda = P3^3;
//Copyright(C)
//Author :love has oO arrears
//All rights reserved
//******************************************************************************/
#include "REG51. h"
/*********************************************************/
// MPU6050, Standard address 0x68
#define MPU6050_ADDRESS 0x68
#define MPU6050_WHO_AM_I 0x75
#define MPU6050_SMPLRT_DIV 0 //8000Hz
#define MPU6050_DLPF_CFG 0
#define MPU6050_GYRO_OUT 0x43 //MPU6050ÍÓÂÝÒÇÊý¾Ý¼ÄæÆ÷µØÖ·
#define MPU6050_ACC_OUT 0x3B //MPU6050¼ÓËÙ¶ÈÊý¾Ý¼ÄæÆ÷µØÖ·
#define MPU6050_SLAVE_ADDRESS 0xd0 //MPU6050Æ÷¼þ¶ÁµØÖ·
//#define MPU6050_SLAVE_ADDRESS 0x68
#define MPU6050_ADDRESS_AD0_LOW 0x68 // address pin low (GND), default for InvenSense evaluation board
#define MPU6050_ADDRESS_AD0_HIGH 0x69 // address pin high (VCC)
#define MPU6050_DEFAULT_ADDRESS MPU6050_ADDRESS_AD0_LOW
#define MPU6050_RA_XG_OFFS_TC 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_YG_OFFS_TC 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_ZG_OFFS_TC 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_X_FINE_GAIN 0x03 //[7:0] X_FINE_GAIN
#define MPU6050_RA_Y_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN
#define MPU6050_RA_Z_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN
#define MPU6050_RA_XA_OFFS_H 0x06 //[15:0] XA_OFFS
#define MPU6050_RA_XA_OFFS_L_TC 0x07
#define MPU6050_RA_YA_OFFS_H 0x08 //[15:0] YA_OFFS
#define MPU6050_RA_YA_OFFS_L_TC 0x09
#define MPU6050_RA_ZA_OFFS_H 0x0A //[15:0] ZA_OFFS
#define MPU6050_RA_ZA_OFFS_L_TC 0x0B
#define MPU6050_RA_XG_OFFS_USRH 0x13 //[15:0] XG_OFFS_USR
#define MPU6050_RA_XG_OFFS_USRL 0x14
#define MPU6050_RA_YG_OFFS_USRH 0x15 //[15:0] YG_OFFS_USR
#define MPU6050_RA_YG_OFFS_USRL 0x16
#define MPU6050_RA_ZG_OFFS_USRH 0x17 //[15:0] ZG_OFFS_USR
#define MPU6050_RA_ZG_OFFS_USRL 0x18
#define MPU6050_RA_SMPLRT_DIV 0x19
#define MPU6050_RA_CONFIG 0x1A
#define MPU6050_RA_GYRO_CONFIG 0x1B
#define MPU6050_RA_ACCEL_CONFIG 0x1C
#define MPU6050_RA_FF_THR 0x1D
#define MPU6050_RA_FF_DUR 0x1E
#define MPU6050_RA_MOT_THR 0x1F
#define MPU6050_RA_MOT_DUR 0x20
#define MPU6050_RA_ZRMOT_THR 0x21
#define MPU6050_RA_ZRMOT_DUR 0x22
#define MPU6050_RA_FIFO_EN 0x23
#define MPU6050_RA_I2C_MST_CTRL 0x24
#define MPU6050_RA_I2C_SLV0_ADDR 0x25
#define MPU6050_RA_I2C_SLV0_REG 0x26
#define MPU6050_RA_I2C_SLV0_CTRL 0x27
#define MPU6050_RA_I2C_SLV1_ADDR 0x28
#define MPU6050_RA_I2C_SLV1_REG 0x29
#define MPU6050_RA_I2C_SLV1_CTRL 0x2A
#define MPU6050_RA_I2C_SLV2_ADDR 0x2B
#define MPU6050_RA_I2C_SLV2_REG 0x2C
#define MPU6050_RA_I2C_SLV2_CTRL 0x2D
#define MPU6050_RA_I2C_SLV3_ADDR 0x2E
#define MPU6050_RA_I2C_SLV3_REG 0x2F
#define MPU6050_RA_I2C_SLV3_CTRL 0x30
#define MPU6050_RA_I2C_SLV4_ADDR 0x31
#define MPU6050_RA_I2C_SLV4_REG 0x32
#define MPU6050_RA_I2C_SLV4_DO 0x33
#define MPU6050_RA_I2C_SLV4_CTRL 0x34
#define MPU6050_RA_I2C_SLV4_DI 0x35
#define MPU6050_RA_I2C_MST_STATUS 0x36
#define MPU6050_RA_INT_PIN_CFG 0x37
#define MPU6050_RA_INT_ENABLE 0x38
#define MPU6050_RA_DMP_INT_STATUS 0x39
#define MPU6050_RA_INT_STATUS 0x3A
#define MPU6050_RA_ACCEL_XOUT_H 0x3B
#define MPU6050_RA_ACCEL_XOUT_L 0x3C
#define MPU6050_RA_ACCEL_YOUT_H 0x3D
#define MPU6050_RA_ACCEL_YOUT_L 0x3E
#define MPU6050_RA_ACCEL_ZOUT_H 0x3F
#define MPU6050_RA_ACCEL_ZOUT_L 0x40
#define MPU6050_RA_TEMP_OUT_H 0x41
#define MPU6050_RA_TEMP_OUT_L 0x42
#define MPU6050_RA_GYRO_XOUT_H 0x43
#define MPU6050_RA_GYRO_XOUT_L 0x44
#define MPU6050_RA_GYRO_YOUT_H 0x45
#define MPU6050_RA_GYRO_YOUT_L 0x46
#define MPU6050_RA_GYRO_ZOUT_H 0x47
#define MPU6050_RA_GYRO_ZOUT_L 0x48
#define MPU6050_RA_EXT_SENS_DATA_00 0x49
#define MPU6050_RA_EXT_SENS_DATA_01 0x4A
#define MPU6050_RA_EXT_SENS_DATA_02 0x4B
#define MPU6050_RA_EXT_SENS_DATA_03 0x4C
#define MPU6050_RA_EXT_SENS_DATA_04 0x4D
#define MPU6050_RA_EXT_SENS_DATA_05 0x4E
#define MPU6050_RA_EXT_SENS_DATA_06 0x4F
#define MPU6050_RA_EXT_SENS_DATA_07 0x50
#define MPU6050_RA_EXT_SENS_DATA_08 0x51
#define MPU6050_RA_EXT_SENS_DATA_09 0x52
#define MPU6050_RA_EXT_SENS_DATA_10 0x53
#define MPU6050_RA_EXT_SENS_DATA_11 0x54
#define MPU6050_RA_EXT_SENS_DATA_12 0x55
#define MPU6050_RA_EXT_SENS_DATA_13 0x56
#define MPU6050_RA_EXT_SENS_DATA_14 0x57
#define MPU6050_RA_EXT_SENS_DATA_15 0x58
#define MPU6050_RA_EXT_SENS_DATA_16 0x59
#define MPU6050_RA_EXT_SENS_DATA_17 0x5A
#define MPU6050_RA_EXT_SENS_DATA_18 0x5B
#define MPU6050_RA_EXT_SENS_DATA_19 0x5C
#define MPU6050_RA_EXT_SENS_DATA_20 0x5D
#define MPU6050_RA_EXT_SENS_DATA_21 0x5E
#define MPU6050_RA_EXT_SENS_DATA_22 0x5F
#define MPU6050_RA_EXT_SENS_DATA_23 0x60
#define MPU6050_RA_MOT_DETECT_STATUS 0x61
#define MPU6050_RA_I2C_SLV0_DO 0x63
#define MPU6050_RA_I2C_SLV1_DO 0x64
#define MPU6050_RA_I2C_SLV2_DO 0x65
#define MPU6050_RA_I2C_SLV3_DO 0x66
#define MPU6050_RA_I2C_MST_DELAY_CTRL 0x67
#define MPU6050_RA_SIGNAL_PATH_RESET 0x68
#define MPU6050_RA_MOT_DETECT_CTRL 0x69
#define MPU6050_RA_USER_CTRL 0x6A
#define MPU6050_RA_PWR_MGMT_1 0x6B
#define MPU6050_RA_PWR_MGMT_2 0x6C
#define MPU6050_RA_BANK_SEL 0x6D
#define MPU6050_RA_MEM_START_ADDR 0x6E
#define MPU6050_RA_MEM_R_W 0x6F
#define MPU6050_RA_DMP_CFG_1 0x70
#define MPU6050_RA_DMP_CFG_2 0x71
#define MPU6050_RA_FIFO_COUNTH 0x72
#define MPU6050_RA_FIFO_COUNTL 0x73
#define MPU6050_RA_FIFO_R_W 0x74
#define MPU6050_RA_WHO_AM_I 0x75
#define MPU6050_TC_PWR_MODE_BIT 7
#define MPU6050_TC_OFFSET_BIT 6
#define MPU6050_TC_OFFSET_LENGTH 6
#define MPU6050_TC_OTP_BNK_VLD_BIT 0
#define MPU6050_VDDIO_LEVEL_VLOGIC 0
#define MPU6050_VDDIO_LEVEL_VDD 1
#define MPU6050_CFG_EXT_SYNC_SET_BIT 5
#define MPU6050_CFG_EXT_SYNC_SET_LENGTH 3
#define MPU6050_CFG_DLPF_CFG_BIT 2
#define MPU6050_CFG_DLPF_CFG_LENGTH 3
#define MPU6050_EXT_SYNC_DISABLED 0x0
#define MPU6050_EXT_SYNC_TEMP_OUT_L 0x1
#define MPU6050_EXT_SYNC_GYRO_XOUT_L 0x2
#define MPU6050_EXT_SYNC_GYRO_YOUT_L 0x3
#define MPU6050_EXT_SYNC_GYRO_ZOUT_L 0x4
#define MPU6050_EXT_SYNC_ACCEL_XOUT_L 0x5
#define MPU6050_EXT_SYNC_ACCEL_YOUT_L 0x6
#define MPU6050_EXT_SYNC_ACCEL_ZOUT_L 0x7
#define MPU6050_DLPF_BW_256 0x00
#define MPU6050_DLPF_BW_188 0x01
#define MPU6050_DLPF_BW_98 0x02
#define MPU6050_DLPF_BW_42 0x03
#define MPU6050_DLPF_BW_20 0x04
#define MPU6050_DLPF_BW_10 0x05
#define MPU6050_DLPF_BW_5 0x06
#define MPU6050_GCONFIG_FS_SEL_BIT 4
#define MPU6050_GCONFIG_FS_SEL_LENGTH 2
#define MPU6050_GYRO_FS_250 0x00
#define MPU6050_GYRO_FS_500 0x01
#define MPU6050_GYRO_FS_1000 0x02
#define MPU6050_GYRO_FS_2000 0x03
#define MPU6050_ACONFIG_XA_ST_BIT 7
#define MPU6050_ACONFIG_YA_ST_BIT 6
#define MPU6050_ACONFIG_ZA_ST_BIT 5
#define MPU6050_ACONFIG_AFS_SEL_BIT 4
#define MPU6050_ACONFIG_AFS_SEL_LENGTH 2
#define MPU6050_ACONFIG_ACCEL_HPF_BIT 2
#define MPU6050_ACONFIG_ACCEL_HPF_LENGTH 3
#define MPU6050_ACCEL_FS_2 0x00
#define MPU6050_ACCEL_FS_4 0x01
#define MPU6050_ACCEL_FS_8 0x02
#define MPU6050_ACCEL_FS_16 0x03
#define MPU6050_DHPF_RESET 0x00
#define MPU6050_DHPF_5 0x01
#define MPU6050_DHPF_2P5 0x02
#define MPU6050_DHPF_1P25 0x03
#define MPU6050_DHPF_0P63 0x04
#define MPU6050_DHPF_HOLD 0x07
#define MPU6050_TEMP_FIFO_EN_BIT 7
#define MPU6050_XG_FIFO_EN_BIT 6
#define MPU6050_YG_FIFO_EN_BIT 5
#define MPU6050_ZG_FIFO_EN_BIT 4
#define MPU6050_ACCEL_FIFO_EN_BIT 3
#define MPU6050_SLV2_FIFO_EN_BIT 2
#define MPU6050_SLV1_FIFO_EN_BIT 1
#define MPU6050_SLV0_FIFO_EN_BIT 0
#define MPU6050_MULT_MST_EN_BIT 7
#define MPU6050_WAIT_FOR_ES_BIT 6
#define MPU6050_SLV_3_FIFO_EN_BIT 5
#define MPU6050_I2C_MST_P_NSR_BIT 4
#define MPU6050_I2C_MST_CLK_BIT 3
#define MPU6050_I2C_MST_CLK_LENGTH 4
#define MPU6050_CLOCK_DIV_348 0x0
#define MPU6050_CLOCK_DIV_333 0x1
#define MPU6050_CLOCK_DIV_320 0x2
#define MPU6050_CLOCK_DIV_308 0x3
#define MPU6050_CLOCK_DIV_296 0x4
#define MPU6050_CLOCK_DIV_286 0x5
#define MPU6050_CLOCK_DIV_276 0x6
#define MPU6050_CLOCK_DIV_267 0x7
#define MPU6050_CLOCK_DIV_258 0x8
#define MPU6050_CLOCK_DIV_500 0x9
#define MPU6050_CLOCK_DIV_471 0xA
#define MPU6050_CLOCK_DIV_444 0xB
#define MPU6050_CLOCK_DIV_421 0xC
#define MPU6050_CLOCK_DIV_400 0xD
#define MPU6050_CLOCK_DIV_381 0xE
#define MPU6050_CLOCK_DIV_364 0xF
#define MPU6050_I2C_SLV_RW_BIT 7
#define MPU6050_I2C_SLV_ADDR_BIT 6
#define MPU6050_I2C_SLV_ADDR_LENGTH 7
#define MPU6050_I2C_SLV_EN_BIT 7
#define MPU6050_I2C_SLV_BYTE_SW_BIT 6
#define MPU6050_I2C_SLV_REG_DIS_BIT 5
#define MPU6050_I2C_SLV_GRP_BIT 4
#define MPU6050_I2C_SLV_LEN_BIT 3
#define MPU6050_I2C_SLV_LEN_LENGTH 4
#define MPU6050_I2C_SLV4_RW_BIT 7
#define MPU6050_I2C_SLV4_ADDR_BIT 6
#define MPU6050_I2C_SLV4_ADDR_LENGTH 7
#define MPU6050_I2C_SLV4_EN_BIT 7
#define MPU6050_I2C_SLV4_INT_EN_BIT 6
#define MPU6050_I2C_SLV4_REG_DIS_BIT 5
#define MPU6050_I2C_SLV4_MST_DLY_BIT 4
#define MPU6050_I2C_SLV4_MST_DLY_LENGTH 5
#define MPU6050_MST_PASS_THROUGH_BIT 7
#define MPU6050_MST_I2C_SLV4_DONE_BIT 6
#define MPU6050_MST_I2C_LOST_ARB_BIT 5
#define MPU6050_MST_I2C_SLV4_NACK_BIT 4
#define MPU6050_MST_I2C_SLV3_NACK_BIT 3
#define MPU6050_MST_I2C_SLV2_NACK_BIT 2
#define MPU6050_MST_I2C_SLV1_NACK_BIT 1
#define MPU6050_MST_I2C_SLV0_NACK_BIT 0
#define MPU6050_INTCFG_INT_LEVEL_BIT 7
#define MPU6050_INTCFG_INT_OPEN_BIT 6
#define MPU6050_INTCFG_LATCH_INT_EN_BIT 5
#define MPU6050_INTCFG_INT_RD_CLEAR_BIT 4
#define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT 3
#define MPU6050_INTCFG_FSYNC_INT_EN_BIT 2
#define MPU6050_INTCFG_I2C_BYPASS_EN_BIT 1
#define MPU6050_INTCFG_CLKOUT_EN_BIT 0
#define MPU6050_INTMODE_ACTIVEHIGH 0x00
#define MPU6050_INTMODE_ACTIVELOW 0x01
#define MPU6050_INTDRV_PUSHPULL 0x00
#define MPU6050_INTDRV_OPENDRAIN 0x01
#define MPU6050_INTLATCH_50USPULSE 0x00
#define MPU6050_INTLATCH_WAITCLEAR 0x01
#define MPU6050_INTCLEAR_STATUSREAD 0x00
#define MPU6050_INTCLEAR_ANYREAD 0x01
#define MPU6050_INTERRUPT_FF_BIT 7
#define MPU6050_INTERRUPT_MOT_BIT 6
#define MPU6050_INTERRUPT_ZMOT_BIT 5
#define MPU6050_INTERRUPT_FIFO_OFLOW_BIT 4
#define MPU6050_INTERRUPT_I2C_MST_INT_BIT 3
#define MPU6050_INTERRUPT_PLL_RDY_INT_BIT 2
#define MPU6050_INTERRUPT_DMP_INT_BIT 1
#define MPU6050_INTERRUPT_DATA_RDY_BIT 0
// TODO: figure out what these actually do
// UMPL source code is not very obivous
#define MPU6050_DMPINT_5_BIT 5
#define MPU6050_DMPINT_4_BIT 4
#define MPU6050_DMPINT_3_BIT 3
#define MPU6050_DMPINT_2_BIT 2
#define MPU6050_DMPINT_1_BIT 1
#define MPU6050_DMPINT_0_BIT 0
#define MPU6050_MOTION_MOT_XNEG_BIT 7
#define MPU6050_MOTION_MOT_XPOS_BIT 6
#define MPU6050_MOTION_MOT_YNEG_BIT 5
#define MPU6050_MOTION_MOT_YPOS_BIT 4
#define MPU6050_MOTION_MOT_ZNEG_BIT 3
#define MPU6050_MOTION_MOT_ZPOS_BIT 2
#define MPU6050_MOTION_MOT_ZRMOT_BIT 0
#define MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT 7
#define MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT 4
#define MPU6050_DELAYCTRL_I2C_SLV3_DLY_EN_BIT 3
#define MPU6050_DELAYCTRL_I2C_SLV2_DLY_EN_BIT 2
#define MPU6050_DELAYCTRL_I2C_SLV1_DLY_EN_BIT 1
#define MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT 0
#define MPU6050_PATHRESET_GYRO_RESET_BIT 2
#define MPU6050_PATHRESET_ACCEL_RESET_BIT 1
#define MPU6050_PATHRESET_TEMP_RESET_BIT 0
#define MPU6050_DETECT_ACCEL_ON_DELAY_BIT 5
#define MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH 2
#define MPU6050_DETECT_FF_COUNT_BIT 3
#define MPU6050_DETECT_FF_COUNT_LENGTH 2
#define MPU6050_DETECT_MOT_COUNT_BIT 1
#define MPU6050_DETECT_MOT_COUNT_LENGTH 2
#define MPU6050_DETECT_DECREMENT_RESET 0x0
#define MPU6050_DETECT_DECREMENT_1 0x1
#define MPU6050_DETECT_DECREMENT_2 0x2
#define MPU6050_DETECT_DECREMENT_4 0x3
#define MPU6050_USERCTRL_DMP_EN_BIT 7
#define MPU6050_USERCTRL_FIFO_EN_BIT 6
#define MPU6050_USERCTRL_I2C_MST_EN_BIT 5
#define MPU6050_USERCTRL_I2C_IF_DIS_BIT 4
#define MPU6050_USERCTRL_DMP_RESET_BIT 3
#define MPU6050_USERCTRL_FIFO_RESET_BIT 2
#define MPU6050_USERCTRL_I2C_MST_RESET_BIT 1
#define MPU6050_USERCTRL_SIG_COND_RESET_BIT 0
#define MPU6050_PWR1_DEVICE_RESET_BIT 7
#define MPU6050_PWR1_SLEEP_BIT 6
#define MPU6050_PWR1_CYCLE_BIT 5
#define MPU6050_PWR1_TEMP_DIS_BIT 3
#define MPU6050_PWR1_CLKSEL_BIT 2
#define MPU6050_PWR1_CLKSEL_LENGTH 3
#define MPU6050_CLOCK_INTERNAL 0x00
#define MPU6050_CLOCK_PLL_XGYRO 0x01
#define MPU6050_CLOCK_PLL_YGYRO 0x02
#define MPU6050_CLOCK_PLL_ZGYRO 0x03
#define MPU6050_CLOCK_PLL_EXT32K 0x04
#define MPU6050_CLOCK_PLL_EXT19M 0x05
#define MPU6050_CLOCK_KEEP_RESET 0x07
#define MPU6050_PWR2_LP_WAKE_CTRL_BIT 7
#define MPU6050_PWR2_LP_WAKE_CTRL_LENGTH 2
#define MPU6050_PWR2_STBY_XA_BIT 5
#define MPU6050_PWR2_STBY_YA_BIT 4
#define MPU6050_PWR2_STBY_ZA_BIT 3
#define MPU6050_PWR2_STBY_XG_BIT 2
#define MPU6050_PWR2_STBY_YG_BIT 1
#define MPU6050_PWR2_STBY_ZG_BIT 0
#define MPU6050_WAKE_FREQ_1P25 0x0
#define MPU6050_WAKE_FREQ_2P5 0x1
#define MPU6050_WAKE_FREQ_5 0x2
#define MPU6050_WAKE_FREQ_10 0x3
#define MPU6050_BANKSEL_PRFTCH_EN_BIT 6
#define MPU6050_BANKSEL_CFG_USER_BANK_BIT 5
#define MPU6050_BANKSEL_MEM_SEL_BIT 4
#define MPU6050_BANKSEL_MEM_SEL_LENGTH 5
#define MPU6050_WHO_AM_I_BIT 6
#define MPU6050_WHO_AM_I_LENGTH 6
#define MPU6050_DMP_MEMORY_BANKS 8
#define MPU6050_DMP_MEMORY_BANK_SIZE 256
#define MPU6050_DMP_MEMORY_CHUNK_SIZE 16
sbit scl = P3^2;
sbit sda = P3^3;
//#define uchar unsigned char
//#define uint unsigned int
#define u8 unsigned char
#define u32 unsigned int
//void delay1(uint x)
//{
// uint i,j ;
// for(i=x;i--;i>0)
// for(j=110;j--;j>0);
//}
void delay()
{ ;; }
void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void I2c_ack()
{
scl = 0;
delay();
sda = 0;
delay();
scl = 1;
delay();
scl = 0;
}
void I2c_noack() //the host does not answer
{
scl = 0;
delay();
sda = 1;
delay();
scl = 1;
delay();
scl = 0;
}
void respons() //wait for slave response
{
u8 i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void I2c_init() //
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(u8 date) //
{
u8 i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
u8 read_byte(u8 ack) //ack = 0: Do not response
{
u8 i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
if(ack == 0)
I2c_noack();
else
I2c_ack();
return k;
}
//void write_add(u8 address,u8 date) //I2CеØÖ·
//{
// start();
// write_byte(0xa0); //24c02Ó"úÆ÷¼þµØÖ·(0xa0)
// respons(); //6050Æ÷¼þµØÖ·
// write_byte(address);
// respons();
// write_byte(date);
// respons();
// stop();
//}
//u8 read_add(u8 address) //I2C¶ÁµØÖ·
//{
// u8 date;
// start();
// write_byte(0xa0); //24C02Ó"úÆ÷¼þµØÖ·(0xa0)
// respons(); //6050Æ÷¼þµØÖ·
// write_byte(address);
// respons();
// start();
// write_byte(0xa1);
// respons();
// date=read_byte(0); //2"2úÉúÓ¦ðÐźÅ
// stop();
// return date;
//}
void Mpu6050_WriteReg(u8 reg_add,u8 reg_dat)
{
start();
write_byte(MPU6050_SLAVE_ADDRESS); //6050I2cµØÖ·
respons();
write_byte(reg_add); //Æ÷¼þ¼ÄæÆ÷µØÖ·
respons();
write_byte(reg_dat); //ÍùÆ÷¼þ¼ÄæÆ÷µØÖ·ÐÊý¾Ý
respons();
stop();
}
void Mpu6050_ReadData(u8 reg_add,u8 *Read,u8 num)
{
u8 i;
start();
write_byte(MPU6050_SLAVE_ADDRESS); //6050I2cµØÖ·
respons();
write_byte(reg_add); //Æ÷¼þ¼ÄæÆ÷µØÖ·
respons();
start();
write_byte(MPU6050_SLAVE_ADDRESS+1); //6050I2cµØÖ·
respons();
for(i = 0; i < (num - 1);i++)
{
*Read = read_byte(1); //µÈýÖ÷"ú2úÉúÓ¦ðÐźÅ
Read++;
}
*Read = read_byte(0); //Ö÷"ú2"2úÉúÓ¦ðÐźÅ
stop();
}
//mpu 3õʼ"
void Mpu6050_Init()
{
Mpu6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00); //releasing the sleep state
Mpu6050_WriteReg(MPU6050_RA_SMPLRT_DIV ,0x07); //gyro sampling rate
Mpu6050_WriteReg(MPU6050_RA_CONFIG , 0x06);
Mpu6050_WriteReg(MPU6050_RA_ACCEL_CONFIG,0x01); //configuration of the acceleration sensor in 16g mode
Mpu6050_WriteReg(MPU6050_RA_GYRO_CONFIG,0x18); ///gyroscope self-test and measurement range, typical values 0x18
}
// void Mpu6050_ReadId() //¶Á6050Æ÷¼þµØÖ·
// {
// u8 Re = 0;
// Mpu6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1);
// }
void Mpu6050_ReadAcc(short *accData)
{
u8 buf[6];
Mpu6050_ReadData(MPU6050_ACC_OUT, buf, 6); //
accData[0] = (buf[0]<<8)|buf[1];
accData[1] = (buf[2]<<8)|buf[3];
accData[2] = (buf[4]<<8)|buf[5];
}
void Mpu6050_ReadGyro(short *gyroData)
{
u8 buf[6];
Mpu6050_ReadData(MPU6050_GYRO_OUT,buf,6);
gyroData[0] = (buf[0] << 8) | buf[1];
gyroData[1] = (buf[2] << 8) | buf[3];
gyroData[2] = (buf[4] << 8) | buf[5];
}
//void Mpu6050_ReadTemp(short *tempData)
//{
// u8 buf[2];
// Mpu6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2); //¶ÁȡζÈÖµ
// *tempData = (buf[0] << 8) | buf[1];
//}
void Mpu6050_ReturnTemp(short*Temperature)
{
short temp3;
u8 buf[2];
Mpu6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2); //¶ÁȡζÈÖµ
temp3= (buf[0] << 8) | buf[1];
*Temperature=(((double) (temp3 + 13200)) / 280)-13;
}
int main(void)
{
u8 Re = 0, Read = 0,TempBuf1,TempBuf2,TempBuf3;
short temp1[3];
short temp2[3];
short temp3;
u8 Temp1Buf1,Temp1Buf2,Temp1Buf3;
u8 Temp2Buf;
I2c_init();
delay();
Mpu6050_Init();
delay();
Mpu6050_ReadData(MPU6050_RA_WHO_AM_I,&Read,1); //¶ÁÊý¾Ý
while(1)
{
Mpu6050_ReadAcc(temp1);
TempBuf1 = temp1[0];
TempBuf2 = temp1[1];
TempBuf3 = temp1[2];
Mpu6050_ReadGyro(temp2);
Temp1Buf1 = temp1[0];
Temp1Buf2 = temp1[1];
Temp1Buf3 = temp1[2];
Mpu6050_ReturnTemp(&temp3);
Temp2Buf = temp3;
}
}
/************* Function Description**************
The present program tests the use of STC15W401AS-35I-SOP16<RMB1. 6>to drive the model aircraft with Sensorless brushless three-phase DC motor.
The program reference from the online code(author: Swiss life), modified to.
Circuit diagram, see the file "BLDC-V10-experimental circuit. the pdf".
The control signal from the P3. 2-input positive pulse signal, at intervals of 5~20ms, pulse width of 1. 000~1.610 ms.
1.160 ms started, 1.610 ms for the highest speed, with a resolution of 2us.
This app is just simple to control, the software is not treated 0 delay 30 degrees switching overcurrent detection.
Due to the 0 detection portion has a RC filter, so changing the capacitance value may be approximately corresponding to the highest speed when the delay of 30 degrees time.
Interested persons can self-improvement circuit and program.
******************************************/
#define MAIN_Fosc 24000000L //define the main Clock
#include "STC15Fxxxx. H"
#define MCU_PIN 16 /* select MCU pin count, supports only 16 or 20 feet(28 feet or 32 of the heel 20 of the foot the same) */
//CMPCR1
#define CMPEN 0x80 //1: allow the comparator, 0: disable,turn off comparator power supply
#define CMPIF 0x40 //comparator interrupt flag, including the rising edge or the falling edge of the interrupt, software clears to 0
#define PIE 0x20 //1: comparison of results from 0 to 1, generating a rising edge interrupt
#define NIE 0x10 //1: result of the comparison by the 1 becomes 0, generates a falling edge interrupt
#define PIS 0x08 //input of positive polarity is selected, 0: choose an external P5. 5 do n-input, 1: by ADCIS[2:0]select the ADC input end to do the positive input.
#define NIS 0x04 //input negative polarity select, 0: select internal BandGap voltage BGv do negative input, 1: Select the external P5. 4 do input.
#define CMPOE 0x02 //1: allow the comparison result is output to P1. 2, 0: disable.
#define CMPRES 0x01 //the comparison result, a 1: CMP+level is higher than the CMP-, 0: CMP+level is lower than the CMP-is, read-only
//CMPCR2
#define INVCMPO 0x80 //1: comparator output inverted, 0: No invert
#define DISFLT 0x40 //1: closed 0. 1uF filtering, 0: allows
#define LCDTY 0x00 //0 to 63, the comparison result changes in the delay period
#if (MCU_PIN == 20)
sbit PWM2_L = P3^4;
sbit PWM1_L = P3^5;
sbit PWM0_L = P3^6;
#endif
#if (MCU_PIN == 16)
sbit PWM2_L = P5^5;
sbit PWM1_L = P3^3;
sbit PWM0_L = P3^6;
#endif
u8 Step;
u8 PWM_Value; // determine the PWM duty cycle value
u16 RxPulseWide;
bit B_RxOk;
bit B_RUN;
u8 PWW_Set;
u8 cnt10ms;
u8 Rx_cnt;
u8 TimeOut; //block timeout
#define DISABLE_CMP_INT CMPCR1 &= ~0X40 // turn off comparator interrupt
#define ENABLE_CMP_INT CMPCR1 |= 0X40 // turn comparator interrupt
/*************************/
void Delay_n_ms(u8 dly)
{
u16 j;
do
{
j = MAIN_Fosc / 13000; //delay 1ms, the main program in this beats running under
while(--j) ;
}while(--dly);
}
void delay_us(u8 us)
{
do
{
NOP(20); //@24MHz
}
while(--us);
}
void StepXL(void) // change the phase sequence function
{
switch(Step)
{
case 0: // AB
PWM0_L=0; PWM2_L=0;
CCAP0H = PWM_Value; CCAP1H=0; CCAP2H=0; // open A phase of the high-end
PWM1_L = 1; // Turn on phase B low-side
ADC_CONTR = 0XED; // choose P1. 5 as ADC input i.e. the phase c voltage
CMPCR1 = 0x9C; //bit7=1 enables the comparator, bit4=1 comparison of results from 1 becomes 0, generates a falling edge interrupt (not in response to the falling edge of the interrupt?)
break;
case 1: // AC
PWM0_L=0; PWM1_L=0;
CCAP0H = PWM_Value; CCAP1H=0; CCAP2H=0; // open A phase of the high-end
PWM2_L = 1; // Turn on phase C low-side
ADC_CONTR = 0XEC; // choose P1. 4 as ADC input i.e. the phase B voltage
CMPCR1 = 0xAC; //rising edge interrupt
break;
case 2: // BC
PWM0_L=0; PWM1_L=0;
CCAP0H=0; CCAP2H=0; CCAP1H = PWM_Value; // open the B phase of the high-end
PWM2_L = 1; // Turn on phase C low-side
ADC_CONTR = 0XEB; // choose P1. 3 as an ADC input, i.e. the a-phase voltage
CMPCR1 = 0x9C; //falling edge interrupt
break;
case 3: // BA
PWM1_L=0; PWM2_L=0;
CCAP0H=0; CCAP2H=0; CCAP1H = PWM_Value; // open the B phase of the high-end
PWM0_L = 1; // Open A phase of the low-end
ADC_CONTR = 0XED; // choose P1. 5 as ADC input i.e. the phase c voltage
CMPCR1 = 0xAC; //rising edge interrupt
break;
case 4: // CA
PWM1_L=0; PWM2_L=0;
CCAP0H=0; CCAP1H=0; CCAP2H = PWM_Value; // open the C phase of the high-end
PWM0_L = 1; // Open A phase of the low-end
ADC_CONTR = 0XEC; // choose P1. 4 as ADC input i.e. the phase B voltage
CMPCR1 = 0x9C; //falling edge interrupt
break;
case 5: // CB
PWM0_L=0; PWM2_L=0;
CCAP0H=0; CCAP1H=0; CCAP2H = PWM_Value;// open the C phase of the high-end
PWM1_L = 1; // Turn on phase B low-side
ADC_CONTR = 0XEB; // choose P1. 3 as an ADC input, i.e. the a-phase voltage
CMPCR1 = 0xAC; //rising edge interrupt
break;
default:
break;
}
}
void PWM_Init(void)
{
PWM0_L = 0;
PWM1_L = 0;
PWM2_L = 0;
#if (MCU_PIN == 20)
P3n_push_pull(0x70);
#endif
#if (MCU_PIN == 16)
P3n_push_pull(0x48);
P5n_push_pull(0x20);
#endif
// CMOD = 1 << 1; //Select system clock/2 as the clock source, i.e. PWM frequency=24M/2/256=46.9 K
CMOD = 5 << 1; //Select system clock/4 Clock source, i.e. PWM frequency=24M/4/256=23.4 K
// CMOD = 6 << 1; //Select system clock/6 Clock source, i.e. PWM frequency=24M/6/256=15.6 K
CL=0; // PCA counter is cleared
CH=0;
PCA_PWM0 = 0X00;
CCAP0H=0; // initialize duty cycle is 0% the value of H is loaded into the L
CCAP0L=0;
CCAPM0=0x42; // set to PWM mode
PCA_PWM1 = 0X00;
CCAP1H=0; // initialize duty cycle to 0%
CCAP1L=0;
CCAPM1=0x42; // set to PWM mode
PCA_PWM2 = 0X00;
CCAP2H=0; // initialize duty cycle to 0%
CCAP2L=0;
CCAPM2=0x42; // set to PWM mode
CR = 1;
}
void ADC_Init(void)
{
P1n_pure_input(0x38);
P1ASF = 0X38; // turn P1. 3 P1. 4 P1. 5 AD input port
}
void CMP_INT(void) interrupt 21
{
CMPCR1 &= ~0X40; // need the software to clear the interrupt flag
if(Step<5) Step++;
else Step = 0;
StepXL();
TimeOut = 10; //10ms timeout
}
void CMP_Init(void)
{
CMPCR1 = 0X8C; // 1000 1100 open the comparator P5. 4 as a comparator the inverting input terminal of the ADC pin as the positive input end of the
CMPCR2 = 60; // 60 Clock filter
P5n_pure_input(0x10);
}
u8 StartMotor(void)
{
u16 timer,i;
DISABLE_CMP_INT; // disable comparator interrupt
PWM_Value = 30; // initial duty ratio=16/256=6%
Step = 0;
StepXL(); // initial position
Delay_n_ms(5);//delay_ms(5);
timer = 300;
while(1)
{
for(i=0; i<timer; i++) delay_us(50); //
timer -= timer /15 + 1;
if(timer < 25) return(1);
if( Step < 5) Step++;
else Step = 0;
StepXL();
}
}
void T0_Iint(void)
{
Timer0_AsTimer(); /* timer 0 is used as timer */
Timer0_12T(); /* Timer0 clodk = fo/12 12 divider, default */
Timer0_16bit();
Timer0_Gate_INT0_P32(); /* timer 0 by the external INT0 high level allows the timer to count */
TH0 = 0;
TL0 = 0;
TR0 = 1; // Turn on timer 0
ET0 = 1;// allow ET0 interrupt
}
void T0_Interrupt(void) interrupt 1
{
Rx_cnt = 0; //once the overflow occurs, the start of the n pulses is invalid
RxPulseWide = 1000; //stop
B_RxOk = 1; //virtual receive a pulse
}
/********************* INT0 interrupt function*************************/
void INT0_int (void) interrupt INT0_VECTOR
{
u16 j;
TR0 = 0;
j = ((u16)TH0 << 8) + TL0;
TH0 = 0;
TL0 = 0;
TR0 = 1;
if(++Rx_cnt >= 5) Rx_cnt = 5;
j >>= 1; //In order to handle, turn into units of us
if((j >= 800) && (j <= 2000) && (Rx_cnt == 5))
{
RxPulseWide = j;
B_RxOk = 1; //flag receive a pulse
}
}
/**********************************************/
void main(void)
{
u16 j;
PWM_Init();
ADC_Init();
CMP_Init();
T0_Iint();
IE0 = 0; // clear external interrupt 0 flag
EX0 = 1; // INT0 Enable
IT0 = 1; //INT0 falling edge interrupt
RxPulseWide = 1000;
PWW_Set = 0;
cnt10ms = 0;
Rx_cnt = 0;
TimeOut = 0;
EA = 1; // Turn on total interrupt
while (1)
{
Delay_n_ms(1); //delay 1ms, the main program in this beats running under
if(TimeOut > 0)
{
if(--TimeOut == 0) //stall timeout
{
CCAP0H=0; CCAP1H=0; CCAP2H=0; // duty cycle is 0
PWM0_L=0; PWM1_L=0; PWM2_L=0;
DISABLE_CMP_INT; // off comparator interrupt
Delay_n_ms(250); //stall,delay 1 sec then start
Delay_n_ms(250);
Delay_n_ms(250);
Delay_n_ms(250);
RxPulseWide = 1000;
PWW_Set = 0;
PWM_Value = 0;
B_RxOk = 0;
B_RUN = 0;
Rx_cnt = 0;
TimeOut = 0;
}
}
if(B_RxOk) //receive a pulse
{
B_RxOk = 0;
j = RxPulseWide;
if(j >= 1100) // 1100~1610 corresponding to the PWM duty ratio of 0~255
{
j = (j - 1100) >> 1; //2us corresponding to the PWM for a stepper
if(j > 256) j = 255;
}
else j = 0;
PWW_Set = (u8)j;
}
if(! B_RUN && (PWW_Set >= 30)) // PWM_Set >= 30, and the motor is not running, then start the motor
{
StartMotor(); // start the motor
CMPCR1 &= ~0X40; // need the software to clear the interrupt flag
ENABLE_CMP_INT; // turn comparator interrupt
B_RUN = 1;
TimeOut = 0;
}
if(++cnt10ms >= 10) // 10ms time slot
{
cnt10ms = 0;
if(B_RUN)
{
if(PWM_Value < PWW_Set) PWM_Value++;
if(PWM_Value > PWW_Set) PWM_Value--;
if(PWM_Value < 20) // stopped
{
PWM_Value = 0;
B_RUN = 0;
CCAP0H=0; CCAP1H=0; CCAP2H=0; // duty cycle is 0
PWM0_L=0; PWM1_L=0; PWM2_L=0;
DISABLE_CMP_INT; // off comparator interrupt
}
}
}
}
}
#include<STC12C5410AD. h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P3^4; //LCD write command/data control terminal. RS=1 Data write; RS=0 writing instruction.
sbit lcdrw=P3^5; //LCD write control terminal; RW=0 write.
sbit lcden=P3^7; //LCD enable end.
uchar num;
void delayms(uint xms) //ms delay subroutine
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void time_init() //timer initialization
{
TMOD=0x11; //set the timer T0,T1 is a working way to 1.
TH0=(65536-25000)/256; //timer 0 high 8-bit initial loading value of the timing 50ms)
TL0=(65536-25000)%256; //timer 0 lower 8 bits of the initial fill value of the timing 50ms)
EA=1; //Open General interrupt.
ET0=1; //Open timer 0 interrupt
TR0=1; //Start the timer to 0.
}
void T0_time() interrupt 1 //timer 0 interrupt sub-function.
{
TH0=(65536-25000)/256; //reload timer 0 high 8-bit value.
TL0=(65536-25000)%256; //reload timer 0 low 8-bit value.
num++;
}
void AD_init() //AD initialization
{
P1M0=0xff;
P1M1=0xff; //set P1 port minimum 4-bit open-drain mode, used for AD collection.
ADC_CONTR=0xe0; //1110 0000 turn on AD Converter power supply, set the conversion speed is 210 clock cycles conversion 1 times.
delayms(10);
}
uint GetAD(uchar channel) //the AD conversion, the channel to convert the channel number 0~7.
{
uchar AD_finished=0;
uint result; //define an int type variable, to save the AD converted data.
ADC_CONTR|=channel; //select AD conversion channel number.
ADC_DATA=0;
ADC_LOW2=0;
ADC_CONTR|=0x08; //start the AD conversion.
while(AD_finished==0) //wait for the AD conversion ends.
{
AD_finished=(ADC_CONTR&0x10); //query ADC_FLAG bit is set to 1;
}
result=ADC_DATA*4+ADC_LOW2;
ADC_CONTR&=0xe0; //turn off AD Converter
return(result); //conversion completed return value.
}
float Ad_Av(uchar channel) //continuous AD acquisition N times, and then averaged.
{
float Val_Av=0; //define one used to save the real voltage value of float type variables.
uchar num; //define one used to capture the loop variable.
for(num=100;num>0;num--)
{
Val_Av+=GetAD(channel); //for N times acquisition summation.
}
Val_Av=Val_Av/100; //for N times collection averaged
return(Val_Av); //put Val_Av the value of the return.
}
void write_com(uchar com) //1602 LCD write instruction.
{
lcdrs=0;
P2=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_data(uchar date) //1602 LCD write data
{
lcdrs=1;
P2=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void lcd_init() //LCD initialization
{
lcdrw=0;
lcden=0;
write_com(0x38); //write instruction, set the 1602 is a 16X2 display, 5x7 dot matrix, 8-bit data interface.
write_com(0x0c); //write instruction, set the opening display does not display the cursor.
write_com(0x06); //write 1 byte after the address pointer is automatically incremented by 1.
write_com(0x01); //display cleared to 0, the data pointer is cleared to 0.
write_com(0x80); //positioning of the 1602 data pointer to 0X08
}
void write_lcd1(uint ad1) //the I circuit voltage AD sampling split after 1602 display
{
write_com(0x80);
if(ad1/1000>=1) //Voltage if less than 10V, the 1-bit display is empty.
{
write_data(0x30+ad1/1000);
}
else write_data(' ');
write_data(0x30+ad1%1000/100);
write_data('.');
write_data(0x30+ad1%100/10);
write_data(0x30+ad1%10);
write_data('V');
}
void write_lcd2(uint ad2) //the I-channel current AD sample split after 1602 display
{
write_com(0x88);
write_data(0x30+ad2/1000);
write_data('.');
write_data(0x30+ad2%1000/100);
write_data(0x30+ad2%100/10);
write_data(0x30+ad2%10);
write_data('A');
}
void main()
{
float ad0,ad1,ad2;
AD_init(); //AD initialization
lcd_init(); //LCD initialization.
time_init(); //timer initialization.
while(1)
{
if(num==20) //num=20, indicating that 1 second the time is up, is performed once the AD sampling and LCD display refresh.
{
num=0; //the num is cleared to 0 for the next count.
TR0=0; //turn off timer 0
ad0=Ad_Av(0); //0-channel AD sampling(0 channel as a reference voltage in.
ad1=Ad_Av(1); //1 channel AD sampling I-channel voltage sampling it.
ad2=Ad_Av(2); //2-channel AD sampling I circuit current sampling in.
ad1=ad1*2480/ad0; //calculate the 1-channel actual Voltage, the actual voltage= actual sampling value*reference voltage mv/reference sample value
ad2=ad2*2480/ad0; //calculate the 2-channel actual Voltage, the result is assigned to ad2.
write_lcd1(ad1);
write_lcd1(ad1*0.6); //put the ad1 value is sent to the LCD display. Calculate the voltage that is sent to the AD voltage is attenuated by 6 times.
write_lcd2(ad2); //put the ad2 value is sent to the LCD display. Calculate the current. Current sampling resistor is 0. 1 Europe, in an enlarged 10 times
TR0=1; //Start the timer to 0.
}
}
}
Вс мар 26, 2017 13:58:21
Вс мар 26, 2017 20:53:58
include 'Macro.inc'
<НАЗВАНИЕ СЕГМЕНТА> segment code
rseg <НАЗВАНИЕ СЕГМЕНТА>
Пн мар 27, 2017 08:24:05
Вт май 09, 2017 11:44:32
; Тип: функция, вызываемая в макросе
; Передаваемые параметры: String,Label,Waiting_value
; Возвращаемое значение: jmp на Label в случае ошибки парсинга String
Parsing macro String,Label,waiting_value ; строка для сравнения, метка для перехода в случае ошибки, время ожидания каждого символа строки в Х*256 мкс
mov parsing_delay,waiting_value
call Intput
db String,0Dh,0Ah,0
jbc parsing_error,Label ; Проверяем признак ошибки парсинга
endm
public Intput
public parsing_delay,parsing_error
USE_DATA_SEG equ 1 ; Использовать автовыделение памяти под сегменты данных
USE_BIT_SEG equ 1 ; Использовать автовыделение памяти под сегменты битовых данных
if USE_DATA_SEG
Parsing_data segment data
rseg Parsing_data
parsing_delay: ds 2
else
parsing_delay equ 1Eh ; Распределяем память вручную. Учитываем, что надо 2 ячейки: parsing_delay и parsing_delay+1
endif
if USE_BIT_SEG
Parsing_bit segment bit
rseg Parsing_bit
parsing_error: dbit 1
else
parsing_error bit 20h.0 ; Распределяем биты вручную
endif
Parsing_code segment code
rseg Parsing_code
Intput: ; Описываем процедуру, вызываемую из макроса
pop DPH ; Извлекаем из стека в DPTR адрес возврата,
pop DPL ; там находиться адрес 1 символа строки
Loop_Intput:
clr A
movc A, @A+DPTR ; Получаем очередной символ из строки
inc DPTR ; Сразу берем следующий символ
jnz Wait ; Если не конец строки, проверяем
jmp @A+DPTR ; А теперь маленький грязный хак. В DPTR у нас адрес команды после строки, вернемся по этому адресу
Wait: ; Принимаем и сравниваем полученный символ с символом из строки
if USE_DATA_SEG
mov parsing_delay+1,#0
else
clr parsing_delay+1
endif
push ACC
mov A, parsing_delay
jz Always_Wait ; Если задержка ожидания = 0
Loop_Wait:
jb RI, Stop_Wait ; Если принят байт, прекращаем ожидание
djnz parsing_delay+1,Loop_Wait
djnz parsing_delay,Loop_Wait ; Цикл ожидания входящего байта
jmp Exit_Intput ; Время ожидания байта истекло, на выход с восстановлением АСС
Always_Wait:
jnb RI, $ ; Ждем байт неограниченно долго
Stop_Wait:
pop ACC
mov parsing_delay,SBUF ; Используем ячейку задержки для сравнения полученого символа с символом из строки
clr RI
cjne A,parsing_delay,Exit_Intput_2; Если хоть 1 полученный символ не совпал, на выход без восстановления АСС
jmp Loop_Intput ; Иначе повторяем цикл сравнения
Exit_Intput: ; Выход по превышению времени парсинга
pop ACC
Exit_Intput_2: ; Выход по ошибке парсинга
clr A
movc A, @A+DPTR
inc DPTR
jnz Exit_Intput_2 ; Ищем конец строки
setb parsing_error ; Устанавливаем признак ошибки парсинга
jmp @A+DPTR ; А теперь маленький грязный хак. В DPTR у нас адрес команды после строки, вернемся по этому адресу
Parsing 'Hello',Error_1,0
clr P2.0 ; действие в случае успеха
jmp $
Error_1:
clr P2.7 ; действие в случае провала
jmp $
Вс май 14, 2017 08:21:35
Пт июн 09, 2017 13:48:25