登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 按键

[复制链接]
发表于 2022-2-7 23:28:58 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 了解复位电路和函数调用,以及独立按键
开始时间: 2022-02-06
结束时间: 2022-02-07
一、复位电路

上电复位:从没有电到上电的瞬间,电容进行充电,此时电容对电路来说相当于导线,RST引脚为高电平;随着电容充电越来越多,电流越来越小,直至电容充满电,不再有电流,RST引脚变为低电平。
按键复位(手动复位):按下按键前RST为低电平,按下按键后,电路导通,电容瞬间放电,RST处于高电平,然后松开按键,之后则与上电复位类似。
复位时间:t(单位:s)=1.2*R(单位:Ω)*C(单位:F)


二、函数的调用

#include<reg52.h>         //000000μ&#189;999999£¨&#214;D&#182;&#207;£&#169;
sbit A2=P2^2;
sbit A1=P2^1;
sbit A0=P2^0;
sbit ENLED=P1^1;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                                                                                                                0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0123456789ABCDEF
unsigned char ledbuff[6]={0xff,0xff,0xff,0xff,0xff,0xff};
unsigned int m=0;
unsigned char n=0;
unsigned char i=0;
void main()
{
        unsigned long sec=0;
        EA=1;                                                                        //ê1&#196;ü×ü&#214;D&#182;&#207;
        ENLED=0;
        TMOD=0x01;                                                //T0&#206;a&#196;£ê&#189;1
        TH0=0xfc;                                                        //&#184;&#248;T0&#184;33&#245;&#214;μ0xfc18(T0&#206;a16&#184;&#246;×&#214;&#189;ú)
        TL0=0x18;
        ET0=1;                                                                //ê1&#196;üT0&#214;D&#182;&#207;
        TR0=1;                                                                //T0&#198;&#244;&#182;ˉ
        while(1)
        {
                if(n==1)
                {
                        n=0;
                        sec++;
                        ledbuff[0]=table[sec%10];
                        ledbuff[1]=table[sec/10%10];
                        ledbuff[2]=table[sec/100%10];
                        ledbuff[3]=table[sec/1000%10];
                        ledbuff[4]=table[sec/10000%10];
                        ledbuff[5]=table[sec/100000%10];
                }
        }
}
/*&#182;¨ê±&#198;÷0μ&#196;&#214;D&#182;&#207;·t&#206;&#241;oˉêy*/
void interrupttime()interrupt 1
{
        TH0=0xfc;                                                        //&#214;&#216;D&#194;&#188;ó&#212;&#216;3&#245;&#214;μ
        TL0=0x67;
        m++;
        if(m>=5000)
        {
                m=0;
                n=1;
        }
        P0=0xff;          //ò2&#191;é&#184;&#196;&#206;aP0=0x00  &#207;&#212;ê&#190;&#207;&#251;òt
        switch(i)
        {
                case 0: A2=1;A1=0;A0=1; i++; P0=ledbuff[0]; break;
                case 1: A2=1;A1=0;A0=0; i++; P0=ledbuff[1]; break;
                case 2: A2=0;A1=1;A0=1; i++; P0=ledbuff[2]; break;
                case 3: A2=0;A1=1;A0=0; i++; P0=ledbuff[3]; break;
                case 4: A2=0;A1=0;A0=1; i++; P0=ledbuff[4]; break;
                case 5: A2=0;A1=0;A0=0; i=0; P0=ledbuff[5]; break;
                default:break;
        }
}

将下面程序和上面进行对比,可以看出下程序中的count函数和led函数在主函数中是同时进行的,通过函数的调用可以是程序的结构更加清晰明了
注意:当函数调用时,需要提前在主函数前进行说明

#include<reg52.h>         //000000μ&#189;999999£¨&#214;D&#182;&#207;£&#169;
sbit A2=P2^2;
sbit A1=P2^1;
sbit A0=P2^0;
sbit ENLED=P1^1;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                                                                                                                0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0123456789ABCDEF
unsigned char ledbuff[6]={0xff,0xff,0xff,0xff,0xff,0xff};
void count();
void led();
void main()
{
        EA=1;                                                                        //ê1&#196;ü×ü&#214;D&#182;&#207;
        ENLED=0;
        TMOD=0x01;                                                //T0&#206;a&#196;£ê&#189;1
        TH0=0xfc;                                                        //&#184;&#248;T0&#184;33&#245;&#214;μ0xfc18(T0&#206;a16&#184;&#246;×&#214;&#189;ú)
        TL0=0x18;
        TR0=1;                                                                //T0&#198;&#244;&#182;ˉ
        while(1)
        {
                if(TF0==1)
                {
                        TF0=0;
                        TH0=0xfc;                                                        //&#214;&#216;D&#194;&#188;ó&#212;&#216;3&#245;&#214;μ
                        TL0=0x67;
                        count();
                        led();
                }
        }
}

void count()
{
        static unsigned int m=0;
        static unsigned long sec=0;
        m++;
        if(m>=5000)
        {
                m=0;
                sec++;
                ledbuff[0]=table[sec%10];
                ledbuff[1]=table[sec/10%10];
                ledbuff[2]=table[sec/100%10];
                ledbuff[3]=table[sec/1000%10];
                ledbuff[4]=table[sec/10000%10];
                ledbuff[5]=table[sec/100000%10];
        }
}

void led()
{
        static unsigned char i=0;
        switch(i)
        {
                case 0: A2=1;A1=0;A0=1; i++; P0=ledbuff[0]; break;
                case 1: A2=1;A1=0;A0=0; i++; P0=ledbuff[1]; break;
                case 2: A2=0;A1=1;A0=1; i++; P0=ledbuff[2]; break;
                case 3: A2=0;A1=1;A0=0; i++; P0=ledbuff[3]; break;
                case 4: A2=0;A1=0;A0=1; i++; P0=ledbuff[4]; break;
                case 5: A2=0;A1=0;A0=0; i=0; P0=ledbuff[5]; break;
                default:break;
        }
}



三、独立按键

首先应理解独立式按键的原理图,然后将矩阵按键进行拆分,再进行理解

#include<reg52.h>
sbit A3=P2^3;
sbit A2=P2^2;
sbit A1=P2^1;
sbit A0=P2^0;
sbit ENLED=P1^1;

sbit D0=P0^0;
sbit D1=P0^1;
sbit D2=P0^2;
sbit D3=P0^3;

sbit K1=P2^4;
sbit K2=P2^5;
sbit K3=P2^6;
sbit K4=P2^7;
void main()
{
        A3=1;
        A2=1;
        A1=1;
        A0=0;
        ENLED=0;
        P0=0x7f;         //起到指示灯作用,可更改
        while(1)
        {
                D3=K1;
                D2=K2;
                D1=K3;
                D0=K4;
        }
}





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

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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