动态扫描~利用中断,定时器~

2019-07-16 04:01发布

刚学单片机没多久~学校学的是飞思卡尔~~最近自学了下51~~利用keil C 和proteus仿真~~~

参照各种参考书和书上的例子~~然后组合了一个动态扫描 12345和HELLO的程序~~不用中断和定时器的已经没啥问题了~~
昨晚临睡前想试一下综合一下顺便熟悉一下教材上的和教程上的各种东西~~于是在原有程序上删删改改组合成一下程序。。。很想知道中断和定时器是怎么应用的!!!!额额~~
经仿真发现只会在8和9之间不断跳变。。。。

额额,改了好多次。。貌似也不怎么成功~~最后还是把它稍微恢复一下~~希望能得到大家的知道~~先行谢过QQQ~~~!!!


#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char

sbit P1_7=P1^7;

void interrupt0() interrupt 0 using 2                         //中断
{
   uint flag=1;

}

void delay(uint x)                                           //延时函数
{
do{x--;}while(x>1);
}

void main()                                                                                          //主函数
{
uchar code num1[5]={0x06,0x5b,0x4f,0x66,0x6d};
uchar code num2[5]={0x76,0x79,0x06,0x06,0x3f};
uchar i;
uint flag=0;

P1_7=1;
TCON=0x01;
TMOD=0X02;
TL0=0xff;
TH0=0x06;
TR0=1;


EA=1;
IT0=1;
EX0=1;

do        {

if(flag==0){
P2=0x01;
for(i=0;i<5;i++)
  {
   P0=num1[i];
   delay(1500)        ;
   P2<<=1;
  }                        }
  
if(flag==1){
P2=0x01;
for(i=0;i<5;i++)
  {  
   P0=num2[i];
   delay(1500)        ;
   P2<<=1;
  }                    }
P1_7=~P1_7;
}while(!TF0);                                 


}                                  



未命名.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
_tacet
2019-07-16 13:14
lstcspring 发表于 2012-11-5 21:53
把你的延时用定时器中断代替,在定时器中断里面送显数据

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar flag=0;
sbit P1_7=P1^7;
uchar temp=0x01;
uchar i;
uchar count=0;
void interrupt0() interrupt 1                 //中断函数1           50ms                 
{
  TR0=0 ;
TL0=(65536-50000)/256;
TH0=(65536-50000)%256;
count++;
if(count==40)                                                        //一秒左右变一次
{
count=0;
flag=~flag;
}  
TR0=1;
  }
void interrupt1() interrupt 3                                   //中断函数2     2ms          动态扫描
{
TR1=0;                                                                                                 //先关
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
i++;
if(i==5)i=0;
temp=_crol_(temp,1);                                                                                  //左移
if(temp==0x20)temp=0x01;                                                                         //移到0010 0000时,又循环回来
TR1=1;                                                                                                  //开回来
}


void main()                                                                                          //主函数
{
uchar code num1[5]={0x06,0x5b,0x4f,0x66,0x6d};
uchar code num2[5]={0x76,0x79,0x06,0x06,0x3f};
TMOD=0X11;
TL0=(65536-50000)/256;
TH0=(65536-50000)%256;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;                                                                                //初始划计时器12
TR0=1;
TR1=1;
EA=1;
ET0=1;
ET1=1;
PT0=1;                                                                                                                                        //开各种中断
do        {

if(flag==0){
   P0=0x00;
   P0=num1;
   P3=temp;
                }

if(flag!=0){
   P0=0x00;  
   P0=num2;
   P3=temp;
  }       
}while(1);                                 


}                               



改的差不多了~~。。额额,好不容易找到牛人的帮助~~才传上来拉~~ 分享一下


一周热门 更多>