各位高手,菜鸟一枚在自学郭天祥的教程,编写每隔1秒钟自动计数,掉电数据保留的程序,写的跟书上的差不多,自认为这种也可以实现,但是就是报错。。。求各位帮忙看看错误~大谢!!!主要是display和main部分有一些区别,另外书上用的中断方式是interrupt1 我用的3.
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit write=0;
sbit dula=P2^6;
sbit wela=P2^7;
sbit sda=P2^0;
sbit scl=P2^1;
uchar num,num2,shi,ge,sec;
void display(uchar,uchar);
uchar code table[]=
{
0x3f,0x06.3x5b,3x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay()
{ ;; }
void delayms(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void start()//起始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()//终止信号
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void response()//应答信号
{
uchar i;
scl=1;
delay();
i=1;
while((sda==1)&&(i<255))i++;//一直没有收到应答信号一段时间
scl=0;//把第九个时钟拉低
delay();
}
void ini
tial()//初始化
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar date)
{
uchar i,temp ;
scl=0;//表示要写,低电平可以动SDA来写数据,到了SCL高电平就只运数据了
temp=date;
delay();
for(i=0;i<8;i++)//一共8位数据
{
temp=temp<<1;//左移有一位进入了PSW中的最高位CY
sda=CY;
delay();
scl=1;//高的时候稳定接受数据
delay();
scl=0;//低的时候稳定可变
delay();
}
sda=1;//释放数据总线准备收低电平的应答信号
delay();
}
uchar read_byte()
{
uchar i,j,k;
scl=0;
delay();
sda=1;//释放数据总线
delay();
for(i=0;i<8;i++)
{
scl=1;//在读第一位的过程中SDA没有动,可以开始接收
delay();
j=sda;
k=k<<1|j;//这样一来J就放到了K的最低位上
scl=0;//方便下次读数据
delay();
}
return k;
}
void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);//A表示器件的地址,(高四位固定为1010? 最后一位0表示要写
response();
write_byte(address);//往心片的第三个地址写
response();
write_byte(date);
response();
stop();
}
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);//再写一次地址说明写到哪里去
response();
write_byte(address);//从着个地址开始读(256以内都可以)
response();
start();
write_byte(0xa1);//1表示下一针数据要读
response();
date=read_byte();
stop();
return date;
}
void main()
{
initial();
num=read_add(25);
shi=num/10;
ge=num%10;
if(num>100)
num=0;
TMOD=0x11;
TH1=(65536-45872)/256;//beachtung!!
TL1=(65536-45872)%256;//beachtung!!
EA=1;
ET1=1;
TR1=1;
while(1)
{
display(shi,ge);
if(write==1)
{
write=0;
write_add(25,num);
}
}
}
void T1_time() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)/256;
num2++;
if(num2==20)
{
num2=0;
num++;
write=1;
delay();
if(num==99)
num=0;
}
}
void display(uchar shi,uchar ge)
{
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
一周热门 更多>