@TOC
CC2530的串行接口原理與應(yīng)用
- 微控制器與微處理器的區(qū)別
- CC2530有兩個(gè)串行通信接口USART0和USART1,它們能夠分別運(yùn)行于異步UART模式或者同步SPI模式磁滚。
- 接地線垂攘,把多個(gè)設(shè)備的電平參考源統(tǒng)一起來晒他。
寄存器
[圖片上傳失敗...(image-b27840-1626001720406)]
- U0CSR寄存器
- 置1陨仅,異步設(shè)置
[圖片上傳失敗...(image-53cffd-1626001720406)] - 置1灼伤,設(shè)置為接收
[圖片上傳失敗...(image-a0d764-1626001720406)]
- U0UCR寄存器
- 校驗(yàn)位
[圖片上傳失敗...(image-3de9f2-1626001502434)] - 設(shè)置幾位傳輸(不同的位寄存器不同)
[圖片上傳失敗...(image-a071eb-1626001502434)] - 是否使用奇偶校驗(yàn)位
[圖片上傳失敗...(image-a4b7dc-1626001502434)] - 停止位
[圖片上傳失敗...(image-1dccce-1626001502434)] - 起始(使用默認(rèn)設(shè)置)
- U0GCR寄存器
- 波特率設(shè)置(先清零&=~0x1F狐赡、|=)
[圖片上傳失敗...(image-35cfd9-1626001502434)]
- U0BAUD寄存器
- 波特率控制(可以直接賦值=)
-
系統(tǒng)時(shí)鐘使用32MHz
32MHz系統(tǒng)時(shí)鐘常用的波特率設(shè)置
串口初始化
-
步驟
串口初始化步驟 -
程序
串口初始化程序
- P2DIR設(shè)置為串口優(yōu)先(查手冊(cè))
- U0DBUF,讀和寫操作的是不同的寄存器
-
串口發(fā)送字符串函數(shù)
串口發(fā)送字符串函數(shù) -
串口接收中斷函數(shù)
串口接收中斷函數(shù)
DHT11溫濕度
- 硬件選擇-根據(jù)所測(cè)環(huán)境、需求
- DHT11的供電電壓范圍為3-5.5V览祖,選擇3.3V(和板子一樣)穴墅,否則可能會(huì)燒引腳。
- 串行接口使用半雙工
- 一次通訊時(shí)間4ms左右皇钞,一次完整的數(shù)據(jù)傳輸為40bit夹界。
- 數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù) +8bit溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù) +8bit校驗(yàn)和
- 通訊過程
[圖片上傳失敗...(image-2985cd-1626001502434)] - 總線空閑狀態(tài)為高電平,主機(jī)把總線拉低等待DHT11響應(yīng),主機(jī)把總線拉低必須大于18毫秒,保證DHT11能檢測(cè)到起始信號(hào)可柿。DHT11接收到主機(jī)的開始信號(hào)后,等待主機(jī)開始信號(hào)結(jié)束,然后發(fā)送80us低電平響應(yīng)信號(hào).主機(jī)發(fā)送開始信號(hào)結(jié)束后,延時(shí)等待20-40us后, 讀取DHT11的響應(yīng)信號(hào),主機(jī)發(fā)送開始信號(hào)后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高复斥。
[圖片上傳失敗...(image-e3c40d-1626001502434)] - 總線為低電平,說明DHT11發(fā)送響應(yīng)信號(hào),DHT11發(fā)送響應(yīng)信號(hào)后,再把總線拉高80us,準(zhǔn)備發(fā)送數(shù)據(jù),每一bit數(shù)據(jù)都以50us低電平時(shí)隙開始,高電平的長(zhǎng)短定了數(shù)據(jù)位是0還是1.格式見下面圖示.如果讀取響應(yīng)信號(hào)為高電平,則DHT11沒有響應(yīng),請(qǐng)檢查線路是否連接正常.當(dāng)最后一bit數(shù)據(jù)傳送完畢后目锭,DHT11拉低總線50us,隨后總線由上拉電阻拉高進(jìn)入空閑狀態(tài)痢虹。
[圖片上傳失敗...(image-27c34f-1626001502434)]
作業(yè)
- 調(diào)試奖唯。將數(shù)據(jù)串口傳輸顯示到電腦糜值。每三秒鐘采集一次臀玄。(數(shù)字轉(zhuǎn)成字符 顯示)
- CC2530 + DTH11
- DTH11.h
#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define DATA_PIN P0_0
//溫濕度定義
uchar ucharFLAG,uchartemp;
uchar shidu_shi,shidu_ge,wendu_shi,wendu_ge=4;
uchar ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,
ucharcheckdata;
uchar ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp;
uchar ucharcomdata;
//延時(shí)函數(shù)
void Delay_us() //1 us 延時(shí)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void Delay_10us() //10 us 延時(shí)
{
Delay_us();
Delay_us();
}
void Delay_ms(uint Time)//n ms 延時(shí)
{
unsigned char i;
while(Time--)
{
for(i=0;i<100;i++)
Delay_10us();
}
}
//溫濕度傳感
void COM(void) // 溫濕寫入
{
uchar i;
for(i=0;i<8;i++)
{
ucharFLAG=2;
while((!DATA_PIN)&&ucharFLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
uchartemp=0;
if(DATA_PIN)uchartemp=1;
ucharFLAG=2;
while((DATA_PIN)&&ucharFLAG++);
if(ucharFLAG==1)break;
ucharcomdata<<=1;
ucharcomdata|=uchartemp;
}
}
void DHT11(void) //溫濕傳感啟動(dòng)
{
DATA_PIN=0;
Delay_ms(30); //>18MS
DATA_PIN=1;
P0DIR &= ~0x01; //重新配置 IO 口方向 輸入
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
if(!DATA_PIN)
{
ucharFLAG=2;
while((!DATA_PIN)&&ucharFLAG++);
ucharFLAG=2;
while((DATA_PIN)&&ucharFLAG++);
COM();
ucharRH_data_H_temp=ucharcomdata;
COM();
ucharRH_data_L_temp=ucharcomdata;
COM();
ucharT_data_H_temp=ucharcomdata;
COM();
ucharT_data_L_temp=ucharcomdata;
COM();
ucharcheckdata_temp=ucharcomdata;
DATA_PIN=1;
uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp);
if(uchartemp==ucharcheckdata_temp)
{
ucharRH_data_H=ucharRH_data_H_temp;
ucharRH_data_L=ucharRH_data_L_temp;
ucharT_data_H=ucharT_data_H_temp;
ucharT_data_L=ucharT_data_L_temp;
ucharcheckdata=ucharcheckdata_temp;
}
wendu_shi=ucharT_data_H/10;
wendu_ge=ucharT_data_H%10;
shidu_shi=ucharRH_data_H/10;
shidu_ge=ucharRH_data_H%10;
}
else //沒用成功讀取,返回 0
{
wendu_shi=2;
wendu_ge=2;
shidu_shi=0;
shidu_ge=0;
}
P0DIR |= 0x01; //IO 口需要重新配置
}
- UART.c
#include <ioCC2530.h>
#include <string.h>
#include"DHT11.h"
//typedef unsigned int uint;
#define TX_SIZE 20
#define TX_STRING "Hello World "
char TxData[TX_SIZE]; //存儲(chǔ)發(fā)送字符串
char TxData1[TX_SIZE];
/*****************************************************
***********************
* 名 稱: DelayMS()
* 功 能: 以毫秒為單位延時(shí) 16M 時(shí)約為 535,32M 時(shí)要調(diào)整,系統(tǒng)
時(shí)鐘不修改默認(rèn)為 16M
* 入口參數(shù): msec 延時(shí)參數(shù)累贤,值越大延時(shí)越久
* 出口參數(shù): 無
******************************************************
**********************/
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i<msec; i++)
for (j=0; j<1070; j++);
}
/*****************************************************
***********************
* 名 稱: InitUart()
* 功 能: 串口初始化函數(shù)
* 入口參數(shù): 無
* 出口參數(shù): 無
******************************************************
**********************/
void InitUart(void)
{
PERCFG = 0x00;
P0SEL = 0x0c; //P0_2,P0_3 用作串口(外設(shè)功能)
P2DIR &= ~0XC0; //P0 優(yōu)先作為 UART0
U0CSR |= 0x80; //設(shè)置為 UART 方式
U0GCR |= 11;
U0BAUD |= 216; //波特率設(shè)為 115200
UTX0IF = 0; //UART0 TX 中斷標(biāo)志初始置位 0
}
/*****************************************************
***********************
* 名 稱: UartSendString()
* 功 能: 串口發(fā)送函數(shù)
* 入口參數(shù): Data:發(fā)送緩沖區(qū) len:發(fā)送長(zhǎng)度
* 出口參數(shù): 無
******************************************************
**********************/
void UartSendString(char *Data, int len)
{
uint i;
for(i=0; i<len; i++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
/*****************************************************
***********************
* 程序入口函數(shù)
******************************************************
**********************/
void main(void)
{
CLKCONCMD &= ~0x40; //設(shè)置系統(tǒng)時(shí)鐘源為 32MHZ
while(CLKCONSTA & 0x40); //等待晶振穩(wěn)定為 32M
CLKCONCMD &= ~0x47; //設(shè)置系統(tǒng)主時(shí)鐘頻 32MHZ
InitUart(); //調(diào)置串口相關(guān)寄存器
memset(TxData, 0, TX_SIZE); //數(shù)據(jù)清 0
while(1)
{
DHT11();
TxData[0]=(char)wendu_shi+48;
TxData[1]=(char)wendu_ge+48;
TxData1[0]=(char)shidu_shi+48;
TxData1[1]=(char)shidu_ge+48;
UartSendString("Temp:",5);
UartSendString(TxData,2);
UartSendString(" ",2);
UartSendString("Humidity:",9);
UartSendString(TxData1,2);
UartSendString("\n",1);
DelayMS(1500); //延時(shí)
}
}
-
結(jié)果顯示
結(jié)果截圖
模數(shù)轉(zhuǎn)換(ADC)
- 測(cè)量物體使用的參考變量穩(wěn)定硼被、高精度
- 逐次逼近型
- DMA直接內(nèi)存存取
-
ADC特征
ADC特征 -
ADC輸入
ADC輸入
-
ADCCON2寄存器
ADCCON2寄存器
ADCCON2寄存器 -
ADCCON3寄存器
ADCCON3寄存器 - 單次轉(zhuǎn)換使用ADCCON3寄存器
使用宏定義
- ADC轉(zhuǎn)換
- ATEST寄存器ADC的轉(zhuǎn)換分為ADC序列轉(zhuǎn)換和ADC單個(gè)轉(zhuǎn)換始鱼。ADC執(zhí)行一系列的轉(zhuǎn)換医清,并把轉(zhuǎn)換結(jié)果通過DMA移動(dòng)到存儲(chǔ)器会烙,不需要任何CPU的干預(yù)柏腻。
- ADC序列轉(zhuǎn)換與APCFG寄存器的設(shè)置有關(guān)纸厉,APCFG為8位模擬輸入的I/O引腳設(shè)置,如果模擬I/O使能五嫂,每一個(gè)通道正常情況下應(yīng)是ADC序列的一部分残腌。如果相應(yīng)的模擬I/O被禁用,將啟用差分輸入贫导,處于差分的兩個(gè)引腳必須在APCFG寄存器中設(shè)置為模擬輸入引腳抛猫。
- ADCCON2.SCH寄存器位用于定義一個(gè)ADC序列轉(zhuǎn)換,它來自ADC輸入孩灯。如果ADCCON2.SCH設(shè)置為一個(gè)小于8的值闺金,轉(zhuǎn)換序列來自AIN0-AIN7的每個(gè)通道上;當(dāng)ADCCON2.SCH設(shè)置為一個(gè)在8和12之間的值峰档,序列包括差分輸入讥巡;當(dāng)ADCCON2.SCH大于或等于12槽棍,為單個(gè)ADC轉(zhuǎn)換缆巧。
- 除了序列轉(zhuǎn)換陕悬,每個(gè)通道都可以進(jìn)行ADC單個(gè)轉(zhuǎn)換,ADC單個(gè)轉(zhuǎn)換通過配置寄存器狂秦。ADCCON3.SCH完成。當(dāng)通過寫ADCCON3觸發(fā)的一個(gè)單個(gè)轉(zhuǎn)換完成時(shí)堪簿,ADC將產(chǎn)生一個(gè)中斷。
- ADC的數(shù)字轉(zhuǎn)換結(jié)果可以通過設(shè)置寄存器ADCCON1獲得虑瀑。
- 開啟ADCCON1
ADCCON1=0x40;
-
左對(duì)齊,先放H的高位
ADCH和ADCL -
操作步驟
操作步驟 -
模擬I/O使能
模擬I/O使能 - ADC 轉(zhuǎn)換必須使用32MHz
CLKCONCMD &= ~0x40;
————————————————
版權(quán)聲明:本文為CSDN博主「路燈謠」的原創(chuàng)文章主届,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明绘闷。
原文鏈接:https://blog.csdn.net/lululumiao/article/details/118614056