51单片机复习001

http://blog.csdn.net/dragon12345666/article/details/22148459 对应程序例程地址

1、更改keil uvision3的字体以及关键字颜色的设置:

	修改顺序入下
	1 打开edit
	2 打开edit 最下方configuration
	3 打开colars 
	4  选择8051  edit c file  可以修改 C语言的大小 和关键词着色 问题。
源自http://zhidao.baidu.com/question/137561189.html

2、位定义:sbit LED00 = P0^0 ;  (放在头文件下面,main()函数上方)。


3、12M晶振,1ms基准延时程序如下:

void delay1ms(unsigned int i)
{

	unsigned char j;
 	while(i--)
 	{
	 for(j=0;j<125;j++)	  //1ms基准延时程序
	 {
 	 ;
	 }
 
 
 }
// j < 125 是因为for(){ ; }循环每循环一次括号内消耗3个指令周期,{;}内执行一个空语句消耗1个指令周期,即:每循环一次消耗4个指令周期(12M晶振:1us * 4)
//注意在写延时函数时 while(){ }  和   for( ; ; ){ }   的区别。


4、循环左移、右移函数_crol_(要移的数字 ,一次移动的位数) ; _cror_();
使用的头文件是#include<intrins.h>
应用例程如下:

/******************************************************************************
 *	说明:AT89S52芯片,12M晶振
 *	P0、P1两个8位端口分别连接8个LED灯
 *	低电平点亮,高电平熄灭。
 ******************************************************************************/

#include<reg52.h>
#include<intrins.h> //是循环左移、右移函数的头文件,参考网址如下
	//http://baike.baidu.com/view/1745068.htm?fromTaglist
	//http://wenku.baidu.com/view/06ba3d00b52acfc789ebc97b.html

//sbit LED00=P0^0;  //位定义,定义单片机引脚


void delay(int t)
{
	int i , j ;
	for(i = 0 ; i < 100*t ; i++)
	{
		for(j = 0 ; j < 125 ; j++)
		{
			;
		}
	}
}

void main(void)
{

	P0 = 0xfe ; //0b11111110 
	P1 = 0x7f ; //0b01111111 

  while(1)
  {
  	P0 = _crol_(P0 , 1);  //循环左移,每次循环1位
	P1 = _cror_(P1 , 1);  //循环右移,每次循环1位
   	delay(5) ;

  }


}

5、在电路连接时,如果是小电压(小功率)设备,如LED灯,最好加一个限压电阻,如果是驱动一个大功率(需要大电流)设备时,最好加一级三极管进行驱动。



6、用程序实现,在单片机的某一个引脚上产生一定频率的方波。

最好利用定时器实现,这样比较精确。通过延时函数实现也行,不过要确保延时的精确度,最好不要使用带有参数的延时函数。

示例如下:

无源蜂鸣器要发声音,必须给它提供一定频率(1KHz左右)的方波。(声音频率)

实现方法:周期性的将打片机引脚“置位、延时、复位、延时”

示例中无源蜂鸣器接在AT89S52单片机的P3^6引脚:

/******************************************************************************
 *	说明:AT89S52芯片,12M晶振
 *	此开发板蜂鸣器的控制端口和单片机的P3^6引脚相连接
 *	用三极管进行驱动  
 *	无源蜂鸣器:需要写函数产生1KHz左右的声音频率(方波)
 ******************************************************************************/

#include<reg52.h>

sbit FMQ = P3^6 ; //位定义,定义单片机引脚

/******************************************************************************
 *	名称:delay1ms()
 *	功能:延时1ms
 *	参数:int t
 *	返回:无
 ******************************************************************************/
void delay1ms(int t)
{
	unsigned char i ;
	while(t--)
	{
		for(i = 0 ; i < 125 ; i++)
		{
			;
		}
	}
}


/******************************************************************************
 *	名称:delay500us()
 *	功能:延时500us
 *	参数:无
 *	返回:无
 ******************************************************************************/
void delay500us(void)
{
	int i ;

	for(i = 0 ; i < 63 ; i++)
	{
		;
	}

}

/******************************************************************************
 *	名称:beep_sound()
 *	功能:产生FMQ发声需要的1KHz的声音频率
 *	参数:无
 *	返回:无
 ******************************************************************************/
void beep_sound(void)
{
	FMQ = 0 ;
	delay500us();
	FMQ = 1 ;
	delay500us();

}


void main(void)
{
  int i	, t;

  while(1)
  {

  	t = 1000 ; //蜂鸣器发声1000*1ms 1KHz频率的方波,一个周期是1ms
	for(i = 0 ; i < t/3 ; i++)	//for( ; ; )循环自身每循环一次占用3个指令周期
	{
		beep_sound();	
	}

	FMQ = 1 ;  //关掉FMQ 1s(延时) 
	delay1ms(1000) ;

  }


}
delay500ms()函数 和 beep_sound()函数 改成如下形式,蜂鸣器的声音频率和发声时长完全面目全非了,很无解! 欢迎有经验的朋友通过评论的方式进行交流。

/******************************************************************************
 *	名称:delay500us()
 *	功能:延时500us
 *	参数:int t
 *	返回:无
 ******************************************************************************/
void delay500us(int t)
{
	int i ;

	for(i = 0 ; i < 63*t ; i++)
	{
		;
	}

}

/******************************************************************************
 *	名称:beep_sound()
 *	功能:产生FMQ发声需要的1KHz的声音频率
 *	参数:无
 *	返回:无
 ******************************************************************************/
void beep_sound(void)
{
	FMQ = 0 ;
	delay500us(1);
	FMQ = 1 ;
	delay500us(1);

}


7、在基于AT89S52单片机编程时,把一些静态变量或数组等(程序运行过程中不发生改变的变量或数组)在定义时变量名前加上 code ,这样这些变量或数组等将被存到单片机外部的ROM(AT89S52的8K ROM)中,这样便节省了单片机内部宝贵的RAM资源。(AT89S52内部只有256Byte的RAM)

注意:动态变量(在程序运行过程中会发生改变的变量或数组)不能用 code 声明,这些变量存放到外部ROM中,程序在运行过程中或出错。

#include<reg52.h>

sbit SMG_1 = P2^7 ; //位定义,定义单片机引脚

unsigned char code S8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//数组名前加 code 作用:将静态数组S8[16]存到AT89S52外部的8K的ROM中,而不是内部的256字节的RAM中。
//这样就节省了芯片内部宝贵的RAM资源。
//但是动态的(在程序运行过程中要发生变化的)变量或数组不能存放在外部的ROM中,变量名前面加code程序会出错

8、4 x 4 矩阵键盘   AT89S52的P1口(8位)扫描矩阵键盘

分为逐行扫描和线反转法扫描两种方式。

逐行扫描:1、先给列全写1 :1111

2、给行写 0111 :读P1口的值,跟据哪一列(n)被拉低,确定出是坐标为(1 , n)键按下;

     给行写 1011 :读P1口的值,跟据哪一列(n)被拉低,确定出是坐标为(2 , n)键按下;

     给行写 1101 :读P1口的值,跟据哪一列(n)被拉低,确定出是坐标为(3 , n)键按下;

     给行写 1110 :读P1口的值,跟据哪一列(n)被拉低,确定出是坐标为(4 , n)键按下;


线反转法扫描: 1、先给列全写1,给行全写0 ,则第x列被拉低;

   2、再给列全写0,给行全写1 ,则第y行被拉低;

    3、确定出是坐标为(x , y)的按键被按下。

具体程序实现过程参照我的博客博文《51单片机复习程序例举001》第8、9程序段:

http://blog.csdn.net/dragon12345666/article/details/22148459



9、按键消抖

按键消抖分为:软件消抖和硬件消抖。




注意:软件消抖时,两到三次的消抖延时,获取按键后加等待按键释放语句也可减少干扰。如果没有加等待按键释放的语句,则要在读取按键后加一个几十到一百毫秒的延时,防止后延抖动带来的干扰。






































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值