单片机程序

#include<reg52.h>#define uchar unsigned charsfr p0=0x80;unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code dofly_DuanMa1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData1[8]; unsigned char TempData2[8]; unsigned char i1,t3,t4;sbit sda=P2^0;sbit scl=P2^1; void Timer0_isr(); sbit LATCH1=P2^2;//定义锁存使能端口 段锁存sbit LATCH2=P2^3;// uchar a; unsigned char t3,i,t4;void delay(){ ;; } void start() //开始信号{ sda=1; delay(); scl=1; delay(); sda=0; delay();}
void stop() //停止{ sda=0; delay(); scl=1; delay(); sda=1; delay();}
void respons() //应答{ uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay();}
void init(){ sda=1; delay(); scl=1; delay();}
void write_byte(uchar date){ uchar i,temp; temp=date;
for(i=0;i<8;i++) { temp=temp<<1; scl=0; delay(); sda=CY; delay(); scl=1; delay(); // scl=0; // delay(); } scl=0; delay(); sda=1; delay();}
uchar read_byte(){ uchar i,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } return k;}
void delay1(uchar x){ uchar a,b; for(a=x;a>0;a--) for(b=100;b>0;b--);}
void write_add(uchar address,uchar date){ start(); write_byte(0xa0); respons(); write_byte(address); respons(); write_byte(date); respons(); stop();}
uchar read_add(uchar address){ uchar date; start(); write_byte(0xa0); respons(); write_byte(address); respons(); start(); write_byte(0xa1); respons(); date=read_byte(); stop(); return date;}void Timer0_isr(void) { TMOD|=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; }void main(){ Timer0_isr(); init(); for(i=0;i<10;i++) { uchar i,t1,t2;
t1++; write_add(23+t1,dofly_DuanMa[t1]); if(t1==10) { write_add(23+t2,dofly_DuanMa1[t2]); t1=0; t2++; if(t2==10) t2=0; } delay1(100); } while(1)
{
p0=read_add(23+i1); LATCH1=1; LATCH1=0; p0=0xfd; LATCH2=1; LATCH2=0; AT24C02存储芯片在数码管上显示 delay1(50); p0=read_add(33+t3); 为什么这里不能进位了,改成23+T3就可以了。 LATCH1=1; LATCH1=0; p0=0xfe; LATCH2=1; LATCH2=0; delay1(50); } } void Timer0_isr1(void) interrupt 1 { uchar t4; TH0=(65536-50000)/256;//重新赋值 2ms TL0=(65536-50000)%256; t4++; if(t4==20) { t4=0; i1++; } if(i1==10) { i1=0; t3++; } if(t3==10) { t3=0; } }

// AT24C02存储芯片在数码管上显示 
void main()
{
 Timer0_isr();
 init();
 for(i=0;i<10;i++)
 {
  uchar i,t1,t2;//应该在函数一开始就对变量定义
  
  t1++;
  /*
  for语句中i是从0到9总共十次,
  t1如果从0开始,只能加到9,永远到不了10,
  所以if(t1==10)中的write_add()不会执行。
  所以在24C02中,只有add(23)~add(23+9)保存了数据,
  所以你在后面读add(33)和之后的数据是读不出来的。
  */
  write_add(23+t1,dofly_DuanMa[t1]);
  if(t1==10)  
  {
   write_add(23+t2,dofly_DuanMa1[t2]);
   t1=0;
   t2++;
   if(t2==10)  t2=0;
  } 
  delay1(100);
 } 
 while(1)                 
 {
  p0=read_add(23+i1);
  LATCH1=1;
  LATCH1=0;
  p0=0xfd;
  LATCH2=1;
  LATCH2=0;
  delay1(50);
  p0=read_add(33+t3);//为什么这里不能进位了,改成23+T3就可以了。  
  LATCH1=1;
  LATCH1=0;
  p0=0xfe;
  LATCH2=1;
  LATCH2=0;
  delay1(50);
 } 
}

for语句中i是从0到9总共十次,

t1如果从0开始,只能加到9,永远到不了10,

所以if(t1==10)中的write_add()不会执行。

所以在24C02中,只有add(23)~add(23+9)保存了数据,

所以你在后面读add(33)和之后的数据是读不出来的。

 

另外:

1、你的变量定义很乱,全局变量只要void Timer0_isr1(void) interrupt 1 中的三个就够了,其他的都定义为局部变量比较合适。

2、既然是存储0~9的段码,那么24C02存入一次就足够了,不需要重复储存。

3、建议你除了’0’ ’1’ ’2’ ’3’ ’4’ ’5’ ’6’ ’7’ ’8’ ’9’以外,加上’A’ ’B’ ’C’ ’D’ ’E’ ’F’ ’-’ ’.’这些符号的段码值,这样更方便使用数码管显示。

4、如果显示不清楚 或 数码管闪烁的厉害 ,可以修改每位数码管显示的时间长度。


//AT24C02存储芯片在数码管上显示  
#include<reg52.h>
#define uchar unsigned char
sfr Data_Port=0x80;
uchar code dofly_DuanMa[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};// 显示段码值0~9 A~F - . 
//uchar code dofly_DuanMa1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
uchar code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
uchar TempData1[8];
uchar TempData2[8];
uchar t1,t2,t3;
sbit sda   =P2^0;
sbit scl   =P2^1;
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;

void Timer0_isr(void)

 TMOD|=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
 TR0=1;
}
void Timer0_isr1(void) interrupt 1 

 //f=1/T=1/(2ms/50000)=25MHZ
 TH0=(65536-50000)/256;//重新赋值 2ms 
 TL0=(65536-50000)%256;
 
 t1++;
 if(t1==20)
 {
  t1=0;
  t2++;
  if(t2==10) 
  { 
   t2=0;
   t3++;
   if(t3==10)  
   {  
    t3=0;
   }  
  } 
 } 
}
void delay()
{
 uchar i=10;
 while(i--);
}         
void delay1(uchar x)

 uchar a,b;
 for(a=x;a>0;a--)  
 for(b=100;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 respons()  //应答

 //uchar i;
 uchar i=0;
 scl=1;
 delay();
 while((sda==1)&&(i<250))i++;
 scl=0;
 delay();
}
void init()

 sda=1;
 delay();
 scl=1;
 delay();
}
void write_byte(uchar date)

 uchar i,temp;
 temp=date;
 for(i=0;i<8;i++)
 { 
  temp=temp<<1;
  scl=0;
  delay();
  sda=CY;
  delay();
  scl=1;
  delay(); // 
  scl=0;//   
  delay();
 } 
 scl=0;
 delay();
 sda=1;
 delay();
}
uchar read_byte()

 uchar i,temp;
 scl=0;
 delay();
 sda=1;
 delay();
 for(i=0;i<8;i++) 
 { 
  scl=1;
  delay();
  temp=(temp<<1)|sda;
  scl=0;
  delay();
 } 
 return temp;
}
void write_add(uchar address,uchar date)

 start();
 write_byte(0xa0);
 respons();
 write_byte(address);
 respons();
 write_byte(date);
 respons();
 stop();
}
uchar read_add(uchar address)

 uchar date;
 start();
 write_byte(0xa0);
 respons();
 write_byte(address);
 respons();
 start();
 write_byte(0xa1);
 respons();
 date=read_byte();
 stop();
 return date;
}
void main()

 uchar i;
 init();
 for(i=0;i<10;i++) 
 {  
  write_add(23+i,dofly_DuanMa[i]);
  delay1(100);
 } 
 for(i=0;i<10;i++) 
 {  
  write_add(23+i,dofly_DuanMa[i]);
  delay1(100);
 } 
 Timer0_isr(); //在初始化完成后开启定时器
 while(1)                 
 {     
  Data_Port=read_add(23+t2);
  LATCH1=1;
  LATCH1=0;
  Data_Port=0xfd;
  LATCH2=1;
  LATCH2=0;
  delay1(50);
  /******************************/
  Data_Port=read_add(23+t3);
  //为什么地址33的话 这里就不能进位了,改成23+T3就可以了。 
  //因为没有对33地址以后的存储器赋值 
  /******************************/ 
  LATCH1=1;
  LATCH1=0;
  Data_Port=0xfe;
  LATCH2=1;
  LATCH2=0;
  delay1(50);
 }  
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-01
#include<reg52.h>
#define uchar unsigned char
sfr p0=0x80;
unsigned char code dofly_DuanMa[10]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_DuanMa1[10]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]=
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData1[8];
unsigned char TempData2[8];
unsigned char i1,t3,t4;
sbit sda=P2^0;
sbit scl=P2^1;
void Timer0_isr();
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;
// uchar a;
unsigned char t3,i,t4;
void delay(){ ;; }
void start() //开始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //停止
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //应答
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void init()
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
// scl=0;
// delay();
}
scl=0;
delay();
sda=1;
delay();
}
uchar read_byte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
void delay1(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void Timer0_isr(void)
{
TMOD|=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
Timer0_isr();
init();
for(i=0;i<10;i++)
{
uchar i,t1,t2;
t1++;
write_add(23+t1,dofly_DuanMa[t1]);
if(t1==10)
{
write_add(23+t2,dofly_DuanMa1[t2]);
t1=0;
t2++;
if(t2==10) t2=0;
}
delay1(100);
}
while(1)
{
p0=read_add(23+i1);
LATCH1=1; //打开锁存器
LATCH1=0; //关闭锁存器
p0=0xfd; //选通十位
LATCH2=1;
LATCH2=0; AT24C02存储芯片在数码管上显示
delay1(50);
p0=read_add(33+t3); 为什么这里不能进位了,改成23+T3就可以了。
LATCH1=1;
LATCH1=0;
p0=0xfe; //选通个位
LATCH2=1;
LATCH2=0;
delay1(50);
}
}
void Timer0_isr1(void) interrupt 1
{
uchar t4;
TH0=(65536-50000)/256;//重新赋值 50ms
TL0=(65536-50000)%256;
t4++;
if(t4==20) //定时1s
{
t4=0;
i1++;
}
if(i1==10)
{
i1=0;
t3++;
}
if(t3==10)
{
t3=0;
}
}
你这个 程序应该是AT24C20存储并显示0-99,共100个数的秒表
第2个回答  2014-01-01
后恢复规划法规和
相似回答
大家正在搜