(編寫帖子額的時候不太熟練,倒置部分結構亂了 ) 一:解決問題思路
所有單片機,想要達到led閃爍,都需要延遲函數.延遲分為硬件延遲和軟件延遲兩種.硬件延遲涉及到定時器的概念,是后面要講的內容,這里采用軟件延遲的方法.
1 軟件延遲(兩種實現方式)
1.1 用指令實現延時
CC2530的每個指令是一個時鐘,而標準的8051的指令周期是12個時鐘。若選用32MHZ的時鐘頻率,那么時鐘周期是1/32 us,一個指令也就是1/32us. 而CC2530系統上電默認是16MHZ的內部RC振蕩器 - ZStack中大多使用的延時函數如下:
- void Delay_us(uint16 value){
- while (value--)
- {
- asm(“NOP”); //一個指令周期占用一個時鐘周期
- asm(“NOP”);
- asm(“NOP”);
- }
- }
- void Delay_ms(uint16 value)
- {
- while(1)
- Delay_us(1000);
- }
復制代碼 1.2 for循環實現延時 (僅做參考,主要用于講解
- void delay_us(int n)
- {
- while(n--)
- {
- unsigned char a,b;
- for(a=173;a>0;a--)
- for(b=143;b>0;b--) ;
- }
-
- }
復制代碼
2. 配置寄存器
2.1配置寄存器順序
1.PxSEL //端口功能選擇 0為通用I/0 1為外設
2.PxDIR //端口方向選擇 0為輸入 1為輸出 LED不需要配置 PxINP寄存器
2.2 PXSEL 和PXDIR詳細配置參數 (這里沒辦法粘貼圖片,就直接給連接可以自行跳轉
2-2 CC2530的通用IO及相關寄存器 - 夏日清涼~ - 博客園 (cnblogs.com)
3.demo
我的CC2530 led1和led2 是P1_0和P1_1; 而且是低電平點亮 這個根據實際情況近些年編寫</div><div><div class="blockcode">
- #include <ioCC2530.h>
- #define led1(x) P1_0=~x
- #define led2(x) P1_1=~x
- void Delay_us(uint16 value){
- while (value--)
- {
- asm(“NOP”); //一個指令周期占用一個時鐘周期
- asm(“NOP”);
- asm(“NOP”);
- }
- }
- void Delay_ms(uint16 value)
- {
- while(1)
- Delay_us(1000);
- }
-
- void main()
- {
- P1SEL &=~0x07;
- P1DIR |= 0x03;
-
-
-
-
- while(1)
- {
- led2(1);
- led1(0);
- Delay_ms(1000);
- led1(1);
- led2(0);
- Delay_ms(1000);
- }
-
- }
復制代碼
文章參考:CC2530單片機精確延時的時間分析-CSDN博客
十二、CC2530系統時鐘設置_通過配置時鐘頻率控制寄存器和時間頻率狀態寄存器實現cc2530使用外部32mhz晶-CSDN博客
|