⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.txt

📁 一段C程序,机遇单片机的一段控制门锁的程序一段C程序,机遇单片机的一段控制门锁的程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>

// P0口连接数码管段控信号

// P1口连接数码管片选信号

sbit Sel0 = P1 ^ 0;
sbit Sel1 = P1 ^ 1;
sbit Sel2 = P1 ^ 2;
sbit Sel3 = P1 ^ 3;
sbit Sel4 = P1 ^ 4;
sbit Sel5 = P1 ^ 5;

// P2口连接4×4键盘

sbit P2_0 = P2 ^ 0;
sbit P2_1 = P2 ^ 1;
sbit P2_2 = P2 ^ 2;
sbit P2_3 = P2 ^ 3;
sbit P2_4 = P2 ^ 4;
sbit P2_5 = P2 ^ 5;
sbit P2_6 = P2 ^ 6;
sbit P2_7 = P2 ^ 7;

// P3口连接发光二极管、蜂鸣器和外部存储器
sbit Green = P3 ^ 0;
sbit Yellow = P3 ^ 1;
sbit Red = P3 ^ 2;
sbit Beep = P3 ^ 3;

// 共阳数码管编码
code const unsigned char LED_CODE[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

// 六个数码管显示内容
unsigned char LED[5];

//两组密码:智能门锁密码Password_1[5]和键盘上锁密码Password_2[5]
unsigned char Password_1[5], Password_2[5];


//输入时密码错误次数
unsigned char Wrong;

// 数码管动态扫描索引
unsigned char LedSel;

// 10毫秒,500毫秒,10秒定时标志
volatile unsigned char Flag10ms, Flag500ms, Flag1s, Flag10s, Flag60s;
unsigned char halfCount;

// 蜂鸣器鸣叫时间(5毫秒为单位)
unsigned char BeepCount;

// 发光二极管点亮时间(5毫秒为单位)
unsigned char LightCount;


// 发光二极管电路工作状态
unsigned char LightType;
#define LightingRed	0	// 点亮红灯
#define LightingGreen	1	// 点亮绿灯
#define LightingYellow	2	// 点亮黄灯

// 蜂鸣器鸣叫类型
unsigned char BeepType;
#define BT_BUTTON	0	// 按键声
#define BT_ALARM_1	1	// 报警声1(60秒)
#define BT_ALARM_2	2	// 报警声2(500毫秒)


// 系统工作状态
unsigned char WorkState;
#define SETPassWord 	0	// 修改密码模式
#define	OPEN    	1	// 开锁模式
#define	L_KEYBORD	2	// 键盘上锁模式
#define UL_KEYBORD	3	// 键盘解锁模式
#define NONE    	4	// 空操作模式


//键盘列扫描
unsigned char ScanLine;
#define line_1     0;          // 扫描第1列
#define line_2     1;          // 扫描第2列
#define line_3     2;          // 扫描第3列
#define line_4     3;          // 扫描第4列

//按键定义
#define BTN_NONE	0x00	// 没有按键动作

// 按键当前扫描值,按键上次扫描值
unsigned char CurKey, OldKey;

// 按键当前扫描值的译码
 unsigned char C_CurKey ;

// 数码管动态扫描
void UpdateLed(void) {
	// 关显示
	Sel0 = Sel1 = Sel2 = Sel3 = Sel4 = Sel5 = 1;
	P0 = LED[LedSel];	// 设置显示内容
	switch (LedSel)
	{
	case 0:	Sel0 = 0; Sel1 = Sel2 = Sel3 = Sel4 = Sel5 = 1; break;
	case 1: Sel1 = 0; Sel0 = Sel2 = Sel3 = Sel4 = Sel5 = 1; break;
	case 2: Sel2 = 0; Sel1 = Sel0 = Sel3 = Sel4 = Sel5 = 1; break;
	case 3: Sel3 = 0; Sel1 = Sel2 = Sel0 = Sel4 = Sel5 = 1; break;
        case 4: Sel4 = 0; Sel1 = Sel2 = Sel0 = Sel3 = Sel5 = 1; break;
        case 5: Sel5 = 0; Sel1 = Sel2 = Sel0 = Sel4 = Sel3 = 1; break;
	default: Sel0 = Sel1 = Sel2 = Sel3 = Sel4 = Sel5 = 1;	LedSel = 0; break;
	}
	// 切换数码管选通索引
	if (LedSel >= 5)
		LedSel = 0;
	else
		++ LedSel;
}




// 蜂鸣器鸣叫设置
void BeepSet(unsigned char type)
{
	switch (type)
	{
		case BT_BUTTON:
			BeepType = BT_BUTTON;
			BeepCount = 20;		// 按键声响0.1秒
			break;
		case BT_ALARM_1:
			BeepType = BT_ALARM_1;
			BeepCount = 12000;	//报警音1响60秒
			break;
		case BT_ALARM_2:
			BeepType = BT_ALARM_2;
			BeepCount = 100;	// 报警音2响0.5秒
			break;
                default:
			BeepCount = 0;
			break;
	}
}


// 蜂鸣器声音控制
void BeepCtrl(unsigned char iCount)
{
	switch (BeepType)
	{
              case BT_BUTTON:	// 按键声音
			if (BeepCount > 0)
			{
				-- BeepCount;
				Beep = 1;
			}
			else
			{
				Beep = 0;
			}
			break;
		case BT_ALARM_1:	   // 报警60秒(蜂鸣器叫5毫秒,停5毫秒)
			if (0 == iCount)
			{
				if (BeepCount > 0)
				{
					Beep = BeepCount % 2;
					-- BeepCount;
				}
				else
				{
					Beep = 0;
				}
			}
			break;
		case BT_ALARM_2:	        // 报警500毫秒
			if (0 == (iCount % 100))        // 500毫秒定时到
			{
				if (BeepCount > 0)
				{
					Beep = BeepCount % 2;
					-- BeepCount;
				}
				else
				{
					Beep = 0;
				}
			}
			break;
                 default:
                           {
			   Beep = 0;
			   BeepCount = 0;
			   break;
                           }

	}
}

// 发光二极管电路点亮控制
void LightCtrl(unsigned char iCount)
{
	switch (LightType)
	{
              case  LightingRed:             // 点亮红灯
                     
                       
                           LightCount = 12000;
                           if (0 == iCount)
			       {
				   if (LightCount > 0)
				      {

					-- LightCount;
					Red = 0;
				      }
                               }
			    else
			          Red = 1;
				                                 
			break;           
              case  LightingGreen:            // 点亮绿灯

                           LightCount = 200;
                            if (0 == (iCount % 200))
			       {
				   if (LightCount > 0)
				      {

					-- LightCount;
					Green = 0;
				      }
                               }
			    else
			          Green = 1;
				              
			break;
              case  LightingYellow:            // 点亮黄灯
                       
                           LightCount = 200;
                            if (0 == (iCount % 200))
			       {
				   if (LightCount > 0)
				      {

					-- LightCount;
					Yellow = 0;
				      }
                               }
			    else
			          Yellow = 1;
				              
			break;
             default:
                       {
			   Yellow = Green = Red = 1;
			   LightCount = 0;
			   break;
                        }          
        }
}
// 系统初始化
void InitSys(void)
{

	// 定时器2初始化
	TH2 = 0xEC;          //计数装载,向上计数
	TL2 = 0x78;
	RCAP2H = 0xEC;       //两个16位无符号整数
	RCAP2L = 0x78;
	ET2 = 1;             //允许定时或计数

	
	// 系统状态默认设置

	CurKey = 11;
        
        // 设置两组原始密码 
        Password_1[5] = Password_2[5] = {0x00,0x00,0x00,0x00,0x00,0x00};

	// 6个数码管显示内容清空
        LED[0] = LED[1] = LED[2] = LED[3] = LED[4] = LED[5] = 0xFF;
         
        //发光二极管灭
         Red = Green = Yellow = 1;

	// 数码管动态扫描索引置0
         LedSel = 0;

         //密码输入错误次数置0
         Wrong = 0;

	// 10毫秒,500毫秒,1秒,10秒,60秒定时标志
	Flag10ms = Flag500ms =  Flag10s =  Flag1s = Flag60s = 0;

	// 蜂鸣器关闭
	Beep = 0;
	// 蜂鸣器鸣叫时间(5毫秒为单位)
        BeepCount = 0;

    //发光二极管点亮时间(5毫秒为单位)
       LightCount = 0;

	

}

// 定时器2中断服务函数
void T2_int(void) interrupt 5 using 1
{
	static unsigned char iCount = 0;

	BeepCtrl(iCount);

	++ iCount;
	if ((iCount % 2) == 0)	// 10毫秒定时到
	{
            Flag10ms = 1;

	    if ((iCount % 100) == 0)	 // 500毫秒定时到
	       {
		Flag500ms = 1;
                if ((iCount % 200) == 0)         // 1秒定时到 
                      {
                        Flag1s = 1; 
                        if ((iCount % 2000) == 0)     // 10秒定时到  
                             {
                                 Flag10s = 1; 
                                if (iCount >= 12000)     // 60秒定时到 
                                    {
                                        Flag60s = 1; 
                                        iCount = 0;
                                    }  
                             }
                      }
               }

		
	}

	TF2 = 0;				// 定时器2溢出标志清零
}



//键盘扫描,按列顺序循环扫描(从第一列到第四列), 并返回当前扫描值
unsigned char KeyScan(void)
{
     switch (ScanLine)
	{
	case line_1: P2_7 = P2_6 = P2_5 = 1;  P2_4 = 0; break;               //第1列:在P2.7-P2.4输出“1110”
	case line_2: P2_7 = P2_6 = P2_4 = 1;  P2_5 = 0; break;
	case line_3: P2_7 = P2_5 = P2_4 = 1;  P2_6 = 0; break;
	case line_4: P2_7 = P2_5 = P2_4 = 1;  P2_6 = 0; break;
	default:  P2_7 = P2_6 = P2_5 = 1;  P2_4 = 0; ScanLine = line_1; break;
	}
                                                                            // 切换键盘列选通索引
    if (ScanLine == line_1)                                     
           {
            if (P2_3 = P2_2 = P2_1 = 1 && P2_0 = 0) CurKey = 1;               //判断每行是否有键按下
            else if (P2_3 = P2_2 = P2_0 = 1 && P2_1 = 0) CurKey = 4;
            else if (P2_3 = P2_1 = P2_0 = 1 && P2_2 = 0) CurKey = 7; 
            else if (P2_2 = P2_1 = P2_0 = 1 && P2_3 = 0) CurKey = 15;  
            else 
                 _nop_(); 
            ScanLine = line_2;                                              // 切换键盘列选通索引 //从第1列切换到第二列
           }        
    else if (ScanLine == line_2)  
           {
            if (P2_3 = P2_2 = P2_1 = 1 && P2_0 = 0) CurKey = 2;
            else if (P2_3 = P2_2 = P2_0 = 1 && P2_1 = 0) CurKey = 5;
            else if (P2_3 = P2_1 = P2_0 = 1 && P2_2 = 0) CurKey = 8; 
            else if (P2_2 = P2_1 = P2_0 = 1 && P2_3 = 0) CurKey = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -