📄 pc51.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 + -