1.8串行通信

串行和并行

Paste_Image.png

异步和同步



a = SBUF SBUF发送
SBUF=a SBUF接受 计算机接受

串行口控制寄存器SCON

串口中断

波特率


不用软件重装,可以定时更短的时间

举个例子:
要9600的波特率 方式1


初值设为FD

流程

例子:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar num;
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=114;y>0;y--);
}

void UART_init()
{
    TMOD=0x20; //定时器1,工作模式2,八位自动重装
    TH1 = 0xfd;
    TL1 = 0xfd;
    TR1 = 1;
    SM0 = 0;
    SM1 = 1; //工作方式1 10位异步
    REN = 1; //串口允许接受
    
}

int main()
{
    UART_init();
    while(1)
    {   
        while(1)
        {
            while(!RI);
            P1 = SBUF;
            RI = 0;
        }
        //SBUF = num; //    串口的发送电脑接受
        /*while(!TI); //查询是否发送完
        TI = 0;
        num++;//从0-256
        delay(500);  */
            
    }
    return 0;
}

注意发送和接受是真对板子的
我们写的程序,RI检测是否板子接受完
P1= SBUF P1接受SBUF的数据

中断写法:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar num;

void UART_init()
{
    TMOD=0x20; //定时器1,工作模式2,八位自动重装
    TH1 = 0xfd;
    TL1 = 0xfd;
    TR1 = 1;   //启动T1计时器
    SM0 = 0;
    SM1 = 1; //工作方式1 10位异步
    REN = 1; //串口允许接受

    EA = 1;
    ES = 1; //开总中断和串口中断
    
}

int main()
{
    UART_init();
    while(1)
    {       
    }
    return 0;
}

void UART() interrupt 4
{
    //内部查询优先级是4
    if(RI)
    {
        num = SBUF;     //  接受SBUF
        P1 = SBUF;    //点亮流水灯
        num++;  //+1
        RI = 0; //将RI置0
        SBUF = num; //发送num
        while(!TI)       
        {
            TI = 0;
        }
    }
}

功能发送一个数 , 加1后返回来

Paste_Image.png

SBUF = x 将单片机中的数据x 发送到SBUF

x = SBUF 单片机接受SBUF

练习:

1. 以4800bps从计算机发任意一字节数据,通过数码管以十进制显示

的形式显示出来。

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar x;
sbit we = P2^7;
sbit du = P2^6;
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=114;y>0;y--);
}

uchar code leddata[]={ 
 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                0x00  //自定义
 
                         };

void UART_init() 
{
    TMOD = 0x20;
    TH1 = 0xfa;
    TL1 = 0xfa;
    TR1 = 1;
    SM0 = 0;
    SM1 = 1;
    REN = 1;

}

void display(uchar num)
{
    uchar bai,shi,ge;
    bai = num / 100; //求模
    shi = num % 100 / 10; //求余100后求出有多少个10 
    ge  = num % 10; //求余
    
    P0 = 0xff;  //清除断码
    we = 1;
    P0 = 0xfe;  //点亮第一位数码管
    we = 0;

    du = 1;
    P0 = leddata[bai];  //显示百位
    du = 0;
    delay(1);

    P0 = 0xff;  //清除断码
    we = 1;
    P0 = 0xfd;//点亮第二位数码管
    we = 0;

    du = 1;
    P0 = leddata[shi];  //显示十位
    du = 0;
    delay(1);

    P0 = 0xff;  //清除断码
    we = 1;
    P0 = 0xfb;//点亮第三位数码管
    we = 0;

    du = 1;
    P0 = leddata[ge];  //显示各位
    du = 0;
    delay(1);
}

int main()
{
    UART_init();
    while(1)
    {
        if(RI)
        {
            RI=0;
        }
        x = SBUF;
        display(x);
    }
}

2. 把矩阵键盘的键值以2400bps上传到计算机串口助手

#include <reg52.h>

#define uchar unsigned char
#define uint  unsigned int

/*1毫秒延时函数*/
void delay(uint z)  
{
    uint x,y;
    for(x = z; x > 0; x--)
        for(y = 114; y > 0 ; y--);
}

/*
串口初始化函数
工作模式1 10位异步收发 发送速率2400bps
*/
void UART_init()  
{
    TMOD = 0x20;    //T1工作模式2  8位自动重装
    TH1 = 0xf4;
    TL1 = 0xf4;     //比特率2400,计算公式256-11059200/2400/32/12
    TR1 = 1;        //启动T1定时器
    SM0 = 0;
    SM1 = 1;        //串口工作方式1 10位异步
//  REN = 1;        //串口允许接收
}

/*
    4*4矩阵键盘扫描函数
    带返回值,返回键值码
*/
uchar KeyScan()
{
    uchar cord_l,cord_h;//声明列线和行线的值的储存变量
    P3 = 0xf0;//1111 0000
    if( (P3 & 0xf0) != 0xf0)//判断是否有按键按下
    {
        delay(5);//软件消抖
        if( (P3 & 0xf0) != 0xf0)//判断是否有按键按下
        {
              cord_l = P3 & 0xf0;// 储存列线值
              P3 = cord_l | 0x0f;
              cord_h = P3 & 0x0f;// 储存行线值
              while( (P3 & 0x0f) != 0x0f );//松手检测
              return (cord_l + cord_h);//返回键值码
        }   
    }
        
}

/*
    4*4矩阵键盘键值码处理函数
    返回转换后的键值码
*/
uchar KeyPro()
{
    uchar key_value; //存放转换后的按键值
    switch( KeyScan() )
    {
        //第一行键值码
        case 0xee: key_value = 0x01;        break;
        case 0xde: key_value = 0x02;        break;
        case 0xbe: key_value = 0x03;        break;
        case 0x7e: key_value = 0x04;        break;
        
        //第二行键值码
        case 0xed: key_value = 0x05;        break;
        case 0xdd: key_value = 0x06;        break;
        case 0xbd: key_value = 0x07;        break;
        case 0x7d: key_value = 0x08;        break;

        //第三行键值码
        case 0xeb: key_value = 0x09;        break;
        case 0xdb: key_value = 0x0a;        break;
        case 0xbb: key_value = 0x0b;        break;
        case 0x7b: key_value = 0x0c;        break;

        //第四行键值码
        case 0xe7: key_value = 0x0d;        break;
        case 0xd7: key_value = 0x0e;        break;
        case 0xb7: key_value = 0x0f;        break;
    case 0x77: key_value = 0x10;        break;
    }
    return (key_value);//返回转换后的键值码  
}


void main()
{
    UART_init();//串口初始化
    while(1)
    {
        SBUF = KeyPro();//调用带返回值的键值码转换函数,把转换后的键值码送入发送SBUF
        while(!TI);     //检测是否发送完毕
        TI = 0;         //清楚发送完毕标志位,已便于下次发送
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容