找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机串中通讯问题

查看数: 2048 | 评论数: 5 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-2-18 08:52

正文摘要:

大神们真心请教,搞不明白,,按健按了,1或2或3,在把这数值发给电脑串口,,串口接收显示的是01 00或  01 00,为什么呀,他发了几次? #include <reg51.h> #define led P2 #define shumaguan P0 # ...

回复

ID:477863 发表于 2019-2-18 19:49
串口工具接收选ASCII
ID:338762 发表于 2019-2-18 18:15
这个程序不是你自己写的吧?你定义的是什么
ID:213173 发表于 2019-2-18 13:55
改这样试试

#include <reg51.h>
#define led P2
#define shumaguan P0
#define anjian P1
sbit ls138A= P3^2;
sbit ls138B= P3^3;
sbit ls138C= P3^4;
unsigned char code shuzu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 0--9数字
unsigned char key;//
bit biaozhi=0;

void chuankou()        //4800bps@12.000MHz
{
        PCON=0X80;//波特率加倍
        SCON=0X50;//设置为工作方式1
        TMOD=0X20;//设置计数器工作方式2
        TH1=0XF3; //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
//        ES=1;     //打开接收中断
//        EA=1;     //打开总中断
        TR1=1;
}

void ls138shuju()   //数码管动态显示函数   
{
        static unsigned char i=0;
        static unsigned int count=0;
        if(++count>=100)
        {
                count=0;
                shumaguan=0x00;//消隐
                switch(i)
                {
                        case 0: ls138A=0;ls138B=0;ls138C=0;shumaguan=shuzu[key/10];i++;break;
                        case 1: ls138A=1;ls138B=0;ls138C=0;shumaguan=shuzu[key%10];i=0;break;
        /*
                        case 2: ls138A=0;ls138B=1;ls138C=0;shumaguan=shuzu[];i++;break;
                        case 3: ls138A=1;ls138B=1;ls138C=0;shumaguan=shuzu[];i++;break;
                        case 4: ls138A=0;ls138B=0;ls138C=1;shumaguan=shuzu[];i++;break;
                        case 5: ls138A=1;ls138B=0;ls138C=1;shumaguan=shuzu[];i++;break;
                        case 6: ls138A=0;ls138B=1;ls138C=1;shumaguan=shuzu[];i++;break;
                        case 7: ls138A=1;ls138B=1;ls138C=1;shumaguan=shuzu[];i=0;break;
        */
                }
        }
}
/*
void yanshi (unsigned int u)
{
        while(u--);
}
*/
void keyscan()                                        //按键扫描程序
{
        static bit sign=0;                        //按键自锁标志
        static unsigned int count=0;        //消抖计数变量                       
        unsigned char num=0;                                //临时变量
        anjian=0xf0;                                        //赋值anjian 1111 0000
        if(anjian!=0xf0)                                //检测有按键按下
        {
                count++;                                //消抖计数
                if((count>=500)&&(sign==0))//100~1000,根据主循环周期调整约10~20ms
                {                       
                        sign=1;                                //按键自锁标志置1
                        num=anjian;                                //保存anjian值xxxx 0000,x为0或1
                        num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
                        anjian=num;                                //赋值anjian xxxx 1111
                        num=anjian;                                //保存anjian值xxxx xxxx
                        switch(num)
                        {
                                case 0xee: key= 1; break;
                                case 0xde: key= 2; break;
                                case 0xbe: key= 3; break;
                                case 0x7e: key= 4; break;
                                case 0xed: key= 5; break;
                                case 0xdd: key= 6; break;
                                case 0xbd: key= 7; break;
                                case 0x7d: key= 8; break;
                                case 0xeb: key= 9; break;
                                case 0xdb: key=10; break;
                                case 0xbb: key=11; break;
                                case 0x7b: key=12; break;
                                case 0xe7: key=13; break;
                                case 0xd7: key=14; break;
                                case 0xb7: key=15; break;
                                case 0x77: key=16; break;
                        }
                        biaozhi=1;
                }
        }
        else                                                //键抬起
        {
                sign=0;                                //按键自锁标志清0
                count=0;                                //消抖计数清0
        }
}
void main()
{
        chuankou();        //初始化串口
        while(1)
        {
                keyscan();//按键扫描
                ls138shuju();//2位数码管显示键值
                led=~key;                //8个LED显示键值
                if(biaozhi==1)//键值通过串口发送给电脑
                {
                        biaozhi=0;
                        SBUF=key;  
                        while(!TI);
                        TI=0;
                }
        }
}
/*
void RX() interrupt 4
{
        RI=0;
        c=SBUF;  //单片机接收电脑发来的值,
        biaozhi=1;
}*/
ID:64817 发表于 2019-2-18 13:21
iofree 发表于 2019-2-18 11:33
图片上12345,串口不是把键值都发出给PC了吗?看起来工作挺正常

我是这里不明白,,按1 按健,把1发给电脑串口,电脑收到是01 00,,不知道 这个如何理解,,,再比如两个单片机学习板直接通讯,一个板子发按键1值,那么另一个板子收01,,还是收01 00.,,,,谢
ID:474677 发表于 2019-2-18 11:33
图片上12345,串口不是把键值都发出给PC了吗?看起来工作挺正常

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表