qq_52393609 2022-05-11 00:36 采纳率: 66.7%
浏览 115
已结题

单片机实训问题,编写驱动程序,使用仿真解决一些问题,代码无报错但仿真无法实现功能

问题遇到的现象和发生背景

本人51单片机初学者一枚,最近正在做相关的实训,然后问题在下面,代码自己已经纯原创编出来了,并且无报错,但是仿真实现不了相关功能,求hxd帮我看看问题出现在哪里,并且仿真图P1口不知道为什么全都没有电流

这里是题目:
(1)当未按下任何按键时,实现自己的学号动态扫描显示;
(2)当按下Key1时,启动定时器0,并设置定时方式1,并通过IO口输出1000Hz,并采用示波器观察结果;
(3)当按下Key2时,启动定时器1,并设置计数方式1,并采用7段数码管进行显示计数个数(按键方式输入);
(4)当按下Key3时,关闭所有定时器。
(5)请提供硬件分配表格,并绘制电路图。

问题相关代码,请勿粘贴截图
#include <REGX51.H>
 
unsigned char code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code table2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0XFE};
unsigned char code xuehao[]={0x66,0x5b,0x3f,0x3f,0x66,0x4f,0x3f,0x7d};
 
sbit DU=P0;
sbit WE=P2;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^2;
sbit DA=P1^7;
sbit MA=P1;
 
void delay(unsigned int t)
{       
    unsigned int j=0;
    for(;t>0;t--)
        for(j=0;j<125;j++);
}
 

void timer0()interrupt 1//定时中断1
{     
    DA=!DA;
    TH0=0Xfe;                     //题(2)示波器显示方波
    TL0=0X0c;
}
 

void timer1()interrupt 3//定时中断2
{        
    TH0=0XFC;
    TL0=0X18;
    if(k1==0)
    {
     delay(10);
        if(k1==0)
        {
            while(1)
            {
             int i;                             //题(3)计数
             i++;
             MA=table1[i];
            }
        }
    }
}


wbzd1() interrupt 0//外部中断1
{
TMOD=0x11;
TH0=0Xfe;
TL0=0X0c;
TH1=0XFC;
TL1=0X18;
TR0=TR1=1;
ET0=ET1=1;
EA=1;

if(k1==0)
    {
        delay(10);
        if(k1==0)
        {
            IT0=1;                             //打开定时中断1
          EX0=1;
        }
    }


if(k2==0)
    {
    delay(10);
    if(k2==0)
        {
        IT1=1;                                    //打开定时中断2
        EX1=1;
        }
    }
}
 
 
wbzd2() interrupt 2//外部中断2
{
      EA=0;                                       //题(4)关闭所有定时器
}
 

 void int0()//执行外部中断1
{
  IT0=1;
  EA=1;
  EX0=1;
 }
 

void int1()//执行外部中断2
{ 
  IT1=1;
  EA=1;
  EX1=1;
 }
 
 
void main()
{
     while(1)
         {
      int i;
      for(i=0;i<=8;i++)
             {
       P0=xuehao[i];
       P2=table2[i];                              //题(1)学号显示
       delay(500);
       if(k1==0|k2==0)
             {
        int0();
                }
        if(k3==0)
            {
        int1();
      }
    }
  }
}



运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果

仿真实现题目功能

  • 写回答

2条回答 默认 最新

  • 智者知已应修善业 2022-05-11 08:21
    关注

    如果整理书写格式就会发现不少问题解决不少问题,乱用无限循环是一切错误根源,正确是除了主函数内有一个无限循环外,其它循环都必须是有限循环才对,另外变量声明必须在函数开头而不是临时想在哪用就在哪声明是不同其它高级编程语言格式的.

    #include <REGX51.H>
     
    unsigned char code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    unsigned char code table2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0XFE};
    unsigned char code xuehao[]={0x66,0x5b,0x3f,0x3f,0x66,0x4f,0x3f,0x7d};
     
    sbit DU=P0;
    sbit WE=P2;
    sbit k1=P3^4;
    sbit k2=P3^5;
    sbit k3=P3^2;
    sbit DA=P1^7;
    sbit MA=P1;
     
    void delay(unsigned int t)
    {       
        unsigned int j=0;
        for(;t>0;t--)
            for(j=0;j<125;j++);
    }
     
    void timer0()interrupt 1//定时中断1
    {     
        DA=!DA;
        TH0=0Xfe;
        TL0=0X0c;
    }
     
    void timer1()interrupt 3//定时中断2
    {        
        TH0=0XFC;
        TL0=0X18;
        if(k1==0)
        {
         delay(10);
            if(k1==0)
            {
                while(1)
                {
                 int i;
                    i++;
                    MA=table1[i];
                }
            }
        }
    }
     
    wbzd1() interrupt 0//外部中断1
    {
    if(k1==0)
        {
            delay(10);
            if(k1==0)
            {
           TMOD=0X01;        //执行定时中断1   
           TH0=0Xfe;
           TL0=0X0c;
           ET0=1;
           TR0=1;
           do{}while(1);
            }
        }
    }
     
    if(k2==0)
    {
        delay(10);
        if(k2==0)
        {
          TMOD=0X01;             //执行定时中断2
          TH1=0XFC;
          TL1=0X18; 
          ET1=1;
          TR1=1;
        }
    }
     
    wbzd2() interrupt 2//外部中断2
    {
          EA=0;
    }
     
     void int0()//执行外部中断1
    {
      IT0=1;
      EA=1;
      EX0=1;
     }
     
    void int1()//执行外部中断2
    { 
      IT1=1;
      EA=1;
      EX1=1;
     }
     
     
    void main()
    {
         while(1)
             {
          int i;
          for(i=0;i<=8;i++)
                 {
           P0=xuehao[i];
           P2=table2[i];
           delay(500);
           if(k1==0|k2==0)
                 {
            int0();
                    }
            if(k3==0)
                {
            int1();
          }
        }
      }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月19日
  • 已采纳回答 5月11日
  • 修改了问题 5月11日
  • 修改了问题 5月11日
  • 展开全部

悬赏问题

  • ¥15 关于#Mybatis#的问题:怎么办重复数据如下"KSDM":37,"KSMC":"呼吸内科门诊","ksdm":37,"ksmc":"呼吸内科门诊"xml文件填写
  • ¥40 servlet的web程序部署出错
  • ¥50 activiti 新建流程系列问题
  • ¥50 为什么我版本升级之后运行速度变慢5倍??
  • ¥15 如何在gazebo中加载机械臂和机械手
  • ¥15 纯运放实现隔离采样方案设计
  • ¥20 easyconnect无法连接后缀带.com的网站,一直显示找不到服务器ip地址,但是带有数字的网站又是可以连接上的,如何解决
  • ¥15 电脑开机过商标后就直接这样,求解各位
  • ¥15 mysql , 用自己创建的本地主机和用户名 登录不上
  • ¥15 关于#web项目#的问题,请各位专家解答!