当前位置:文档之家› CC1101接收程序及相关电路图

CC1101接收程序及相关电路图

相关电路

#include"main.h"

#include"cc1101.h"

#include"lcd1602.h"

void main(void)

{

int i;

UCHAR leng =0; //待接收字节长度

UCHAR TxBuf[8]={0}; // 8字节, 如果需要更长的数据包,请正确设置UCHAR RxBuf[8]={0}; //接收缓存区

InitLcd1602();

WriteAddressLcd1602(1,0);

WriteCharForLCD1602("The CC1101 Test!");

WriteAddressLcd1602(2,0);

WriteCharForLCD1602("Design by XuJie!");

Delaynms(6000);

ClearLcd1602();

CpuInit();

POWER_UP_RESET_CC1100();

halRfWriteRfSettings();

halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);

TxBuf[0] = 1 ;

TxBuf[1] = 1 ;

TxBuf[2] = 1 ;

TxBuf[3] = 1 ;

TxBuf[4] = 1 ;

TxBuf[2] = 1 ;

TxBuf[6] = 1 ;

TxBuf[7] = 1 ;

halRfSendPacket(TxBuf,8); // Transmit Tx buffer data

delay(6000);

InitTimer0();

// 显示格式

// Bulb overturn at

// ***** SEC later!

WriteAddressLcd1602(1,0);

WriteCharForLCD1602("Bulb overturn at"); WriteAddressLcd1602(2,6);

WriteCharForLCD1602("SEC later!");

while(1)

{

led = 1; //指示灯一直熄灭,只有接收到数据时才闪烁leng =8; // 预计接受8 bytes

ResultToDisplay(SetTime);

WriteAddressLcd1602(2,0);

for(i=0;i<5;i++)

WriteLcd1602(1,DisplayResult[i]);

if(halRfReceivePacket(RxBuf,&leng))

{

if( RxBuf[1]==1) //确认,开始灭定时

{

led = 0;

TR0 = 0;

TR1 = 1;

}

if( RxBuf[2]==1)

{ //确认,开始亮定时

led = 0;

TR0 = 1;

TR1 = 0;

}

if( RxBuf[3]==1) //时间加

{

led = 0;

SetTime ++;

}

if( RxBuf[4]==1) //时间减

{

led = 0;

SetTime --;

}

if( RxBuf[5]==1) //灯亮

{

led = 0;

bulb = 0;

}

if( RxBuf[6]==1) //灯灭

{

led = 0;

bulb = 1;

}

delay(1000);

}

RxBuf[1] = 0xff; // 接收正确数据后复位数据,防止旧数据对新数据影响

RxBuf[2] = 0xff;

RxBuf[3] = 0xff;

RxBuf[4] = 0xff;

RxBuf[5] = 0xff;

RxBuf[6] = 0xff;

}

}

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

定时器0函数:控制灯定时一定时间后点亮

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

void Timer0() interrupt 1

{

TH0 = (65536-50000)/256; //50ms定时,定时20次,12M晶振约为1s TL0 = (65536-50000)%256;

count0 ++;

if(20==count0)

{

count0 = 0;

time0 ++;

if(time0==SetTime)

{

time0 = 0;

led = 0;

bulb = 0; //定时时间到,灯亮

}

}

}

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

定时器1函数:控制灯点亮时定时一段时间后熄灭

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

void Timer1() interrupt 3

{

TH1 = (65536-50000)/256; //50ms定时,定时20次,12M晶振约为1s TL1 = (65536-50000)%256;

count1 ++;

if(20==count1)

{

count1 = 0;

time1 ++;

if(time1==SetTime)

{

time1 = 0;

led = 0;

bulb = 1; //定时时间到,灯灭

}

}

}

#ifndef _MAIN_H_

#define _MAIN_H_

#include

#include

#include

//宏定义

#define UCHAR unsigned char

#define UINT unsigned int

#define ULONG unsigned long

sbit led=P2^2; //LED指示灯,每接收到字节闪烁一次p

sbit bulb = P2^0;

int SetTime = 0; //定时时间,单位:s

int count0,count1,time0,time1; //定时器中断内部变量

UCHAR DisplayResult[5]; //全局显示结果数组

/**************************************************

函数功能:延时函数:延时nms

入口参数:y ms

***************************************************/

void Delaynms(UINT y)

{

UINT x;

for(;y>0;y--)

for(x=110;x>0;x--);

}

/**************************************************

函数功能:将长整型数据转换为字符数组形式以待显示

***************************************************/

void ResultToDisplay(int dat)

{

DisplayResult[4] = dat%10+0x30;

DisplayResult[3] = dat%100/10+0x30;

DisplayResult[2] = dat%1000/100+0x30;

DisplayResult[1] = dat%10000/1000+0x30;

DisplayResult[0] = dat%100000/10000+0x30;

}

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

定时初始函数:初始值50000=50ms

定时器0

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

void InitTimer0()

{

TMOD = 0x11; //定时器0,定时器1工作方式1

TH0 = (65536-50000)/256; //定时器0装初值

TL0 = (65536-50000)%256;

TH1 = (65536-50000)/256; //定时器1装初值

TL1 = (65536-50000)%256;

EA = 1; //开总中断

ET0 = 1; //开Timer0中断

ET1 = 1;

}

#endif

#ifndef _CC1101_H_

#define _CC1101_H_

#define WRITE_BURST 0x40 //连续写入#define READ_SINGLE 0x80 //读

#define READ_BURST 0xC0 //连续读

#define BYTES_IN_RXFIFO 0x7F //接收缓冲区的有效字节数

#define CRC_OK 0x80 //CRC校验通过位标志

//***********************************

CC1100接口

*************************************************

sbit G DO0 =P1^6;

sbit G DO2 =P1^5;

sbit MISO =P1^2;

sbit MOSI =P1^3;

sbit SCK =P1^4;

sbit CSN =P1^1;

//***********************************按键********************************************************

//sbit KEY1 =P0^0;

//sbit KEY2 =P0^1;

//***********************************数码管位选**************************************************

//sbit led3=P2^0;

//sbit led2=P2^1;

//sbit led1=P2^2;

//sbit led0=P2^3;

//***********************************蜂鸣器*******************************************************

//sbit BELL=P3^4;

//***************更多功率参数设置可详细参考DA TACC1100英文文档中第48-49页的参数表******************

//UCHAR PaTabel[8] = {0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04}; //-30dBm 功率最小

UCHAR PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60}; //0dBm

//UCHAR PaTabel[8] = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0}; //10dBm 功率最大

//***************************************************************************** ******************

void SpiInit(void);

void CpuInit(void);

void RESET_CC1100(void);

void POWER_UP_RESET_CC1100(void);

void halSpiWriteReg(UCHAR addr, UCHAR value);

void halSpiWriteBurstReg(UCHAR addr, UCHAR *buffer, UCHAR count);

void halSpiStrobe(UCHAR strobe);

UCHAR halSpiReadReg(UCHAR addr);

void halSpiReadBurstReg(UCHAR addr, UCHAR *buffer, UCHAR count);

UCHAR halSpiReadStatus(UCHAR addr);

void halRfWriteRfSettings(void);

void halRfSendPacket(UCHAR *txBuffer, UCHAR size);

UCHAR halRfReceivePacket(UCHAR *rxBuffer, UCHAR *length);

//***************************************************************************** ************

// CC1100 STROBE, CONTROL AND STATUS REGSITER

#define CCxxx0_IOCFG2 0x00 // GDO2 output pin configuration

#define CCxxx0_IOCFG1 0x01 // GDO1 output pin configuration

#define CCxxx0_IOCFG0 0x02 // GDO0 output pin configuration

#define CCxxx0_FIFOTHR 0x03 // RX FIFO and TX FIFO thresholds

#define CCxxx0_SYNC1 0x04 // Sync word, high UCHAR

#define CCxxx0_SYNC0 0x05 // Sync word, low UCHAR

#define CCxxx0_PKTLEN 0x06 // Packet length

#define CCxxx0_PKTCTRL1 0x07 // Packet automation control

#define CCxxx0_PKTCTRL0 0x08 // Packet automation control

#define CCxxx0_ADDR 0x09 // Device address

#define CCxxx0_CHANNR 0x0A // Channel number

#define CCxxx0_FSCTRL1 0x0B // Frequency synthesizer control

#define CCxxx0_FSCTRL0 0x0C // Frequency synthesizer control

#define CCxxx0_FREQ2 0x0D // Frequency control word, high UCHAR

#define CCxxx0_FREQ1 0x0E // Frequency control word, middle UCHAR

#define CCxxx0_FREQ0 0x0F // Frequency control word, low UCHAR

#define CCxxx0_MDMCFG4 0x10 // Modem configuration

#define CCxxx0_MDMCFG3 0x11 // Modem configuration

#define CCxxx0_MDMCFG2 0x12 // Modem configuration

#define CCxxx0_MDMCFG1 0x13 // Modem configuration

#define CCxxx0_MDMCFG0 0x14 // Modem configuration

#define CCxxx0_DEVIATN 0x15 // Modem deviation setting

#define CCxxx0_MCSM2 0x16 // Main Radio Control State Machine configuration

#define CCxxx0_MCSM1 0x17 // Main Radio Control State Machine configuration

#define CCxxx0_MCSM0 0x18 // Main Radio Control State Machine configuration

#define CCxxx0_FOCCFG 0x19 // Frequency Offset Compensation configuration

#define CCxxx0_BSCFG 0x1A // Bit Synchronization configuration

#define CCxxx0_AGCCTRL2 0x1B // AGC control

#define CCxxx0_AGCCTRL1 0x1C // AGC control

#define CCxxx0_AGCCTRL0 0x1D // AGC control

#define CCxxx0_WOREVT1 0x1E // High UCHAR Event 0 timeout

#define CCxxx0_WOREVT0 0x1F // Low UCHAR Event 0 timeout

#define CCxxx0_WORCTRL 0x20 // Wake On Radio control

#define CCxxx0_FREND1 0x21 // Front end RX configuration

#define CCxxx0_FREND0 0x22 // Front end TX configuration

#define CCxxx0_FSCAL3 0x23 // Frequency synthesizer calibration

#define CCxxx0_FSCAL2 0x24 // Frequency synthesizer calibration

#define CCxxx0_FSCAL1 0x25 // Frequency synthesizer calibration

#define CCxxx0_FSCAL0 0x26 // Frequency synthesizer calibration

#define CCxxx0_RCCTRL1 0x27 // RC oscillator configuration

#define CCxxx0_RCCTRL0 0x28 // RC oscillator configuration

#define CCxxx0_FSTEST 0x29 // Frequency synthesizer calibration control

#define CCxxx0_PTEST 0x2A // Production test

#define CCxxx0_AGCTEST 0x2B // AGC test

#define CCxxx0_TEST2 0x2C // Various test settings

#define CCxxx0_TEST1 0x2D // Various test settings

#define CCxxx0_TEST0 0x2E // Various test settings

// Strobe commands

#define CCxxx0_SRES 0x30 // Reset chip.

#define CCxxx0_SFSTXON 0x31 // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).

// If in RX/TX: Go to a wait state where only the synthesizer is

// running (for quick RX / TX turnaround).

#define CCxxx0_SXOFF 0x32 // Turn off crystal oscillator.

#define CCxxx0_SCAL 0x33 // Calibrate frequency synthesizer and turn it off

// (enables quick start).

#define CCxxx0_SRX 0x34 // Enable RX. Perform calibration first if coming from IDLE and

// MCSM0.FS_AUTOCAL=1.

#define CCxxx0_STX 0x35 // In IDLE state: Enable TX. Perform calibration first if

// MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled:

// Only go to TX if channel is clear.

#define CCxxx0_SIDLE 0x36 // Exit RX / TX, turn off frequency synthesizer and exit

// Wake-On-Radio mode if applicable.

#define CCxxx0_SAFC 0x37 // Perform AFC adjustment of the frequency synthesizer

#define CCxxx0_SWOR 0x38 // Start automatic RX polling sequence (Wake-on-Radio)

#define CCxxx0_SPWD 0x39 // Enter power down mode when CSn goes high.

#define CCxxx0_SFRX 0x3A // Flush the RX FIFO buffer.

#define CCxxx0_SFTX 0x3B // Flush the TX FIFO buffer.

#define CCxxx0_SWORRST 0x3C // Reset real time clock.

#define CCxxx0_SNOP 0x3D // No operation. May be used to pad strobe

commands to two

// UCHARs for simpler software.

#define CCxxx0_PARTNUM 0x30

#define CCxxx0_VERSION 0x31

#define CCxxx0_FREQEST 0x32

#define CCxxx0_LQI 0x33

#define CCxxx0_RSSI 0x34

#define CCxxx0_MARCSTATE 0x35

#define CCxxx0_WORTIME1 0x36

#define CCxxx0_WORTIME0 0x37

#define CCxxx0_PKTSTA TUS 0x38

#define CCxxx0_VCO_VC_DAC 0x39

#define CCxxx0_TXBYTES 0x3A

#define CCxxx0_RXBYTES 0x3B

#define CCxxx0_PA TABLE 0x3E

#define CCxxx0_TXFIFO 0x3F

#define CCxxx0_RXFIFO 0x3F

// RF_SETTINGS is a data structure which contains all relevant CCxxx0 registers

typedef struct S_RF_SETTINGS

{

UCHAR FSCTRL2; //自已加的

UCHAR FSCTRL1; // Frequency synthesizer control.

UCHAR FSCTRL0; // Frequency synthesizer control.

UCHAR FREQ2; // Frequency control word, high UCHAR.

UCHAR FREQ1; // Frequency control word, middle UCHAR.

UCHAR FREQ0; // Frequency control word, low UCHAR.

UCHAR MDMCFG4; // Modem configuration.

UCHAR MDMCFG3; // Modem configuration.

UCHAR MDMCFG2; // Modem configuration.

UCHAR MDMCFG1; // Modem configuration.

UCHAR MDMCFG0; // Modem configuration.

UCHAR CHANNR; // Channel number.

UCHAR DEVIATN; // Modem deviation setting (when FSK modulation is enabled).

UCHAR FREND1; // Front end RX configuration.

UCHAR FREND0; // Front end RX configuration.

UCHAR MCSM0; // Main Radio Control State Machine configuration.

UCHAR FOCCFG; // Frequency Offset Compensation Configuration.

UCHAR BSCFG; // Bit synchronization Configuration.

UCHAR AGCCTRL2; // AGC control.

UCHAR AGCCTRL1; // AGC control.

UCHAR AGCCTRL0; // AGC control.

UCHAR FSCAL2; // Frequency synthesizer calibration.

UCHAR FSCAL1; // Frequency synthesizer calibration.

UCHAR FSCAL0; // Frequency synthesizer calibration.

UCHAR FSTEST; // Frequency synthesizer calibration control

UCHAR TEST2; // Various test settings.

UCHAR TEST1; // Various test settings.

UCHAR TEST0; // Various test settings.

UCHAR IOCFG2; // GDO2 output pin configuration

UCHAR IOCFG0; // GDO0 output pin configuration

UCHAR PKTCTRL1; // Packet automation control.

UCHAR PKTCTRL0; // Packet automation control.

UCHAR ADDR; // Device address.

UCHAR PKTLEN; // Packet length.

} RF_SETTINGS;

