51单片机入门(第五讲)

 

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,t0,t1,swan,wan,qian,bai,shi,ge,flag,flag1;
uint shu;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};
void display(uchar swan,uchar wan,uchar qian,uchar bai,uchar shi,uchar ge);
void delay(uint z);
void init();
void main()
{	
	init();
	while(1)
	{ 
		if(flag1!=1)
		{
		   display(7,6,5,bai,shi,ge);
		}else
    {
				display(16,17,18,18,19,20);
			  
		}		
	}
}

void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

void display(uchar swan,uchar wan,uchar qian,uchar bai,uchar shi,uchar ge)
{
    dula=1;
		P0=table[swan];
		dula=0;
		P0=0xff;
		wela=1;
		P0=0xfe;
		wela=0;
		delay(1);

		dula=1;
		P0=table[wan];
		dula=0;
		P0=0xff;
		wela=1;
		P0=0xfd;
		wela=0;
		delay(1);

		dula=1;
		P0=table[qian];
		dula=0;
		P0=0xff;
		wela=1;
		P0=0xfb;
		wela=0;
		delay(1);
		
		dula=1;
		P0=table[bai];
		dula=0;
		P0=0xff;
		wela=1;
		P0=0xf7;
		wela=0;
		delay(1);
		
		dula=1;
		P0=table[shi];
		dula=0;
		P0=0xff;
		wela=1;
		P0=0xef;
		wela=0;
		delay(1);
		
		dula=1;
		P0=table[ge];
		dula=0;
		P0=0xff;
		wela=1;
		P0=0xdf;
		wela=0;
		delay(1);
}

void init()
{	
	shu=432;
	temp=0xfe;
	P1=temp;
	TMOD=0x11;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	EA=1;
	ET0=1;
	ET1=1;
	TR0=1;
  TR1=1;	
}

void timer0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	t0++;	
	if(flag!=1)
	{	
	  if(t0==10)
	  {
			t0=0;
			temp=_crol_(temp,1);
		  P1=temp;
	  }
	}else
    {
				if(t0%4==0)
				{					  
			    P1=~P1;
				}
				if(t0==60)
				{
						TR0=0;
					  P1=0xff;
					  flag1=1;
				}
		}	
}
void timer1() interrupt 3
{
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	t1++;
  if(t1==2)
	{
			t1=0;
		  shu--;
		  bai=shu/100;
			shi=shu%100/10;
			ge=shu%10;
		  if(shu==398)
			{
					TR0=0;
				  TH0=(65536-50000)/256;
	        TL0=(65536-50000)%256;
				  TR0=1;
				  flag=1;
				  t0=0;
				  P1=0xff;
				  TR1=0;
				  
			}
		  
	}		
}

 多复习多理解

独立键盘  矩阵键盘

 

 

 

