串口通讯

/*
                                  串口发送端(还需要接受端)
程序说明:每按一下按钮,P2.0端口的LED闪烁一次,数码管加一,当加到
9时,再按一下就重复为零

知识点:外部中断1
        定时器1
寄存器:中断允许寄存器IE,定时器控制寄存器TCON,定时器方式寄存器TMOD,串口控制寄存器SCON
*/
#include<reg52.h>
unsigned int i,j; 
int duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//在数码管显示的0~9数字的十六进制代码
/*
//步骤一:串口配置
//步骤二:波特率配置
//步骤三:写数据
*/
sbit LED = P2^0;//端口位声明
void main()//主函数
{
    LED = 0;
    EX1 = 1;//外部中断1分开关
    IT1 = 1;//触发方式:下降沿
    PX1 = 1;//设置为高优先级
    
    //步骤一:波特率配置,由定时器1的益处率决定
    TMOD = 0x20;//0010 0000 = 0x20,定时器1设置为工作方式2,8位自动装载的定时器
    TH1 = 0xF4;//初值
    TL1 = 0xF4;//波特率4800
    ET1 = 1;//定时器1允许分开关
    TR1 = 1;//启动定时器

    
    //设置串口工作方式
    SCON = 0x50;//等同于TMOD,方式一,允许接收 0101 0000
    //PCON = 0x00;
    //TI = 0;发送中断标志位
    //RI = 0;接收中断标志位
    ES = 1;//IE寄存器第四位,串口中断允许位
    EA = 1;//外部中断总开关
    while(1);
}

void button() interrupt 2 //2为中断号,
{ 
    //当发生中断时LED灯从灭到亮
    LED = ~LED;//中断一次
    for(j=0;j<33000;j++);//延时,让亮一段时间
    LED = ~LED;//再灭
    i++;
    SBUF = duan[i];//依次把数组的数字送到SBUF
    if(i == 9)//判断,i=9时就回到0,依次循环
        i = 0;
    /*
    这些是每中断一次就让数码管从0到9展现
    for(i=0;i<=9;i++)
    {
        SBUF = duan[i];//把数据发送到串口
        for(j=0;j<30000;j++);
    }
    */    
}
#include <reg52.h>
#define OUT P1//把串口接收的数据发送到P1端口
/*
//步骤一:串口配置
//步骤二:波特率配置
//步骤三:写数据
*/
void main()
{
    //步骤一:波特率配置,由定时器1的益处率决定
    TMOD = 0x20;//0010 0000 = 0x20,定时器1设置为工作方式2,8位自动装载的定时器
    TH1 = 0xF4;//初值
    TL1 = 0xF4;//波特率4800
    ET1 = 1;//定时器1允许分开关
    TR1 = 1;//启动定时器

    
    //设置串口工作方式
    SCON = 0x50;//等同于TMOD,方式一,允许接收 0101 0000
    PCON = 0x00;
    TI = 0;//发送中断标志位,在方式0中,当串口发送完8位数据时,由硬件配置1,表明发送中断有请求;注意:该位必须由软件来清0
    RI = 0;//接收中断标志位,同上
    ES = 1;//IE寄存器第四位,串口中断允许位
    EA = 1;//外部中断总开关
    while(1);
}

void receive() interrupt 4 //4是串口中断号
{
    EA = 0;//关闭中断总开关,防止有其他中断发生进来
    OUT = SBUF;//把串口接收的数据发送到P1端口
    RI = 0;//RI是接受中断标志位,执行中断后要自动清0
    EA = 1;
}

原文地址:https://www.cnblogs.com/kinson/p/6913763.html