基于51的CC1101发送程序

合集下载

基于CC1101的无线通信实习报告

基于CC1101的无线通信实习报告

北京化工大学生产实习报告——基于CC1101的串口通信及无线通信院系:专业:班级:姓名:学号:组员:学号:指导教师:助教:完成日期:一、实验名称:基于CC1101的串口通信及无线通信。

二、实习简介:实习的目的是培养学生的实际动手能力,只有让学生真正完成一个产品的生产过程才更具现实意义。

本生产实习的内容注重培养学生硬件和软件的动手能力,为学生毕业后在电子信息、通信等领域,从事软件与硬件的开发和生产工作的培养的基本技能,提升学生的就业竞争力。

三、实习目的1、了解电路板的制造工艺和过程;2、学习电路板焊接前的检查方法;3、认识常用的电子元器件;4、学习电路板焊接的基础知识;5、学习电路板中元件的焊接方法,电源连接器和插排连接器的焊接方法;6、学习C语言单片机的软件编程技术;7、编写串口通信/无线通信/按键程序/液晶显示的驱动程序。

四、实习内容本次生产实习的电路分为两个部分:硬件电路板和软件编程。

硬件电路板主要是将各个器件完好地焊接到电路板上。

软件编程有:串口通信/无线通信/按键程序/液晶显示驱动程序。

五、实习步骤1.原理图和PCB图的绘制:学习发光LED、独立按键、液晶显示器、无线模块的工作原理,以及用AltiumDesigner软件画原理图,PCB图的基本使用方法。

再用AltiumDesigner软件时要根据所用原器件的说明书合理的画封装,选择合适的封装形式。

学习各个模块的功能、特点、实现原理。

根据所提供的设计好的实验模块,分组(3人)进行电路设计、绘制原理图和PCB图,学习掌握RS232通信接口的基本设计方法,设计通信接口的基本电路。

2.电路板的焊接组装与调试:(1)基本技能的训练包括:常用元件的特性,焊接技巧与注意事项,硬件故障的检测方法及模块功能和性能的测试方法。

(2)元件测试、焊接:在检测电子器件和分组的基础上,在贴片联系区进行贴片电阻的焊接训练,最终在线路板上完成元件的焊接与组装。

3.单片机的软件设计:(1)软件使用方法:学习C语言编译环境的功能及实现方法(主要是Keil编译器)。

基于51单片机发送动态密码程序

基于51单片机发送动态密码程序
time_pwd[5] = password/100%10;
}
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
SCON = 0x50; // 设置串行口方式1
TH1 = 0xFd; // 11.0592M晶振 波特率9600
TL1 = 0xFd;
TH0 = (65536 - 45872) / 256; // 对TH0 TL0赋值
TL0 = (65536 - 45872) % 256; // 重装计数初值
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x21; // 设置定时器1、定时器0为工作方式2
PCON = 0x00;
{
if (j==0) // 七位数 取前六位
{
time_pwd[0] = password/1000000;
time_pwd[1] = password/100000%10;
time_pwd[2] = password/10000%10;
password =password*password*password;
j = password/10000000; // 取password第八位的值
k = password/1000000%10; // 取password第七位的值

基于CC1101的无线收发系统设计

基于CC1101的无线收发系统设计

基于CC1101的无线收发系统设计刘雪亭【摘要】无线射频收发系统是近年来通信领域中发展最快、应用最广的模块电路。

该系统由发射模块和接收模块组成,以单片机C8051F310作为控制核心部件,基于无线收发芯片CC1101构成的通信传输模块系统,实现信息的无线收发。

本文对其工作原理和工作方式进行了分析,给出了其软硬件设计过程。

%Wireless RF transceiver system is the fastest and most widely used in the communication field in recent years. The system is composed of a transmitting module and a receiving module. The system is composed of a single chip microcomputer C8051F310 as the core component, and a communication transmission module system based on the wireless transceiver CC1101 is realized. In this paper, the working principle and working mode are analyzed, and the software and hardware design process is given.【期刊名称】《电子设计工程》【年(卷),期】2016(024)018【总页数】4页(P123-125,128)【关键词】CC1101;C8051F310;发射模块;接收模块【作者】刘雪亭【作者单位】四川信息职业技术学院四川广元 628040【正文语种】中文【中图分类】TN929-5无线射频收发系统是近年来通信领域中发展最快、应用最广的技术。

51串口 发送字符串 源程序

51串口  发送字符串  源程序
unsigned char checksum,count3;
bit read_flag=0;
void init_serialcomm(void)
{
SCON = 0x50; //SCON: 方式1, 8-bit UART
TMOD |= 0x20; //TMOD: timer 1,方式2, 8-bit 自动重装
PCON |= 0x80; //SMOD=1;
TH1 = 0xF4; //波特率:4800 11.0592MHz
IE |= 0x90; //开中断
TR1 = 1; //开定时器1
// TI=1;
{
unsigned int k=0;
do
{
send_char_com(*(str + k));
k++;
} while(k < strlen);
}
//串口接收中断函数
void serial () interrupt 4 using 3
send_string_com(inbuf1,INBUF_LEN);
}
}
}
/*通信协议:第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。
测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。
}
main()
{
init_serialcomm(); //初始化串口
while(1)
{

《单片机应用设计-基于单片机的433M无线通信系统》廖永斌

《单片机应用设计-基于单片机的433M无线通信系统》廖永斌

学号:课程设计题目基于单片机的433M无线通信系统学院专业班级姓名指导教师2018年 1月 13日《单片机应用设计》任务书学生姓名:专业班级:指导教师:工作单位:题目: 基于单片机的433M无线通信系统课程设计目的:1、熟悉单片机应用系统的硬件设计及软件设计的基本方法;2、将《单片机原理与应用》理论课的理论知识应用于实际的应用系统中;3、训练单片机应用技术,锻炼实际动手能力4、提高正确地撰写论文的基本能力。

课程设计内容和要求1、完成硬件电路的设计,其中包括单片机和CC1101模块的设计;2、完成无线通信模块的程序设计与实现,上机运行调试程序,记录实验结果(如图表等),并对实验结果进行分析和总结;3、课程设计报告书按学校统一规范来撰写,报告主要包括以下内容:目录、摘要、关键词、基本原理、方案论证、硬件设计、软件设计(带流程图、程序清单)、仿真结果、实物运行结果照片、结论献等;4、查阅不少于6篇参考文献。

初始条件:1、STC89C52和CC1100H模块;2、先修课程:单片机原理与应用。

时间安排:第19周,安排设计任务,完成硬件设计;第20周,完成软件设计、撰写报告,答辩。

指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (Ⅰ)Abstract (Ⅱ)1基本原理 (1)1.1无线通信系统 (1)1.2芯片简介 (1)1.2.1单片机STC89C52 (1)1.2.2 无线通信CC1101芯片 (3)2方案论证与设计 (5)2.1无线通信模块选择 (5)2.2 单片机最小系统选择 (5)2.3整体方案设计 (6)3 硬件电路设计 (6)4软件程序设计 (8)4.1发送端编程 (8)4.2接收端编程 (9)4.3程序调试与下载 (10)5硬件仿真 (12)6实物制作与调试 (12)6.1 STC89C52单片机最小系统 (12)6.2无线通信模块CC1101 (13)6.3稳压电路模块 (13)7心得体会 (15)8参考文献 (16)附录 (17)摘要随着通信系统信息容量的不断提高,射频技术在无线通信中占据着举足轻重的位置。

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 datadelay(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 bytesResultToDisplay(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晶振约为1sTL0 = (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<intrins.h>#include<string.h>#include<reg51.h>//宏定义#define UCHAR unsigned char#define UINT unsigned int#define ULONG unsigned longsbit led=P2^2; //LED指示灯,每接收到字节闪烁一次psbit bulb = P2^0;int SetTime = 0; //定时时间,单位:sint 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工作方式1TH0 = (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 registerstypedef 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 FSCAL3; // Frequency synthesizer calibration.UCHAR FSCAL2; // Frequency synthesizer calibration.UCHAR FSCAL1; // Frequency synthesizer calibration.UCHAR FSCAL0; // Frequency synthesizer calibration.UCHAR FSTEST; // Frequency synthesizer calibration controlUCHAR TEST2; // Various test settings.UCHAR TEST1; // Various test settings.UCHAR TEST0; // Various test settings.UCHAR IOCFG2; // GDO2 output pin configurationUCHAR IOCFG0; // GDO0 output pin configurationUCHAR 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.0x00, // FSCAL1 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<s; i++);for(i=0; i<s; 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;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);value = SpiTxRxByte(0);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);value = SpiTxRxByte(0);CSN = 1;return value;}//***************************************************************************** ************//函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)//输入:无//输出:无//功能描述:配置CC1100的寄存器//***************************************************************************** ************void halRfWriteRfSettings(void){halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL2);//自已加的// Write register settingshalSpiWriteReg(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 transmittedwhile (!GDO0);// Wait for GDO0 to be cleared -> end of packetwhile (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 0x00static 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;}}elsereturn 0;}#endif#ifndef _LCD1602_H_#define _LCD1602_H_#include"main.h"sbit lcd1602RSPort=P2^4; //寄存器选择位sbit lcd1602RWPort=P2^5; //读写选择位sbit lcd1602EPort=P2^6; //使能信号位#define LCD1602DA TAPORT P0 //数据端口/**************************************************函数功能:将模式设置指令或显示地址或数据写入液晶模块入口参数:DatState=0,写地址State=1,写数据***************************************************/void WriteLcd1602(UCHAR State,UCHAR Dat){lcd1602RSPort=State; //根据规定,RS和R/W同时为低电平时,可以写入指令lcd1602RWPort=0; //根据规定,RS为高电平且R/W为低电平时,可以写入数据lcd1602EPort=0; //E置低电平(写指令时,就是让E从0到1发生正跳变,所以应先置"0"_nop_();_nop_(); //空操作两个机器周期,给硬件反应时间LCD1602DATAPORT=Dat; //将数据送入数据端口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间lcd1602EPort=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间lcd1602EPort=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/**************************************************函数功能:指定字符显示的实际地址入口参数:AddrRow=1,写入第一行,Row=2,写入第二行***************************************************/void WriteAddressLcd1602(UCHAR Row,UCHAR Addr){if(Row==1)WriteLcd1602(0,0x80+Addr); //第一行位置的确定方法规定为"80H+地址码Addr"if(Row==2)WriteLcd1602(0,0x80+0x40+Addr); //第二行位置的确定方法规定为"80H+40H地址码Addr"}/**************************************************函数功能:LCD写入字符串***************************************************/void WriteCharForLCD1602(UCHAR *ch){while(*ch!=0&&ch>0x20)WriteLcd1602(1,*ch++);}/**************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/void InitLcd1602(){Delaynms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间WriteLcd1602(0,0x38); //3次写设置模式Delaynms(5);WriteLcd1602(0,0x38);Delaynms(5);WriteLcd1602(0,0x38);Delaynms(5);WriteLcd1602(0,0x0c);Delaynms(5);WriteLcd1602(0,0x06);Delaynms(5);WriteLcd1602(0,0x01);Delaynms(5);}/**************************************************函数功能:清零LCD1602***************************************************/void ClearLcd1602(){WriteLcd1602(0,0x01);Delaynms(5);}#endif。

