本帖最后由 小明啊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;
- }
復制代碼 |