长安.
Articles7
Tags12
Categories3
51单片机课程项目

51单片机课程项目

本文介绍了金沙滩51单片机的各项实验…

项目列表:

项目一: 流水灯

项目二: 独立按键

项目三: 数码管静态显示

项目四: 矩阵按键

···

项目一 : 流水灯

#include<reg52.h>

sbit ENLED=P1^4;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;

void Delay500ms()		//延时函数500ms
{
    unsigned char i, j, k;

    i = 4;
    j = 129;
    k = 119;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void main()
{
    unsigned char i;
    ADDR3=1;
    ENLED=0;
    ADDR0=0;
    ADDR1=1;
    ADDR2=1;
/*                  第一个项目              */
    while(1)
    {
        P0 = 0x7F;//单个点亮
        Delay500ms();
        for(i = 0;i < 7;i++)
        {
            P0 = P0>>1|0x80;//P0右移流水灯
            Delay500ms();
        }
    }

/*               第二个项目                */
    P0 = 0xFE;//P0状态复位
    Delay500ms();
    while(1)
    {
        for(i = 0;i < 7;i++)//流水点亮
        {
            P0 = P0<<1|1;
            Delay500ms();
        }
        for(i = 0;i < 7;i++)
        {
              P0 = P0>>1|0x80;
              Delay500ms();
        }
    }  
}

项目二 :独立按键


#include<reg52.h>

sbit enled=p1^4;
sbit addr0=p1^0;
sbit addr1=p1^1;
sbit addr2=p1^2;
sbit addr3=p1^3;//定义三八译码器引脚

sbit keyin_1 = p2^4;
sbit keyin_2 = p2^5;
sbit keyout_1 = p2^3;//定义按键引脚

void delay_ms(unsigned char cnt)//ms延时函数
{
    unsigned char i;
    while(cnt--)
    {
        for(i = 0;i < 110;i++);
    }
}

//led_push()
//{
//	unsigned char i = 0;
//	while(1)
//	{
//		delay_ms(500);
//		p0 = 0xfe;//p0口复位
//		for(i = 0;i < 8;i++) 
//		{
//			delay_ms(500);
//			p0 = p0<<1|0x01;//左移一位,低位补1
//		}
//	}
//}

void main()//主函数
{
    addr3=1;
    enled=0;
    addr0=0;
    addr1=1;
    addr2=1;//设置三八译码器为led输出

    keyin_1 = 1;
    keyout_1 = 0;//按键引脚初始化
    p0 = 0xff;

    /***************独立按键控制四个led*****************/
    while(1)//主循环
    {
         if(keyin_1 == 0)//检测到按键按下
         {
         	delay_ms(10);//消抖
            if(keyin_1 == 0)//判断按键值
            {
                p0 = 0x0f;//前四个led点亮
                while(keyin_1 == 0);//按键释放
            }
         }
         if(keyin_2 == 0)//检测到按键按下
         {
         	delay_ms(10);//消抖
            if(keyin_2 == 0)//判断按键值
            {
                p0 = 0xf0;//后四个led点亮
                while(keyin_2 == 0);//按键释放
            }
         }
    }
    /******************按键控制流水灯*******************/
//	while(1)
//	{
//		if(keyin_1 == 0)//检测到按键按下
//		 {
//		 	delay_ms(10);//消抖
//			if(keyin_1 == 0)//判断按键值
//			{
//				led_push();//流水灯函数
//				while(keyin_1 == 0);//按键释放
//			}
//		 }
//	}
}

项目三 : 数码管静态显示


/****************************①使第一个数码管循环显示0~F***********************/
#include<reg52.h>

sbit ENLED=P1^4;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;

unsigned char code LED[] = { 
 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};//数码管显示字符转换表

void Delay500ms()		//@11.0592MHz
{
    unsigned char i, j, k;

    i = 4;
    j = 129;
    k = 119;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void main()
{
    unsigned char i = 0;	

    ENLED=0;
    ADDR3=1;
    ADDR2=0;
    ADDR1=0;
    ADDR0=0;	
    for(i = 0;i < 16;i++)
    {
        P0 = LED[i];
        Delay500ms();
    }
    while(1);
}

/******②使6位数码管依次显示0~5********/

#include<reg52.h>

sbit ENLED=P1^4;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;

unsigned char code LED[] = { 
 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};//数码管显示字符转换表

void Delay500ms()		//@11.0592MHz
{
    unsigned char i, j, k;

    i = 4;
    j = 129;
    k = 119;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void main()
{
    unsigned char j;	

    ENLED=0;

    while(1)
    {	
        
        switch (j)
         {
            case 0: ADDR2=0; ADDR1=0; ADDR0=0; j++; P0 = LED[j-1]; Delay500ms(); break;
            case 1: ADDR2=0; ADDR1=0; ADDR0=1; j++; P0 = LED[j-1]; Delay500ms(); break;
            case 2: ADDR2=0; ADDR1=1; ADDR0=0; j++; P0 = LED[j-1]; Delay500ms(); break;
            case 3: ADDR2=0; ADDR1=1; ADDR0=1; j++; P0 = LED[j-1]; Delay500ms(); break;
            case 4: ADDR2=1; ADDR1=0; ADDR0=0; j++; P0 = LED[j-1]; Delay500ms(); break;
            case 5: ADDR2=1; ADDR1=0; ADDR0=1; j++; P0 = LED[j-1]; Delay500ms(); break;
            default: break;
         }
         if(j >= 6) j = 0;
    }
}

/****************************使6位数码管先后依次循环显示"0~F"***********************/
#include<reg52.h>

sbit ENLED=P1^4;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;//定义三八译码器引脚

unsigned char code LED[] = { 
 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};//数码管显示字符转换表

void Delay500ms()		//@11.0592MHz 延时函数
{
    unsigned char i, j, k;

    i = 4;
    j = 129;
    k = 119;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void main()
{
    unsigned char i, j;//定义无符号字符型变量

    ENLED=0;
    j = 0;//初始化变量j

    while(1)
    {	
        switch (j)
         {
            case 0: ADDR2=0; ADDR1=0; ADDR0=0; j++; for(i = 0;i < 16;i++){ P0=LED[i];Delay500ms();} break;
            case 1: ADDR2=0; ADDR1=0; ADDR0=1; j++; for(i = 0;i < 16;i++){ P0=LED[i];Delay500ms();} break;
            case 2: ADDR2=0; ADDR1=1; ADDR0=0; j++; for(i = 0;i < 16;i++){ P0=LED[i];Delay500ms();} break;
            case 3: ADDR2=0; ADDR1=1; ADDR0=1; j++; for(i = 0;i < 16;i++){ P0=LED[i];Delay500ms();} break;
            case 4: ADDR2=1; ADDR1=0; ADDR0=0; j++; for(i = 0;i < 16;i++){ P0=LED[i];Delay500ms();} break;
            case 5: ADDR2=1; ADDR1=0; ADDR0=1; j++; for(i = 0;i < 16;i++){ P0=LED[i];Delay500ms();} break;
            default: break;
         }
    }
    while(1);
}

项目四 : 矩阵按键


#include<reg52.h>

sbit ENLED=P1^4;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;

sbit KEYI1=P2^4;
sbit KEYI2=P2^5;
sbit KEYI3=P2^6;
sbit KEYI4=P2^7;

sbit KEYO4=P2^0;
sbit KEYO3=P2^1;
sbit KEYO2=P2^2;
sbit KEYO1=P2^3;

unsigned char code LED[] = { 
 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 time() interrupt 1         //中断函数
{
    static unsigned char keyo=0;//键盘行刷新 
    unsigned char i;
    static unsigned char keybuf[4][4]={   //暂存消抖检测按键值
        {0xff,0xff,0xff,0xff},
        {0xff,0xff,0xff,0xff},
        {0xff,0xff,0xff,0xff},
        {0xff,0xff,0xff,0xff}
    };

    TH0 = 0xFC;		//设置定时初值 
    TL0 = 0x67;		//设置定时初值

    keybuf[keyo][0]=(keybuf[keyo][0]<<1)|KEYI1;
    keybuf[keyo][1]=(keybuf[keyo][1]<<1)|KEYI2;
    keybuf[keyo][2]=(keybuf[keyo][2]<<1)|KEYI3;
    keybuf[keyo][3]=(keybuf[keyo][3]<<1)|KEYI4;

    for(i=0;i<4;i++)
    {
        if((keybuf[keyo][i] & 0x0f)==0x00)
        {
            keysta[keyo][i]=0;
        }
        else if((keybuf[keyo][i] & 0x0f)==0x0f)
        {
            keysta[keyo][i]=1;
        }
    }
    keyo++;
    // if(keyo>=4)
    // {
    //     keyo=0;
    // }
    keyo=keyo & 0x03;
    switch(keyo)   //刷新行键盘
    {
        case 0:KEYO4=1;KEYO1=0;break;
        case 1:KEYO1=1;KEYO2=0;break;
        case 2:KEYO2=1;KEYO3=0;break;
        case 3:KEYO3=1;KEYO4=0;break;
        default:break;
    }
}


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

    unsigned char i,j;

    EA=1;
    ENLED=0;
    ADDR3=1;
    ADDR2=0;
    ADDR1=0;
    ADDR0=0;

    TMOD=0X01;
    TL0 = 0x67;		//设置定时初值
    TH0 = 0xFC;		//设置定时初值  
    ET0=1;
    TR0=1;   

    P0=LED[0]; 
    
    while(1)
    {
        for(i=0;i<4;i++)
        {
            for(j=0;j<4;j++)
            {
                if(backup[i][j]!=keysta[i][j])
                {
                    if(backup[i][j]==0)
                    {
                        P0=LED[i*4+j];
                    }
                    backup[i][j]=keysta[i][j];
                }
            }
        }
    }
}
Author:长安.
Link:http://example.com/2022/09/19/51%E5%8D%95%E7%89%87%E6%9C%BA%E8%AF%BE%E7%A8%8B%E9%A1%B9%E7%9B%AE/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可