标题:
51单片机小白求教关于定时器中断的问题
[打印本页]
作者:
小明啊9527
时间:
2021-4-19 16:47
标题:
51单片机小白求教关于定时器中断的问题
本帖最后由 小明啊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;
}
复制代码
作者:
小明啊9527
时间:
2021-4-22 09:27
帖子沉了,算了算了
作者:
8866.
时间:
2021-5-11 10:38
同问,这个怎么弄
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1