CC1101工作流程

我现在做cc1101,笔记2009-01-09 15:59CC1101工作流程:1.初始化SPI,MCU各引脚。

当有数据接收或发送状态声明时,有中断和查询两种方式。

GDO0与GDO2引脚输出至MCU引脚,若要用中断则要接至MCU外部中断引脚,查询时则可用GPIO。

2.复位CC1101。

3.初始化CC1101。

(写操作时可从SO中读出CC1101状态)初始化后CC1100为IDLE状态.4.状态机转换,写/读FIFO数据。

每次写操作时SO返回的值为写操作前的CC1100状态值,具体值见Table20;读状态命令为当前CC1100状态值,具体值见寄存器0X35说明;注意两者区别。

快速认识Cc1100Cc1100可以工作在同步模式下,代价是:MCU自己控制前导码。

本系统中,Cc1100将工作在异步模式下。

知识点Head Byte:在引脚 Cc1100.Csn 有效后,通过SPI 总线写入 Cc1100的第一个字节。

Status Byte:在写入 HeadByte 的同时,MCU 得到 Status Byte。

Burst Bit:在 Head Byte 中的一个 Bit, 有效值=="1",无效值=="0"GDO0:GDO0可用作FIFO状态输出,载波感应(CS),时钟输出,GDO0 脚也能用作集成于芯片的模拟温度传感器(未用).配置寄存器为IOCFG0(0X02),现在配置为RX模式下数据状态反应输出.GDO1:GDO1与SPI的SO共用引脚,默认状态下为3态,当CSn为低电平时,此引脚SPI的SO功能生效。

