51单片机复习001

发布者:stampie最新更新时间:2017-09-18 来源: eefocus关键字:51单片机  定时器  计数器 手机看文章 扫描二维码
随时随地手机看文章

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基准延时程序如下:


  1. void delay1ms(unsigned int i)  

  2. {  

  3.   

  4.     unsigned char j;  

  5.     while(i--)  

  6.     {  

  7.      for(j=0;j<125;j++)    //1ms基准延时程序  

  8.      {  

  9.      ;  

  10.      }  

  11.    

  12.    

  13.  }  


  1. // j < 125 是因为for(){ ; }循环每循环一次括号内消耗3个指令周期,{;}内执行一个空语句消耗1个指令周期,即:每循环一次消耗4个指令周期(12M晶振:1us * 4)  


  1. //注意在写延时函数时 while(){ }  和   for( ; ; ){ }   的区别。  


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


  1. /****************************************************************************** 

  2.  *  说明:AT89S52芯片,12M晶振 

  3.  *  P0、P1两个8位端口分别连接8个LED灯 

  4.  *  低电平点亮,高电平熄灭。 

  5.  ******************************************************************************/  

  6.   

  7. #include  

  8. #include //是循环左移、右移函数的头文件,参考网址如下  

  9.     //http://baike.baidu.com/view/1745068.htm?fromTaglist  

  10.     //http://wenku.baidu.com/view/06ba3d00b52acfc789ebc97b.html  

  11.   

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

  13.   

  14.   

  15. void delay(int t)  

  16. {  

  17.     int i , j ;  

  18.     for(i = 0 ; i < 100*t ; i++)  

  19.     {  

  20.         for(j = 0 ; j < 125 ; j++)  

  21.         {  

  22.             ;  

  23.         }  

  24.     }  

  25. }  

  26.   

  27. void main(void)  

  28. {  

  29.   

  30.     P0 = 0xfe ; //0b11111110   

  31.     P1 = 0x7f ; //0b01111111   

  32.   

  33.   while(1)  

  34.   {  

  35.     P0 = _crol_(P0 , 1);  //循环左移,每次循环1位  

  36.     P1 = _cror_(P1 , 1);  //循环右移,每次循环1位  

  37.     delay(5) ;  

  38.   

  39.   }  

  40.   

  41.   

  42. }  


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


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

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

示例如下:

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

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

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


  1. /****************************************************************************** 

  2.  *  说明:AT89S52芯片,12M晶振 

  3.  *  此开发板蜂鸣器的控制端口和单片机的P3^6引脚相连接 

  4.  *  用三极管进行驱动   

  5.  *  无源蜂鸣器:需要写函数产生1KHz左右的声音频率(方波) 

  6.  ******************************************************************************/  

  7.   

  8. #include  

  9.   

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

  11.   

  12. /****************************************************************************** 

  13.  *  名称:delay1ms() 

  14.  *  功能:延时1ms 

  15.  *  参数:int t 

  16.  *  返回:无 

  17.  ******************************************************************************/  

  18. void delay1ms(int t)  

  19. {  

  20.     unsigned char i ;  

  21.     while(t--)  

  22.     {  

  23.         for(i = 0 ; i < 125 ; i++)  

  24.         {  

  25.             ;  

  26.         }  

  27.     }  

  28. }  

  29.   

  30.   

  31. /****************************************************************************** 

  32.  *  名称:delay500us() 

  33.  *  功能:延时500us 

  34.  *  参数:无 

  35.  *  返回:无 

  36.  ******************************************************************************/  

  37. void delay500us(void)  

  38. {  

  39.     int i ;  

  40.   

  41.     for(i = 0 ; i < 63 ; i++)  

  42.     {  

  43.         ;  

  44.     }  

  45.   

  46. }  

  47.   

  48. /****************************************************************************** 

  49.  *  名称:beep_sound() 

  50.  *  功能:产生FMQ发声需要的1KHz的声音频率 

  51.  *  参数:无 

  52.  *  返回:无 

  53.  ******************************************************************************/  

  54. void beep_sound(void)  

  55. {  

  56.     FMQ = 0 ;  

  57.     delay500us();  

  58.     FMQ = 1 ;  

  59.     delay500us();  

  60.   

  61. }  

  62.   

  63.   

  64. void main(void)  

  65. {  

  66.   int i , t;  

  67.   

  68.   while(1)  

  69.   {  

  70.   

  71.     t = 1000 ; //蜂鸣器发声1000*1ms 1KHz频率的方波,一个周期是1ms  

  72.     for(i = 0 ; i < t/3 ; i++)   //for( ; ; )循环自身每循环一次占用3个指令周期  

  73.     {  

  74.         beep_sound();     

  75.     }  

  76.   

  77.     FMQ = 1 ;  //关掉FMQ 1s(延时)   

  78.     delay1ms(1000) ;  

  79.   

  80.   }  

  81.   

  82.   

  83. }  

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



  1. /****************************************************************************** 

  2.  *  名称:delay500us() 

  3.  *  功能:延时500us 

  4.  *  参数:int t 

  5.  *  返回:无 

  6.  ******************************************************************************/  

  7. void delay500us(int t)  

  8. {  

  9.     int i ;  

  10.   

  11.     for(i = 0 ; i < 63*t ; i++)  

  12.     {  

  13.         ;  

  14.     }  

  15.   

  16. }  

  17.   

  18. /****************************************************************************** 

  19.  *  名称:beep_sound() 

  20.  *  功能:产生FMQ发声需要的1KHz的声音频率 

  21.  *  参数:无 

  22.  *  返回:无 

  23.  ******************************************************************************/  

  24. void beep_sound(void)  

  25. {  

  26.     FMQ = 0 ;  

  27.     delay500us(1);  

  28.     FMQ = 1 ;  

  29.     delay500us(1);  

  30.   

  31. }  


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

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



  1. #include  

  2.   

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

  4.   

  5. unsigned char code S8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};  

  6. //数组名前加 code 作用:将静态数组S8[16]存到AT89S52外部的8K的ROM中,而不是内部的256字节的RAM中。  

  7. //这样就节省了芯片内部宝贵的RAM资源。  

  8. //但是动态的(在程序运行过程中要发生变化的)变量或数组不能存放在外部的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、按键消抖

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




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