/////////////////////////////////////////////////////////////////

const RF_SETTINGS rfSettings =

{

0x00,

0x08, // FSCTRL1 Frequency synthesizer control.

0x00, // FSCTRL0 Frequency synthesizer control.

0x10, // FREQ2 Frequency control word, high byte.

0xA7, // FREQ1 Frequency control word, middle byte.

0x62, // FREQ0 Frequency control word, low byte.

0x5B, // MDMCFG4 Modem configuration.

0xF8, // MDMCFG3 Modem configuration.

0x03, // MDMCFG2 Modem configuration.

0x22, // MDMCFG1 Modem configuration.

0xF8, // MDMCFG0 Modem configuration.

0x00, // CHANNR Channel number.

0x47, // DEVIATN Modem deviation setting (when FSK modulation is enabled).

0xB6, // FREND1 Front end RX configuration.

0x10, // FREND0 Front end RX configuration.

0x18, // MCSM0 Main Radio Control State Machine configuration.

0x1D, // FOCCFG Frequency Offset Compensation Configuration.

0x1C, // BSCFG Bit synchronization Configuration.

0xC7, // AGCCTRL2 AGC control.

0x00, // AGCCTRL1 AGC control.

0xB2, // AGCCTRL0 AGC control.

0xEA, // FSCAL3 Frequency synthesizer calibration.

0x2A, // FSCAL2 Frequency synthesizer calibration.

0x11, // FSCAL0 Frequency synthesizer calibration.

0x59, // FSTEST Frequency synthesizer calibration.

0x81, // TEST2 Various test settings.

0x35, // TEST1 Various test settings.

0x09, // TEST0 Various test settings.

0x0B, // IOCFG2 GDO2 output pin configuration.

0x06, // IOCFG0D GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation.

0x04, // PKTCTRL1 Packet automation control.

0x05, // PKTCTRL0 Packet automation control.

0x00, // ADDR Device address.

0x0c // PKTLEN Packet length.

};

//***************************************************************************** ************

//函数名:delay(unsigned int s)

//输入:时间

//输出:无

//功能描述:普通廷时,内部用

//***************************************************************************** ************

static void delay(unsigned int s)

{

unsigned int i;

for(i=0; i

for(i=0; i

}

void halWait(UINT timeout) {

do {

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

} while (--timeout);

}

void SpiInit(void)

{

CSN=0;

SCK=0;

CSN=1;

}

/****************************************************************************** ***********

//函数名:CpuInit()

//输入:无

//输出:无

//功能描述:SPI初始化程序

/****************************************************************************** ***********/

void CpuInit(void)

{

SpiInit();

delay(5000);

}

//***************************************************************************** ************

//函数名:SpisendByte(UCHAR dat)

//输入:发送的数据

//输出:无

//功能描述:SPI发送一个字节

//***************************************************************************** ************

UCHAR SpiTxRxByte(UCHAR dat)

{

UCHAR i,temp;

temp = 0;

SCK = 0;

for(i=0; i<8; i++)

{

if(dat & 0x80)

{

MOSI = 1;

}

else MOSI = 0;

dat <<= 1;

SCK = 1;

_nop_();

_nop_();

temp <<= 1;

if(MISO)temp++;

SCK = 0;

_nop_();

_nop_();

}

return temp;

}

//***************************************************************************** ************

//函数名:void RESET_CC1100(void)

//输入:无

//输出:无

//功能描述:复位CC1100

//***************************************************************************** ************

void RESET_CC1100(void)

{

CSN = 0;

while (MISO);

SpiTxRxByte(CCxxx0_SRES); //写入复位命令

while (MISO);

CSN = 1;

}

//***************************************************************************** ************

//函数名:void POWER_UP_RESET_CC1100(void)

//输入:无

//输出:无

//功能描述:上电复位CC1100

//***************************************************************************** ************

void POWER_UP_RESET_CC1100(void)

{

CSN = 1;

halWait(1);

CSN = 0;

halWait(1);

CSN = 1;

halWait(41);

RESET_CC1100(); //复位CC1100

}

//***************************************************************************** ************

//函数名:void halSpiWriteReg(UCHAR addr, UCHAR value)

//输入:地址和配置字

//输出:无

//功能描述:SPI写寄存器

//***************************************************************************** ************

void halSpiWriteReg(UCHAR addr, UCHAR value)

{

CSN = 0;

while (MISO);

SpiTxRxByte(addr); //写地址

SpiTxRxByte(value); //写入配置

CSN = 1;

}

//***************************************************************************** ************

//函数名:void halSpiWriteBurstReg(UCHAR addr, UCHAR *buffer, UCHAR count)

//输入:地址,写入缓冲区,写入个数

//输出:无

//功能描述:SPI连续写配置寄存器

//***************************************************************************** ************

void halSpiWriteBurstReg(UCHAR addr, UCHAR *buffer, UCHAR count)

{

UCHAR i, temp;

temp = addr | WRITE_BURST;

CSN = 0;

while (MISO);

SpiTxRxByte(temp);

for (i = 0; i < count; i++)

{

SpiTxRxByte(buffer[i]);

}

CSN = 1;

}

//***************************************************************************** ************

//函数名:void halSpiStrobe(UCHAR strobe)

//输入:命令

//输出:无

//功能描述:SPI写命令

//***************************************************************************** ************

void halSpiStrobe(UCHAR strobe)

{

CSN = 0;

while (MISO);

SpiTxRxByte(strobe); //写入命令

CSN = 1;

}

//***************************************************************************** ************

//函数名:UCHAR halSpiReadReg(UCHAR addr)

//输入:地址

//输出:该寄存器的配置字

//功能描述:SPI读寄存器

//***************************************************************************** ************

UCHAR halSpiReadReg(UCHAR addr)

{

UCHAR temp, value;

temp = addr|READ_SINGLE;//读寄存器命令

CSN = 0;

while (MISO);

SpiTxRxByte(temp);

CSN = 1;

return value;

}

//***************************************************************************** ************

//函数名:void halSpiReadBurstReg(UCHAR addr, UCHAR *buffer, UCHAR count)

//输入:地址,读出数据后暂存的缓冲区,读出配置个数

//输出:无

//功能描述:SPI连续写配置寄存器

//***************************************************************************** ************

void halSpiReadBurstReg(UCHAR addr, UCHAR *buffer, UCHAR count)

{

UCHAR i,temp;

temp = addr | READ_BURST; //写入要读的配置寄存器地址和读命令

CSN = 0;

while (MISO);

SpiTxRxByte(temp);

for (i = 0; i < count; i++)

{

buffer[i] = SpiTxRxByte(0);

}

CSN = 1;

}

//***************************************************************************** ************

//函数名:UCHAR halSpiReadReg(UCHAR addr)

//输入:地址

//输出:该状态寄存器当前值

//功能描述:SPI读状态寄存器

//***************************************************************************** ************

UCHAR halSpiReadStatus(UCHAR addr)

{

UCHAR value,temp;

temp = addr | READ_BURST; //写入要读的状态寄存器的地址同时写入读命令CSN = 0;

while (MISO);

SpiTxRxByte(temp);

CSN = 1;

return value;

}

//***************************************************************************** ************

//函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)

//输入:无

//输出:无

//功能描述:配置CC1100的寄存器

//***************************************************************************** ************

void halRfWriteRfSettings(void)

{

halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL2);//自已加的

// Write register settings

halSpiWriteReg(CCxxx0_FSCTRL1, rfSettings.FSCTRL1);

halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL0);

halSpiWriteReg(CCxxx0_FREQ2, rfSettings.FREQ2);

halSpiWriteReg(CCxxx0_FREQ1, rfSettings.FREQ1);

halSpiWriteReg(CCxxx0_FREQ0, rfSettings.FREQ0);

halSpiWriteReg(CCxxx0_MDMCFG4, rfSettings.MDMCFG4);

halSpiWriteReg(CCxxx0_MDMCFG3, rfSettings.MDMCFG3);

halSpiWriteReg(CCxxx0_MDMCFG2, rfSettings.MDMCFG2);

halSpiWriteReg(CCxxx0_MDMCFG1, rfSettings.MDMCFG1);

halSpiWriteReg(CCxxx0_MDMCFG0, rfSettings.MDMCFG0);

halSpiWriteReg(CCxxx0_CHANNR, rfSettings.CHANNR);

halSpiWriteReg(CCxxx0_DEVIATN, rfSettings.DEVIATN);

halSpiWriteReg(CCxxx0_FREND1, rfSettings.FREND1);

halSpiWriteReg(CCxxx0_FREND0, rfSettings.FREND0);

halSpiWriteReg(CCxxx0_MCSM0 , rfSettings.MCSM0 );

halSpiWriteReg(CCxxx0_FOCCFG, rfSettings.FOCCFG);

halSpiWriteReg(CCxxx0_BSCFG, rfSettings.BSCFG);

halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2);

halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1);

halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0);

halSpiWriteReg(CCxxx0_FSCAL3, rfSettings.FSCAL3);

halSpiWriteReg(CCxxx0_FSCAL2, rfSettings.FSCAL2);

halSpiWriteReg(CCxxx0_FSCAL1, rfSettings.FSCAL1);

halSpiWriteReg(CCxxx0_FSCAL0, rfSettings.FSCAL0);

halSpiWriteReg(CCxxx0_FSTEST, rfSettings.FSTEST);

halSpiWriteReg(CCxxx0_TEST2, rfSettings.TEST2);

halSpiWriteReg(CCxxx0_TEST1, rfSettings.TEST1);

halSpiWriteReg(CCxxx0_TEST0, rfSettings.TEST0);

halSpiWriteReg(CCxxx0_IOCFG2, rfSettings.IOCFG2);

halSpiWriteReg(CCxxx0_IOCFG0, rfSettings.IOCFG0);

halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);

halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);

halSpiWriteReg(CCxxx0_ADDR, rfSettings.ADDR);

halSpiWriteReg(CCxxx0_PKTLEN, rfSettings.PKTLEN);

}

//***************************************************************************** ************

//函数名:void halRfSendPacket(UCHAR *txBuffer, UCHAR size)

//输入:发送的缓冲区,发送数据个数

//输出:无

//功能描述:CC1100发送一组数据

//***************************************************************************** ************

void halRfSendPacket(UCHAR *txBuffer, UCHAR size)

{

halSpiWriteReg(CCxxx0_TXFIFO, size);

halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据

halSpiStrobe(CCxxx0_STX); //进入发送模式发送数据

// Wait for GDO0 to be set -> sync transmitted

while (!GDO0);

// Wait for GDO0 to be cleared -> end of packet

while (GDO0);

halSpiStrobe(CCxxx0_SFTX);

}

void setRxMode(void)

{

halSpiStrobe(CCxxx0_SRX); //进入接收状态

}

/*

// Bit masks corresponding to STATE[2:0] in the status byte returned on MISO

#define CCxx00_STATE_BM 0x70

#define CCxx00_FIFO_BYTES_A V AILABLE_BM 0x0F

#define CCxx00_STATE_TX_BM 0x20

#define CCxx00_STATE_TX_UNDERFLOW_BM 0x70

#define CCxx00_STATE_RX_BM 0x10

#define CCxx00_STATE_RX_OVERFLOW_BM 0x60

#define CCxx00_STATE_IDLE_BM 0x00

static UCHAR RfGetRxStatus(void)

{

UCHAR temp, spiRxStatus1,spiRxStatus2;

UCHAR i=4;// 循环测试次数

temp = CCxxx0_SNOP|READ_SINGLE;//读寄存器命令

CSN = 0;

while (MISO);

SpiTxRxByte(temp);

spiRxStatus1 = SpiTxRxByte(0);

do

{

SpiTxRxByte(temp);

spiRxStatus2 = SpiTxRxByte(0);

if(spiRxStatus1 == spiRxStatus2)

{

if( (spiRxStatus1 & CCxx00_STATE_BM) == CCxx00_STATE_RX_OVERFLOW_BM)

{

halSpiStrobe(CCxxx0_SFRX);

return 0;

}

return 1;

}

spiRxStatus1=spiRxStatus2;

}

while(i--);

CSN = 1;

return 0;

}

*/

UCHAR halRfReceivePacket(UCHAR *rxBuffer, UCHAR *length)

{

UCHAR status[2];

UCHAR packetLength;

UCHAR i=(*length)*4; // 具体多少要根据datarate和length来决定

halSpiStrobe(CCxxx0_SRX); //进入接收状态

//delay(5);

//while (!GDO1);

//while (GDO1);

delay(2);

while (GDO0)

{

delay(2);

--i;

if(i<1)

return 0;

}

if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0

{

packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度

if (packetLength <= *length) //如果所要的有效数据长度小于等于接收到的数据包的长度

{

halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据

*length = packetLength; //把接收数据长度的修改为当前数据的长度

// Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)

halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2); //读出CRC校验位

halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区

return (status[1] & CRC_OK); //如果校验成功返回接收成功}

else

{

*length = packetLength;

halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区

return 0;

}

}

else

return 0;

}

#endif

#ifndef _LCD1602_H_

#define _LCD1602_H_

#include"main.h"

sbit lcd1602RSPort=P2^4; //寄存器选择位

万年历(c++设计)

西安科技大学2009级C++实验报告 创作编号:BG7531400019813488897SX 创作者:别如克* 面向对象技术实验报告 (万年历)

1.实验目的 掌握一种编程工具和面向对象程序设计的基本思想和方法,培养我们学生综合利用某种语言进行程序设计的能力,培养我们学生利用系统提供的功能进行创新设计的能力,培养我们学生充分利用计算机的功能和特点分析实际问题及解决实际问题的能力。 为我们提供一个综合运用所学知识解决实际问题的机会,增强我们学生的实践动手能力和工程实践能力,并培养和锻炼我们学生的自学创新能力。 为了能更好地了解C++语言,因此开设了此次课程设计,程序设计教学课程的目的不是为了单独的课堂学习,而是要让我们学生掌握程序设计的基本思想及方法。一方面,在课程设计过程中,可以明确的指导为什么而学,还能对所学知识得到应用,更重要的是可以让我们学生掌握一些基本函数的用法,从而不在对编程序感到茫然,经过设计,可以让我们熟悉简单程序的设计方法和编写,对程序设计及该门课程设计语言的应用得到理解。 2.功能简介 万年历,输入年份,可以显示出这一年的每个月份和所对应的星期

天,可以查询每一天. 3.流程图 4.代码 #include #include using namespace std; int i,c,day,year,k,a[50]; void f1(int x) //大月 { for( i=0;i<50;i++) a[i]=33; for(i=k-1;i>=0;i--) a[i]='\000'; //1号前均为空格 for(i=k;i<31+k;i++)

ISD4004按自己所需地址录放音或者按顺序录放音(包含ISD4004资料——绝对好用)

