51单片机的部分学习内容

一、蜂鸣器

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit BEEP=P2^5;                        //定义端口
void delay_10us(u166 ten_us){          //延时函数
  while(ten_us--);
}
void main()
{
u16 i=2000;                            //控制蜂鸣器响的时间
while(i){
while(i--){
BEEP!=BEEP;          //BEEP=0;             //改变频率来改变音调 T=(1/f)*2;
delay_10us(100);     //delay_10us(50);
}                    //BEEP=1;
i=0;                 //delay_10us(150);    //周期为50+150=200us;
BEEP=0;
}
}

二、动态数码管

人的肉眼可见的显示的时间是20ms-50ms,要是将动态数码管显示的间隔的时间小于20ms,人的肉眼将会误以为数字
是同时出现的。
如图一所示,如果想让最左边的LED8显示,则根据右边的图可知,就是等于Y7,即P22P23P24=111;同理,让LED7显示,就是等于Y6,即P22P23P24=011;
还有重要的一点就是消除重影。
比如LED8=0,他会有一个LED8=1的重影,所以让数码管清零以此来消影。

                                                                  图一

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define SMG_A_DP_PORT P0 //注意这里是P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x6d,0x7d,0x07,0x7f};
void delay_10us(u16 ten_us){
while(ten_us--);
}
void smg_display()
{
u8 i=0;
for(i=0;i<=7;i++){
switch(i)
{
case 0:LSC=1;LSB=1;LSA=1;break; //LED8即Y7
case 1:LSC=1;LSB=1;LSA=0;break; //LED7即Y6
case 2:LSC=1;LSB=0;LSA=1;break; //LED6即Y5
case 3:LSC=1;LSB=0;LSA=0;break; //LED6即Y4
case 4:LSC=0;LSB=1;LSA=1;break; //LED6即Y3
case 5:LSC=0;LSB=1;LSA=0;break; //LED6即Y2
case 6:LSC=0;LSB=0;LSA=1;break; //LED6即Y1
case 7:LSC=0;LSB=0;LSA=0;break; //LED6即Y0
}
SMG_A_DP_PORT=gsmg_code[i];
delay_10us(100);
SMG_A_DP_PORT=0x00;               //消影
}
}

void main()
{
while(1){
smg_display();
}
}

三、独立按键

按下独立按键的时候会抖动,所以要消抖。抖动的时间是5-10ms,所以要通过延时函数来消除抖动,然后再来个if语句判断其是否是稳定闭合。(这是属于软件消抖)
然后重要的就是独立按键扫描函数。
就是判断其是要求单次按键效果(比如开灯)还是一直按着的效果(比如遥控器加音量)。

 

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;

sbit KEY1=P3^1;         //定义独立按键的端口
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit LED1=P2^0;

#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0

void delay_10us(u16 ten_us){
while(ten_us--);
}

u8 key_scan(u8 mode){            //通过mode的值来决定这个按键扫描函数是达到单次按键效果(mode=0)还是一直按着(mode=1)的效果
     static u8 key=1;            //定义静态变量
     if(mode==1){
     key=1;
}
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)){
key=0;
delay_10us(1000);                         //消抖         
if(KEY1==0){
return KEY1_PRESS;
}else if(KEY2==0){
return KEY2_PRESS;
}else if(KEY3==0){
return KEY3_PRESS;
}else if(KEY4==0){
return KEY4_PRESS;
}
}else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1){
key=1;
}
return KEY_UNPRESS;
}

void main()
{
u8 key=0;
while(1){
key=key_scan(0);
if(key==KEY1_PRESS){
LED1=!LED1;                 //取反是为了独立按键按一次它亮一次,再按一次就灭了
}
}
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值