找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1532|回复: 7
收起左侧

好想有人给我解释一下这个单片机程序代码啊,顶不住了

[复制链接]
ID:1047868 发表于 2022-10-16 10:21 | 显示全部楼层 |阅读模式
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar ms=26,a,qiangda,flag2,xs=5,n=20;
sbit we1 = P2^1;
sbit we2 = P2^2;
sbit we3 = P2^3;
sbit we4 = P2^4;

sbit beep = P3^7;   


sbit zhuchi = P3^6;                  
        
sbit S1 = P1^0;                  
sbit S2 = P1^1;
sbit S3 = P1^2;
sbit S4 = P1^3;
sbit S5 = P1^4;
sbit S6 = P1^5;

sbit Sa = P1^6;         
sbit Sj = P1^7;         
sbit L1=P3^5;
uchar code tab[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

void delay(uint z);
void display();
void init();
void key();

void main()
{
        init();
        while(1)
        {
                display();
                key();
        }                                            
}
   void timer1() interrupt 3         
{
        TH1 = 0X4b;
        TL1 = 0Xfe;
        a++;
        if(a == 20 && qiangda == 1)                  
        {
                a = 0;
                ms--;
                if(ms == 0 && qiangda == 1)
                {                                
                        ms = 0;
                        TR1 = 0;
                        P0 = 0;
                    beep = 1;
                        qiangda = 0;
                        L1=1;
                        delay(20000);
                        L1=0;
                }
        }
        if(a == 20 && flag2 == 1)
        {
                a = 0;
                ms--;
                if(ms == 0)
                {
                        ms = 0;
                        TR1 = 0;
                        P0 = 0;
            beep = 1;
                        L1=1;
                        delay(20000);
                        L1=0;
                }
        }
}

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

   void display()                          
{
        we1 = 0;P0=tab[xs]; delay(1);we1 = 1;           
        we2 = 0;P0=0x40;delay(1);we2 = 1;           
        we3 = 0;P0=tab[ms/10];delay(1);we3 = 1;         
        we4 = 0;P0=tab[ms%10];delay(1);we4 = 1;         
}
   void key()                                          
{
        if(zhuchi == 0)
                {
                        delay(5);
                        if(zhuchi == 0)
                        {
                        TR1 = ~TR1;
                        ms=5;
                        xs=0;
                        qiangda = 1;

                        beep=0;delay(2000);beep=1;
                                   
                        while(!zhuchi);
                        }
                }

        if(Sa == 0)                                          
                {
                        delay(10);
                if(Sa == 0)
                        {
                            beep=0;delay(2000);beep=1;
                            n++;
                            ms=n;
                            if(n==30)
                             {n=4;}
                             display();                                                                                                                           
                            while(!Sa);
                        }
                }
    if(Sj == 0)                                          
                 {
                        delay(10);
                        if(Sj == 0)
                        {
                            beep=0;delay(2000);beep=1;
                            n--;
                            ms=n;
                            if(n==5)
                             {n=31;}
                            display();
                            while(!Sj);
                        }
                }

         if(qiangda == 1)
                {
                        P1=0xff;
                        if(P1 != 0xff)
                        {                                    
                                delay(5);
                                if(P1 != 0xff)
                                {                                
                            switch(P1)
                                           {
                                          
                                          case 0xfe:{TR1=0;xs=1;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                          case 0xfd:{TR1=0;xs=2;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                          case 0xfb:{TR1=0;xs=3;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                          case 0xf7:{TR1=0;xs=4;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                          case 0xef:{TR1=0;xs=5;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                          case 0xdf:{TR1=0;xs=6;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                         }
                                }
                        }
                }        
}                                                   
void init()                              
{  
L1=0;
         a = 0;                                 
ms = 5;                        
        beep = 1;
        TMOD = 0x10;                 
        TH1 = 0X4b;
        TL1 = 0Xfe;
         EA = 1;
        ET1 = 1;
        TR1 = 0;                        
}                        

回复

使用道具 举报

ID:310441 发表于 2022-10-16 17:19 | 显示全部楼层
这个代码晃了一眼,应该是比较简单的代码。
有定时器,有“主持”,“抢答”等拼音,功能也很清晰。
建议新手学习不要偷懒,
认真的自己一行一行的加注释。
回复

使用道具 举报

ID:137736 发表于 2022-10-16 17:50 | 显示全部楼层
一句注释也没有,差评
回复

使用道具 举报

ID:401564 发表于 2022-10-16 18:08 | 显示全部楼层
这个只是一个简单的基础8051
并没有用到什么复杂的算法,甚至可以说是半点算法都没有
几乎没有难度可言
你觉得太难,那只是你基础没有打好而已
回复

使用道具 举报

ID:491577 发表于 2022-10-17 10:14 | 显示全部楼层
楼主基础太差,到处是延时函数,定时器你以为是拿来看的吗?大于1ms的延时都是用定时器产生的。你的中断程序都用长延时函数不出错才怪。估计第一个中断程序还没有执行完,第二、三个中断又到了,永远都在中断中。
回复

使用道具 举报

ID:842100 发表于 2022-10-17 15:01 | 显示全部楼层
你发的太乱了,帮你整理了一下,让你看的舒服容易理解,但是程序不能用。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar ms=26,a,qiangda,flag2,xs=5,n=20;
sbit we1 = P2^1;
sbit we2 = P2^2;
sbit we3 = P2^3;
sbit we4 = P2^4;
sbit beep = P3^7;   
sbit zhuchi = P3^6;                  
sbit S1 = P1^0;                  
sbit S2 = P1^1;
sbit S3 = P1^2;
sbit S4 = P1^3;
sbit S5 = P1^4;
sbit S6 = P1^5;
sbit Sa = P1^6;         
sbit Sj = P1^7;         
sbit L1=P3^5;
uchar code tab[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
void delay(uint z);
void display();
void init();
void key();

void main()
{
       void init()                              
      {  
         L1=0;
         a = 0;                                 
         ms = 5;                        
         beep = 1;
         TMOD = 0x10;                 
         TH1 = 0X4b;
         TL1 = 0Xfe;
         EA = 1;
         ET1 = 1;
         TR1 = 0;                        
      }
        while(1)
        {
                void display()                          
               {
                  we1 = 0;P0=tab[xs]; delay(1);we1 = 1;           
                  we2 = 0;P0=0x40;delay(1);we2 = 1;           
                  we3 = 0;P0=tab[ms/10];delay(1);we3 = 1;         
                  we4 = 0;P0=tab[ms%10];delay(1);we4 = 1;         
               }
                void key()                                          
              {
                  if(zhuchi == 0)
                  {
                        delay(5);
                        if(zhuchi == 0)
                        {
                        TR1 = ~TR1;
                        ms=5;
                        xs=0;
                        qiangda = 1;
                        beep=0;delay(2000);beep=1;
                        while(!zhuchi);
                        }
                 }
              if(Sa == 0)                                          
              {
                        delay(10);
                        if(Sa == 0)
                        {
                            beep=0;                            delay(2000);                            beep=1;
                            n++;
                            ms=n;
                            if(n==30)
                             {n=4;}
                             display();                                                                                                                           
                            while(!Sa);
                        }
              }
              if(Sj == 0)                                          
             {
                        delay(10);
                        if(Sj == 0)
                        {
                            beep=0;delay(2000);beep=1;
                            n--;
                            ms=n;
                            if(n==5)
                             {n=31;}
                            display();
                            while(!Sj);
                        }
             }
            if(qiangda == 1)
            {
                        P1=0xff;
                        if(P1 != 0xff)
                        {                                    
                                delay(5);
                                if(P1 != 0xff)
                                {                                
                            switch(P1)
                                           {
                                             case 0xfe:{TR1=0;xs=1;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                             case 0xfd:{TR1=0;xs=2;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                             case 0xfb:{TR1=0;xs=3;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                             case 0xf7:{TR1=0;xs=4;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                             case 0xef:{TR1=0;xs=5;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                             case 0xdf:{TR1=0;xs=6;TR1=1;flag2=1;qiangda = 0;beep = 0;delay(2000);beep = 1;ms = n;};break;
                                         }
                                }
                        }
                }        
}   

        }                                            
}
   void timer1() interrupt 3         
{
        TH1 = 0X4b;
        TL1 = 0Xfe;
        a++;
        if(a == 20 && qiangda == 1)                  
        {
                a = 0;
                ms--;
                if(ms == 0 && qiangda == 1)
                {                                
                        ms = 0;
                        TR1 = 0;
                        P0 = 0;
                        beep = 1;
                        qiangda = 0;
                        L1=1;
                        delay(20000);
                        L1=0;
                }
        }
        if(a == 20 && flag2 == 1)
        {
                a = 0;
                ms--;
                if(ms == 0)
                {
                        ms = 0;
                        TR1 = 0;
                        P0 = 0;
            beep = 1;
                        L1=1;
                        delay(20000);
                        L1=0;
                }
        }
}

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

   void display()                          
{
        we1 = 0;P0=tab[xs]; delay(1);we1 = 1;           
        we2 = 0;P0=0x40;delay(1);we2 = 1;           
        we3 = 0;P0=tab[ms/10];delay(1);we3 = 1;         
        we4 = 0;P0=tab[ms%10];delay(1);we4 = 1;         
}


回复

使用道具 举报

ID:584814 发表于 2022-10-17 16:21 | 显示全部楼层
四位数码管抢答器,主持人1坐席6,大概就是这。
如果连这个也要发帖求助的话,基本上可以绕开单片机这行了。
PS:真想必须有答案又不想自已动脑可上假货宝上买买买
回复

使用道具 举报

ID:883242 发表于 2022-10-17 23:16 | 显示全部楼层
hhh402 发表于 2022-10-17 10:14
楼主基础太差,到处是延时函数,定时器你以为是拿来看的吗?大于1ms的延时都是用定时器产生的。你的中断程 ...

其实main函数初始化完毕后就撒手人寰,所有处理都在中断里面是很寻常的写法。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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