下午没事玩了玩吃灰已久的51(第一次碰还是大一的时候,花了俩小时鼓捣了个秒表,当时就看着郭天祥那本书,数电啥的也没学,就会c语言)。ps:说起来挺失望的,留下检查的三个人,两个是抄了某中的板子历程,结果我的因为看错了题目导致少了一位精度被老师无视了。
这里写的例子也来自于郭天祥的书上,写的时候遇到点问题:
首先是51里向量中断号的问题,
一、中断号
外部中断0 0
定时器T0 1
外部中断1 2
定时器T1 3
串口中断 4
一定要注意在写中断服务函数时候后面的interrupt x,这里的x标号一定要对,否则进不了中断:
下面是写好改过的,功能很简单,一边闪灯,数码管一边计数,用两个定时器就可以了;
#include<reg52.h>
unsigned char index=0;
unsigned char index1=0;
unsigned char gewei=0;
unsigned char shiwei=0;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit led0=P1^1;
sbit control_0=P2^0;
sbit control_1=P2^1;
void interrupt_init()
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
}
void delay(unsigned char j)
{
unsigned char i=0,k=0;
for(i=0;i<j;i++)
{
for(k=0;k<110;k++);
}
}
void display()
{
control_0=0;
control_1=1;
P0=table[shiwei];
P0=0xff;
control_1=0;
control_0=1;
P0=table[gewei];
P0=0xff;
}
void main()
{
interrupt_init();
while(1)
{
display();
}
}
void T0_time()interrupt 1 //定时器0
{
TH0=(65536-50000)/256;
TL0=(65535-50000)%256;
index++;
if(index==4)
{
led0=0;
index=0;
}
else
{
led0=1;
}
}
void T1_time() interrupt 3//定时器1
{
TH1=(65536-50000)/256;
TL1=(65535-50000)%256;
index1++;
if(index1==20)
{
gewei++;//个位
index1=0;
if(gewei==10)
{
gewei=0;
shiwei++;
if(shiwei==6)
{
shiwei=0;
}
}
}
}