剛學單片機不久,自己依葫蘆畫瓢的寫了一個程序,要求達到一定的值蜂鳴器發生報警,報警聲長用數碼管顯示,一分鐘后關閉,可是仿真的時候數碼管并不顯示時間,用keil調試的時候發現不能進入定時中斷,想了很久都不知道為什么這樣,不知道如何改,求求大佬們幫助。
2W]E6`03_`ZP0ED7%IJ6M.png (56.64 KB, 下載次數: 41)
下載附件
2019-5-21 21:57 上傳
單片機源程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar AD_val;
uchar aa,shi,ge,miao,zheng,flag;
sbit wei1=P2^6;
sbit wei2=P2^7;
sbit buzzer=P1^0;
sbit CS=P3^0;
sbit CLK=P3^6;
sbit DIO=P3^7;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char A_D();
void init();
void display(uchar shi,uchar ge);
void delay(uint z);
void alarm();
void main()
{
while(1)
{
AD_val=A_D();
zheng=AD_val/51;
alarm();
if(buzzer==0)
{
// miao=60;
init();
if(aa==20)
{
aa=0;
miao++;
if(miao==60)
{
miao=0;
TR0=0;
buzzer=1;
}
shi=miao/10;
ge=miao%10;
}
display(shi,ge);
}
}
}
unsigned char A_D()//模數轉換
{
uchar i,dat;
CS=1;
CLK=0;
CS=0;
DIO=1;
CLK=1;
CLK=0;
DIO=1;
CLK=1;
CLK=0;
DIO=0;
CLK=1;
CLK=0;
DIO=1;
CLK=1;
for(i=0;i<8;i++)
{
CLK=1;
CLK=0;
dat<<=1;
dat|=(uchar)DIO;
}
CS=1;
return dat;
}
void display(uchar shi,uchar ge)//顯示程序
{
wei1=1;
wei2=0;
P0=table[ge];
delay(1);
P0=0Xff;
wei1=0;
wei2=1;
P0=table[shi];
delay(1);
P0=0xff;
}
void delay(uint z)//延遲
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void alarm()//警報
{
if(zheng>0)
{
buzzer=0;
}
else
{
buzzer=1;
}
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
PT0=1;
}
void timer0() interrupt 1//定時器中斷
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
|