#include #define unchar unsigned char #define uint unsigned int sbit SS =P1^0; //片选 sbit MOSI=P1^1; //数据输入 sbit MISO=P1^2; //数据输出 sbit SCLK=P1^3; //ISD4004时钟 sbit INT =P1^4; //中断 sbit LED =P0^1; //指示灯 sbit LED1=P0^0; //指示灯:亮是录音/不亮是放音 sbit PR =P1^7; //录音和放音选择开关 sbit STOP=P1^5; //复位 sbit AN =P1^6; //执行 unchar code voice[ ]={ 0x0000,0x000f,0x001e,0x002f,0x003c,0x004b,0x005a,0x0069, 0x0078,0x0087,0x0096,0x00a5,0x00b4, 0x00c3,0x00d2 }; //一共录音15段,1-10段内容为数字0—9,11-15段内容音为:拾、点、分、秒、现在北京时间 void delay(unsigned int time) //延迟n微秒 { while(time!=0) { time--; } } void delayms(unsigned int time) //延迟n毫秒 { TMOD=0x01; for(time;time>0;time--) { TH0=0xfc; TL0=0x18; TR0=1; while(TF0!=1) {;} TF0=0; TR0=0; }

微机原理程序 (2)

实验二:循环程序设计 2. DA TA SEGMENT x db -78,127,-128,-125,88 y db 32,-43,76,95,1 S db 5 dup(?) data ends Code segment Assume cs:code,ds:data Start:mov ax,data Mov ds,ax Mov cx,5 Mov bx,0 L1:mov al,x[bx] Add al,y[bx] Inc bx Loop L1 MOV AH,4CH INT 21H CODE ENDS END START 3. DA TA SEGMENT Y DB 68H,24H,90H,57H,13H HX DB 67H,34H,12H,90H,57H S DB 5 DUP(?) DA TA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA START:MOV AX,DATA MOV DS,AX MOV CX,5 MOV SI,OFFSET X MOV DI,OFFSET Y LP:MOV AL,[SI] MOV AH,[DI] ADC AL,AH DAA MOV S[SI],AL INC SI INC DI LOOP LP MOV AH,4CH INT 21H

CODE ENDS END START 4、 DA TA SEGMENT LIST DB 0,1,2,3,4,5,6,7,8,9 COUNT EQU $-LIST DA TA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA START:MOV AX,DATA MOV DS,AX MOV CX,COUNT-1 LOOP1:MOV DX,CX MOV BX,0 LOOP2:MOV AX,LIST[BX] CMP AX,LIST[BX+1] MOV LIST[BX],AX LOOP3:INC BX LOOP LOOP2 MOV CX,DX LOOP LOOP1 MOV AX,4CH INT 21H CODE ENDS END START 实验三:子程序调用程序设计 DA TA SEGMENT NUM DB 85,77,126,-1,-43,37,-128,11,-19,13 DA TA ENDS ADDITION SEGMENT NUM1 DB 10 DUP(?) ADDITION ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA,ES:ADDITION START:AX,DATA MOV DS,AX MOV AX,ADDITION MOV ES,AX CALL ORDER CALL COPY MOV AH,4CH INT 21H ORDER PROC MOV CX,9

单片机课程设计—万年历[1]

郑州轻工业学院 软件学院 单片机与接口技术课程设计总结报告 设计题目:电子万年历 学生姓名: 系别: 专业: 班级: 学号: 指导教师: 2011年12月16日

设计题目: 电子万年历 设计任务与要求: 1、显示年月日时分秒及星期信息 2、具有可调整日期和时间功能 3、增加闰年计算功能 方案比较: 方案一:系统分为主控制器模块、显示模块、按键开关模块,主控制模块采用 AT89C52单片机为控制中心,显示模块采用普通的共阴LED数码管,键输入采用中断实现 功能调整,计时使用AT89C52单片机自带的定时器功能,实现对时间、日期的操作,通 过按键盘开关实现对时间、日期的调整。 方案二:系统分为主控模块、时钟电路模块、按键扫描模块,LCD显示模块,电源 电路、复位电路、晶振电路等模块。主控模块采用AT89C52单片机,按键模块用四个按键,用于调整时间,显示模块采用LCD1602,时钟电路模块采用DS1302时钟芯片实现对 时间、日期的操作。 两个方案工作原理大致相同,只有显示模块和时钟电路不同。LED数码管价格适中,对于数字显示效果较好,而且使用单片机的端口也较少; LCD1602液晶显示屏,显示功 能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED数码管来说 要昂贵些,但是基于本设计显示的东西较多,若采用LED数码管的话,所需数码管较多,而且不利于控制,因此选择LCD1602作为显示模块。DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的 应用,实时时钟有秒、分、时、星期、日、月和年,月小于31天时可以自动调整,并具 有闰年补偿功能,而且在掉电时能够在外部纽扣电池的供电下继续工作。单片机有定时 器的功能,但时间误差较大,且需要编写时钟程序,因此采用DS1302作为时钟电路。 对比以上方案,结合设计技术指标与要求我们选择了方案二进行设计。

ISD4004系列芯片

ISD4004系列单片语音录放电路 一、 简述 ●单片8至16分钟语音录放 ●内置微控制器串行通信接口 ●3V 单电源工作 ●多段信息处理 ●工作电流25-30mA,维持电流1μA ●不耗电信息保存100年(典型值) ●高质量、自然的语音还原技术 ●10万次录音周期(典型值) ●自动静噪功能 ●片内免调整时钟,可选用外部时钟 PDIP/SOIC NC NC Vcca ANAIN+ ANAIN-NC AMCAP NC AUDOUT NC Vssa Vssa NC NC 28-PIN TSOP ISD4004系列工作电压3V,单片录放时间8至16分钟,音质好,适用于移动电话及其他便携式电子产品中。芯片采用CMOS 技术,内含振荡器、防混淆滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平闪烁存贮陈列。芯片设计是基于所有操作必须由微控制器控制,操作命令可通过串行通信接口(SPI 或Microwire)送入。芯片采用多电平直接模拟量存储技术, 每个采样值直接存贮在片内闪烁存贮器中,因此能够非常真实、自然地再现语音、音乐、音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和"金属声"。采样频率可为 4.0,5.3,6.4,8.0kHz,频率越低,录放时间越长,而音质则有所下降,片内信息存于闪烁存贮器中,可在断电情况下保存100年(典型值),反复录音10万次。 二、引脚描述 电源:(VCCA,VCCD) 为使噪声最小,芯片的模拟和数字电路使用不同的电源总线,并且分别引到外封装的不同管脚上,模拟和数字电源端最好分别走线,尽可能在靠近供电端处相连,而去耦电容应尽量靠近器件。 地线:(VSSA,VSSD) 芯片内部的模拟和数字电路也使用不同的地线。

微机原理程序

一,在数据段从TABLE开始定义10无符号的数据,每个数据为一个字节,计算这10个数的和,结果放到SUM字单元之中 DA TA SEGMENT TABLE DB 12H, 23H, 34H, 45H, 56H DB 67H, 78H, 89H, 9AH, 0FDH SUM DW DA TA ENDS STACK SEGMENT D8 5 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS: STACK START: MOV AX, DATA MOV DS, AX MOV ES, AX MOV AX,STACK MOV SS, AX LEA SI, TABLE MOV CX, 10 XOR AX, AX NEXT: ADD AL , 0 INC SI LOOP NEXT MOV SUM, AX MOV AH, 4CH INT 21H CODE ENDS ENDS START

二,在数据段自TABLE开始的连续10个单元中有放在0-9的平方值,查表求任意数X (0<=X<=9)的平方值,并将结果放到RESULT中 三,在数据段定义2个数据,每个数据占有若干字节,按照低地址存储低数据位的原则存储,这两个数据长度一样,计算这2个数据的和,并将结果放到RESULT中。 四、用8255PA作开关量输入口,PB作输出口。 CODE SEGMENT ASSUME CS:CODE ,DS:CODE ,ES:CODE ORG 32E0H PA EQU 0FFD8H PB EQU 0FFD9H PC EQU 0FFDAH PCTL EQU 0FFDBH HI:MOV DX,PCTL MOV AL,90H OUT DX,AL PI:MOV DX,PA IN AL,DX INC DX OUT DX,AL JMP PI CODE ENDS END HI

