嵌入式前期笔记总结

1.点亮Led灯的方式-低电平亮

  • sbit led1=P1^0;led1=0;//P1口单独赋值
  • P1=0xfe;//P1口整体赋值
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;

2.延迟函数书写

void delay(int xms)
{
	unsigned int i,j;
	for(i=0;i<xms;i++)
		for(j=112;j>0;j--)
{

3.手动定义on/off代表0,1

#define ON 0;//低电平点亮
#define OFF 1;//高电平熄灭

4.流水灯项目代码-位输出移位

    while(1)
	{
	    LED0=ON;
		delay(200);
		LED0=OFF;

		LED1=ON;
		delay(200);
		LED1=OFF;

		LED2=ON;
		delay(200);
		LED2=OFF;

		LED3=ON;
		delay(200);
		LED3=OFF;

		LED4=ON;
		delay(200);
		LED4=OFF;

		LED5=ON;
		delay(200);
		LED5=OFF;

		LED6=ON;
		delay(200);
		LED6=OFF;

		LED7=ON;
		delay(200);
		LED7=OFF;
	}

5.流水灯项目代码-循环移位输出

#include<reg52.h>
#include<intrins.h>
#include"delay.h"


void main()
{
    P1=0Xfe;//1111 1110
    while(1)
	{
	    delay(200);
		P1=_crol_(P1,1);     //循环移位函数,把p1寄存器内的数向左移一位
	}
}
与运算
实例:
p1=0xfe;//1111 1110
p1=p1|0x01;// 1111 1110与0000 0001所有数与0与还是它本身,与1与都为1
//现在p1就变成了1111 1111


左移右移
p1=0xfe;//1111 1110
p1<<=1;//左移一位 <=>  p1=p1<<1
//p1变成了1 1111 1100
p1=0xfe;//1111 1110第一个灯亮
while(1)
{
	delay(200)
	p1<<=1;
	p1=p1|0x01;
}

7.蜂鸣器的使用

#include<reg52.h>
#define ON 0;
#define OFF 1;
sbit FM=P2^3;

void delay(unsigned int xms);
void main()
{
    unsigned char i;//ÎÞ·ûºÅ×Ö·ûÐÍ·¶Î§0-255
    while(1)
	{
	    P1=0xfe;//1111 1110	ʹµÚÒ»¸öLEDµÆµãÁÁ
	    for(i=0;i<8;i++)
		{
		    delay(100);
			P1<<=1;//P1=P1<<1	 
			P1=P1|0X01;//0000 0001 
			FM=ON;
			delay(100);
			FM=OFF;
		}
	}
}

8.数码管的显示

/*********************************************************************************
*ʵÑéÃû   £ºÊýÂë¹Ü¾²Ì¬ÏÔʾ
*ʵÑéЧ¹û	£ºµÚÒ»¸öÊýÂë¹ÜÏÔʾ×Ö·û¡°b¡±
*
*********************************************************************************/
#include<reg52.h>
#include "bstv51.h"

sbit duan=P2^6;//定义段选
sbit wei=P2^7;//定义位选

void main()
{
	bstv51_init();//单片机初始化程序
	P0=0x7c;//对应的是b
	duan=1;//锁存IC使能
	duan=0;

	P0=0xfe;//对应的是第八个数码管
	wei=1;//锁存IC使能
	wei=0;
	
	while(1);
}

在这里插入图片描述

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit DU=P2^6;
sbit WE=P2^7;

uchar code sz[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
                   0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 
                   0x5e , 0x79 , 0x71 , 0x00};	 
void delay(uint xms)
{
	for(uint i=0;i<xms;i++)
		for(uint j=112;i>0;j--)
}

void main()
{
	while(1)
	{
		P0=sz[8];//8
		DU=1;
		DU=0;
		P0=0x7f;//第八个
		WE=1;
		WE=0;
		delay(2);//当你的延时小于3ms的时候人的肉眼无法观察到变化,也就是说会看到8位数码管全亮
		//delay是必要的在全亮的时候,原因:去掉delay之后显示器不一定有这么快的显示频率,不一定能够响应这么快的时序
										//数码管在进行这么快没有延迟的时序变化,这就说明数码管不能有任何的错误显示,任何错误显示都会被放大。
		//解决方法有二:加delay(2)
		//或者   重置
		/*
		P0=0xff;//什么都不显示重置
		WE=1;
		WE=0;
		*/
		
		P0=sz[7];//7
		DU=1;
		DU=0;
		P0=0x7e;//第7个
		WE=1;
		WE=0;
		delay(2);
	
		P0=sz[6];//6
		DU=1;
		DU=0;
		P0=0x7d;//第6个
		WE=1;
		WE=0;
		delay(2);
	
		P0=sz[5];//5
		DU=1;
		DU=0;
		P0=0x7c;//第5个
		WE=1;
		WE=0;
		delay(2);
	
		P0=sz[4];//4
		DU=1;
		DU=0;
		P0=0x7b;//第4个
		WE=1;
		WE=0;
		delay(2);
	
		P0=sz[3];//3
		DU=1;
		DU=0;
		P0=0x7a;
		WE=1;
		WE=0;
		delay(2);
	
		P0=sz[2];//2
		DU=1;
		DU=0;
		P0=0xfd;
		WE=1;
		WE=0;
		delay(2);
	
		P0=sz[1];	//1
		DU=1;
		DU=0;
		P0=0xfe;
		WE=1;
		WE=0;
		delay(2);
	}

}

9.独立按键

//把前面的定义都写在头文件里面去
/*********************************************************************
 *
 *                         bstv51.c
 *
 *********************************************************************
 * 描    述: BST-V51开发板初始化
 * 开发平台: BST-V51开发板+KEIL C51
 ********************************************************************/

#include <reg52.h>/*包含51系统头文件*/
#include "bstv51.h"/*包含BST-V51开发板头文件*/

/*BST-V51主板初始化函数*/
void bstv51_init(void)
{
	/* 引脚方向、输出初值定义 */
	FM=1;/*蜂鸣器*/
	EN=0;/*让LCD1602数据口处于输入状态,相当于LCD1602使不能,让其释放数据总线*/
	CS=1;/*TF卡使不能*/
	RST=0;/*ds1302使不能*/
}


void bstv51_init(void)
{
	//引脚方向、输出初值定义
	FM=1;//蜂鸣器
	EN=0;//让LCD1602数据口处于输入状态,相当于LCD1602使不能让其释放数据总线
	CS=1;//TF卡使不能
	RST=0;//ds1302使不能
}

独立按键I/O口按下为0,未按下为1

void main()
{	
	bstv41_init();
	P1=0xff;//熄灭所有LED
	while(1)
	{
		L0=K1;//和下面的等效
		//if(K1==0)	L0=0;
		//else	L0=1;
		L1=K1;
		L2=K2;
		L3=K2;
		L4=K3;
		L5=K3;
		L6=K4;
		L7=K4;
	}
}

非运算

非运算即取反运算,在二进制中1变0,0变1
110101进非运算后为001010

/*********************************************************************************
*实验名   :矩阵键盘扫描 数码管显示
*实验效果	:按S1-S16矩阵按键,数码管8位依次显示0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
*
*********************************************************************************/
#include<reg52.h>
#include"bstv51.h"

uchar code table[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
                   0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 
                   0x5e , 0x79 , 0x71 , 0x00};	 //0-9&A-F&“不显示”  字型码

void delay(uint xms)	//延迟xms
{
    uint i,j;
	for(i=xms;i>0;i--)
	  for(j=112;j>0;j--);
}

void display(uchar num)	   //数码管显示函数
{
    P0=table[num];		 //段选
	DU=1;
	DU=0;
}

void keyscan4x4()
{
    uchar temp,key;


	///第一行扫描///
	P3=0xfe;//1111 1110 让P3.0口输出低
	temp=P3;
	temp=temp&0xf0;//1111 0000	位与操作 屏蔽后四位
	if(temp!=0xf0)
	{
	    delay(10);
		temp=P3;//延迟后再判断一次判断是否松开按键
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
		    temp=P3;
			switch(temp)
			{
			  case 0xee:	   //1110 1110 S1被按下
			       key=0;
				   break;
			  case 0xde:		  //1101 1110  S2被按下
				   key=1;
				   break;
			  case 0xbe:		  //1011 1110  S3被按下
				   key=2;
				   break;
			  case 0x7e:		  //0111 1110  S4被按下
				   key=3;
				   break;
			}
			while(temp!=0xf0)
			{
			    temp=P3;
				temp=temp&0xf0;
			}
			display(key);
		}
	}
			///第二行扫描///
	P3=0xfd;//1111 1101 让P3.1口输出低
	temp=P3;
	temp=temp&0xf0;//1111 0000	位与操作 屏蔽后四位
	if(temp!=0xf0)
	{
	    delay(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
		    temp=P3;
			switch(temp)
			{
			  case 0xed:	   //1110 1101 S5被按下
			       key=4;
				   break;
			  case 0xdd:		  //1101 1101  S6被按下
				   key=5;
				   break;
			  case 0xbd:		  //1011 1101  S7被按下
				   key=6;
				   break;
			  case 0x7d:		  //0111 1101  S8被按下
				   key=7;
				   break;
			}
			while(temp!=0xf0)
			{
			    temp=P3;
				temp=temp&0xf0;
			}
			display(key);
		}
	 }
			///第三行扫描///
	P3=0xfb;//1111 1011 让P3.2口输出低
	temp=P3;
	temp=temp&0xf0;//1111 0000	位与操作 屏蔽后四位
	if(temp!=0xf0)
	{
	    delay(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
		    temp=P3;
			switch(temp)
			{
			  case 0xeb:	   //1110 1011 S9被按下
			       key=8;
				   break;
			  case 0xdb:		  //1101 1011  S10被按下
				   key=9;
				   break;
			  case 0xbb:		  //1011 1011  S11被按下
				   key=10;
				   break;
			  case 0x7b:		  //0111 1011  S12被按下
				   key=11;
				   break;
			}
			while(temp!=0xf0)
			{
			    temp=P3;
				temp=temp&0xf0;
			}
			display(key);
		  }
		}

			///第四行扫描///
	P3=0xf7;//1111 0111 让P3.0口输出低
	temp=P3;
	temp=temp&0xf0;//1111 0000	位与操作 屏蔽后四位
	if(temp!=0xf0)
	{
	    delay(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
		    temp=P3;
			switch(temp)
			{
			  case 0xe7:	   //1110 0111 S13被按下
			       key=12;
				   break;
			  case 0xd7:		  //1101 0111  S14被按下
				   key=13;
				   break;
			  case 0xb7:		  //1011 0111  S15被按下
				   key=14;
				   break;
			  case 0x77:		  //0111 0111  S16被按下
				   key=15;
				   break;
			}
			while(temp!=0xf0)
			{
			    temp=P3;
				temp=temp&0xf0;
			}
			display(key);

		 }
	 }

}

void main()
{
    bstv51_init(); //学习板初始化 
	P0=0;		 //位选 锁存为8位同时显示
	WE=1;
	WE=0;
	while(1)
	{
	   keyscan4x4();
	}
}


10.中断系统
下降沿触发
 独立按键部分默认先输入0X0F就是高电平,那么按下他就会实现高电平到低电平的下降沿从而触发中断
低电平触发
当按下独立按键的时候电平高转低,不松手的时候一直处于低电平,那么中断函数内的P2就会一直翻转,
而由于反转速度过快,人眼无法识别,所以呈现的是全亮状态。

低电平触发

/*********************************************************************************
*实验名   :外部中断实验(低电平触发)
*实验效果	:按住学习板上第三排任意按键 LED灯8位全亮
              松开按键后 随机上4个或下4个灯亮
*
*********************************************************************************/
#include<reg52.h>
//按下独立按键的时候电平高转低,不松手的时候一直处于低电平,那么中断函数内的P2就会一直翻转,
    而由于反转速度过快,人眼无法识别,所以呈现的是全亮状态。
void main()
{
    P1=0X0F;//0000 1111	 前四个灯灭 后四个灯亮
	P3=0X0F;//独立按键部分默认先输入0X0F就是高电平,那么按下他就会实现高电平到低电平的下降沿从而触发中断
	EA=1;//全局中断打开
	EX0=1;//INT0中断开启
	IT0=0;//低电平触发
	while(1)
	{
	    ;
	}
}

void ISR_KEY()interrupt 0	 //中断服务函数
{
    P1=~P1;
}

下降沿触发

/*********************************************************************************
*实验名   :外部中断实验(下降沿触发)
*实验效果	:按下学习板上第三排任意按键,LED灯前后四位状态调换
*
*********************************************************************************/
#include<reg52.h>
//按一次就跳变,也就是说开始前四个灯不亮后四个亮,按下之后就反过来
void main()
{
    P1=0X0F;//0000 1111	 前四个灯灭 后四个灯亮
	P3=0X0F;
	EA=1;//全局中断打开
	EX0=1;//INT0中断允许
	IT0=1;//触发方式为下降沿触发
	while(1)
	{
	    ;
	}
}

void ISR_KEY()interrupt 0
{
    P1=~P1;
}
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值