200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 蓝桥杯51单片机之利用中断同时控制流水灯 数码管 独立按键 蜂鸣器【单片机开发初学

蓝桥杯51单片机之利用中断同时控制流水灯 数码管 独立按键 蜂鸣器【单片机开发初学

时间:2023-08-15 12:52:10

相关推荐

蓝桥杯51单片机之利用中断同时控制流水灯 数码管 独立按键 蜂鸣器【单片机开发初学

文章目录

一、流水灯与数码管二、独立按键、数码管、流水灯、蜂鸣器

一、流水灯与数码管

流水灯不断左移,通过外部中断0来控制数码管的显示。

#include <reg52.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint z);void left_one();//两个锁存器的锁存端sbit dula= P2^6;sbit wela= P2^7;uchar temp, num, aa;uchar code table[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};void main(){num= 0;TMOD= 0x01; //初始化定时器//50毫秒进行一次中断TH0= (65536-50000)/256; //高八位TL0= (65536-50000)%256; //低八位EA= 1; //开总中断ET0= 1; //开定时器中断TR0= 1; //启动定时器//点亮一个流水灯temp= 0xfe;P1= temp;//数码管的初始值为0dula= 1;P0= table[0];dula= 0;//每个数码管都亮wela= 1;P0= 0x00;wela= 0;while(1){//流水灯左移一位left_one(); }}//中断函数void timer0() interrupt 1 //定时器0中断,1等级的中断{TH0= (65536-50000)/256; //高八位TL0= (65536-50000)%256; //低八位aa++;if(aa==40) {aa= 0;num++;//不能超过,否则清零if(num==10)num= 0;//更改数码管的数字dula= 1;P0= table[num];dula= 0;}}//延时函数void delay(uint z) //延时x毫秒的函数{uint i,j;for(i=z; i>0; i--){for(j=110; j>0; j--) ;}}//流水灯函数void left_one(){delay(1000);temp = temp<<1;P1= temp;}

二、独立按键、数码管、流水灯、蜂鸣器

#include <reg52.h>#define uint unsigned int#define uchar unsigned charvoid delayms(uint z); //延时void add_left(); //默认从0到8顺序流动void display(); //亮学号,中断0void burst(); //全数码管闪烁,中断1void pulse_BZ(uint Q); //蜂鸣器发声函数//U1和U2锁存器的锁存端sbit dula = P2^6;sbit wela = P2^7;//蜂鸣器锁存器sbit buzzer = P2^3;//学号的段选信号uchar code table[]={0x5b, 0x3f, 0x06, 0x6f,0x66, 0x5b, 0x7d, 0x3f};//0到9的数字段选信号uchar S[]= {0x06, 0x5b, 0x4f, 0x66,0x6d, 0x7d, 0x07, 0x7f, 0x6f};//存放位选信号uchar D[]= {0xfe, 0xfd, 0xfb, 0xf7,0xef, 0xdf, 0xbf, 0x7f};//存放流水灯信号uchar Led[]={0x3F, 0xE7, 0xFC};void main(){//中断方式初始化IT0= 0; //外部中断0低电平触发IT1= 0; //外部中断1低电平触发//开中断允许寄存器IEEA= 1; //开总中断EX0= 1; //允许外部中断0EX1= 1; //允许外部中断1//开中断优先级寄存器IPPX0= 1; //外部中断0高优先级PX1= 0; //外部中断1低优先级while(1){add_left();}}void delayms(uint z){uint i, j;for(i=z; i>0; i--)for(j=110; j>0; j--) ;} //外部中断0 服务函数,亮学号void display() interrupt 0{uchar temp= P0; //保护现场uint i;int n=1000;P1= Led[2]; //第三组流水灯pulse_BZ(100); //蜂鸣器响一声while(n>0){for(i=0; i<sizeof(table); i++){dula= 1;P0= table[i]; //送入段选信号dula= 0;P0= 0xff; //送位选数据前关闭数码管的显示,防止位选锁存器混乱wela= 1;P0= D[i]; //送入位选信号,只亮一位,但由于视觉残留效应,会觉得是同时亮着的wela= 0;delayms(2); //(必须有延时)延时2毫秒,对于人眼的视觉暂留根本看出来在跳 n--;}}P0= temp; //恢复现场}//外部中断1 服务函数,全数码管闪烁void burst() interrupt 2{uchar temp= P0;uint num;P1= Led[1]; //第二组流水灯pulse_BZ(100); //蜂鸣器响一声for(num=0; num<9; num++)//9个数循环显示{wela= 1;P0= 0x00; //全数码管亮wela= 0;dula= 1;P0= S[num]; //段选信号,依次取数组中的值dula= 0;delayms(500); //延时0.5秒}P0= temp;}void add_left(){uint i;P1= Led[0]; //第一组流水灯//pulse_BZ(100); //蜂鸣器响一声for(i=0; i<8; i++){dula= 1;P0= S[i];dula= 0;wela= 1;P0= D[i];wela= 0;delayms(1000);}}void pulse_BZ(uint Q){buzzer = 0; //输出低电平来发声delayms(Q); //发声之后需要延时一下buzzer = 1; //关闭发声delayms(Q); //延时 }

1、实现的功能就是:

第一档是数码管从左到右数字不断进行加1操作;

第二档是数码管全亮,从0一直加到9,不断闪烁;

第三档也就是最高档是显示学号;

流水灯显示档位,每次换挡蜂鸣器都会短暂响一声。

2、中断分析

这也就是通过外部中断的高低位设置来实现的,在这里,显示学号是外部中断0,等级设置为最高,数码管全显示数字增加的外部中断1,等级为中等,最低等级是正常执行的部分,也就是数码管依次向右移动同时加1。

蓝桥杯51单片机之利用中断同时控制流水灯 数码管 独立按键 蜂鸣器【单片机开发初学者有趣综合案例】

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。