微机原理程序题

1. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中sign与sinteger 均为双字变量。 if ( sinteger = = 0) sign = = 0; else If ( siteger > 0) sign = 1; else sign = -1; mov eax,sinteger mov edx,sign cmp eax,0 jnz L1 mov ebx,0 L1:cmp ebx,0 jl L2 mov ebx,1 L2:mov ebx,-1 2. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中ch1与caps均为字节变量。 if (ch1> =’a’ && ch1< =’z’) caps= =0; if (ch1> =’A’ && ch1< =’Z’) caps= =1; mov ax,ch1 mov bx,caps cmp ax,a jb next cmp ax,z ja next mov bx,0 next:cmp ax,A jl done cmp ax,Z ja done done: 3. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中sum与i变量均为双字变量。 sum=0; for ( i=1;i< =100;i++) if ( i%2= =0) sum=sum+i; mov ecx,i mov ecx,1 .while(ecx<=100)

mov eax,ecx xor edx,edx mov ebx,2 div ebx cmp edx,0 jnz next add sum,ecx next:inc ecx .endw 1. 能被4整除但不能被100整除,或者年被400整除的年份是闰年。编程写一个完整的程序,求出2012年~2099年中的所有闰年年份,并把它们存放在数组Lyear中。 算法描述 ; esi=0;ecx=2012; ; while (ecx<2100) ; { if (year mod 4=0 and year mod 100 <>0) or (year mod 400=0) then ; {Lyear[esi]=ecx;esi++;} ; ecx++; ; } ; Lcounter=esi; include io32.inc .data Lyear dword 100 dup(?) Lcounter dword 0 .code mainproc xor esi,esi ;esi闰年个数计数器,兼做Lyear下标。 mov ecx,2012 ;ecx年份计数器。 .while (ecx<2100) mov eax,ecx xor edx,edx mov ebx,400 div ebx cmp edx,0 jz leap ;if year mod 400=0 then goto leap mov eax,ecx xor edx,edx mov ebx,4 div ebx cmp edx,0 jnz next ;if year mod 4<>0 then goto next mov eax,ecx xor edx,edx mov ebx,100 div ebx

万年历C语言课程设计(内附程序)

石家庄铁道大学课程设计 C语言课程设计 万年历 单位电气与电子工程学院(系) 班级 学号 学生姓名 指导教师 完成日期 2013 年7 月 8日

摘要 本课程设计报告介绍的是C语言实习中的万年历项目。该报告共分五章,第一章介绍选题意义,也就是我选择万年历作为课题项目的理由。第二章是系统的分析,包括系统概述,系统的构成,其中包括各个模块功能的分析介绍,该章节的最后介绍了各部分的功能,即组成程序的各个函数的功能介绍。第三章是系统的实现,即为各个功能的实现而服务的十个自定义函数的流程图,通过这十个流程图,您可以快速地明白程序功能的实现过程。第四章是总结,即本人在设计万年历程序过程中的心得,以及在整个程序设计过程中我的工作过程,也体现了我的设计思路。第五章是参考文献,在这里我主要查阅了《C程序设计(第三版)》中的C函数附表,另外有几处欠缺的知识,我借鉴了另一本书上的相关部分。第六章,也是最后一章,我把整个程序的源代码及其注释附上。由于本人水平所限,程序也不可能很完美,必定有一些漏洞和拖沓,还请谅解。好了,从这里开始,我将与你们分享我我在整个万年历程序设计中的所做所想。

目录 1.选题的意义 (4) 2.系统的分析 (5) 2.1系统概述 (5) 2.2系统的构成 (5) 2.3各模块的功能 (5) 2.4系统的运行环境 (5) 3.系统实现 (6) 4.总结 (11) 5.参考文献 (12) 6.附录(程序源代码) (13)

第一章 选题的意义 (1)通过万年历的设计,使我们掌握软件开发过程的问题分析、系统设计、程序编写、测试等基本方法和技能。 (2)通过万年历的设计,熟练掌握C语言中的分支、循环、数组、函数、文件操作等的综合运用。 (3)通过万年历的设计,可以培养独立思考、综合运用所学有关相应知识的能力,更好地巩固《C程序设计》课程中的所学内容。 (4)通过万年历的设计,可以强化自己的动手编程能力,更加深刻地感受C语言的优点。 (5)万年历与我们的生活联系密切,通过万年历的设计,我们可以感受知识与实践相结合的乐趣。

微机原理练习六--读程序并回答问题

微机原理练习六读程序并回答问题 1. 已知,(DS)=2000H,(BX)=100H,(SI)=0002H,从物理地址20100H单元开始,依次存放数据12H、34H、56H、78H; 而从物理地址21200H单元开始,依次存放数据2AH、4CH、8BH、98H。试说明下列各条指令单独执行后AX寄存器的内容。 ① MOV AX,3600H (AX)= ② MOV AX,[1200H] (AX)= ③ MOV AX,BX (AX)= ④ MOV AX,[BX] (AX)= 2. 以下语句汇编后,变量CON1、CON2、CON3和CON4的内容分别是多少? N1=10 N2=5 N3=3 CON1 DB NOT N1 CON2 DB (N1 AND N2 OR N3)GE 0FH CON3 DW (N2 AND N1 XOR N3)LE 0FH CON4 DB (N1 AND N3 OR N2)LT 0FH 3. 读下列程序,并在空白处填入合适指令,使该程序段能完成将100H个字节数据从2000H处搬到1000H处的操作。 MOV SI,2000H MOV CX,100H CLD 4 指出下面指令序列的执行结果。 MOV DX,2000H MOV BX,1000H XCHG BX,DX 则:BX= DX= 5 设初值AX=6264H,CX=0001H,在执行下列程序段后,AX=?CX=? AND AX,AX JZ DONE SHL CX,1 ROR AX,CL DONE:OR AX,1234H 则:AX= CX=

6有数据定义如下,与之等同功能的指令是什么? DAT DW 100 DUP(?) : MOV CX,LENGTH DAT ADD AX,TYPE DAT 7. 指出下面指令序列的执行结果。 MOV AX,1234H PUSH AX POP BX 则:BX= AX= 8. 对于给定的数据定义,变量R1和R2的值分别是多少? ①A1 DB 1,2,3,‘ABC’ A2 DB 0 R1 EQU A2-A1 则R1= ②K1 DW ? K2 DB 6 DUP(?) R2 EQU $-K1 则R2= 9. 选用最少的指令,实现下述要求的功能。 ①AH的高4位清0,其余位不变。 ②AL的高4位取反,其余位不变。 ③AL的高4位移到低4位,高4位清0。 ④AL的低4位移到高4位,低4位清0。 10. 下面一段程序完成对某一缓冲区置全“1”操作。设缓冲区长度为20个字节,缓冲区首址DI=0200H,并设(ES) =3000H,试填空。 CLD MOV AX,3000H MOV DI,0200H MOV AL,0FFH REP STOSB 11. 下列伪指令在存储区中分别为各变量分配多少字节? VR1 DW 10 VR2 DW 6DUP(?),66,88 VR3 DD 10DUP(?) VR4 DB ‘HOW ARE YOU’ 12. 写出下列程序段执行后的结果,并说出完成的是什么功能? MOV CL,4 MOV AL,87H MOV DL,AL AND AL,0FH OR AL,30H SHR DL,CL OR DL,30H 则(AL)= (DL)= 实现的功能为13. 分析程序段,并填入适当的内容。 MOV AL,0FH

电子万年历的设计与实现

毕业设计(论文)任务书 题目:电子万年历的设计与实现 任务与要求: 设计一以单片机为核心控制的万年历,具有多项显示和控制功能。要求:准确计 时,以数字形式显示当前年月日、星期、时间; 具有年月日、星期、时间的设置和调整功能;自行设计所需直流电源 时间: 2010年9 月 27 日至 2010 年 11 月 23 日共 8 周 所属系部:电子工程系

