登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 51单片机矩阵按键,点阵,步进电机以及DIY小门铃

[复制链接]
发表于 2022-1-11 21:16:28 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 51单片机
学习安排: 了解一下点阵,学习矩阵按键扫描和分时复用,学习部分步进电机的知识,将门铃做好
开始时间: 2022-01-10
结束时间: 2022-01-11
1月10日
在B站上学习点阵知识,只是了解了一下没有做深入探究,其原理和数码管动态刷新类似。之后学习矩阵按键知识并再次复习中断,之后利用所学知识编写程序,利用了定时器,中断,分时复用,switch语句检测按键状态,并显示被按下的按键(利用分时复用,在检测到有按键按下后再打开数码管进行显示)。过程较为坎坷,写了两天,当然中间也有在做其他的事情。

下面是矩阵按键扫描程序

#include<reg52.h>

sbit KEY_OUT_4 = P2^7;
sbit KEY_OUT_3 = P2^6;
sbit KEY_OUT_2 = P2^5;
sbit KEY_OUT_1 = P2^4;
sbit ENLED = P1^1;
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit KEY_IN_1 = P2^0;
sbit KEY_IN_2 = P2^1;
sbit KEY_IN_3 = P2^2;
sbit KEY_IN_4 = P2^3;

unsigned char code LedChar[] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
                };
                unsigned char KeySta[4][4] = {
                {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}
                };

                void main()
                {
                unsigned char i,j;
                unsigned char backup[4][4] = {
                {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}
                };

                EA = 1;
                TMOD = 0x01;
                TH0 = 0xf5;
                TL0 = 0x55;
                ET0 = 1;
                TR0 = 1;
                P0 = LedChar[0];

                while(1)
                {

                for(i = 0;i<4;i++)
                {
                for(j = 0;j<4;j++)
                {
                if(backup[j] != KeySta[j])
                {

                if(backup[j] == 0)
                {
                ENLED = 0;
                ADDR0 = 1;
                ADDR1 = 0;
                ADDR2 = 1;
                P0 = LedChar[i*4+j];
                }
                backup[j] = KeySta[j];

                }
                }
                }
                }
                }

                void InterruptTimer0() interrupt 1
                {

                unsigned char i = 0;
                static unsigned char keyout = 0;
                static unsigned char keybuf[4][4] = {
                {0xFF,0xFF,0xFF,0xFF}, {0xFF,0xFF,0xFF,0xFF}, {0xFF,0xFF,0xFF,0xFF}, {0xFF,0xFF,0xFF,0xFF}
};

                ENLED = 1;
                ADDR0 = 1;
                ADDR1 = 1;
                ADDR2 = 1;
                TH0 = 0xf5;
                TL0 = 0x55;
                keybuf[keyout][0] = (keybuf[keyout][0] <<1) | KEY_IN_1;
                keybuf[keyout][1] = (keybuf[keyout][1] <<1) | KEY_IN_2;
                keybuf[keyout][2] = (keybuf[keyout][2] <<1) | KEY_IN_3;
                keybuf[keyout][3] = (keybuf[keyout][3] <<1) | KEY_IN_4;

                for(i = 0;i<4;i++)
                {
                if((keybuf[keyout] & 0x0F) == 0x00)
                {
                KeySta[keyout] = 0;
                }
                else if((keybuf[keyout] & 0x0F) == 0x0F)
                {
                KeySta[keyout] = 1;
                }
                }

                keyout++;
                keyout = keyout & 0x03;
                switch(keyout)
                {
                case 0:KEY_OUT_4 = 0;KEY_OUT_3 = 1;KEY_OUT_2 = 1;KEY_OUT_1 = 1;break;
                case 1:KEY_OUT_4 = 1;KEY_OUT_3 = 0;KEY_OUT_2 = 1;KEY_OUT_1 = 1;break;
                case 2:KEY_OUT_4 = 1;KEY_OUT_3 = 1;KEY_OUT_2 = 0;KEY_OUT_1 = 1;break;
                case 3:KEY_OUT_4 = 1;KEY_OUT_3 = 1;KEY_OUT_2 = 1;KEY_OUT_1 = 0;break;
                default:break;
                }
                }

现象是按键从左开始“S"显示0-9,a-f。

1月11日

门铃的零件到货,开始进行组装,焊接(成品在下面)。其原理还有一部分不太明白,明天会进行进一步学习研究。关于单片机的学习,今天学习了一点步进电机,在下认为很重要,所以要学的细致一些(毕竟以后可能要做智能车)目前了解了步进电机的分类,工作原理以及工作模式(单四拍,八拍,双四拍),其中八拍是较为常用的工作模式。工作原理是利用电磁感应产生磁场,通过改变导通的"相"来使"外圈"不断吸引"内圈"让内圈达到旋转的效果。

下面是门铃成果图

门铃

门铃

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表