#include<AT89X52.H>
#define uchar unsigned char
#define FLASHFREQ 100
sbit KEY1=P1^4;//定义KEY1分加一
sbit KEY2=P1^5;//定义KEY2秒加一
#define COM1_ON (P1=0xf7)//1111 1110//低电平点亮
#define COM2_ON (P1=0xfb)//1111 1101
#define COM3_ON (P1=0xfd)//1111 1011
#define COM4_ON (P1=0xfe)//1111 0111
#define COMS_OFF (P1=0xff)/*数码管全灭宏定义*/
#define SEG_PORT (P0)/*段码数据输出端口*/
uchar code LED_Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳极,COM采用7404取反驱动
#define DISPLAY_BIT 4//数码管显示位数
uchar DisBuff[DISPLAY_BIT];//显示缓冲区
bit DisDecemal=0;//是否显示小数点
uchar shi=11,fen=59,miao=49;
void delay(uchar ms)//1ms延时,12MHZ
{
uchar i,j;
for(i=ms;i>0;i--)
for (j=122;j>0;j--);
}
void LED_DisplayTimer(uchar LED1,uchar LED2,uchar LED3,uchar LED4)
{
DisBuff[0]=LED_Tab[LED1];
DisBuff[1]=LED_Tab[LED2];
DisBuff[2]=LED_Tab[LED3];
DisBuff[3]=LED_Tab[LED4];
/***小数点闪烁在这里控制***/
if (DisDecemal==1)
DisBuff[1]&=0x7f;//点亮小数点
}
void Timer0_Init(void)//@12MHZ,STC8952
{
TMOD=0x01;
TH0=(65536-5000)>>8;//重装5ms的初值
TL0=(65536-5000);
IE=0x82;
TR0=1;
}
void Display_Scan(void)//共阴极数码管<5ms调用一次
{
static uchar COM;
COM++;
if(COM>=DISPLAY_BIT) COM=0;//COM的值在0,1,2 ,3之间切换
COMS_OFF;//切换前将全部显示暂时关闭,避免虚影,所谓虚影就是数码管看起来“全亮”
switch(COM)
{
case 0:SEG_PORT=DisBuff[0];//时十位
COM1_ON;
break;
case 1:SEG_PORT=DisBuff[1];//时个位
COM2_ON;
break;
case 2:SEG_PORT=DisBuff[2];//分十位
COM3_ON;
break;
case 3:SEG_PORT=DisBuff[3];//分个位
COM4_ON;
break;
}
}
void KeyScan(void)//键盘扫描程序
{
if(KEY1==0)
{
delay(5);
if(KEY1==0)
{
shi++;
if (shi==24)
shi=0;
while(!KEY1)//等待按键释放,防止按键长时间不释放,影响显示
{
LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);
}
}
}
else if(KEY2==0)
{
delay(5);
if(KEY2==0)
{
fen++;
if(fen==60)
fen=0;
while(!KEY2)//等待按键释放
{
LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);
}
}
}
}
void main()
{
{
Timer0_Init();
while(1)
{
LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);
KeyScan();//键盘扫描
}
}
void Timer0(void) interrupt 1 using 3//前台程序
{
static uchar flashFREQ;//闪烁频率控制
static uchar mms;//统计中断次数,做时钟的基准源
flashFREQ++;
mms++;
TH0=(65536-5000)>>8;//重装5ms的初值
TL0=(65536-5000);
if(mms==200)//5*200=1000
{
mms=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(shi==24)
shi=0;
}
}
}
Display_scan();//动态扫描数码管<5ms调用一次
if(flashFREQ>=FLASHFREQ)
flashFREQ=0;//闪烁计时
if(flashFREQ>=FLASHFREQ/2)//闪烁其实就是一半时间正常显示,一半时间不显示而已。所以我们看起来是闪烁效果
DisDecemal=1;
else
DisDecemal=0;
}
你既然会,就把调整的那个和我说说吧
追答void main()
{
Timer0_Init();
while(1)
{
LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);
KeyScan();//键盘扫描
Display_Scan();//动态扫描数码管=FLASHFREQ)
flashFREQ=0;//闪烁计时
if(flashFREQ>=FLASHFREQ/2)//闪烁其实就是一半时间正常显示,一半时间不显示而已。所以我们看起来是闪烁效果
DisDecemal=1;
else
DisDecemal=0;
}
}
void Timer0() interrupt 1//前台程序
{
static uchar mms;//统计中断次数,做时钟的基准源
flashFREQ++;
mms++;
TH0=(65536-5000)>>8;//重装5ms的初值
TL0=(65536-5000);
if(mms==200)//5*200=1000
{
mms=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(shi==24)
shi=0;
}
}
}
其他地方和原来一样,
static uchar flashFREQ;//闪烁频率控制
定义全局变量进行声明
编译过程如下,已没有错误。
Build target 'Target 1'
compiling b.c...
linking...
Program Size: data=23.1 xdata=0 code=457
"a" - 0 Error(s), 0 Warning(s).
【 为什么void Timer0(void) interrupt 1 using 3这行编译的时候提示vo...
你的这个程序的主要问题。是因为你把中断函数写到主函数里面了。中断函数是独立的应该写到主函数外面。我调整一下以后,就没有那个错误了。希望能帮到你,欢迎采纳。
...器中断编程中这个,void timer0( ) interrupt 1,这里timer0( ) 为...
定时器0的中断函数,函数名后面需要加括号!interrupt 后面的数字表示使用的寄存器组!
单片机中void Timer0_isr(void) interrupt 1 using 1 怎么理解
1、这个是定时器0的中断函数。2、从字面上可以看到Timer0——定时器0,interrupt——中断。3、定时器设置初值并打开后,当计数器计数到你设置的数后,就会产生一个定时器中断,然后无论你当时程序在运行什么代码,都会跳转到IsrTimer0这个函数运行,运行完毕后再跳回去执行之前的代码。4、void IsrTimer...
单片机中void Timer0_isr(void) interrupt 1 using 1 怎么理解
1、这个是定时器0的中断函数。2、从字面上可以看到Timer0——定时器0,interrupt——中断。3、定时器设置初值并打开后,当计数器计数到用户设置的数后,就会产生一个定时器中断,然后无论你当时程序在运行什么代码,都会跳转到IsrTimer0这个函数运行,运行完毕后再跳回去执行之前的代码。4、void IsrTime...
单片机中的Timer0Interrupt(void) interrupt 1什么意思?
1.这是定时器0的中断函数。2.可以看到Timer0——Timer0——定时器0——中断。3.定时器设置初始值和开放,当计数器计数设置数量,将会有一个定时器中断,然后不管你有什么代码运行时的程序,将跳转到IsrTimer0这个函数运行,运行完成后返回之前执行的代码。4.这个方法不能改变,函数名也不能改变。
...void IsrTimer0(void) interrupt 1using 1是什么意思?谢谢
运行完毕后再跳回去执行之前的代码,这就是中断!补充一点:void IsrTimer0(void) interrupt 1using 1这个写法不能变,函数名也必须这样写,因为这个是编译器规定好了的,一旦编译器检测到这个名字的函数,就会把它当做中断函数处理,中断的时候就会自动跳转到这个函数运行。你可以查询一下相关资料。
...提示在void timer0(void) interrupt 1 using 1 出错,求助啊_百度...
……IE=0X00;time=ctm;} } }--再加上一个括号 void timer(void) interrupt 1using 1 \/\/ 定时器0中断程序,用于报警 ……
关于中断函数的定义,using 1是什么意思
r7寄存器,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会弹出来 节省代码和时间 外部中断int0 void intsvr0(void)interrupt 0 using 1 定时\/计数器t0 void timer0(void)interrupt 1 using 1 外部中断int1 void intsvr1(void)interrupt ...
单片机中的Timer0Interrupt(void) interrupt 1下的程序是用来做什么的...
开定时器后,定时器就开始计时,定时器有四种工作模式,比如工作方式0,16位定时器,可以定时65536us,当从初值加到65536后,产生溢出,定时器向cpu申请中断,cpu转去执行中断服务程序,执行完后回到main函数,51单片机共有5个中断源,外部中断0,定时器0,外部中断1,定时器1,外加串行口中断、...
单片机的蜂鸣器演奏 生日歌
EA = 1;}void BeepTimer0(void) interrupt 1 \/\/音符发生中断{ BeepIO = !BeepIO; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0;}\/\/***void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed){ unsigned int NewFreTab[12]; \/\/新的频率表 unsigned char i...