找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机小白求教关于定时器中断的问题

[复制链接]
跳转到指定楼层
楼主
ID:906025 发表于 2021-4-19 16:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小明啊9527 于 2021-4-20 08:37 编辑

这个实现的功能是16x16的矩阵按键按一个,蜂鸣器就发出一个音调,然后串口再把对应的数字发送出去。

我遇到的问题是,这两个功能只用一个的时候都是正常的,但是两个一块儿用的时候就进入死循环了
就是main函数里面的makesound()和emitData()注释掉一个,就都可以用,然后一块儿用就不行了


(调试的时候发现,就是死循环是跳到makesound()函数里面的那个while循环了,初步判断是没办法进入到定时器0的中断里面了,所以n不能+1)

emitData()函数里面到底对定时器0做了什么,导致它没办法中断了

学生党,但是不介意花点钱表示感谢


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sbit sound = P2^0;

  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define LED_PORT P0
  7. #define f1(a) a/256
  8. #define f2(a) a%256
  9. #define FOSC 11059200L //晶振设置,默认使用11.0592M Hz
  10. #define BAUD 9600

  11. sbit wela_1 = P2^4;
  12. sbit wela_2 = P2^5;
  13. sbit wela_3 = P2^6;
  14. sbit wela_4 = P2^7;
  15. sbit L1=P1^0;
  16. sbit L2=P1^1;
  17. sbit L3=P1^2;
  18. sbit L4=P1^3;

  19. uint m=0,n=0;

  20. uint buttons[]={7,4,1,0,8,5,2,0,9,6,3,0,0,0,0,0};        //按键的分布
  21. unsigned code table[]= {0Xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  22. uint music[]={0,0xf91e,0xf9de,0xfa89,0xfad8,0xfb68,0xfbe8,0xfc5a,    0xfc8f,0xfcef,0xfd44,};
  23. uint rhythm[]={0,1,2,3,4,5,6,7,8,9};


  24. void Delayms(unsigned int ms)
  25. {
  26.         unsigned int i,j;
  27.         for(i=0;i<ms;i++)
  28.                 for(j=0;j<114;j++);
  29. }

  30. void LEDdisplay(unsigned int num)                 //数码管显示
  31. {
  32.     unsigned int qian,bai,shi,ge;        
  33.         qian=num/1000;
  34.         bai=num%1000/100;
  35.         shi=num%100/10;
  36.         ge=num%10;
  37.         
  38.         wela_1 = 1;          //关闭所有数码管
  39.         wela_2 = 1;
  40.         wela_3 = 1;
  41.         wela_4 = 1;        

  42.         wela_4=0;  //显示千位
  43.         LED_PORT=table[qian];
  44.         Delayms(1);
  45.         LED_PORT = 0xff;
  46.         wela_4=1;
  47.         
  48.         wela_3=0;  //显示百位
  49.         LED_PORT=table[bai];
  50.         Delayms(1);
  51.         LED_PORT = 0xff;
  52.         wela_3=1;
  53.         
  54.         wela_2=0;  //显示十位
  55.         LED_PORT=table[shi];
  56.         Delayms(1);
  57.         LED_PORT = 0xff;
  58.         wela_2=1;
  59.         
  60.         wela_1=0;  //显示个位
  61.         LED_PORT=table[ge];
  62.         Delayms(1);
  63.         LED_PORT = 0xff;
  64. }



  65. void Delay(unsigned int num)
  66. {
  67.   while( --num );                        
  68. }

  69. uint keyboard(){                          //获取4x4按键
  70.     uint temp;
  71.     uint key_num=10;
  72.     uint i;   
  73.     P1=0xef;
  74.     for(i=0;i<=3;i++){
  75.         if(L1==0) key_num = buttons[4*i];
  76.         if(L2==0) key_num = buttons[4*i+1];
  77.         if(L3==0) key_num = buttons[4*i+2];
  78.         if(L4==0) key_num = buttons[4*i+3];
  79.         Delay(500);
  80.         temp=P1;
  81.         temp=temp|0x0f;        //保证左移
  82.         temp=temp<<1;
  83.         temp=temp|0x0f;        //列输入初始化
  84.         P1=temp;
  85.     }

  86.             return key_num;
  87. }



  88. void UsartConfiguration()
  89. {
  90.         SCON = 0X50;                        //设置为工作方式1        10位异步收发器
  91.         TMOD |= 0x21; //设置计数器工作方式2  8位自动重装计数器        
  92.         PCON = 0X80;//波特率加倍        SMOD = 1  28800
  93.         TH1 = 256 -(FOSC/12/32/(BAUD/2)); //计算溢出率
  94.         TL1 = 256 -(FOSC/12/32/(BAUD/2));
  95.         TR1 = 0; //打开定时器        
  96.         ES=1;//打开串口
  97.         EA = 1;//打开总中断
  98. }




  99. void makesound(uint x){                         //利用定时器0发出声音
  100.         m=rhythm[x];
  101.           TR0 = 1;        
  102.         while(n<300);
  103.         n=0;
  104.         TR0 = 0;
  105. }

  106. void emitData(uchar temp){                 //串口发出信息
  107.          TR1=1;         
  108.         SBUF=temp;
  109.         while(!TI);
  110.         TI=0;     
  111.         TR1=0;                     
  112. }

  113. void main(){

  114.         uint a;
  115.     uint temp=10;
  116.     uint sum=0;
  117.         unsigned long int b=0;
  118.         EA=1;
  119.         ET1=0;
  120.         ET0=1;
  121.         IP=0x08;
  122.         TMOD=0x21;
  123.         TH0 = f1(music[m]);
  124.     TL0 = f2(music[m]);

  125.         UsartConfiguration();
  126.         
  127.    
  128.     while(b<100000){
  129.         a=keyboard();
  130.         if((a!=10)&&(temp!=a)){
  131.                         temp=a;
  132.                         b=b*10+temp;                        
  133.                         makesound(temp);
  134.                         emitData(temp);
  135.                

  136.         }
  137.         else{
  138.                         temp=a;
  139.             b=b;
  140.         }

  141.                
  142.                 b=b%10000;
  143.                 sum=(uint)b;
  144.         LEDdisplay(sum);
  145.     }
  146. }



  147. void emit() interrupt 1 {
  148.         TR0 = 0;
  149.         if(m==0||n>200){
  150.                 sound = sound;
  151.                 TH0 = f1(0xff0f);
  152.                 TL0 = f2(0xff0f);
  153.         }else{
  154.                 sound = !sound;
  155.                 TH0 = f1(music[m]);
  156.                 TL0 = f2(music[m]);
  157.         }
  158.         n++;
  159.         TR0 = 1;
  160. }

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

使用道具 举报

沙发
ID:906025 发表于 2021-4-22 09:27 | 只看该作者
帖子沉了,算了算了
回复

使用道具 举报

板凳
ID:751378 发表于 2021-5-11 10:38 | 只看该作者
同问,这个怎么弄
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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