配置寄存器为IOCFG0(0X01),现在配置为空闲状态下3态,SPI模式下SO.GDO2:GDO2可用作FIFO状态输出,载波感应(CS),时钟输出,配置寄存器为IOCFG0(0X00),现在配置为载波感应(CS)输出.TXOFF_MODE/RXOFF_MODE:注意,此配置为在数据包被发送/接收后状态机状态决定位,仅是在发生发送或者接收后动作;当为IDLE时发SRX/STX后状态机不按此配置运行。

基于51单片机和CC1101的无线温度监控系统设计

基于51单片机和CC1101无线温度监控系统设计前言目前,科学技术的发展日新月异,单片机等大规模集成电路的进步与发展,温度监控技术的应用越来越广泛。

在传统微机化的温度监控系统中,均是以有线方式来实现温度监控。

传统的温度监控系统,其突出的问题是由于有线通信,线缆传输连线麻烦,需要特制接口,颇为不便,且实用性不强,成本高,造成系统的普及性降低,同时也带来了制作繁琐,外围电路复杂的缺点。

近年来,随着各种单片机及无线收发芯片的出现与推广,使得基于CC1101的无线温度监控系统的实现成为可能。

温度是工业、农业生产中常见的和最基本的参数之一,在生产过程中常需对温度进行检测和监控,采用微型机进行温度检测、数字显示、信息存储及实时控制,对于提高生产效率和产品质量、节约能源等都有重要的作用。

伴随工业科技、农业科技的发展,温度测量需求越来越多,也越来越重要。

但是在一些特定环境温度监测环境范围大,测点距离远,布线很不方便。

这时就要采用无线方式对温度数据进行采集。

利用无线技术实现数据传输比使用传统的有线电缆有不可比拟的优点,如可移动性、方便灵活性等多方面都更能满足人们的实际需要。

实现无线数据传输的方法多种多样,使用高频无线电技术、激光技术、红外技术等等均能满足无线传输要求。

本设计是以宏晶科技推出的STC89C52RC单片机作为控制核心,提出以DS18B20的单线分布式温度采集与控制系统,通过CC1101无线收发模块收发信息。

监控点将接收到主控点的信息后,经过一些处理,然后相应的监控点将采集并发送数据给主控点。

主控点通过串口将收到的温度信息回馈到上位机(PC机),从而远程实现对整个系统的检测与控制。

一.总体方案设计温度监控系统有着共同的特点:测量点多、环境复杂、布线分散、现场离监控室远等。

若采用一般温度传感器采集温度信号,则需要设计信号调理电路、A/D 转换及相应的接口电路,才能把传感器输出的模拟信号转换成数字信号送到计算机去处理。

原创:51单片机串口通信(字符串接收和发送)

