单片机实验 之 广告流水灯中断控制

实验内容:

1.利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1hz闪烁,设晶振频率为12MHz

2.利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪烁,每盏灯的闪烁频率为10次/秒,8个灯依次闪烁一遍后循环。

3.用定时器以间隔500ms在6位数码管上依次显示0、1、2、3……、F(自己设计电路)

4.中断嵌套

INT0、INT1同时存在,P1为输出口,INT1优先级高于INT0,均为电平触发。

主程序8个发光二极管上下移动12轮,再闪烁12次;INT0的中断服务程序控制P1口的8个发光二极管闪烁13次,INT1的中断服务程序控制P1口的8个发光二极管上下移动10轮。其中,上下移动一次所用时间为100ms,闪烁一次所用时间为50ms,所有定时用中断处理,不允许用软件定时。

5.同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1、10、50、100、200、400、800、1k(hz)的方波。

仿真图:


1.源码:#include<reg52.h>
#define uchar unsigned char
sbit LED = P1^0;
uchar T_0 = 0;
void main()
{
TMOD=0x01;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
EA=1;
  ET0=1;

TR0=1;
while(1);
}
void LED_FLASH()interrupt 1

TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
T_0++;
if(T_0==50)
{
T_0=0;
LED=~LED;
}

}

2.源码:

#include <reg52.h>   
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned char
uchar T_0=0;
uchar a;
void delay(uint z)
{
uint j,k;
for(j=z;j>0;j--)
for(k=110;k>0;k--);
}
void main()
{
TMOD=0x10;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
EA=1;
ET1=1;
TR1=1;
a=0xfe;
while(1)
{
if(T_0==5)
{
T_0=0;
P1=a;
delay(500);
P1=0xff;
delay(50);
a=_crol_(a,1);
}
}
}
void LED_FLASH() interrupt 3

TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
T_0++;

}

3.源码:

#include<reg52.h>
#define uchar unsigned char
sbit LED = P0^0; 
uchar T_0 = 0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //0-F
uchar a=0;
void main()
{
uchar b;
b=0x01;
TMOD=0x01;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
EA=1;
  ET0=1;
TR0=1;
while(1)
{ if(T_0==25)
{
T_0=0;
P2=b;
P0=table[a];
a++;
if(a==16)
a=0;
}
}
}
void LED_FLASH()interrupt 1

TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
T_0++;

}

这是实物调试的代码,仿真图就自行设计吧。

4.源码:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,aa,bb;
uint i,j,led,m,n,k,ge,shi,bai,qian,wan,shiwan,x,y;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};     //0~F
uchar code place[]={0xe3,0xe7,0xeb,0xef,0xf3,0xf7}; //138译码器000~005
void delayms(uint);
void display();
void main()
{
TMOD=0xdd;
IT0=1;          //外部中断低电平触发
IT1=1;
EX0=1; //允许外部中断
EX1=1;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
ET0=1;
TR0=1;  
while(1)
{     led=0xfe; 
for(k=0;k<11;k++)   //流水灯12次
{
for(m=0;m<7;m++)   //流水灯往下流
{
P2=led;
delayms(6);
led=_crol_(led,1); 
}
for(n=0;n<7;n++)   //流水灯往上流
{
P2=led;
delayms(6);
led=_cror_(led,1);
}
display();
}
for(i=0;i<11;i++) //闪烁12次
{
P2=0x00;
delayms(25);
P2=0xff;
delayms(25);
display();
}
};
}
void display()
{
    ge++;
P2=0xf7;
P0=table[ge];
  if(ge==9)
  {
ge=0;
shi++;
P2=0xf3;
P0=table[shi];

if(shi==9)
{
shi=0;
bai++;
}
}
}
void delayms(uint xms)    
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
for(x=0;x<12;x++) //闪烁13次
{
P1=0x00;
delayms(25);
P1=0xff;
delayms(25);
display();
}
}
void T1_time() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
led=0xfe; 
for(y=0;y<9;y++)   //Á÷Ë®µÆ10´Î
{
for(m=0;m<7;m++)   //Á÷Ë®µÆÍùÏÂÁ÷
{
P1=led;
delayms(6);
led=_crol_(led,1); 
}
for(n=0;n<7;n++)   //Á÷Ë®µÆÍùÉÏÁ÷
{
P1=led;
delayms(6);
led=_cror_(led,1);
}
}
display();

}

5.源码:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P3^0;
uint code table[]={4000,400,80,40,20,10,5,4}; //8种频率
uchar Fre_0=0,Fre_1=0,i=0,T_0=0,b=0;
void main()
{
Fre_0=20000;
TMOD=0x11; //TMOD叫做计数器模式控制寄存器,01为方式1,功能为16位定时器
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
TH1=(65536-Fre_0)/256;
TL1=(65536-Fre_0)%256;
EA=1; //开总中断
ET0=1; //启动定时器0或1的中断
//(这两个条件允许了系统响应中断)
ET1=1;
TR0=1; //启动定时器
TR1=1;
LED1=1;
while(1) //等待中断
{
if(Fre_1>=0)
{ TR0=0;
LED1=~LED1;
if(T_0>14)
T_0=0;
i++;
if(i>7)
i=0;
TR0=1;
}
}
}
void LED_FLASH1() interrupt 1 //缺少了interrupt会无法运行函数,这个要由后面的参数n指明中断号

TH0=(65536-250)/256;
TL0=(65536-250)%256;
b++;
if(b>table[i]+1)
Fre_1++;
}
void LED_FLASH0() interrupt 3 //缺少了interrupt会无法运行函数,这个要由后面的参数n指明中断号
{
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
T_0++;

}

具体到仿真图或者实物调试都会有些许差异,还可对代码中的并行串口P0-P3做相应的调整,这个具体问题具体分析。

展开阅读全文

没有更多推荐了,返回首页