单片机学习进阶案例

该博客详细介绍了多个单片机应用案例,包括INT0、INT1中断计数,TIMER0控制LED闪烁、数码管显示、8*8点阵显示、蜂鸣器门铃声、交通指示灯,以及TIMER1控制音阶演奏等。每个案例都提供了原理图和程序代码,适合单片机初学者深入学习。

根据单片机100案例所做,适合初学者进一步学习单片机的案例.

单片机案例11

结合proteus和keil
11 INT0中断计数器
原理图

在这里插入图片描述

程序
/*
	名称:INT0中断计数
	说明:按下计数键K1触发中断,中断程序累加计数
		计数值显示在三个数码管上,按下清零键K2数码管清零

*/
#include<reg51.h>
#include<intrins.h>
#define INT8U unsigned char
#define INT16U unsigned int 

//共阳极0-9的数码管段码表
code INT8U CA_Table[]=
{
   
   
	0xC0,0xF9,
	0xA4,0xB0,
	0x99,0x92,
	0x82,0xF8,
	0x80,0x90,
	0xFF//黑屏
};
//计数器值分解后的给位
INT8U show_buffer[]={
   
   0,0,0};
INT16U count=0;
sbit clear_key=P3^6;
//延时
void delay_ms(INT16U x)
{
   
   
	INT8U t;
	while(x--)
	{
   
   
		for(t=0;t<120;t++);
	}
}
//数码管显示计数值
void refresh_show()
{
   
   
	//获取三个数位
	show_buffer[0]=count/100;
	show_buffer[1]=count%100/10;
	show_buffer[2]=count%10;

	if(show_buffer[0]==0)//高位为0时不显示
	{
   
   
		show_buffer[0]=10;
		//高位为0时,第二位为0,也不显示
		if(show_buffer[1]==0)
			show_buffer[1]=10;
	}
	P0=CA_Table[show_buffer[0]];
	P1=CA_Table[show_buffer[1]];
	P2=CA_Table[show_buffer[2]];

}
void main()
{
   
   
	//初始化显示端口
	P0=0xFF;
	P1=0xFF;
	P2=0xFF;
	IE=0x81;//允许INT0中断
	IT0=1;//下降沿触发
	while(1)
	{
   
   
		if(clear_key==0)//清零
			count=0;
		refresh_show();//持续则刷新显示
	}
}

//INT0中断函数
void ex_int0() interrupt 0
{
   
   
	EA=0;//禁止中断
	delay_ms(10);//消抖
	count++;//计数值递增
	EA=1;//开中断
}

单片机案例12

结合proteus和keil
12 INT0与INT1中断计数
原理图

在这里插入图片描述

程序
/*
	名称:INT0和INT1中断计数
	说明:按下计数键K1计数值显示在右边数码管上,
		按下计数键K2计数值显示在左边数码管上,
		按下清零键K3,K4数码管清零

*/
#include<reg51.h>
#include<intrins.h>
#define INT8U unsigned char
#define INT16U unsigned int 

sbit K3=P3^4;//清零
sbit K4=P3^5;
//共阳极0-9的数码管段码表
code INT8U CA_Table[]=
{
   
   
	0xC0,0xF9,
	0xA4,0xB0,
	0x99,0x92,
	0x82,0xF8,
	0x80,0x90,
	0xFF//黑屏
};

code INT8U scan_bits[]=
{
   
   
	0x20,0x10,
	0x08,0x04,
	0x02,0x01
};
//两组计数的显示缓冲,前3为一组,后3一组
INT8U show_buffer[]=
{
   
   
	0,0,0,
	0,0,0
};
INT16U count_a=0;
INT16U count_b=0;

//延时
void delay_ms(INT16U x)
{
   
   
	INT8U t;
	while(x--)
	{
   
   
		for(t=0;t<120;t++);
	}
}
//数码管显示计数值
void refresh_show()
{
   
   
	INT8U i;
	//分解count_a
	show_buffer[5]=count_a/100;
	show_buffer[4]=count_a%100/10;
	show_buffer[3]=count_a%10;

	if(show_buffer[5]==0)//高位为0时不显示
	{
   
   
		show_buffer[5]=10;
		//高位为0时,第二位为0,也不显示
		if(show_buffer[4]==0)
			show_buffer[4]=10;
	}

	//分解count_b
	show_buffer[2]=count_b/100;
	show_buffer[1]=count_b%100/10;
	show_buffer[0]=count_b%10;

	if(show_buffer[2]==0)//高位为0时不显示
	{
   
   
		show_buffer[2]=10;
		//高位为0时,第二位为0,也不显示
		if(show_buffer[1]==0)
			show_buffer[1]=10;
	}


	for(i=<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值