51单片机知识点总结

51单片机知识点总结

第二章:

存储器空间组成,各区间特点及访问方式,工作寄存器区的设定,程序状态字的位结构及其功能,堆栈的操作,P0-P3各端口的功能,特点,使用方法,单片机复位信号的产生及复位之后的状态,振荡周期、状态周期、机器周期及指令周期的关系及计算方法。

第三章:

寻址方式,各类指令(如一般传送类指令五种操作数之间的数据传递,特殊传送类指令的使用方法,算术运算类指令对PSW各标志位的影响,逻辑运算类指令的功能及其使用,控制转移类指令的转移范围等),简单程序的编写与识读(如数据块的搬移,延时程序的实现及如何设定循环次数,查表程序),包括简单C语言程序的识读(如数据传送,数据排序等)。

第四章:

中断系统:包括中断源有哪些,如何进行中断允许控制,中断优先级控制,各自的中断入口地址是多少,中断得到CPU服务(即中断响应)的基本条件,中断响应延迟的原因。

定时器:定时器的各种工作方式及其使用方法,定时器的初始化,如何使用定时器实现周期信号的输出。以及相应的简单编程。

串行口:串行口的各工作方式及其使用,接收如何使能,多机通信

第五章:

三总线结构及其实现,片外扩展芯片的编址方式及其特点,片外程序及数据存储器的扩展实现并分析其地址区间,片外IO扩展的实现及其器件编址,简单编程。

第六章:

键盘,主要是行列式编码键盘的实现方法,识别方法,扫描法的工作原理,按键去抖动。LED段码实现方法,动态LED显示与静态LED显示的比较。

 

第二篇:51单片机控制的遥控车制作过程总结和体会

我于2010/7/16日才正式决定做遥控车。到2010/7/31中午正式全部完成。

首先 我做的遥控车目前的功能有:前进,后退,开始,停止,加速,减速,左转,右转

用的无线发送接收方式,用pt2262编码,pt2272解码!

1,  测速模块(虽然最后没用上,还是说说),测速的方式有很多很多,我们选择的方式有红外测速,光敏测速。最后查完资料决定用光敏测速,我是在机械鼠标上拆的光敏三极管,通过计固定时间内的低电平次数,就可以测出转速,但是使用时出了问题,几乎三极管集电极电压保持在1.7伏左右,主要是因为受自然光影响,随后对其进行密封,只留个很小的进光孔,效果还不错

2,  电机驱动部分。网上流传甚广的是如下电路图

1_070321124025.jpg

11脚出现高电平时,使左边的9014导通,从而左边的8050和右边的8550导通,经实验,确实没问题,但是如果第11和10同时为高呢?因为单片机通电的各引脚瞬间是高电平,将导致两边8550,8050没经过电机而导通。其二,我实验的时候,反正经常出现控制不了的状况,即让左边9014导通,而电机不能正常转动,其三,当电机整个驱动电压为7.6V时,9014门极控制为4.5V,发现电机转动的很慢,而流过电机的电流才0.4A

,而电机端电压居然高达十几伏,最后还不慎将整个电路烧毁了

最后我在网上找到了这个电路:

其中A,B点是接电机的。

这个电路就非常好,好在哪儿?

首先:两控制端同为低,或同为高,电机都不转,8050,8550均未全部导通,那么就不存在短路的情况,其二只有两个引脚一高一低的时候,电机才会正常运转。

而这个电路的驱动能力是相当的好,即使是4.5V的干电池都能轻而易举的让电机快转。但是当把控制端接到单片机上去之后,让单片机输出口输出“1”,而电机并未转动,IO口电压很低,最后我想到了可能是单片机的IO驱动能力不够,因为单片机的IO只能驱动八个TTL电路,最后我在电机控制的各引脚接了13K的上拉电阻(太大太小都不行),然后OK了,电机完全在控制之中了。

3:无线接收模块:

         pt2262和pt2272—M4(瞬态型)的地址端设成一样之后,2262发号,2272接收,接收时VT会输出一个高脉冲,我将其接个非门,目的是能产生中断,因为后面我还打算把语音部分加上,当然你想简单点则可以不加,只是程序要稍作改动。未接单片机时,接收效果非常好,很远都能接收到,但是接上单片机之后发现,2272低电平为0V,高电平却为0.65V,网上说可能是单片机的端口设置成了输出,我检查了一遍,发现并不是这个问题。我想可能和2272的地址设置有关系,因为D0和A11为同一引脚,而单片机的各引脚初始状态为1,你把它改成0 也不对,数据端结果误认为成了地址控制了,所以我索性将各个2272(D0---D3)数据端口接个反相器74HC04;一下子,能够收号了,完全正确。

至此我的小车就做出来了,看着简单,做的时候才知道“锅儿是铁倒的,馍馍是面做的”。

发射部分程序:51单片机控制,因为后面准备做语音部分,所以用单片机发送,容易控制和实现半智能化;电路图看程序即可看出;

#include "reg51.h"

sbit start=P3^3;

sbit stop=P3^4;

sbit qianj=P1^2;

sbit hout=P1^1;

sbit zuoz=P1^0;

sbit youz=P1^3;

sbit jias=P3^1;

