51中断实验与流水灯protues仿真

51单片机实验及protues仿真


实验内容:

设计一个单片机实验,完成对外部事件进行计数,当来2个脉冲时,通过中断用数码管显示相应信息或执行一个任务,当来6个脉冲时,又显示另外的信息或执行另一个任务,计数具备清零,发现中断时,有相应信息提示。

设计任意流水灯电路,实现两种以上方式的流水灯效果,通过按键切换或者自动切换。


一、实验一

1.protues仿真

在这里插入图片描述

2.程序

#include <reg51.h>

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit led1=P3^0;
sbit led2=P1^0;

sbit k0=P3^2;  //定义按键K3

#define smg P2

u8 tab[]=		   //段码表
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 
//0,	  1,	 2,	  3,	 4,		5,	 6,		7,	 8,		9,这是共阴极数码管0-9的段码


int count0,count1;

//定时器0溢出中断程序
void timer0() interrupt 1  //定时器0中断标志位为1
{
	//重新装载定时器0计数初值
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	if(count0==20)   //T0*10=1s LED1闪烁
	{
		led1=~led1;
		count0=0;
	}
	count0++;
}

//定时器1溢出中断程序
void timer1() interrupt 3  //定时器1中断标志位为3
{
	//重新装载定时器1计数初值
	TH1=(65536-25000)/256;
	TL1=(65536-25000)%256;
	
	count1++;
	
	if(count1==40)  //T1*10=0.5s LED2闪烁  20为2秒
	{
		led2=~led2;
		//count1=0;
	}
	if(count1==120*3) //为6秒
	{
		smg = tab[6];
		//count1 = 0;
	}
	
}

int main()
{
	EA=1;    //全局中断使能
	ET0=1;   //定时器0溢出中断使能
	ET1=1;   //定时器1溢出中断使能
	TR0=1;   //定时器0使能
	TR1=1;   //定时器1使能
	TMOD=0x11;   //00010001B,定时器0、1使用工作方式1,16位定时器
	//装载定时器0计数初值
	TH0=(65536-50000)/256;    //内置时钟频率为6MHz,定时器0计数50000次,计数初值为15536转为16进制
	TL0=(65536-50000)%256;    //机械周期为2us,T0=(65536-计数初值)*2us=0.1s
	//装载定时器1计数初值
	TH1=(65536-25000)/256;    //内置时钟频率为6MHz,定时器0计数25000次,计数初值为40536转为16进制
	TL1=(65536-25000)%256;    //机械周期为2us,T1=(65536-计数初值)*2us=0.05s
	led1=0;   //控制P3.0
	led2=0;   //控制P1.0
	
	while(1)
	{
		 
	}

}

二、实验二

1.protues仿真

在这里插入图片描述

2.程序

#include<reg51.h>
#include<intrins.h>



#define led P2

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

//延迟函数
void delay(){
	u16 a, b;
	for(a = 0; a < 400; a++)
	for(b = 0; b < 400; b++);
}



// LED点亮方式:依次点亮(一次一个,循环三次)
void yici(){
	char i, j;
 	for(j = 0; j < 1; j++){
		led = 0xfe;
		for(i = 0; i < 7; i++){
			led = _cror_(led, 1);
			delay();
		}
		led = 0x7f;
		for(i = 0; i < 7; i++){
			led = _crol_(led, 1);
			delay();
		}
	}
}

// 从两边到中间
char toMiddle[] = {0x7e, 0xbd, 0xdb, 0xe7, 0xdb, 0xbd, 0x7e};//LED灯点亮方式
void bianToMiddle(){
	char i, j;
 	for(j = 0; j < 1; j++){//循环三遍
		for(i = 0; i < 7; i++){//LED点亮方式:从两边到中间
			led = toMiddle[i];
			delay();
		}
	}
}

//由上向下依次点亮LED灯
char toBottom[] = {0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00};
void topToBottom(){
	char i, j;
 	for(j = 0; j < 1; j++){
		led = 0xff;
		for(i = 0; i < 8; i++){
			led = led << 1;
			delay();
		}
		for(i = 6; i >= 0; i--){
			 led = toBottom[i];
			delay();
		}
	}
}



void main(){
	while(1){
	 yici();	//LED灯依次亮
	 bianToMiddle();//LED灯从两边向中间逐次点亮
	 led = 0xff;	//关闭LED灯
	 topToBottom();//由上向下依次点亮LED灯
	}
}


总结

大佬可以支持一下:

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

眰恦I

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值