摘要 随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。 而电子万年历作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很常用的题目。因为它的有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。数字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用,壁挂式LED数码管显示的日历钟逐渐受到人们的欢迎。LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出多种功能。所以,电子万年历无论作为比赛题目还是练习题目都是很有价值。 关键词:单片机;万年历 1

目录 1 概述 (5) 1.1单片机原理及应用简介 (5) 1.2系统硬件设计 (6) 1.3结构原理与比较.............................. 错误!未定义书签。2系统总体方案及硬件设计......................... 错误!未定义书签。 2.1系统总体方案................................ 错误!未定义书签。 2.2硬件电路的总体框图设计 (12) 2.3硬件电路原理图设计 (12) 3软件设计 (13) 3.1主程序流程图 (13) 3.2显示模块流程图 (14) 4P ROTEUS软件仿真 (15) 4.1仿真过程 (15) 4.2仿真结果 (16) 5课程设计体会 (17) 参考文献 (18) 附录:源程序代码附 (18) 结束语 (25) 2

ISD4004应用电路及程序

ISD4004应用电路及程序 2011年08月05日 09:42 本站整理作者:秩名用户评论(1) 关键字:ISD4004(7) ISD4004应用电路图: ISD4004电压是3.3V,所以本把5V的电压串联了两个二极管,这样得到的电压会是3.6伏左右,已经符合ISD4004的供电电压,这个图已经是很简化的一个图了,录音输入只采用负端单端输入方式,本人已经试过可以用。 信号放大和功率放大电路: 运放采用典型的运放芯片NE5532,对ISD4004信号进行跟随和放大,为后级功放提供了保障。 ISD4004驱动程序如下: 个人亲自测试并应用过,此程序肯定可以用。但v4扦测未通过 #include #include #define uchar unsigned char #define uint unsigned int // ISD4004 Control bit #define SS_1 (PORTB |= BIT(0)) #define SS_0 (PORTB &= ~BIT(0)) #define SCLK_1 (PORTB |= BIT(1)) #define SCLK_0 (PORTB &= ~BIT(1)) #define MOSI_1 (PORTB |= BIT(2)) #define MOSI_0 (PORTB &= ~BIT(2)) #define MISO_1 (PORTB |= BIT(3)) #define MISO_0 (PORTB &= ~BIT(3)) uchar temp,flag; void delay_ms(uint i) { uint a,k; for(a=0;a void Send_Data(uint ISD4004Data) { uchar i; for(i=0;i> i; temp= temp & 0x01;

微机原理程序

;**********************; ;* 数/模转换实验1 *; ;* 产生锯齿波 *; ;**********************; io0832a equ 290h code segment assume cs:code start: mov cl,0 mov dx,io0832a lll: mov al,cl out dx,al add cl,10 push dx mov ah,06h ;判断是否有键按下 mov dl,0ffh int 21h pop dx jz lll ;若无则转LLL mov ah,4ch ;返回 int 21h code ends end start ;**********************; ;* 数/模转换实验2 *; ;* 产生正弦波 *; ;**********************; data segment io0832a equ 290h Sin db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96 h db 80h,66h,4eh,38h,25h,15h,09h,04h Db 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据 data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax ll: mov si,offset sin ; 置正弦波数据的偏移地址为SI mov bh,32 ;一组输出32个数据 lll: mov al,[si] ;将数据输出到D/A转换器 mov dx,io0832a out dx,al mov ah,06h mov dl,0ffh int 21h jne exit mov cx,1 delay: loop delay ;延时 inc si ;取下一个数据 dec bh jnz lll ;若未取完32个数据则转lll jmp ll exit: mov ah,4ch ;退出 int 21h code ends end start ;****************************; ;* AD转换器2--示波器 *; ;* 采集数据在屏幕是作图 *; ;****************************; io0809b equ 299h code segment assume cs:code start: mov ax,0012h ;设屏幕显示方式为VGA 640X480模示 int 10h start1: mov ax,0600h int 10h ;清屏 and cx,0 ;cx为横坐标draw: mov dx,io0809b ;启动A/D转换器通道1 out dx,al mov bx,200;500 ;延时delay: dec bx jnz delay

C语言程序设计 万年历程序

#include"stdio.h" int mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31}; int judge(int year,int month) { if(month==1||month==3||month==5||month==7||month==8||month==10||month ==12) return(1); else if(month==2) { if(year%4!=0||year%100==0&&year%400!=0) return(2); else return(3); } else return(4); } void show2() { int year,i,j,a,n,m,k; char ** p; char * week[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; char*month[]={"January","February","March","April","May","June","July","Augu st","September","October","November","December"}; printf("please inter the year:"); scanf("%d",&year); printf("\n"); printf("the calendar of the year%d.",year); printf("\n"); a=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7; for(i=0;i<12;i++) { n=judge(year,i+1); p=month+i; printf("%s\n",*p); printf("\n"); for(j=0;j<7;j++) {p=week+j; printf("%6s",*p);}

微机原理五类常用程序

五类常用程序:传输数据求最大最小值统计正负数排序加法程序 存储器清零或置FF 1.1将1000H-1063H中的各字节内容清0(或置FFH) 1.2传输数据块 将1000H-1063H中的字节内容传递到4000H-4063H 2.找最大值最小值 从2500H-2563H中存放着数据,把其中的最大值找出来, 地址存放在3000H中 3.统计负数正数 从2100H 开始存放100个无符号数,统计有多少个正数, 多少个负数。负数个数存入2200H 4.1求1AH+02H+31H+14H+2FH+06H=??? 数据1AH、0FH 、24H、4EH、18H、2DH 放在[3000H]- [3005H]处 4.2求十进制计算 25 74 89 67 + 49 78 64 95 数据25 74 89 67放在[2400]- [2403] 数据49 78 64 95放在[2500]- [2503] 4.3将BLOCK单元开始的10个单元数相加,结果存放入BLOCK单元。若相加过程中发生溢出,停止运算,并在DL中设置溢出标志FF. 5.冒泡排序方法 5.1字节型变量V AR1、V AR2和V AR3存放有3个无符号数,将其中的内容按从大到小重新排列。 解:经重新排列后,V AR1的值最大,V AR3的值最小。由于变量中存放的数据为无符号数,因此应该采用JA、JAE、JB、JBE等指令。 编程思路:通过在三个数中找出最大值,将它与V AR1单元进行交换;然后对剩余的两个数进行比较,将较大值存放在V AR2中。汇编语言程序如下: 5.2存放在2040H-2045H中的字节数据由大到小排列

基于ISD4004的语音录放系统

本科毕业设计 (2012届) 题目语音录放系统的设计 学院 专业 班级 学号 学生姓名 指导教师 完成日期2012年5月

摘要 本论文主要实现语音录放系统的设计。语音录放系统主要包括单片机控制模块、语音采集模块、语音处理模块、信号放大模块,其中单片机控制模块是整个系统设计的关键。在语音的录放过程中,单片机通过SPI通信方式与语音模块进行通讯,来实现语音的录音与播放。由于每段录音都对应着不同的地址,因此在播放录音时,需要发送需要播放的地址即可播放。 语音录放系统的信号处理过程主要包括语音的采集、信号的放大和语音的滤波。语音经过驻极体传感器,即麦克风,把声波信号转换成电信号。传感器采集的电信号进过放大电路,放大一定倍数,经滤波、耦合之后送至语音模块。语音模块对连续变化的语音信号进行采样,抽取其中的语音信号电平,直接存储在语音芯片ISD4004中,因此使得语音自然真实。当语音播放时,需要在语音芯片的输出段加一个带通滤波器,以滤除音频带宽以外的信号,从而减少杂音的干扰。STC89C52单片机的程序,使用keil编译程序进行设计和调试完成,其主要功能是控制语音模块,以及液晶显示模块。 关键词:微控制器;录音放音;ISD4004; ABSTRACT The main aim of this paper is to realize the function of voice recording and playback system. The key to the overall system design of the voice recording system which includes a single-chip control module, voice acquisition module, voice processing module, signal amplification module, is MCU control module. In the voice playback process, the microcontroller communicates through SPI communication voice module,

