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

📄 pc51.c

📁 C51串口程序
💻 C
字号:
#include "reg52.h"

#define TimeLen 2000			// 定时器定时时间长度	

unsigned short  Loop_Num  ;		// 转动圈数
unsigned char	Led_Buf[4] ={1,2,3,4};	// 存放数码管显示的数
unsigned char	Led_Sel = 0 ;	// 动态扫描中选中的数码管号	

#define	LEDDAT_P	P0 			// 数码管数据管脚
#define	LEDSEL_P  	P2 		// 数码管使能选择管脚

#define LED_NUM		4			// 数码管个数
#define uint8  unsigned char
#define uint32 unsigned int
#define Baud   9600
#define fosc   11059200 

bit Tx_Flag ;     // 发送结束标志位 ,0:发送结束     1:正在发送
bit Rx_Flag ;     // 接收结束标志位 ,0:正在接收     1:接收完一条完整的指令
bit Rx_Start ;     // 接收到开始符



uint8 RxLen=0 ;



// 数码管数
code  uint8 LED_CODE[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf};
void InitCom( void );
// 定时器0初始
void  Time0Init(void)
{
  	TMOD= 0x01 ;
	TR0= 1 ;
	ET0= 1 ;
	EA= 1 ;
	TL0= ( 65536-TimeLen ) % 256 ;
	TH0= ( 65536-TimeLen ) / 256 ;
}
// 串口模块


//
// 协议 :  起始码 ($ ) + 长度码 (该字节后面的总长度)+ 数据 + 结束符(#)
//




void InitCom( void )
{

        uint32 temp ;

        SCON = 0x50 ;                   // 串口模式1,10位模式
         // T2 初始化
        T2CON = 0X34 ;
        PCON = 0 ;
        temp = fosc;
        temp = temp / 32 / Baud ;       // 获取波特率相应的计数值
        temp = 0xffff - temp ;
        RCAP2H = temp>>8 ;
        RCAP2L = temp&0xff ;

        ES = 1 ;                        // 启用串口中断
        Tx_Flag = 0  ;
        Rx_Start = 0 ;
        Rx_Flag = 0 ;
}

//extern unsigned char	Led_Buf[4] ;
uint8 bak_buf[4] ;
// 串口
void Com_Int( void ) interrupt 4
{
        uint8 temp ;

        if(RI)
        {
                RI = 0 ;
              P1  = SBUF ;
			/*	if( temp == '$')
				{
					Rx_Start = 1 ;	
                    RxLen = 0 ;               // 数据接收数组下标归零
                }
				else if( Rx_Start == 1 )*/
				//{
				//	bak_buf[ RxLen ] = temp ;
					//RxLen++ ;
					/*if( RxLen == 4 )
					{
						RxLen = 0 ;
						Rx_Start = 0 ;
						for( temp = 0 ; temp<4 ; temp++ ) Led_Buf[temp] = bak_buf[4] ;
					}
				}*/
	                  
        }
        /*if(TI)
        {
                TI = 0 ;
                Tx_Flag = 0 ;
        }*/
}



 // 每20毫秒调用 动态扫描
void timer0(void) interrupt 1
{

	TL0= ( 65536-TimeLen ) % 256 ;
	TH0= ( 65536-TimeLen ) / 256 ;
 
	LEDSEL_P = 0;
	LEDDAT_P = ~LED_CODE[Led_Buf[Led_Sel]] ;		// 动态扫描显示
	LEDSEL_P = 0x01 << Led_Sel ;
	Led_Sel++;
	if( Led_Sel == LED_NUM )Led_Sel=0;


}
main()
{
	Time0Init() ;
	InitCom() ;
	while(1);
}

⌨️ 快捷键说明

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