欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2023/12/9 139 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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 P2u8 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.05sled1=0; //控制P3.0led2=0; //控制P1.0while(1){}}

二、实验二

1.protues仿真

2.程序

#include<reg51.h> #include<intrins.h>#define led P2typedef 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灯} }

总结

大佬可以支持一下:

总结

以上是生活随笔为你收集整理的51中断实验与流水灯protues仿真的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。