STC8051与CC2530单片机有撒不同

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC8051与CC2530单片机有撒不同相关的知识,希望对你有一定的参考价值。

STC8051是MCS51为核的单片机,CC2530是以增强型8051为核心开发的的产品。这就是其本质的区别。请看百度百科给的说明:CC2530 结合了领先的RF 收发器的优良性能,业界标准的增强型8051 CPU,系统内可编程闪存,8-KB RAM 和许多其它强大的功能。CC2530 有四种不同的闪存版本:CC2530F32/64/128/256,分别具有32/64/128/256KB 的闪存。CC2530 具有不同的运行模式,使得它尤其适应超低功耗要求的系统。 参考技术A ,怎么会这么用呢? CC2530本身就具有代码预取功能的低功耗8051 微控制器内核,比8051单片机 参考技术B 我实在是不懂

STC15不同配置模式下的串口输出方式总结

STC15不同配置模式下的串口输出方式总结


  • ✨基于STC15W408AS单片机。STC15W401AS系列单片机(含IRC15W415AS)有:2个普通定时器/计数器(T0T2)
  • 🔰晶振频率:11.0592MHz;波特率:115200

🌴串口配置模式1

在不开启串口中断情况下,仅作为一般调试信息输出,不能接收串口数据。

//STC15W408AS,512字节的RAM,8K FLASH
//晶振频率:11.0592MHz
//波特率:115200
#include <STC15F2K60S2.H>
#include "intrins.h"
//#include "stdio.h"

bit busy;
//#define     FOSC    11059200UL
//#define     BAUD    115200

//sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7


void Delay500ms();
void UartInit(void);        //115200bps@11.0592MHz
void SendData(unsigned char dat);
void SendString(char *s);

void main()

    P1M0 = 0x00;
    P1M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;

    UartInit();
	Delay500ms();
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");

    while (1)
    
        P17 = 0x01;
        Delay500ms();
        P17 = 0x00;
        Delay500ms();
//        printf("Hello World /r/n");
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");
    



void UartInit(void)     //115200bps@11.0592MHz

	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xFE;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时


/*----------------------------
发送串口数据
----------------------------*/
void SendData(unsigned char dat)

	 SBUF = dat;   
    while (!TI); //等待前一个数据发送完成
    TI = 0;//清除发送标志




/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)

    while (*s)                  //检测字符串结束标志
    
        SendData(*s++);         //发送当前字符
    



void Delay500ms()       //@11.0592MHz

    unsigned char i, j, k;
    _nop_();
    _nop_();
    i = 22;
    j = 36;
    k = 227;
    do
    
        do
        
            while (--k);
        
        while (--j);
    
    while (--i);




🌷串口配置模式2

在不开启串口中断情况下,实现printf输出。仅作为一般调试信息输出,不能接收串口数据。

//STC15W408AS,512字节的RAM,8K FLASH
//晶振频率:11.0592MHz
//波特率:115200

#include <STC15F2K60S2.H>
#include "intrins.h"
#include "stdio.h"

bit busy;
//#define     FOSC    11059200UL
//#define     BAUD    115200

//sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7


void Delay500ms();
void UartInit(void);        //115200bps@11.0592MHz
void SendData(unsigned char dat);
void SendString(char *s);

void main()

    P1M0 = 0x00;
    P1M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    UartInit();
	Delay500ms();
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");

    while (1)
    
        P17 = 0x01;
        Delay500ms();
        P17 = 0x00;
        Delay500ms();
        printf("Hello World \\r\\n");
//	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");
    



void UartInit(void)     //115200bps@11.0592MHz

	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xFE;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时


/*----------------------------
发送串口数据
----------------------------*/
void SendData(unsigned char dat)

	 SBUF = dat;   
    while (!TI); //等待前一个数据发送完成
    TI = 0;//清除发送标志


char putchar(char dat)

    SendData(dat);
    return dat;

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)

    while (*s)                  //检测字符串结束标志
    
        SendData(*s++);         //发送当前字符
    


void Delay500ms()       //@11.0592MHz

    unsigned char i, j, k;
    _nop_();
    _nop_();
    i = 22;
    j = 36;
    k = 227;
    do
    
        do
        
            while (--k);
        
        while (--j);
    
    while (--i);




🌻串口配置模式3

