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 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了