原创:51单⽚机串⼝通信(字符串接收和发送)下⾯的⽰例代码基于51单⽚机,⽤于快速⼆次开发实现基于串⼝字符串通信控制程序(⽐如要实现电脑控制单⽚机的开灯和关灯),⽰例很⾔简意赅,并附上了详尽的注释,本⽰例代码经过了更新,新版本代码更加友好了,1 #include<reg52.h>23//------------------串⼝通信的数据包协议-----------------//4/*5此程序的串⼝字符串通信使⽤到下⾯的⼀个⾃定义协议,每次通信都是发送或接收⼀个数据包,数据包格式解释如下(长度恒为15):6例如:A01_fmq_01Off___#7 A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种)8 01-----设备代号9 fmq_01Off___--------指令(长度恒为10),指令的前4个⼈字符是指令头部,指令的后6个字符是指令尾部10 #---------数据包的结束标记1112例如:A02_SenT010250#13 A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种)14 02-----设备代号15 SenT010250--------指令(长度恒为10),指令的前4个⼈字符是指令头部,指令的后6个字符是指令尾部16 #---------数据包的结束标记17*/18char RecvString_buf[16]; //定义数据包长度为15个字符19#define deviceID_1Bit '0' //⽤于串⼝通信时,定义本地设备ID的第1位20#define deviceID_2Bit '2' //⽤于串⼝通信时,定义本地设备ID的第2位21#define datapackage_headflag 'A' //⽤于串⼝通信时,定义数据包头部的验证标记2223char DataPackage_DS18B20[16]={datapackage_headflag,deviceID_1Bit,deviceID_2Bit,'_','S','e','n','T','X','X','X','X','X','X','#'}; //这个是曾经⽤来控制温度传感模块(DS18B20)的数据包24char HeartBeat[16]={datapackage_headflag,deviceID_1Bit,deviceID_2Bit,'_','B','e','a','t','X','X','X','X','X','X','#'}; //我随便定义了⼀个数据包⽤来做"⼼跳包",⽐如单⽚机系统向电脑每2秒发送⼀次该数据包,如果电脑没有按时接收到,就认为 25//----------------------------------------------//26/*******************************27串⼝通信28 MCU:89C52RC 11.0592MHz2930//11.0592MHz 0xd0 1200bps31//12MHz 0xcc 1200bps32//11.0592MHz 0xfa 9600bps33//0xf4 11.0592MHz 0xf3 12MHz 4800bps34//均在SMOD=1的情况下(波特率倍增模式)35*******************************/36//串⼝发送函数37void PutString(unsigned char *TXStr)38 {39 ES=0;40while(*TXStr!=0)41 {42 SBUF=*TXStr;43while(TI==0);44 TI=0;45 TXStr++;46 }47 ES=1;48 }49//串⼝接收函数50 bit ReceiveString()51 {52char * RecStr=RecvString_buf;53char num=0;54 unsigned char count=0;55 loop:56 *RecStr=SBUF;57 count=0;58 RI=0;59if(num<14) //数据包长度为15个字符,尝试连续接收15个字符60 {61 num++;62 RecStr++;63while(!RI)64 {65 count++;66if(count>130)return0; //接收数据等待延迟,等待时间太久会导致CPU运算闲置,太短会出现"数据包被分割",默认count=13067 }68goto loop;69 }70return1;71 }72//定时器1⽤作波特率发⽣器73void Init_USART()74 {75 SCON=0x50; //串⼝⽅式1,使能接收76 TMOD|=0x20; //定时器1⼯作⽅式2(8位⾃动重装初值)77 TMOD&=~0x10;78 TH1=0xfa; //9600bps79 TL1=0xfa;80 PCON|=0x80; //SMOD=181 TR1=1;82 TI=0;83 RI=0;84//PS=1; //提⾼串⼝中断优先级85 ES=1; //开启串⼝中断使能86 }87//⽐较指令头部88 bit CompareCMD_head(char CMD_head[])89 {90 unsigned char CharNum;91for(CharNum=0;CharNum<4;CharNum++) //指令长度为10个字符92 {93if(!(RecvString_buf[CharNum+4]==CMD_head[CharNum]))94 {95return0; //指令头部匹配失败96 }97 }98return1; //指令头部匹配成功99 }100//⽐较指令尾部(start:从哪⾥开始⽐较,quality:⽐较多少个字符,CMD_tail[]:要⽐较的字符串)101 bit CompareCMD_tail(unsigned char start,unsigned char quality,char CMD_tail[])102 {103 unsigned char CharNum;104for(CharNum=0;CharNum<quality;CharNum++)105 {106if(!(RecvString_buf[start+CharNum]==CMD_tail[CharNum]))107 {108return0;109 }110 }111return1;112 }113 bit Deal_UART_RecData() //处理串⼝接收数据包函数(成功处理数据包则返回1,否则返回0)114 {115//PutString(RecvString_buf);116if(RecvString_buf[0]==datapackage_headflag&&buf_string[14]=='#') //进⾏数据包头尾标记验证117 {118switch(RecvString_buf[1]) //识别发送者设备ID的第1位数字119 {120case'0':121switch(RecvString_buf[2]) //识别发送者设备ID的第2位数字122 {123case'3':124if(CompareCMD_head("Ligt")) //判断指令头部是否为"Ligt"125 {126//下⾯是指令尾部分析127switch(RecvString_buf[8])128 {129case'0':130switch(RecvString_buf[9])131 {132case'0':133134return0;135case'1':136if(CompareCMD_tail(10,3,"Off")) //判断整个数据包是否为:A03_Ligt01Off_#137 {138//如果是则执⾏以下代码139return1;140 }141if(CompareCMD_tail(10,3,"On_")) //判断整个数据包是否为:A03_Ligt01On__#142 {143//如果是则执⾏以下代码144return1;145 }146return0;147default:148return0;149 }150default:151return0;152 }153 }154return0;155156default:157return0;158 }159default:160return0;161 }162 }163return0;164 }165/************************166中断函数167************************/168//串⼝中断服务函数-----------169void USART() interrupt 4//标志位TI和RI需要⼿动复位,TI和RI置位共⽤⼀个中断⼊⼝170 {171if(ReceiveString())172 {173//数据包长度正确则执⾏以下代码174 Deal_UART_RecData();175 }176else177 {178//数据包长度错误则执⾏以下代码179//LED1=~LED1;180 }181 RI=0; //接收并处理⼀次数据后把接收中断标志清除⼀下,拒绝响应在中断接收忙的时候发来的请求182 }183/***************************184主函数185***************************/186void main()187 {188 EA=1; 189 Init_USART(); //初始化串⼝中断通信,当串⼝接受完数据包后,如果检测到数据包包含有效指令,则⾃动执⾏对应的代码,执⾏完⾃动返回到主函数,为了尽可能不影响主函数的时序,串⼝中断函数的执⾏代码不要过复杂190while(1)191 {192//下⾯可以放要经常运⾏的⽤户代码,使⽤PutString()函数来发送数据包,如PutString(HeartBeat); 注:空格的ASCLL码是:0x20,回车是:0x0D193194195 }196 }。