开启串口中断情况下,仅作为一般调试信息输出,可以实现接收串口数据(接收部分需要代码完善)。

//STC15W408AS,512字节的RAM,8K FLASH
//晶振频率:11.0592MHz
//波特率:115200

#include <STC15F2K60S2.H>
#include "intrins.h"
//#include "stdio.h"

bit busy;
//#define     FOSC    11059200UL
//#define     BAUD    115200

//sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7


void Delay500ms();
void UartInit(void);        //115200bps@11.0592MHz
void SendData(unsigned char dat);
void SendString(char *s);

void main()

    P1M0 = 0x00;
    P1M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
//	ACC = P_SW1;
//    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
//    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
    UartInit();
	Delay500ms();
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");

    while (1)
    
        P17 = 0x01;
        Delay500ms();
        P17 = 0x00;
        Delay500ms();
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");
    



void UartInit(void)     //115200bps@11.0592MHz

	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xFE;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
    ES = 1; //使能串口中断
    EA = 1;


/*----------------------------
        UART 中断服务程序
-----------------------------*/

void Uart() interrupt 4

    if (RI)
    
        RI = 0;                 //清除RI位
    
    if (TI)
    
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    


/*----------------------------
发送串口数据
----------------------------*/
void SendData(unsigned char dat)


		while (busy);               //等待前面的数据发送完成
    ACC = dat;                  //获取校验位P (PSW.0)
		busy = 1;
    SBUF = ACC;                 //写数据到UART数据寄存器



/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)

    while (*s)                  //检测字符串结束标志
    
        SendData(*s++);         //发送当前字符
    



void Delay500ms()       //@11.0592MHz

    unsigned char i, j, k;
    _nop_();
    _nop_();
    i = 22;
    j = 36;
    k = 227;
    do
    
        do
        
            while (--k);
        
        while (--j);
    
    while (--i);




🌼串口配置模式4

开启串口中断情况下,使用printf函数输出调试信息,可以实现接收串口数据(接收部分需要代码完善)。

//STC15W408AS,512字节的RAM,8K FLASH
//晶振频率:11.0592MHz
//波特率:115200

#include <STC15F2K60S2.H>
#include "intrins.h"
#include "stdio.h"

bit busy;
//#define     FOSC    11059200UL
//#define     BAUD    115200

//sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7


void Delay500ms();
void UartInit(void);        //115200bps@11.0592MHz
void SendData(unsigned char dat);
void SendString(char *s);

void main()

    P1M0 = 0x00;
    P1M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
//	ACC = P_SW1;
//    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
//    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
    UartInit();
	Delay500ms();
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");

    while (1)
    
        P17 = 0x01;
        Delay500ms();
        P17 = 0x00;
        Delay500ms();
        printf("Hello World \\r\\n");
//	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");
    



void UartInit(void)     //115200bps@11.0592MHz

	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xFE;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
	  TI = 1;         // 很关键,使用printf函数时必须有此命令
    ES = 1; //使能串口中断
    EA = 1;


/*----------------------------
        UART 中断服务程序
-----------------------------*/

void Uart() interrupt 4

    if (RI)
    
        RI = 0;                 //清除RI位
    
    if (TI)
    
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    


/*----------------------------
发送串口数据
----------------------------*/
void SendData(unsigned char dat)


	while (busy);               //等待前面的数据发送完成
    ACC = dat;                  //获取校验位P (PSW.0)
	 busy = 1;
    SBUF = ACC;                 //写数据到UART数据寄存器


char putchar(char dat)

    SendData(dat);
    return dat;

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)

    while (*s)                  //检测字符串结束标志
    
        SendData(*s++);         //发送当前字符
    



void Delay500ms()       //@11.0592MHz

    unsigned char i, j, k;
    _nop_();
    _nop_();
    i = 22;
    j = 36;
    k = 227;
    do
    
        do
        
            while (--k);
        
        while (--j);
    
    while (--i);




以上是关于STC8051与CC2530单片机有撒不同的主要内容,如果未能解决你的问题,请参考以下文章

cc2530f256是STM32单片机的一款吗

如何使用串口调试工具收发cc2530串口数据?

CC2530 比一般的单片机好在哪?

cc2530属于啥单片机

8051单片机实战分析(以STC89C52RC为例) | 10 - 外部中断的使用

CC2530开发模块与51单片机如何实现串口通信