十小时玩转单片机

文章介绍了如何在Keil环境下使用8051开发板Proteus实现各种功能,包括利用外部中断检测按键、制作流水灯、定时器控制、PWM调光、静态和动态数码管显示以及软件防抖和矩阵键盘操作,最后提及了LCD的使用。
摘要由CSDN通过智能技术生成

Proteus 使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

keil使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
生成hex给Proteus 用
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

开始

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述## 利用外部中断检测独立按键
在这里插入图片描述

利用外部中断检测独立按键

按一下开关一个灯亮一个灯灭
在这里插入图片描述

#include<reg51.h>
sbit led1=P1^0;
sbit led2=P1^1;
main()
{
	led1=0;
	led2=1;
	IT0=1;//下降沿触发INT0外部中断
	EX0=1;//允许INT0外部中断
	EA=1;//开总中断
	while(1);
}
key() interrupt 0
{
	led1=~led1;
	led2=~led2;
	IE0=0;
}

流水灯

在这里插入图片描述

#include<reg51.h>
//sbit D1=P2^7;

main()
{
	//D1=1;
	long i=10000;
	int x;
	for(x=0x80;x>=1;x=x/2)
	{
		P2=x;
		i=10000;
		while(i--);
	}
	
}

用定时器控制流水灯

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<reg51.h>
int count;//用于在定时器中断服务程序中计数。
main()
{
	int x;
	count=0;
	TMOD=0X01;
	//TH0和TL0分别是定时器0的高位和低位计数器寄存器。
	TH0=0X3C;
	TL0=0XB0;
	ET0 = 1; // 开启定时器0中断
	EA = 1;  // 开启全局中断
	TR0 = 1; // 启动定时器0

	//for(x=0x80;x>=1;x=x/2)
	for(x = 0x01; x <= 0x80; x = x * 2)//反着闪烁
	{
		P2=x;
		while(count<10);//0.5秒
		count=0;
	}	
}
timer0() interrupt 1
{
	count++;
	// 重新设置定时器0的计数器,以便产生下一个定时周期。
	TH0=0X3C;
	TL0=0XB0;
}

PWM改变高电平的时间灯的亮度就有变化

电容:稳定电压
在这里插入图片描述

#include<reg51.h>
sbit led = P1^0;
main()
{
	int i,j;
	//不亮
	j=1000;
	while(j--)
	{
		led=0;
		i=50;
		while(i--);
	}
	//50%亮
	j=1000;
	while(j--)
	{
		led=0;
		i=50;
		while(i--);
		led=1;
		i=50;
		while(i--);
	}
	//60%亮
	j=1000;
	while(j--)
	{
		led=0;
		i=40;
		while(i--);
		led=1;
		i=60;
		while(i--);
	}
	//100%亮
	j=1000;
	while(j--)
	{
		led=1;
		i=100;
		while(i--);
	}
}

静态显示电路设计–数码管

数码管display在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

静态显示变化字形

在这里插入图片描述

#include<reg51.h>
void delay(){
	long i = 20000;
	while(i--);
}

main()
{ 	
	int num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
	int i;
	for(i = 0; i<sizeof(num)/sizeof(num[0]);i++){
		P2=num[i];
		delay();}
	
}

动态显示变化字形

keil最好用英文做文件名字,中文不报错

在这里插入图片描述

#include<reg51.h>
void delay(){
	long i = 25;
	while(i--);
}

main()
{ 
	int i,j;
	int t=1;
	int num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
	j=1;
	
	while(j<9){
		P3=0xff-t;
		P2=num[j++];
		delay();
		t=t*2;
	}
}


一个按键设计

在这里插入图片描述

#include<reg51.h>
sbit key1=P1^0;
void delay(){
	long i = 25;
	while(i--);
}

main()
{ 
	int i,j;
	int t=1;
	int shuzi;
	int num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
	j=1;
	if(key1==0) shuzi=num[1];
	else shuzi=num[0];
	P3=0xfe;
	P2=shuzi;
}

四个按键设计

在这里插入图片描述

#include<reg51.h>

void delay(){
	long i = 25;
	while(i--);
}

main()
{ 
	int i,j;
	int t=1;
	int shuzi;
	int num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
	j=1;
	while(1){
		switch(P1){
			case 0xfe: shuzi=num[1]; break;
			case 0xfd: shuzi=num[2]; break;
			case 0xfb: shuzi=num[3]; break;
			case 0xf7: shuzi=num[4]; break;
		}
	P3=0xfe;
	P2=shuzi;
	}
	while(0){//j<9){
		P3=0xff-t;
		P2=num[j++];
		delay();
		t=t*2;
	}
}


软件防抖编程

在这里插入图片描述
在这里插入图片描述

#include<reg51.h>  // 包含8051微控制器的头文件

void delay() {
    long i = 25;
    while(i--);  // 简单的延时函数`
}

main() { 
    int i, j, k;
    int t = 1;
    int shuzi;
    int p;
    // 数字0-9在七段显示器上的编码
    int num[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
    shuzi = num[0];  // 初始显示数字0

    while(1) {
        p = P1;  // 读取P1端口的值
        // 检查是否有按键按下
        if(p != 0xff) {
            k = 2000;
            while(k--);  // 延时去抖
            p = P1;  // 再次检查P1端口的值
            // 根据P1的值改变要显示的数字
            if(p != 0xff) switch(P1) {
                case 0xfe: shuzi = num[1]; break;
                case 0xfd: shuzi = num[2]; break;
                case 0xfb: shuzi = num[3]; break;
                case 0xf7: shuzi = num[4]; break;
            }
        }
        
        P3 = 0xfe;  // 设置显示段
        P2 = shuzi;  // 显示数字
    }
    j = 1;
    while(0) {  // 这部分代码永远不会执行
        // 以下代码似乎是用于循环显示数字,但未被使用
        P3 = 0xff - t;
        P2 = num[j++];
        delay();
        t = t * 2;
    }
}

矩阵键盘

在这里插入图片描述

keypad

在这里插入图片描述
在这里插入图片描述

#include<reg51.h>  // 包含8051微控制器的头文件

void delay() {
    int k = 2000;
    while(k--);  // 延时去抖
}

main() { 
    int shuzi;
    int p;
    // 数字0-9在七段显示器上的编码
    int num[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x77};
    shuzi = num[0];  // 初始显示数字0

    while(1) {
        P1=0xf7;  // 第一列接的P1^3-->11110111
				p=P1;
        // 检查是否有按键按下
        if(p != 0xf7) {
            delay();
            p=P1;  // 再次检查P1端口的值
            // 根据P1的值改变要显示的数字
            if(p != 0xf7) switch(p) {
                case 0x77: shuzi = num[7]; break;
                case 0xb7: shuzi = num[4]; break;
                case 0xd7: shuzi = num[1]; break;
                case 0xe7: shuzi = num[10]; break;
            }
        }
        
        P3 = 0xfe;  // 设置显示段
        P2 = shuzi;  // 显示数字
    }
}

矩阵键盘逐列

在这里插入图片描述

#include<reg51.h>  // 包含8051微控制器的头文件

void delay() {
    int k = 2000;
    while(k--);  // 延时去抖
}

int readkey() {
    int p;
	int key;
    // 将 P1^3 置为低电平,其余位保持高电平
    P1 = 0xf7;  // 第一列接的 P1^3 -> 11110111
    p = P1;

    // 检查是否有按键按下
    if (p != 0xf7) {
        delay();  // 延时以消除抖动
        p = P1;  // 再次检查 P1 端口的值

        // 如果检测到按键按下
        if (p != 0xf7) {
            // 根据 P1 的值确定按下的键
            switch (p) {
                case 0x77: key = 7; break;  // 第一行第一列
                case 0xb7: key = 4; break;  // 第二行第一列
                case 0xd7: key = 1; break;  // 第三行第一列
                case 0xe7: key = 10; break; // 第四行第一列
            }
        }
    }
		
	P1 = 0xfb; //第二列
    p = P1;
    if (p != 0xfb) {
        delay();  
        p = P1; 
        if (p != 0xfb) {
            switch (p) {
                case 0x7b: key = 8; break;
                case 0xbb: key = 5; break;
                case 0xdb: key = 2; break;
                case 0xeb: key = 0; break;
            }
        }
    }
		
	P1 = 0xfd;  // 第三列
    p = P1;
    if (p != 0xfd) {
        delay();  
        p = P1;
        if (p != 0xfd) {
            switch (p) {
                case 0x7d: key = 9; break;
                case 0xbd: key = 6; break;
                case 0xdd: key = 3; break;
                case 0xed: key = 11; break;
            }
        }
    }
		
	P1 = 0xfe;  // 第四列
    p = P1;
    if (p != 0xfe) {
        delay();  
        p = P1;
        if (p != 0xfe) {
            switch (p) {
                case 0x7e: key = 12; break;
                case 0xbe: key = 13; break;
                case 0xde: key = 14; break;
                case 0xee: key = 15; break;
            }
        }
    }
		
	return key;
}

main() { 
    int p;
    // 数字0-9在七段显示器上的编码
    int num[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    while(1) {
       int key = readkey();
        P3 = 0xfe;  // 设置显示段
        P2 = num[key]; // 显示数字
    }
}

LCD

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值