keil 写程序,proteus仿真,求程序和仿真电路图

AT89C51动态数码管显示不用太复杂 简单的就行396969746@qq.com
2024-12-20 19:51:34
推荐回答(2个)
回答1:

 

 #include

 #include

 #define uint unsigned int 

 #define uchar unsigned char 

 uchar temp,aa,num,numdu,numwe;

 sbit diola=P2^5;

 sbit dula=P2^6;         

 sbit wela=P2^7;         

 uchar code table[]={    //建立2-9字形码表

 0x6f  ,0x5b,0x4f,

 0x66,0x6d,0x7d,0x07,

 0x7f,0x6f,

 };

 uchar code tablewe[]={  //建立8个数码管位选通码表

 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,};

 void delay(uint z);     

 

 void main( ) 

 {

 num=0;

 aa=0;

     TMOD=0x01;             //T0工作在方式1, 0000 0001

 TH0=(65536-50000)/256; //50ms定时初值 

 TL0=(65536-50000)%256;

     EA=1;        // CPU开中断           

 ET0=1;       // 允许T0中断           

 TR0=1;       //  启动T0         

 diola=1;

 temp=0xfe;   // 最初LED灯亮数据 1111 1110     

 P1=temp;     //       

 diola=0;

 dula=1;      // 数码管段选通         

 P0=table[0]; // 显示0     

 dula=0;      // 数码管段锁存           

 wela=1;      // 数码管位选通           

 P0=0xc0;     // 8个数码管亮         

 wela=0;      // 数码管位锁存           

 while(1)     // LED灯作流水灯

 {

 delay(1000);  //延时1s

 diola=1;

 temp=_crol_(temp,1);//循环左移1位

 P1=temp;     //输出,作流水灯

 diola=0;

 }

 }

 

 void delay(uint z)

 {

 uint x,y;

 for(x=z;x>0;x--)

 for(y=110;y>0;y--);

 }

 

 void timer0() interrupt 1      //定时器T0中断程序

 {

 TH0=(65535-50000)/256;     //再次为定时器T0赋初值50ms

 TL0=(65535-50000)%256;

 aa++;

 if(aa==20)                 //判定1s定时时间到否?  20*50ms=1s

 {

 aa=0;                 //  1s定时时间到,将aa清零 

 numdu++;              //

 if(numdu==9)          //判定第8位数码管是否显示数字8

 numdu=1;              // 是,将numdu=1,表示下次数码管显示时,显示的数字是1

 dula=1;               //段选通

 P0=table[numdu];      //送字形码

 dula=0;               //段锁存

 wela=1;               //位选通

 P0=tablewe[numwe];    //选通要显示数字的那个数码管

 wela=0;               //位锁存

 numwe++;              //

 if(numwe==8)          //判定8位数码管是否显示完

 numwe=0;              //显示完,将numwe=0,再重新从第一个数码管显示

 }

 

 }

   

回答2:

太难!