U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
LED_Init();
initUART0();
while(1)
{
if(RXTXflag == 1) //接收状态
{
if(temp!=0)
{
LED2=!LED2;
UartTX_Send_String(Recdata,10);
UartTX_Send_String(“\n”,1);
RXTXflag = 3; //进入发送状态
}
temp = 0;
}
if(RXTXflag == 3) //发送状态
{
U0CSR &= ~0x40; //不能收数
U0CSR |= 0x40; //允许接收
RXTXflag = 1; //恢复到接收状态
}
}
}
/****************************************************************
串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中断标志
temp = U0DBUF;
}
#include <iocc2530.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define LED1 P1_0
#define LED2 P2_0
void LED_Init();
void initUART0(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);
void delay(void);
uchar Recdata1[10]=“Hello\n”;
uchar Recdata[10]=“Welcome\n”;
uchar RXTXflag = 1;
uchar temp=0;
uint datanumber = 0;
uint stringlen;
int counter=0;
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartTX_Send_String(uchar *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void TIM1_Init()
{
CLKCONCMD&=~0X7f; //晶振设置为32MHz
while(CLKCONSTA & 0x40); //等待晶振稳定
EA=1; //开总中断
T1IE=1; //开T1溢出中断
T1CTL=0x09; //0000 1001启动设32分频,设自由模式
}
void LED_Init()
{
P0SEL &=~0X01;
P0DIR |=0X01;
P2SEL &=~0X01;
P2DIR |=0X01;
LED1=1;
LED2=1;
}
void delay(void)
{
int i = 0,j = 0;
for(i = 0;i < 1000;i++)
for(j = 0;j < 500;j++);
}
/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //串口设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
LED_Init();
initUART0();
TIM1_Init();
while(1)
{
}
}
/****************************************************************
串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中断标志
temp = U0DBUF;
}
#pragma vector = T1_VECTOR
__interrupt void Uart(void)
{
IRCON=0x00;
if(counter <91) // 自由模式6s
{
counter++;
}else{
LED2=0;
counter=0;
UartTX\_Send\_String("everything is ok",17);
}
}
#include <iocc2530.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define LED1 P1_0
#define LED2 P2_0
void LED_Init();
void initUART0(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);
void delay(void);
uchar Recdata[10]=“Welcome\n”;
uchar RXTXflag = 1;
uchar temp=0;
uint datanumber = 0;
uint stringlen;
int counter=0;
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartTX_Send_String(uchar *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void LED_Init()
{
P0SEL &=~0X01;
P0DIR |=0X01;
P2SEL &=~0X01;
P2DIR |=0X01;
LED1=1;
LED2=1;
}
/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //串口设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
initUART0();
stringlen = strlen((char *)Recdata);
if(counter==0){
counter=1;
UartTX_Send_String(“What is your name?”,19);
}
while(1)
{
if(RXTXflag == 1) //接收状态
{
if( temp != 0)
{
if((temp!='#')&&(datanumber<50)) //’#‘被定义为结束字符,最多能接收50个字符
{
Recdata[datanumber++] = temp;
}
else
{
RXTXflag = 3; //进入发送状态
}
if(datanumber == 50)
RXTXflag = 3;
temp = 0;
}
}
if(RXTXflag == 3) //发送状态
{
UartTX\_Send\_String("send:",5);
U0CSR &= ~0x40; //不能收数
UartTX\_Send\_String("Hello ",7);
UartTX\_Send\_String(Recdata,datanumber);
UartTX\_Send\_String("\n",1);
U0CSR |= 0x40; //允许接收
RXTXflag = 1; //恢复到接收状态
datanumber = 0; //指针归0
memset(Recdata, 0, sizeof(Recdata));
}
}
}
/****************************************************************
串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中断标志
temp = U0DBUF;
}
#include <iocc2530.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define LED1 P0_0
#define LED2 P2_0
void LED_Init();
void initUART0(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);
int cnt=0;
int flag=0;
uchar Recdata[6];
uchar RXTXflag = 1;
uchar temp=0;
uint datanumber = 0;
uint stringlen;
int counter=0;
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartTX_Send_String(uchar *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void LED_Init()
{
P0SEL &=~0X01;
P0DIR |=0X01;
P2SEL &=~0X01;
P2DIR |=0X01;
LED1=1;
LED2=1;
}
/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //串口设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
initUART0();
LED_Init();
while(1)
{
}
}
/****************************************************************
串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0;
Recdata[datanumber++] = U0DBUF;
if(datanumber==5)
{
if(Recdata[0] == ‘L’ && Recdata[1] == ‘E’ && Recdata[2] == ‘D’&& Recdata[3] == ‘1’&& Recdata[4] == ‘1’)
LED1=0;
if(Recdata[0] == ‘L’ && Recdata[1] == ‘E’ && Recdata[2] == ‘D’&& Recdata[3] == ‘1’&& Recdata[4] == ‘2’)
LED1=1;
if(Recdata[0] == ‘L’ && Recdata[1] == ‘E’ && Recdata[2] == ‘D’&& Recdata[3] == ‘2’&& Recdata[4] == ‘1’)
LED2=0;
if(Recdata[0] == ‘L’ && Recdata[1] == ‘E’ && Recdata[2] == ‘D’&& Recdata[3] == ‘2’&& Recdata[4] == ‘2’)
LED2=1;
datanumber = 0;
//memset(Recdata,0,sizeof(Recdata));
}
}
1.每隔10秒采集一次VDD/3的电压值并显示出来,并且当串口接收到来自串口调试助手发送来的0x01时,发送VDD/3的电压值。
\*2. 每隔20秒询问一次是否有AD采集任务,若收到回复“temp sensor”则令ADC采集片内温度传感器的值并显示出来,若收到回复“vdd”则令ADC采集VDD/3的值并显示出来。
#include <iocc2530.h>
#include <string.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
void initUART0(void);
void UartTX_Send_String(char *Data,int len);
float GetTemperature(void);
int counter=0;
char Temp[6];
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartTX_Send_String(char *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void TIM1_Init()
{
CLKCONCMD&=~0X7f; //晶振设置为32MHz
while(CLKCONSTA & 0x40); //等待晶振稳定
EA=1; //开总中断
T1IE=1; //开T1溢出中断
T1CTL=0x09; //0000 1001启动设32分频,设自由模式
}
float GetTemperature(void)
{
uint value,sum;
int i;
for(i=0;i<4;i++)
{
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |= 0x30; //选择ADC的启动模式为手动
ADCCON1 |= 0x40; //启动AD转化
while(!(ADCCON1 & 0x80)); //等待 AD 转换完成
value = ADCL >> 2; //ADCL 寄存器低 2 位无效,由于他只有12位有效,ADCL寄存器低4位无效。网络上很多代码这里都是右移两位,那是不对的
value |= (((uint)ADCH) << 6);
sum+=value;
}
value=sum>>2;
return (value-1367.5)/4.5;
}
/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //串口设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
initUART0();
TIM1_Init();
while(1)
{
}
}
#pragma vector = T1_VECTOR
__interrupt void Uart(void)
{
IRCON=0x00;
if(counter <15) // 自由模式1s
{
counter++;
}else{
counter=0;
float AvgTemp = GetTemperature();
memset(Temp, 0, 6);
sprintf(Temp,"%.2f", AvgTemp);//将浮点数转成字符串
UartTX\_Send\_String(Temp,5);
UartTX\_Send\_String(" ",10);
}
}
无线射频收发实验
#include “ioCC2530.h”
#define LED2 P2_0
static unsigned char buf[128];
static int len=0;
unsigned char i;
void Delay(unsigned char m)
{
int i=0,j=0;
for(i=0;i<1000;i++)
{
for(j=0;j < m; j++);
}
}
/***********************
*串口初始化
*返回参数 无
***********************/
void initUARTtest(void)
{
CLKCONCMD &= ~0x40; //晶振
while(!(SLEEPSTA & 0x40)); //等待晶振稳定
CLKCONCMD &= ~0x47; //TICHSPD128分频,CLKSPD不分频
SLEEPCMD |= 0x04; //关闭不用的RC振荡器
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
U0CSR |= 0x80;//UART方式
U0GCR |= 10; //波特率设为57600
U0BAUD |= 216;
UTX0IF = 0;//中断标志清0
U0CSR |= 0X40;//允许接收
IEN0 |= 0x84; //开总中断,接收中断
}
/*************************************************/
void UartTX_Send_String(unsigned char *Data,int len)
{
int j;
//LED2 = ~LED2;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void rf_init()
{
//硬件CRC以及AUTO_ACK使能
//FRMCTRL0 |= (0x20 | 0x40); /* AUTO_ACK | AUTO_CRC */
TXFILTCFG = 0x09;//设置TX抗混叠过滤器以获得合适的带宽
AGCCTRL1 = 0x15;//调整AGC目标值
FSCAL1 = 0x00;//获得最佳的EVM
RFIRQM0 |= (1<<6);// RXPKTDONE 中断位使能
IEN2 |= (1<<0);// RF 中断使能
EA = 1;//开中断
FREQCTRL = 0x0d; //信道选择,选择11信道
SHORT_ADDR0 = 0x05;//目标地址过滤期间使用的短地址
SHORT_ADDR1 = 0x00;
PAN_ID0 = 0x22; //目标地址过滤期间使用的PANID
PAN_ID1 = 0x00;
RFST = 0xed; //清除RXFIFO缓冲区并复位解调器
RFST = 0xe3; //为RX使能并校准频率合成器
FRMFILT0 &= ~(1<<0);//禁止帧过滤
//FRMFILT0 = 0x0C;
}
#pragma vector=RF_VECTOR
__interrupt void rf_isr(void)
{
unsigned char i;
EA = 0; //关中断
//接收帧结束
if (RFIRQF0 & (1<<6)) {
len = RFD-2;//接收帧长度
len &= 0x7f;
//将接收的数据写入buf中
for (i = 0; i < len; i++)
{
buf[i] = RFD;
//Delay(200);
}
RFST =0xED; //清除接收缓冲区
UartTX\_Send\_String(buf,len); //Uart0SendString(buf);
S1CON = 0; // 清RF中断
RFIRQF0 &= ~(1<<6); //清 RXPKTDONE中断
LED2 = ~LED2; //LED1灯状态改变
}
EA = 1;
}
void tx()
{
unsigned char i;
unsigned char mac[]="hncu ";
RFST = 0xe3; //为RX使能并校准频率合成器
//wait for SFD not active and TX\_Active not active
// TX\_ACTIVE | SFD
while (FSMSTAT1 & ((1<<1) | (1<<5)));
RFIRQM0 &= ~(1<<6); //禁止RXPKTDONE中断
IEN2 &= ~(1<<0); //禁止RF中断
RFST = 0xee; // ISFLUSHTX
RFIRQF1 = ~(1<<1);// 清除 TXDONE 中断
RFD = 8;// 传输的帧长度
//将mac的内容写到RFD中
for(i=0;i<6;i++)
{
RFD = mac[i];
}
RFIRQM0 |= (1<<6);// 打开RX中断
IEN2 |= (1<<0);//打开RF中断
RFST = 0xe9; //发送数据包ISTXON
while (!(RFIRQF1 & (1<<1)));//等待传输结束
RFIRQF1 = ~(1<<1);//清除 TXDONE状态
LED2=~LED2;//LED1灯状态改变
//Delay(200);//延时
}
void main(void)
{
initUARTtest();
//P0DIR |= 0x01;
P2DIR |= 0x01;
LED2=1;//关闭LED2
EA = 0;//关闭总中断
SLEEPCMD &= ~0x04;//设置时钟频率为32M
//等待时钟稳定
while(!(SLEEPSTA & 0x40));
CLKCONCMD &= ~0x47;
SLEEPCMD |= 0x04;
rf\_init();//初始化RF
EA = 1;//中断使能
//发送或等待接收中断
while(1) {
//宏定义RX
#ifndef RX //如果没有定义RX,开始发送
tx();
Delay(200);//延时
//Delay(200);
# else //如果定义RX,等待接收断中
//UartTX\_Send\_String(buf,len);
#endif
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
O等大厂,18年进入阿里一直到现在。**
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-VHi84T4v-1715604083555)]
[外链图片转存中…(img-7UDzNnrz-1715604083556)]
[外链图片转存中…(img-fkIeivcQ-1715604083556)]
[外链图片转存中…(img-yp6Ra6m7-1715604083557)]
[外链图片转存中…(img-8dL34kxH-1715604083558)]
[外链图片转存中…(img-uKFY3t2N-1715604083558)]
[外链图片转存中…(img-V4Wqm6HW-1715604083559)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!