本帖最后由 小明啊9527 于 2021-4-20 08:37 编辑
这个实现的功能是16x16的矩阵按键按一个,蜂鸣器就发出一个音调,然后串口再把对应的数字发送出去。
我遇到的问题是,这两个功能只用一个的时候都是正常的,但是两个一块儿用的时候就进入死循环了
就是main函数里面的makesound()和emitData()注释掉一个,就都可以用,然后一块儿用就不行了
(调试的时候发现,就是死循环是跳到makesound()函数里面的那个while循环了,初步判断是没办法进入到定时器0的中断里面了,所以n不能+1)
emitData()函数里面到底对定时器0做了什么,导致它没办法中断了
学生党,但是不介意花点钱表示感谢
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- sbit sound = P2^0;
- #define uchar unsigned char
- #define uint unsigned int
- #define LED_PORT P0
- #define f1(a) a/256
- #define f2(a) a%256
- #define FOSC 11059200L //晶振设置,默认使用11.0592M Hz
- #define BAUD 9600
- sbit wela_1 = P2^4;
- sbit wela_2 = P2^5;
- sbit wela_3 = P2^6;
- sbit wela_4 = P2^7;
- sbit L1=P1^0;
- sbit L2=P1^1;
- sbit L3=P1^2;
- sbit L4=P1^3;
- uint m=0,n=0;
- uint buttons[]={7,4,1,0,8,5,2,0,9,6,3,0,0,0,0,0}; //按键的分布
- unsigned code table[]= {0Xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
- uint music[]={0,0xf91e,0xf9de,0xfa89,0xfad8,0xfb68,0xfbe8,0xfc5a, 0xfc8f,0xfcef,0xfd44,};
- uint rhythm[]={0,1,2,3,4,5,6,7,8,9};
- void Delayms(unsigned int ms)
- {
- unsigned int i,j;
- for(i=0;i<ms;i++)
- for(j=0;j<114;j++);
- }
- void LEDdisplay(unsigned int num) //数码管显示
- {
- unsigned int qian,bai,shi,ge;
- qian=num/1000;
- bai=num%1000/100;
- shi=num%100/10;
- ge=num%10;
-
- wela_1 = 1; //关闭所有数码管
- wela_2 = 1;
- wela_3 = 1;
- wela_4 = 1;
- wela_4=0; //显示千位
- LED_PORT=table[qian];
- Delayms(1);
- LED_PORT = 0xff;
- wela_4=1;
-
- wela_3=0; //显示百位
- LED_PORT=table[bai];
- Delayms(1);
- LED_PORT = 0xff;
- wela_3=1;
-
- wela_2=0; //显示十位
- LED_PORT=table[shi];
- Delayms(1);
- LED_PORT = 0xff;
- wela_2=1;
-
- wela_1=0; //显示个位
- LED_PORT=table[ge];
- Delayms(1);
- LED_PORT = 0xff;
- }
- void Delay(unsigned int num)
- {
- while( --num );
- }
- uint keyboard(){ //获取4x4按键
- uint temp;
- uint key_num=10;
- uint i;
- P1=0xef;
- for(i=0;i<=3;i++){
- if(L1==0) key_num = buttons[4*i];
- if(L2==0) key_num = buttons[4*i+1];
- if(L3==0) key_num = buttons[4*i+2];
- if(L4==0) key_num = buttons[4*i+3];
- Delay(500);
- temp=P1;
- temp=temp|0x0f; //保证左移
- temp=temp<<1;
- temp=temp|0x0f; //列输入初始化
- P1=temp;
- }
- return key_num;
- }
- void UsartConfiguration()
- {
- SCON = 0X50; //设置为工作方式1 10位异步收发器
- TMOD |= 0x21; //设置计数器工作方式2 8位自动重装计数器
- PCON = 0X80;//波特率加倍 SMOD = 1 28800
- TH1 = 256 -(FOSC/12/32/(BAUD/2)); //计算溢出率
- TL1 = 256 -(FOSC/12/32/(BAUD/2));
- TR1 = 0; //打开定时器
- ES=1;//打开串口
- EA = 1;//打开总中断
- }
- void makesound(uint x){ //利用定时器0发出声音
- m=rhythm[x];
- TR0 = 1;
- while(n<300);
- n=0;
- TR0 = 0;
- }
- void emitData(uchar temp){ //串口发出信息
- TR1=1;
- SBUF=temp;
- while(!TI);
- TI=0;
- TR1=0;
- }
- void main(){
- uint a;
- uint temp=10;
- uint sum=0;
- unsigned long int b=0;
- EA=1;
- ET1=0;
- ET0=1;
- IP=0x08;
- TMOD=0x21;
- TH0 = f1(music[m]);
- TL0 = f2(music[m]);
- UsartConfiguration();
-
-
- while(b<100000){
- a=keyboard();
- if((a!=10)&&(temp!=a)){
- temp=a;
- b=b*10+temp;
- makesound(temp);
- emitData(temp);
-
- }
- else{
- temp=a;
- b=b;
- }
-
- b=b%10000;
- sum=(uint)b;
- LEDdisplay(sum);
- }
- }
- void emit() interrupt 1 {
- TR0 = 0;
- if(m==0||n>200){
- sound = sound;
- TH0 = f1(0xff0f);
- TL0 = f2(0xff0f);
- }else{
- sound = !sound;
- TH0 = f1(music[m]);
- TL0 = f2(music[m]);
- }
- n++;
- TR0 = 1;
- }
复制代码 |