线与关系   连根先连在一起  只要有一根线为低电平那么整个都为低电平。

 

 

 

 写一个按下独立键盘1时led1亮,松手时灯灭同时数码管数字加1(0-9)。

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit led1=P1^0;
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
uchar sum;
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}
void main()
{
		
	P3=0xff;//按键初始化 全部置一
    wela=1;
    P0=0xfe;   //当第一个数码管亮
    wela=0;	
	  while(1) 
	  {
				if(key1==0)  //判断是否按下
				{
					delay(5); //延时消抖
					if(key1==0)  //再次检测是否按下  防噪音防误触
				  {											
						led1=0;  //灯亮
						sum++;
						if(sum==10)
						 {
								sum=0;
						 }
					 }
					    while(!key1);  //松手检测
						delay(5);    //消抖
						while(!key1);  //再次松手检测
				  }else
				   {
						led1=1;  //灯灭
						dula=1;
						P0=table[sum]; //数码管加一
						dula=0;
				   }
					 
		}
}

 矩阵键盘

 

 

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit led1=P1^0;
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
uchar key,temp;
void delay(uint z) 
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}
void display(uchar key)  //显示程序
{
	  dula=1;
	  P0=table[key];
	  dula=0;
}
void jzjpsm()   //矩阵键盘扫描程序
{
	P3=0xfe;  //给p3.0赋0  扫描第一行
	temp=P3;
    temp=temp&0xf0;  //取高四位和1111与
    if(temp!=0xf0)  //如果temp高四位变化说明检测到按键
    {
			  delay(10);  //延时防抖动
			  temp=P3;
			  temp=temp&0xf0;
			  if(temp!=0xf0)  //再次扫描
				{
					temp=P3;
					switch(temp)  //对temp的不同值对应不同情况
					{
							case 0xee: //为第一个键
								key=0;
								break;
							case 0xde:  //为第二个键
								key=1;
								break;
							case 0xbe:  //为第三个键
								key=2;
								break;
							case 0x7e:  //为第四个键
							  key=3;
							  break;
					}
					while(temp!=0xf0) //松手检测 松手即跳出
					{
							temp=P3;
						  temp=temp&0xf0;
					}
					display(key);  //显示对应的数字
				}
		}
		P3=0xfd;
	  temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
				delay(10);
			  temp=P3;
			  temp=temp&0xf0;
			  if(temp!=0xf0)
				{
					temp=P3;
					switch(temp)
					{
							case 0xed:
								key=4;
								break;
							case 0xdd:
								key=5;
								break;
							case 0xbd:
								key=6;
								break;
							case 0x7d:
							  key=7;
							  break;
					}
					while(temp!=0xf0)
					{
							temp=P3;
						  temp=temp&0xf0;
					}
					display(key);
				}
		}
    P3=0xfb;
	  temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
				delay(10);
			  temp=P3;
			  temp=temp&0xf0;
			  if(temp!=0xf0)
				{
					temp=P3;
					switch(temp)
					{
							case 0xeb:
								key=8;
								break;
							case 0xdb:
								key=9;
								break;
							case 0xbb:
								key=10;
								break;
							case 0x7b:
							  key=11;
							  break;
					}
					while(temp!=0xf0)
					{
							temp=P3;
						  temp=temp&0xf0;
					}
					display(key);
				}
		}
  	P3=0xf7;
	  temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
				delay(10);
			  temp=P3;
			  temp=temp&0xf0;
			  if(temp!=0xf0)
				{
					temp=P3;
					switch(temp)
					{
							case 0xe7:
								key=12;
								break;
							case 0xd7:
								key=13;
								break;
							case 0xb7:
								key=14;
								break;
							case 0x77:
							  key=15;
							  break;
					}
					while(temp!=0xf0)
					{
							temp=P3;
						  temp=temp&0xf0;
					}
					display(key);
				}
		}	
}
void main()
{
		dula=1;
		P0=0x00;
		dula=0;
	    wela=1;
		P0=0xc0;
	    wela=0;
	    while(1)
		{
				jzjpsm();
		}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STC51是一款非常常见和广泛使用的单片机,由海上电子公司生产。STC51的全称是STC12C5A60S2,是一款8位的低功耗高性能单片机。它采用MCS-51指令集,具有强大的功能和灵活的扩展性。 STC51单片机入门的第一步是了解其基本原理和架构。STC51采用哈佛结构,具有4KB的内部FLASH存储器和128B的内部RAM。它还具有多种外设接口,包括GPIO、定时器、串口、ADC等。了解这些基本知识是学习STC51的基础。 接下来,我们需要学习如何使用开发工具和编程软件。STC推出了一系列的开发工具和编程软件,其中包括STC-ISP下载器、STC-ISP助手和STC-PROG编程软件。了解如何正确连接硬件并使用这些软件进行编程是非常重要的。 了解STC51的编程语言是必要的。STC51支持多种编程语言,包括C语言和汇编语言。对于初学者来说,建议先学习C语言,因为它更容易上手。可以通过编写简单的程序来熟悉STC51的编程语言和编程技巧。 熟悉基本的输入输出操作和中断是学习STC51的重要一步。STC51具有丰富的输入输出接口,包括数字输入输出口、模拟输入输出口和串口等。了解如何进行输入输出操作和中断处理是开发应用程序的基础。 最后,可以通过实际的项目实践来深入理解和掌握STC51。可以选择一些简单的项目,例如LED灯控制、蜂鸣器控制等,通过实践不断提高自己的能力。 总之,STC51单片机入门需要掌握其基本原理和架构、开发工具和编程软件的使用、编程语言的学习、输入输出操作和中断处理的了解,以及通过实际项目实践来提高能力。希望这些基本知识对你的STC51单片机入门有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值