sbit jians=P3^2;

sbit fashe=P2^4;

void delay_ms(unsigned char nn)

{

         unsigned char i,j,k;

         for(i=nn;i>0;i++)

                   for(j=2;j>0;j--)

                            for(k=248;k>0;k--);

}

void main()

{

         fashe=0;

         while(1)

         {

         if(qianj==0)

                   {

                   delay_ms(10);

                   if(qianj==0)

                            {

                            while(!qianj);

                            P2=0x08;//前进

                            fashe=1;

                            delay_ms(50);

                            fashe=0;

                            }

                   }

        

         if(hout==0)

                   {

                   delay_ms(10);

                   if(hout==0)

                            {

                            while(!hout);

                            P2=0x04;

                            fashe=1;

                            delay_ms(50);

                            fashe=0;

                            }

                   }

         if(zuoz==0)

                   {

                   delay_ms(10);

                   if(zuoz==0)

                            {

                            P2=0x02;

                            fashe=1;

                            delay_ms(50);

                            fashe=0;

                            }

                   }

         if(youz==0)

                   {

                   delay_ms(10);

                   if(youz==0)

                            {

                            P2=0x01;

                            fashe=1;

                            delay_ms(50);

                            fashe=0;

                            }

                   }

         if(jias==0)

                   {

                   delay_ms(10);

                   if(jias==0)

                            {

                            P2=0x0c;

                            fashe=1;

                            delay_ms(50);

                            fashe=0;

                            }

                   }

                  

                  

         if(jians==0)

                   {

                   delay_ms(10);

                   if(jians==0)

                            {

                            P2=0x03;

                            fashe=1;

                            delay_ms(50);

                            fashe=0;

                            }

                   }

         if(start==0)

                   {

                   delay_ms(10);

                   if(start==0)

                            {

                            P2=0x0a;

                            fashe=1;

                            delay_ms(50);

                            fashe=0;

                            }

                   }

         if(stop==0)

                   {

                   delay_ms(10);

                   if(stop==0)

                            {

                            P2=0x05;

                            fashe=1;

                            delay_ms(50);

                            fashe=0;

                            }

                   }

                  

        

         }

}

接收部分程序:

#include "reg52.h"

#include "intrins.h"

sbit zuo=P2^2;

sbit you=P2^3;

sbit qianj=P2^0;

sbit hout=P2^1;

sbit p32=P3^2;

unsigned char p_time=0;

unsigned char pwmh=200;

bit flag1=0;    //收号标志

bit qh=0;

/*

void delay_ms(unsigned char nn)

{

         unsigned char i,j,k;

         for(i=nn;i>0;i++)

                   for(j=2;j>0;j--)

                            for(k=248;k>0;k--);

}

*/

void delay_us(unsigned char nn)

{

         unsigned char m;

         unsigned char n;

         for(m=0;m<=nn;m++)

                   for(n=0;n<=33;n++)

                   ;

}

void jiasu(void)

{

          if(pwmh+5>100)

          pwmh=100;

          else pwmh+=5;

}

void jiansu(void)

{

          if(pwmh<=30)

          pwmh=30;

          else pwmh-=5;      

}

void zuoz(void)

{

                   zuo=1;you=0;

                   delay_us(30);

                   zuo=0;you=0;

}

void youz(void)

{

                   you=1;zuo=0;

                   delay_us(30);

                   you=0;zuo=0;

}

void start(void)

{

         TR0=1;

         pwmh=30;

         qh=0;

}

void stop(void)

{

         TR0=0;

         pwmh=0;

}

int0()interrupt 0 using 1{

flag1=1;

}

timer0()interrupt 1 using 1{

         p_time++;

         if(qh==0)

         {

                   if(p_time<=pwmh)

                             {qianj=1;hout=0;}

                   else {qianj=0;hout=0;}

         }

         if(qh==1)

         {

                   if(p_time<=pwmh)

                             {hout=1;qianj=0;}

                   else {hout=0;qianj=0;}     

         }

         if(p_time==255)

                   p_time=0;

}

void jieshou(void)

{

                   unsigned char js;

                   if(flag1==1)

                   {

                            flag1=0;

                            _nop_();

                            _nop_();

                            _nop_();

                            _nop_();

                            _nop_();                                       

                            js=P2&0xf0;

                            switch(js)

                            {

                                     case 0x00: break;

                                     case 0xf0: break;

                                     case 0xa0: jiasu();    break;

                                     case 0x50: jiansu();break;

                                     case 0x70: zuoz();    break;

                                     case 0xd0: youz();    break;

                                     case 0xe0: qh=0;      break;       //前后标志位为0,则表示前进

                                     case 0xb0: qh=1;      break;       //前后标志位为1,则表示后退

                                     case 0x60: start();   break;

                                     case 0x90: stop();    break;

                                     default:   break;

                            }

                   }

}                                                                                                                                                                                                                                                   

void init()

{

         TMOD=0x02;   //只产生pwm

         TH0=0x38;

         TL0=0x38;

         ET0=1;

         EA=1;

         EX0=1;

         IT0=1;               

}

void main()

{

         init();

         while(1)

         {       

         jieshou();

         }

                  

}

相关推荐