单片机双机通信(C51程序)

单片机双机通信(C51程序)/*发送程序连线:两个单片机用3 根线连起来,要共地,rxd,txd 要交叉连接程序效果:通过主机发送,从机接收在主机中通过记下按键按下的次数,主机中显示最后按下的六个数值,并发送给从机,从机也显示这六个数值*/#includereg52.h //头文件#includeintrins.h //循环移位文件#define uchar unsigned char//宏定义#define uint unsigned intsbit key1=P3 ; //位声明uchar code table[] ={0X00,0x3f,0x06,0x5b,//数码管显示的数值0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar table_tr[6];//暂存最后按下的六个数值uchar count,cnt;//延时子函数,用于数码管显示void delay(uchar i){ uchar x,y; for(x=i;x0;x--) for(y=110;y0;y--);}//初始化子函数void init(){ TMOD=0x20;//T1 工作在方式2 TH1=0XF4;//波特率为4.8kbit/s TL1=0XF4; TR1=1;//启动定时器1 SCON=0X50;//串口工作在方式1,允许接收}//显示子函数void display(){ uchar i,j;//定义局部变量j=0x7f; //赋初值for(i=0;i6;i++) { P2=j; //点亮最右边的数码管P0=table[table_tr[i]]; //显示该数值delay(10); //延时,便于眼睛看清j=_cror_(j,1);//循环右移一位}}//按键扫描子函数void key_scan(){ if(key1==0) //判断是否有按键按下{ while(!key1) //等待按键松手{ display();//防止掉显} cnt++; //加1,用于显示SBUF=cnt;//送给缓冲区,发送while(!TI); //等待发送完TI=0; //发送完了,标志位清零for(count=0;count5;count++) //用于保存最后按下的六个按键数值{ table_tr[count] =table_tr[count+1]; } table_tr[5]=cnt; //把最后按下的按键数值赋给table_tr【5】if(cnt==10) //按键按下的次数有没有等于10 cnt=0;//等于,则清零}}void main() { init(); //调用初始化子函数P0=0x00; while(1) { key_scan(); //调用键盘扫描子函数display();//调用显示子函数} }tips:感谢大家的阅读,本文由我司收集整编。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我今天才发现以前传的那个接收程序,主函数后面少了一段函数,不晓得为什么掉了一段函数,跟大家说声抱歉我把接收的函数的主函数,附在这个文档末尾。

这个文档的发送程序跟前面的接收程序是对应的,根据程序说明连接好电路测试可以通过的。

这个函数的功能是按KEY1键接收端灯亮,按KEY2键接收端灯灭。

(51单片机端口默认高电平,接灯的时候注意下)CC1101/CC1100基于AT51/52单片机的按键发送程序#include <reg52.h>#include <intrins.h>#define INT8U unsigned char#define INT16U unsigned int#define WRITE_BURST 0x40 //连续写入#define READ_SINGLE 0x80 //读#define READ_BURST 0xC0 //连续读#define BYTES_IN_RXFIFO 0x7F //接收缓冲区的有效字节数#define CRC_OK 0x80 //CRC校验通过位标志//*****************************************************************************************sbit G DO0 =P2^1;sbit G DO2 =P2^2;sbit MISO =P2^3;sbit MOSI =P2^5;sbit SCK =P2^4;sbit CSN =P2^0;//*****************************************************************************************sbit LED =P0^0;sbit KEY1 =P0^2;sbit KEY2 =P0^3;sbit KEY3 =P0^1;//sbit KEY1 =P0^1;//sbit KEY2 =P0^2;//sbit KEY3 =P0^3;//*****************************************************************************************sbit led3=P0^4;sbit led2=P0^5;sbit led1=P0^6;sbit led0=P0^7;//*****************************************************************************************//INT8U PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};//***************************************************************************** ************void SpiInit(void);void CpuInit(void);void RESET_CC1100(void);void POWER_UP_RESET_CC1100(void);void halSpiWriteReg(INT8U addr, INT8U value);void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count);void halSpiStrobe(INT8U strobe);INT8U halSpiReadReg(INT8U addr);void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count);INT8U halSpiReadStatus(INT8U addr);void halRfWriteRfSettings(void);void halRfSendPacket(INT8U *txBuffer, INT8U size);//***************************************************************************** ************// 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 INT8U#define CCxxx0_SYNC0 0x05 // Sync word, low INT8U#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 INT8U#define CCxxx0_FREQ1 0x0E // Frequency control word, middle INT8U#define CCxxx0_FREQ0 0x0F // Frequency control word, low INT8U#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 Machineconfiguration#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 INT8U Event 0 timeout#define CCxxx0_WOREVT0 0x1F // Low INT8U 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// INT8Us 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_PKTSTATUS 0x38#define CCxxx0_VCO_VC_DAC 0x39#define CCxxx0_TXBYTES 0x3A#define CCxxx0_RXBYTES 0x3B#define CCxxx0_PATABLE 0x3E#define CCxxx0_TXFIFO 0x3F#define CCxxx0_RXFIFO 0x3F// RF_SETTINGS is a data structure which contains all relevant CCxxx0 registerstypedef struct S_RF_SETTINGS{INT8U FSCTRL2; //自已加的INT8U FSCTRL1; // Frequency synthesizer control.INT8U FSCTRL0; // Frequency synthesizer control.INT8U FREQ2; // Frequency control word, high INT8U.INT8U FREQ1; // Frequency control word, middle INT8U.INT8U FREQ0; // Frequency control word, low INT8U.INT8U MDMCFG4; // Modem configuration.INT8U MDMCFG3; // Modem configuration.INT8U MDMCFG2; // Modem configuration.INT8U MDMCFG1; // Modem configuration.INT8U MDMCFG0; // Modem configuration.INT8U CHANNR; // Channel number.INT8U DEVIATN; // Modem deviation setting (when FSK modulation is enabled).INT8U FREND1; // Front end RX configuration.INT8U FREND0; // Front end RX configuration.INT8U MCSM0; // Main Radio Control State Machine configuration.INT8U FOCCFG; // Frequency Offset Compensation Configuration.INT8U BSCFG; // Bit synchronization Configuration.INT8U AGCCTRL2; // AGC control.INT8U AGCCTRL1; // AGC control.INT8U AGCCTRL0; // AGC control.INT8U FSCAL3; // Frequency synthesizer calibration.INT8U FSCAL2; // Frequency synthesizer calibration.INT8U FSCAL1; // Frequency synthesizer calibration.INT8U FSCAL0; // Frequency synthesizer calibration.INT8U FSTEST; // Frequency synthesizer calibration controlINT8U TEST2; // Various test settings.INT8U TEST1; // Various test settings.INT8U TEST0; // Various test settings.INT8U IOCFG2; // GDO2 output pin configurationINT8U IOCFG0; // GDO0 output pin configurationINT8U PKTCTRL1; // Packet automation control.INT8U PKTCTRL0; // Packet automation control.INT8U ADDR; // Device address.INT8U 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.0x00, // FSCAL1 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<s; i++);for(i=0; i<s; i++);}void halWait(INT16U 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(INT8U dat)//输入:发送的数据//输出:无//功能描述:SPI发送一个字节//***************************************************************************** ************INT8U SpiTxRxByte(INT8U dat){INT8U 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(INT8U addr, INT8U value)//输入:地址和配置字//输出:无//功能描述:SPI写寄存器//***************************************************************************** ************void halSpiWriteReg(INT8U addr, INT8U value){CSN = 0;while (MISO);SpiTxRxByte(addr); //写地址SpiTxRxByte(value); //写入配置CSN = 1;}//*****************************************************************************************//函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)//输入:地址,写入缓冲区,写入个数//输出:无//功能描述:SPI连续写配置寄存器//***************************************************************************** ************void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count){INT8U 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(INT8U strobe)//输入:命令//输出:无//功能描述:SPI写命令//***************************************************************************** ************void halSpiStrobe(INT8U strobe){CSN = 0;while (MISO);SpiTxRxByte(strobe); //写入命令CSN = 1;}//***************************************************************************** ************//函数名:INT8U halSpiReadReg(INT8U addr)//输出:该寄存器的配置字//功能描述:SPI读寄存器//***************************************************************************** ************INT8U halSpiReadReg(INT8U addr){INT8U temp, value;temp = addr|READ_SINGLE;//读寄存器命令CSN = 0;while (MISO);SpiTxRxByte(temp);value = SpiTxRxByte(0);CSN = 1;return value;}//***************************************************************************** ************//函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)//输入:地址,读出数据后暂存的缓冲区,读出配置个数//输出:无//功能描述:SPI连续写配置寄存器//***************************************************************************** ************void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count){INT8U i,temp;temp = addr | READ_BURST; //写入要读的配置寄存器地址和读命令CSN = 0;while (MISO);SpiTxRxByte(temp);for (i = 0; i < count; i++){buffer[i] = SpiTxRxByte(0);}CSN = 1;}//***************************************************************************** ************//函数名:INT8U halSpiReadReg(INT8U addr)//输出:该状态寄存器当前值//功能描述:SPI读状态寄存器//***************************************************************************** ************INT8U halSpiReadStatus(INT8U addr){INT8U value,temp;temp = addr | READ_BURST; //写入要读的状态寄存器的地址同时写入读命令CSN = 0;while (MISO);SpiTxRxByte(temp);value = SpiTxRxByte(0);CSN = 1;return value;}//***************************************************************************** ************//函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)//输入:无//输出:无//功能描述:配置CC1100的寄存器//***************************************************************************** ************void halRfWriteRfSettings(void){halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL2);//自已加的// Write register settingshalSpiWriteReg(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(INT8U *txBuffer, INT8U size)//输入:发送的缓冲区,发送数据个数//输出:无//功能描述:CC1100发送一组数据//***************************************************************************** ************void halRfSendPacket(INT8U *txBuffer, INT8U size){halSpiWriteReg(CCxxx0_TXFIFO, size);halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据halSpiStrobe(CCxxx0_SIDLE);halSpiStrobe(CCxxx0_STX); //进入发送模式发送数据// Wait for GDO0 to be set -> sync transmittedwhile (!GDO0);// Wait for GDO0 to be cleared -> end of packetwhile (GDO0);halSpiStrobe(CCxxx0_SFTX);}void setRxMode(void){halSpiStrobe(CCxxx0_SRX); //进入接收状态}/*void Delay(unsigned int s){unsigned int i;for(i=0; i<s; i++);for(i=0; i<s; i++);}*/void main(void){bit key1_flag = 0;bit key2_flag = 0;unsigned int key1_scan_cnt = 300;unsigned int key2_scan_cnt = 300;unsigned char ii;INT8U TxBuf[8]={1,2,3,4,5,6,7,8}; // 8字节, 如果需要更长的数据包,请正确设置INT8U PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};CpuInit();POWER_UP_RESET_CC1100();halRfWriteRfSettings();halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);while(1){if(KEY1 == 0){key1_scan_cnt--;if(!key1_scan_cnt)//确认按键正常按下{key1_scan_cnt = 300;key1_flag = 1;//按键第1次按下标志位}}else{key1_scan_cnt = 300;if(key1_flag)//按键弹起{ key1_flag = 0;TxBuf[0] = 0xff;for(ii=0;ii<3;ii++)halRfSendPacket(TxBuf,8);// Transmit Tx buffer data }}if(KEY2 == 0){key2_scan_cnt--;if(!key2_scan_cnt)//确认按键正常按下{key2_scan_cnt = 300;key2_flag = 1;//按键第1次按下标志位}}else{key2_scan_cnt = 300;if(key2_flag)//按键弹起{key2_flag = 0;TxBuf[0] = 0xaa;for(ii=0;ii<3;ii++)halRfSendPacket(TxBuf,8);// Transmit Tx buffer data}}}}/*//接收函数主函数部分void main(void){INT8U leng =0;INT8U RxBuf[8]={0};INT8U PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};CpuInit();POWER_UP_RESET_CC1100();halRfWriteRfSettings();halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);while(1){leng =8; // 预计接受8 bytesif(halRfReceivePacket(RxBuf,&leng)){if(RxBuf[0] == 0xff)//接收到的开灯信号{{led0=0;led1=0;led2=0;}if(RxBuf[0] == 0xaa)//接收到关灯信号{led0=1led1=1;led2=1;}}}}*/。

相关文档
最新文档