📄 max232.c
字号:
/*****************************************************************************
MCS8051-III学习板演示程序
(c) Copyright 2007-2007,广州恒芯电子
All Rights Reserved
*****************************************************************************/
/*****************************************************************************
程序说明
名称: MCS8051-III学习板演示程序(MAX232测试)
功能: 从串口接收一个字节,并在数码管上显示,或读入键盘值从串口发送出去(波特率为1200)
版本:2007-07-01
*****************************************************************************/
/*****************************************************************************
硬件说明
单片机: 兼容MCS-51单片机/STC89C51
晶振频率: 12MHz
*****************************************************************************/
#include "regx52.h"
/****************************************************************************
说明: 程序预定义
*****************************************************************************/
#define LED7A_CTRL P1_7/*数码管第一位控制引脚(0为有效,1为无效)*/
#define LED7B_CTRL P1_6/*数码管第二位控制引脚(0为有效,1为无效)*/
#define LED7C_CTRL P1_5/*数码管第三位控制引脚(0为有效,1为无效)*/
#define LED7D_CTRL P1_4/*数码管第四位控制引脚(0为有效,1为无效)*/
#define LED7_STATUS P0/*数码管状态引脚(0为有效,1为无效)*/
#define KEY_STATUS P2/*键盘引脚*/
/****************************************************************************
说明: 变量定义
*****************************************************************************/
code unsigned char m_ucLedTab[]=
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
0x88, 0x83, 0xC6, 0xa1 ,0x86 ,0x8e, 0xff
};/*数码管十六进制编码表*/
unsigned char code m_ucKeyTab[]=
{
0xde, 0xe7, 0xd7, 0xb7, 0xeb, 0xdb, 0xbb, 0xed, 0xdd, 0xbd,
0x77, 0x7b, 0x7d, 0x7e, 0xbe, 0xee
};/*键盘十六进制编码表*/
unsigned char m_ucLedBuf[4];/*七段数码管显示值缓存*/
/****************************************************************************
名称: KeyCheck()
说明: 键盘检测
参数: 无
返回: 键盘码值,若无键按下则返回16
*****************************************************************************/
unsigned char KeyCheck();
/****************************************************************************
名称: Led7Scan()
说明: 数码管动态扫描处理程序
参数: 无
返回: 无
*****************************************************************************/
void Led7Scan();
/****************************************************************************
名称: Uart()
说明: 从串口接收一个字节,在数码管上显示
参数: 无
返回: 无
*****************************************************************************/
void Uart();
/*****************************************************************************
程序开始
*****************************************************************************/
void main()
{
unsigned char ucKey;
/*T0中断设定*/
TMOD=0x21;/*使用T0:GATE=0,C/T=0(定时),M1 M0=01(工作方式1)*/
TH0=0xec;/*定时时间 50Hz/4 计算公式:10000H - (5 x 1000) = EC78H*/
TL0=0x78;
TH1=0xe6;/*波特率为1200*/
TL1=0xe6;
ET0=1;/*允许T0中断*/
TR0=1;/*使T0工作*/
TR1=1;
SCON=0x50;
ES=1;
EA=1;/*总中断开启*/
m_ucLedBuf[0]=0;
m_ucLedBuf[1]=16;
m_ucLedBuf[2]=0;
m_ucLedBuf[3]=0;
while(1)
{
ucKey=KeyCheck();/*获得键盘值*/
if(ucKey!=16)/*判断是否有键按下,若有则将它在数码管显示出来*/
{
m_ucLedBuf[0]=ucKey;/*将键盘值在数码管上显示*/
EA=0;
SBUF=ucKey;/*将键盘值从串口发送出去*/
while(!TI);
TI=0;
EA=1;
}
}
}
/*****************************************************************************
名称: Interrupt1Handler
说明: T0中断入口
参数: 无
返回 :无
*****************************************************************************/
void Interrupt1Handler() interrupt 1
{
Led7Scan(); /*数码管动态扫描*/
TH0=0xec; /*重新设置T0定时值*/
TL0=0x78;
}
/*****************************************************************************
名称: Interrupt4Handler
说明: UART中断入口
参数: 无
返回 :无
*****************************************************************************/
void Interrupt4Handler() interrupt 4
{
Uart();
}
/****************************************************************************
名称: Led7Scan()
说明: 数码管动态扫描处理程序
参数: 无
返回: 无
*****************************************************************************/
void Led7Scan()
{
static unsigned char a=0;
switch(a) /*判断数码管动态扫描值*/
{
case 0: /*处理数码管第一位*/
LED7D_CTRL=1; /*设置数码管第四位为无效*/
LED7A_CTRL=0; /*设置数码管第一位位有效*/
break;
case 1: /*处理数码管第二位*/
LED7A_CTRL=1; /*设置数码管第一位为无效*/
LED7B_CTRL=0; /*设置数码管第二位位有效*/
break;
case 2: /*处理数码管第三位*/
LED7B_CTRL=1; /*设置数码管第二位为无效*/
LED7C_CTRL=0; /*设置数码管第三位位有效*/
break;
case 3: /*处理数码管第四位*/
LED7C_CTRL=1; /*设置数码管第三位为无效*/
LED7D_CTRL=0; /*设置数码管第四位位有效*/
break;
}
LED7_STATUS=m_ucLedTab[m_ucLedBuf[a]]; /*将显示码送数码管状态引脚*/
a++; /*数码管动态扫描值加1,若该值4则置为0*/
if(a>3)
a=0;
}
/****************************************************************************
名称: KeyCheck()
说明: 键盘检测
参数: 无
返回: 键盘码值,若无键按下则返回16
*****************************************************************************/
unsigned char KeyCheck()
{
unsigned char a,b;
for(a=0;a<4;a++)/*循环4次*/
{
switch(a)/*改变键盘扫描码*/
{
case 0:KEY_STATUS=0xef;break;
case 1:KEY_STATUS=0xdf;break;
case 2:KEY_STATUS=0xbf;break;
case 3:KEY_STATUS=0x7f;break;
};
b=KEY_STATUS;
if((b&0x0f)!=0x0f)/*判断是否有按键按下*/
{
for(a=0;a<16;a++)/*根据键盘码判断那个键按下*/
{
if(b==m_ucKeyTab[a])
{
return a;
}
}
}
}
return 16;
}
/****************************************************************************
名称: Uart()
说明: 从串口接收一个字节,在七段数码管上显示
参数: 无
返回: 无
*****************************************************************************/
void Uart()
{
EA=0;
while(RI==0);/*串口接收一个字节,并在七段数码管上显示*/
RI=0;
m_ucLedBuf[2]=SBUF&0xf0;
m_ucLedBuf[3]=SBUF&0x0f;
EA=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -