找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1962|回复: 5
打印 上一主题 下一主题
收起左侧

单片机串口通信 矩阵键盘的程序为什么一直调试不出来 仿真,好像通信不上

[复制链接]
跳转到指定楼层
楼主
ID:744060 发表于 2020-5-5 19:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在线等,挺急的。郭天祥 串口通信 矩阵键盘的程序为什么一直调试不出来 proteus仿真,好像通信不上一样,网上有说到其程序不一定正确,也找了些网友改过的程序,都没有调试出来,要么就显示888888,结果试过很多种,但无一例外,甲机不管按下哪个按键,乙机显示都毫无改变。   这个程序改了几天了都没弄好-- 请求大佬支援
原程序是甲机按下按键,乙机就显示,具体接了什么显示,有几个显示我不确定。我想在甲机发送6个数字,乙机有(6个连起来的数码管)7SEG MPX6 CA就显示这6个数,改了一点程序。对串口这块,试过其他例子有时也好像通讯不上,所以很迷。仿真的单片机12MHZ或11.0592MHZ都试过

单片机源程序如下:
  1. #include "reg51.h"//有74HC573锁存器 接收的乙机
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit dula=P2^6;//申明U1锁存器的锁存端
  5. sbit wela=P2^7;//申明U2锁存器的锁存端
  6. uchar code table[]=
  7. {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
  8.     0x77,0x7c,0x39,0x5e,0x79,0x71};
  9. uchar buffer[]={0x00,0x00,0x00,0x00,0x00,0x00};
  10. unsigned char i;
  11. void display(uchar num){
  12.     P0=table[num];dula=1;dula=0;}
  13. void main(){
  14.     TMOD=0;     //定时器T1工作于方式2
  15.     TH1=0xfd;
  16.     TL1=0xfd;
  17.      TR1=1;
  18.    REN=1;              //接收允许
  19.      SM0=0;SM1=1;                 //开串行口中断
  20.     ES=1;    EA=1;             //开总中断允许位   
  21. P0=0xc0;wela=1;wela=0;   
  22.      while(1);}
  23. void ser()interrupt 4
  24. {uchar a;
  25. EA=0;RI=0;buffer[i]=SBUF;a=buffer[i];i++;if(i==6) i=0;display(a);}
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:744060 发表于 2020-5-5 19:09 | 只看该作者
#include "reg51.h"//甲机 发送方
#define uchar unsigned char
#define uint unsigned int
    int key,num;
unsigned char code key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,
0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};         //键盘按键对应的扫描码表
void delay(uint xms)
    {uint i,j;for(i=xms;i>0;i--)
    for(j=110;j>0;j--);}   
void send(uchar key_num)
{SBUF=key_num;
    while(!TI); TI=0;}
void scan(){
    uchar temp,key;
    P2=0xfe;temp=P2;temp=temp&0xf0;
    if(temp!=0xf0){
        delay(5);temp=P2;temp=temp&0xf0;
        if(temp!=0xf0){temp=P2;
            switch(temp)
            {case 0xee:
                key=0;break;
            case 0xde:
                key=1;break;
                case 0xbe:
                key=2;break;
                    case 0x7e:
                key=3;break;}
            while(temp!=0xf0){temp=P2;temp=temp&0xf0;}
            send(key);}}
    P2=0xfd;temp=P2;temp=temp&0xf0;
            if(temp!=0xf0){delay(5);temp=P2;temp=temp&0xf0;
                if(temp!=0xf0){temp=P2;
                    switch(temp)
            {case 0xed:
                key=4;break;
            case 0xdd:
                key=5;break;
                case 0xbd:
                key=6;break;
                    case 0x7d:
                key=7;break;}
            while(temp!=0xf0){temp=P2;temp=temp&0xf0;}
            send(key);}}
            P2=0xfb;temp=P2;temp=temp&0xf0;if(temp!=0xf0){
                delay(5);temp=P2;temp=temp&0xf0;if(temp!=0xf0)
                {temp=P2;
                    switch(temp)
                {case 0xeb:
                key=8;break;
            case 0xdb:
                key=9;break;
                case 0xbb:
                key=10;break;
                    case 0x7b:
                key=11;break;}
                while(temp!=0xf0){temp=P2;temp=temp&0xf0;}
            send(key);}}
            P2=0xf7;temp=P2;temp=temp&0xf0;if(temp!=0xf0){
                delay(5);temp=P2;temp=temp&0xf0;if(temp!=0xf0)
                {temp=P2;
                    switch(temp)
                {case 0xe7:
                key=12;break;
            case 0xd7:
                key=13;break;
                case 0xb7:
                key=14;break;
                    case 0x77:
                key=15;break;}
                    while(temp!=0xf0){temp=P2;temp=temp&0xf0;}
            send(key);}}
        }

void main(){
    TMOD=0x20;     //定时器T1工作于方式2
    TH1=0xfd;
    TL1=0xfd;
     TR1=1;
   SCON=0x40;
REN=1;
    ES=1;                     //开串行口中断
EA=1;              //开总中断允许位        
     while(1){scan(); }}
回复

使用道具 举报

板凳
ID:732506 发表于 2020-5-6 00:26 | 只看该作者
这种两机联调的,要先把两边分开,确定是哪一边的问题才能修改程序。可以先用串口助手看甲发出什么信号是否正常,然后用串口助手向乙发送应由甲发送的信号看乙是否有反应,根据结果判断是哪一方的问题。如果仿真就用虚拟终端看串口输出,或将串口输出映射到虚拟串口,然后使用串口助手。
回复

使用道具 举报

地板
ID:462827 发表于 2020-5-6 11:32 | 只看该作者
你把仿真图跟全部的项目文件打包上来那还差不多,光眼看代码是调试不了的。
回复

使用道具 举报

5#
ID:744060 发表于 2020-5-6 19:53 | 只看该作者
好的,我马上上传
回复

使用道具 举报

6#
ID:744060 发表于 2020-5-6 19:57 | 只看该作者
proteus图之前换过几个P口试过

serial.rar

135.58 KB, 下载次数: 12

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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