C语言程序的设计万年历

存档资料成绩: 华东交通大学理工学院 课程设计报告书 所属课程名称车 C语言程序设计课程设计 题目万年历查询 分院电信分院 专业班级 2013级电气工程及其自动化1班 学号 105 学生周利凯 指导教师肖盛文 2014年 6月 15日 摘要

通过C语言编程实现了一个万年历,能实现基本的万年历功能。通过本章的讲解,使读者能够明白万年历的实现原理和方法。万年历的实现核心是要判断闰年和根据给定的日期计算其对应的星期,并按照合适的方式输出日历.这都是本章向读者讲述的重点。 另外,在当今社会万年历在生活起着越来越重要的角色,它悄无声息的走进我们的生活,还向读者讲述了怎样突出显示某个日期的方法,这会在实际应用中经常遇到。除了讲述万年历的实现方法外,本章还回顾了前面章节的知识,如光标定位﹑设置寄存器﹑产生中断﹑输出一个字符等,以及讲述系统日期﹑屏幕输出的方法等。 关键字: C语言,函数,历法计算,万年历,中断。 目录

1.设计万年历目的--------------------------- P4 2.万年历程序设计思路图解及其讲解-----------P5 3.万年历程序清单与编码----------------------P7 4.万年历的调试与分析------------------------P12 5.万年历的使用环境与说明--------------------P14 6. 设计心得-----------------------------------P15 7.万年历参考文献------------------------------P16 8.致-----------------------------------------P17

ISD4004系列语音芯片中文资料教学内容

I S D4004系列语音芯 片中文资料

ISD4004系列单片语音录放电路 一、简述 ●单片8至16分钟语音录放 ●内置微控制器串行通信接口 ●3V 单电源工作 ●多段信息处理 ●工作电流25-30mA,维持电流1μA ●不耗电信息保存100年(典型值) ●高质量、自然的语音还原技术 ●10万次录音周期(典型值) ●自动静噪功能 ●片内免调整时钟,可选用外部时钟 S S 1 M O S I 2 M I S O 3 V s s d 4 N C 5 N C 6 N C 7 8 N C N C 9 N C 10 V s s a 11 V s s a 12 A N D O U T 13 A M C A P 14 P D I P /S O I C I N T 28-P I N T S O P ISD4004系列工作电压3V,单片录放时间8至16分钟,音质好,适用于移动电话及其他 便携式电子产品中。芯片采用CMOS 技术,内含振荡器、防混淆滤波器、平滑滤波器、音 频放大器、自动静噪及高密度多电平闪烁存贮陈列。芯片设计是基于所有操作必须由微控制器控制,操作命令可通过串行通信接口(SPI 或Microwire)送入。芯片采用多电平直接模拟量存储技术, 每个采样值直接存贮在片内闪烁存贮器中,因此能够非常真实、自然地再现语音、音乐、音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和"金属声"。采样频率可为 4.0,5.3,6.4,8.0kHz,频率越低,录放时间越长,而音质则有所下降,片内信息存于闪烁存贮器中,可在断电情况下保存100年(典型值),反复录音10万次。 二、引脚描述

微机原理程序

实验二:循环程序设计 2. DA TA SEGMENT x db -78,127,-128,-125,88 y db 32,-43,76,95,1 S db 5 dup(?) data ends Code segment Assume cs:code,ds:data Start:mov ax,data Mov ds,ax Mov cx,5 Mov bx,0 L1:mov al,x[bx] Add al,y[bx] Inc bx Loop L1 MOV AH,4CH INT 21H CODE ENDS END START 3. DA TA SEGMENT Y DB 68H,24H,90H,57H,13H HX DB 67H,34H,12H,90H,57H S DB 5 DUP(?) DA TA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA START:MOV AX,DATA MOV DS,AX MOV CX,5 MOV SI,OFFSET X MOV DI,OFFSET Y LP:MOV AL,[SI] MOV AH,[DI] ADC AL,AH DAA MOV S[SI],AL INC SI INC DI LOOP LP MOV AH,4CH INT 21H

END START 4. DA TA SEGMENT LIST DB 0,1,2,3,4,5,6,7,8,9 COUNT EQU $-LIST DA TA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA START:MOV AX,DATA MOV DS,AX MOV CX,COUNT-1 LOOP1:MOV DX,CX MOV BX,0 LOOP2:MOV AX,LIST[BX] CMP AX,LIST[BX+1] MOV LIST[BX],AX LOOP3:INC BX LOOP LOOP2 MOV CX,DX LOOP LOOP1 MOV AX,4CH INT 21H CODE ENDS END START 实验三:子程序调用程序设计 DA TA SEGMENT NUM DB 85,77,126,-1,-43,37,-128,11,-19,13 DA TA ENDS ADDITION SEGMENT NUM1 DB 10 DUP(?) ADDITION ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA,ES:ADDITION START:AX,DATA MOV DS,AX MOV AX,ADDITION MOV ES,AX CALL ORDER CALL COPY MOV AH,4CH INT 21H ORDER PROC MOV CX,9

万年历系统设计方案

电子万年历系统设计 The design of Electronic calendar system 专业:电子信息科学与技术 学号: 姓名:

电子万年历系统设计 摘要:近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,并且给人类生活带来了根本性的改变。尤其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便。虽然在日常生活中,各种信息处理终端如电脑、手机等给我们提供了准确的时间信息。但是在大多数场合却仅仅局限于个人的适用围之。在家居生活中,一款悬挂余居室墙壁上大方得体的电子钟不仅能为我们提供准确的时间显示,而且魅惑了环境,给单调的居室带来了现代化的气息,因而成为许多家庭的必备之选。 本文设计了一种基于八位串行输入-并行输出移位寄存器74HC164芯片,以STC89C52单片机为核心、数码显示的电子万年历,主要介绍了时钟芯片、温度传感器、仿真模块,以及万年历硬件和软件的设计,实现了准确显示,公历年、月、日、农历月、日、时、分、秒功能。 关键字:单片机;时钟芯片;温度传感器;仿真

The Design of Electronic Calendar System Abtract:In recent years, with computer penetration in the social sphere and the development of large-scale integrated circuits, MCU applications are constantly deepening, as it has a function of strong, small size, low power consumption, cheap, reliable, easy to use , And other characteristics, and therefore particularly suited to control the system and to human life brought about fundamental changes. SCM is by the application of technology products have entered the tens of thousands of households. The emergence of electronic calendar to the lives of people of many convenience. While in everyday life, dealing with all kinds of information terminals such as computers, mobile phones has provided us with accurate time information. However, in most occasions is limited to individuals within the scope of the application. In home life, hoisted more than a generous living room walls of the appropriate electronic bell can not only provide us with accurate time, and tantalized by the environment, bring to the monotonous room a modern flavor, so many families must Of the election. In this paper, a design based on eight serial input - output parallel shift register 74 HC164 chip to STC89C52 microcontroller as the core, digital display electronic calendar, mainly on the clock chip temperature sensor, simulation modules, hardware and calendar And software design, to achieve an accurate, the calendar year, month, day and the Lunar month, day, hours, minutes and seconds functions. Key words:MCU;Clock chip;Temperature sensor;Simulation

相关主题
文本预览
相关文档 最新文档