⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.c

📁 这是本人调用small rtos51的函数来仿真写的基本代码
💻 C
字号:
/***********************************************
最后我自己发现的问题是因为我没有外部扩展RAM所以出错,
最后我将OS_Q_MEM_SEL为idata(即内部ram堆栈)
终于可以正确发送和接收
OS默认OS_Q_MEM_SEL为xdata,而你没扩展ram则会出错
****************************************************/

#include "config.h"

//uint8 ShowCase[5];                          //显示缓存,用来保存各个显示位的段码
//uint8 KeyBordData;
uint8 OS_Q_MEM_SEL NotUse _at_ 0x0000;      //指针的NULL为0,这个变量占用0地址避免出现有效的NULL指针
//uint8 OS_Q_MEM_SEL CommandData[16];         //给命令消息队列分配的队列空间
uint8 OS_Q_MEM_SEL SerialInData[16];        //给读串口消息队列分配的队列空间
//uint8 OS_Q_MEM_SEL SerialOutData[32];       //给写串口消息队列分配的队列空间

extern void Recuve(void);

//uint8 Recdata;//接收的数据

//bit RecFlag;


//单片机初始化		
void init(void)
{
	P1=P2=P3=0xff;
	P0=0x00;
	TMOD=0x01;			//T0工作于方式1
	SCON=0x50;			// UART_mode=1,即fs/32或者fs/64 ,REN=1[允许接收控制位]
	RCAP2H=0xff; 
	RCAP2L=0xdc;
	T2MOD=0;  
	T2CON=0x34;			// Set T2 to baud rate register					 //波特率发生器方式,溢出脉冲作串行口的发送接收时钟
	ET0=1;
	TH0=(65536-1000)/256;
	TL0=(65536-1000)%256;
	ES = 1;
	TR0=1;

    
}


//主程序初始化                          
void main(void)
{
    OSInit();
    init();
    //OSTaskCreate(Show, NULL, 0);
    OSTaskCreate(Recuve, NULL, 0);
	//OSQCreate(SerialInData,16);
    //OSTaskCreate(TimeSum, NULL, 3);
    while(1)
    {
        PCON = PCON | 0x01;                     /* CPU进入休眠状态 */
    }
}


void Recuve(void)
{
    uint8 data temp;                                   
    OSQCreate(SerialInData,16);                    
    while (1)
    {
	//OS_ENTER_CRITICAL();
	//OS_INT_ENTER();   //允许嵌套中断管理
	//OSQPend(&temp,SerialInData,0);  //一直等待队列消息呢
//用OSQPend和OSQAccept都可以	
if(OSQAccept(&temp,SerialInData)==OS_Q_OK)
{
		if(temp==0x01)P0=0xf0;//可以正常亮LED灯	
		else P0=0x0f; 

		//if(RecFlag)
		//{
		//RecFlag=0;
		SBUF = temp;
		while(TI==0);
		TI=0;
		//}
}

//OSIntExit();	  //退出嵌套中断管理
		//OS_EXIT_CRITICAL();
    }
}


  

//串口中断 
#pragma disable                                        /* 除非最高优先级中断,否则,必须加上这一句                 */
		
void comm(void) interrupt 4
{
	

	if (RI)
	{	//因为是接收中断,所以要加上OS_INT_ENTER(); 
        OS_INT_ENTER();   //允许嵌套中断管理
		RI = 0;
		//RecFlag=1;
		//Recdata=SBUF;
        OSQIntPost(SerialInData,SBUF);
        OSIntExit();	  //退出嵌套中断管理
		return;
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -