登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 定时炸dan

[复制链接]
发表于 2022-1-25 21:16:56 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 51单片机
学习安排: 学习定时炸dan程序并复习前面的知识
开始时间: 2022-01-23
结束时间: 2022-01-24
定时炸dan程序就像是对之前学习的单片机知识的汇总,用到了蜂鸣器,矩阵按键,数码管及led灯的刷新,定时器及中断,分时复用等等综合性挺强,程序很多,不好码,写完之后在看程序时发现我对中断在整个程序中处的位置有些模糊,就去复习了一下。


定时炸dan程序

#include<reg52.h>

sbit BUZZ = P1^3;
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 P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
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}
};
unsigned char LedBuff[7] = {
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char code KeyCodeMap[4][4] = {
                {0x31,0x32,0x33,0x26},
    {0x34,0x35,0x36,0x25},
    {0x37,0x38,0x39,0x28},
                {0x30,0x1B,0x0D,0x27}
};
unsigned long pdata KeyDownTime[4][4] = {
    {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}
};
bit enBuzz = 0;
bit flag1s = 0;
bit flagStart = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned int CountDown = 0;

void ConfigTimer0(unsigned int ms);
void ShowNumber(unsigned long num);
void KeyDriver();

void main()
{
EA = 1;
ENLED = 0;
ConfigTimer0(1);
ShowNumber(0);

while(1)
{
KeyDriver();
if(flagStart && flag1s)
{
flag1s = 0;
if(CountDown>0)
{
CountDown--;
ShowNumber(CountDown);

if(CountDown == 0)
{
enBuzz = 1;
LedBuff[6] = 0x00;
}
}
}
}
}

void ConfigTimer0(unsigned int ms)
{
                unsigned long tmp;

    tmp = 32768000/12;
                tmp = (tmp*ms)/1000;
    tmp = 65536 - tmp;
    tmp = tmp + 28;
    T0RH = (unsigned char)(tmp>>8);
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0;
    TMOD |= 0x01;
    TH0 = T0RH;
                TL0 = T0RL;
    ET0 = 1;
    TR0 = 1;
}

void ShowNumber(unsigned long num)
{
    signed char i;
                unsigned char buf[6];
               
                for(i = 0;i<6;i++)
                {
                buf = num%10;
                num = num/10;
                }
    for(i = 5;i>=1;i--)
                {
                if(buf == 0)
                   LedBuff = 0xFF;
                else
                   break;
                }               
                for(;i>=0;i--)
                {
                LedBuff = LedChar[buf];
                }
}

void KeyAction(unsigned char keycode)
{
if(keycode == 0x26)
{
if(CountDown<9999)
{
CountDown++;
ShowNumber(CountDown);
}
}
else if(keycode == 0x28)
{
if(CountDown>1)
{
CountDown--;
ShowNumber(CountDown);
}
}
else if(keycode == 0x0D)
{
flagStart = 1;
}
else if(keycode == 0x1B)
{
enBuzz = 0;
LedBuff[6] = 0xFF;
flagStart = 0;
CountDown = 0;
ShowNumber(CountDown);
}
}

void KeyDriver()
{
unsigned char i,j;
static unsigned char pdata backup[4][4] = {
    {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
static unsigned long pdata TimeThr[4][4] = {
    {1000,1000,1000,1000},{1000,1000,1000,1000},
    {1000,1000,1000,1000},{1000,1000,1000,1000}
};
for(i = 0;i<4;i++)
{
for(j = 0;j<4;j++)
{
if(backup[j] != KeySta[j])
{
if(backup[j] != 0)
{
KeyAction(KeyCodeMap[j]);
}
backup[j] = KeySta[j];
}
if(KeyDownTime[j]>0)
{
if(KeyDownTime[j] >= TimeThr[j])
{
KeyAction(KeyCodeMap[j]);
TimeThr[j] += 200;
}
}
else
{
TimeThr[j] = 1000;
}
}
}
}

void KeyScan()
{
static unsigned char n = 0;
unsigned char i;
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}
};
    P20 = 1;
    P21 = 1;
    P22 = 1;
    P23 = 1;
                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;
                KeyDownTime[keyout] += 4;
                }
                else if((keybuf[keyout] & 0x0F) == 0x0F)
                {
                KeySta[keyout] = 1;
                KeyDownTime[keyout] = 0;
                }
                }
               
                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;
                }
                    P0 = 0xFF;
    switch(n)
    {
                 
     case 022 = 021 = 020 = 0;n++0 = LedBuff[5];break;
                 case 122 = 021 = 020 = 1;n++0 = LedBuff[4];break;
                 case 222 = 021 = 120 = 0;n++0 = LedBuff[3];break;
     case 322 = 021 = 1;P20 = 1;n++;P0 = LedBuff[2];break;
                 case 422 = 1;P21 = 0;P20 = 0;n++;P0 = LedBuff[1];break;
     case 522 = 1;P21 = 0;P20 = 1;n++;P0 = LedBuff[0];break;
                 case 622 = 1;P21 = 1;P20 = 0;n = 0;P0 = LedBuff[6];break;
     default: break;
                }
                }
               
                void LedScan()
                {
                static unsigned char i = 0;
    P0 = 0xFF;
    switch(i)
    {
                 
     case 022 = 0;P21 = 0;P20 = 0;i++;P0 = LedBuff[5];break;
                 case 122 = 0;P21 = 0;P20 = 1;i++;P0 = LedBuff[4];break;
                 case 222 = 0;P21 = 1;P20 = 0;i++;P0 = LedBuff[3];break;
     case 3:P22 = 0;P21 = 1;P20 = 1;i++;P0 = LedBuff[2];break;
                 case 4:P22 = 1;P21 = 0;P20 = 0;i++;P0 = LedBuff[1];break;
     case 5:P22 = 1;P21 = 0;P20 = 1;i++;P0 = LedBuff[0];break;
                 case 6:P22 = 1;P21 = 1;P20 = 0;i = 0;P0 = LedBuff[6];break;
     default: break;
                }
                }
               
                void InterruptTimer0() interrupt 1
                {
                static unsigned int tmr1s = 0;
               
                TH0 = T0RH;
                TL0 = T0RL;
                if(enBuzz)
                  BUZZ = ~BUZZ;
                else
                  BUZZ = 1;
                LedScan();
                KeyScan();
                if(flagStart)
                {
                tmr1s++;
                if(tmr1s>=1000)
                {
                tmr1s = 0;
                flag1s = 1;
                }
                }
                else
                {
                tmr1s = 0;
                }
                }

好懒~~不想说~~~
 楼主| 发表于 2022-1-26 10:08:43 | 显示全部楼层
电气2109张烁琦 发表于 2022-1-25 23:32
要不要考虑一起搞个真的

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

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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