51单片机串行通信程序c语言

//利用51单片机的串口实现双机之间的通信,具体地址依据使用的开发板做修改。
#include "reg51.h"

#define uchar unsigned char
#define uint unsigned int
#define XBYTE ((unsigned char volatile xdata *) 0)
#define DATA8279 XBYTE[0x8000] //定义8279数据口
#define STATUS8279 XBYTE [0x8001]//定义8279状态
#define CTRL8279 XBYTE [0x8001]//定义8279控制口

uchar num,readflag=0;

uint keyval; //定义键内码传递参数
static uint code Convert[] = { //按键的显示值
0x06,0x5B,0x4F,0x77,
0x66,0x6D,0x7D,0x7C,
0x07,0x7F,0x6F,0x39,
0x79,0x3F,0x71,0x5E};
uint key_flag=0,keynum;

void init_8279()
{
CTRL8279=0xd1; /* clear RAM */
while (STATUS8279 & 0x80) /* wait till RAM is clear */
{
}
CTRL8279=0x20 | 20; /*11.0592MHz/6/20=92.16kHz 8279 clock */
CTRL8279=(0x00)|0;//(0x10<<3) | 0 ;/* 8x8字符显示,右入; 编码扫描键盘,双键锁定 */

EX0=1; //开外部中断0
IT0=1; //外部中断0选用下降沿
}

void keyboard_int() interrupt 0 /* Keyboard Interrup 外部中断器0*/
{
uchar s;
s=STATUS8279;
if(s & 0x0f) //如果FIFO RAM 满8个数据
{
CTRL8279=0x40; //cpu读取键输入数据
keyval=DATA8279; //key为读出的键值
s=((keyval & 0x18)>>1) | (keyval & 0x03); //计算其在数组里的值
keynum=s;
key_flag=1;
}
}

void init_comm() //串口通信初始化
{
SCON = 0x50 ; //UART为模式1,8位数据,允许接收 0101 0000
TMOD |= 0x20 ; //定时器1为模式2,8位自动重装 0010 0000
PCON |= 0x00 ; //SMOD=0;
TH1 = 0xFD ; //Baudrate:9600 fosc="11".0592MHz
TL1 = 0xFD ;
ES=1; //ES=1(串行口中断允许位)
EA=1;
TR1 = 1 ; // 定时器1启动
TI=0; //开启发送
}

void delay(int i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--) ;

}

void sentdata()
{

SBUF=Convert[keynum]; //给SBUF赋按键值
while(TI==0)
{
;
}
//for(;TI==0;);
TI=0;
}

void recieve_comm() interrupt 4
{
if(RI==1)
{
RI=0;
num=SBUF;
DATA8279=num;
}
}

void main()
{
init_8279();
init_comm();
while(1)
{
if(key_flag==1)
{
key_flag=0;
sentdata();
}
}

}

相关文档
最新文档