关键字:51单片机  定时器  计数器 引用地址:51单片机复习001

上一篇:51单片机复习程序例举001
下一篇:51单片机的i2c多字节的读写24c02

推荐阅读最新更新时间:2024-03-16 15:37

51单片机中什么是bit和sbit?_bit和sbit区别
回顾C语言发现在单片机中有bit sbit sfr 等一些类型! 问题:什么是bit和sbit?他们有什么区别?   bit : 编译时分配空间 sbit 只能在外部定义全局变量。 sfr(特殊功能寄存器)的bit。SFR是系统指定的内存地址。   bit 动态分配的,有编译器来指定内存地址。   bit和sbit都是C51扩展的变量类型。   sbit 要在最外面定义,就是说必须定义成外部变量.sbit定义的是SFR(特殊功能寄存器)的bit   sbit更像是类型定义,不像是变量定义。   sbit: 指示说明性说明   bit 可以在外部或内部定义。
[单片机]
51单片机做的智能时钟具有闹钟功能(DS1302+DS18B20+LCD1602)
本贴针对学完单片机并且有读懂代码的非新手同学。本人目前放寒假,这个是本人在上个学期的单片机课上要求做的综合实验,现在重新修改了下增加了菜单目前测试毫无问题可以完美使用。有志向做闹钟的同学可以参考一下,原码上由本人写的大量注释可以方便看懂。 使用了LCD1602、DS1302、DS18B20用来测试温度、内部含闹钟系统但本人没有做EEPROM有需要的同学可以自行添加。 单片机源程序如下: #include reg52.h #include key.h #include LCD1602.h #include DS1302.h #include music.h #include DS18B20.H #define no
[单片机]
动态扫描方法和定时器1在数码管的前三位显示出秒表
/* 用动态扫描方法和定时器1在数码管的前三位显示出秒表 */ #include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char uint closedu,closewe; uchar code wetable ={ 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; uchar code dutable ={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}
[单片机]
51单片机内部资源
通过这篇博客对这一段时间对51单片机的学习做一定总结,这是对单片机内部资源的一定总结:单片机的内部资源总体上分为两部分:基本功能和服务性功能。如下图所示; 对于基本的器件有:LED灯,蜂鸣器、继电器、步进电机和按键。其中通过LED的不同组合方式可以扩展出LED流水灯、数码管和点阵。其实基本的器件的工作方式是基本相同的,只是对电平表现出的不同输出方式。其中数码管可以通过动态和静态两种方式显示;静态显示为一对一形式,动态显示为一对多形式的循环显示。其中点阵的表现方式其实和数码管的动态显示是相同的,只是点阵和数码管的LED灯的排列方式不同而已。对于X*Y形式的按键扫描方法是:行列交叉取点发。 上述都为一些基本器件,为了方便和更加
[单片机]
NRF52840学习历程(六)RTC 实时计数器(滴答定时器)
开发板:初雪的100出头那块 NRF52840 EVAL KIT 下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB也行,其他的下载器诸如STLINK,DAP不建议用) 版本号: KEIL5编程环境,CMSIS为5.3.0, NRF52840的CMSIS为8.35.0 参考资料: NRF52840-Eval-Kit-Schematic.pdf(原理图) nRF5_SDK_17.0.2_d674dde(官方例程) nRF5_SDK_17.0.0_offline_doc(官方文档) nRF52840_PS_v1.1.pdf(官方数据手册) RTC 实时计数器 32.768KH
[单片机]
NRF52840学习历程(六)RTC 实时<font color='red'>计数器</font>(滴答<font color='red'>定时器</font>)
51单片机I/O口使用经验
按常规,在51端口(P1、P2、P3)某位用作输入时,必须先向对应的锁存器写入1,使FET截止。一般情况是这样,也有例外。所谓IO口内部与电源相连的上拉电阻而非一常规线性电阻,实质上,该电阻是由两个场效应管并联在一起:一个FET为负载管,其阻值固定;另一个FET可工作在导通或截止两种状态(姑且叫可变FET)。使其总电阻值变化近似为0或阻值较大(20千欧--40千欧)两种情况。当和端口锁存器相连的FET由导通至截止时,该阻值近似为0,可将引脚快速上拉至高电平;当和锁存器相连的FET由截止至导通时,该电阻呈现较大阻值,限制了和端口锁存器相连的FET的导通电流。 51I/O口作为输入端和外部信号相连有时必须考虑上述特性,本人在设计LT
[单片机]
51单片机-按键部分(3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 1
[单片机]
c51中定时器工作时如何使用T0脚输入脉冲信号?
嵌入式系统中,定时器是一种常用的设备,可以实现各种时间控制功能,如计时、计数、产生中断等。8051单片机中有两个定时器:T0和T1,其中T0定时器主要用于计时和计数操作,可以通过T0脚输入脉冲信号来控制定时器的工作。 T0脚是单片机的P3.4口,既可以作为普通的输入输出口,也可以作为T0定时器的外部输入引脚。当T0脚作为定时器的外部输入引脚时,可以通过输入的脉冲信号来控制定时器的计数。在使用T0脚输入脉冲信号时,需要采取一些措施来确保信号的稳定性和正确性。 首先,需要确定输入脉冲信号的频率。在使用T0脚输入脉冲信号时,需要将信号的频率与定时器的工作频率相匹配。具体来说,当定时器使用外部时钟源时,其工作频率为外部时钟源频率的一半,因
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved