51单片机知识点总结
第二章:
存储器空间组成,各区间特点及访问方式,工作寄存器区的设定,程序状态字的位结构及其功能,堆栈的操作,P0-P3各端口的功能,特点,使用方法,单片机复位信号的产生及复位之后的状态,振荡周期、状态周期、机器周期及指令周期的关系及计算方法。
第三章:
寻址方式,各类指令(如一般传送类指令五种操作数之间的数据传递,特殊传送类指令的使用方法,算术运算类指令对PSW各标志位的影响,逻辑运算类指令的功能及其使用,控制转移类指令的转移范围等),简单程序的编写与识读(如数据块的搬移,延时程序的实现及如何设定循环次数,查表程序),包括简单C语言程序的识读(如数据传送,数据排序等)。
第四章:
中断系统:包括中断源有哪些,如何进行中断允许控制,中断优先级控制,各自的中断入口地址是多少,中断得到CPU服务(即中断响应)的基本条件,中断响应延迟的原因。
定时器:定时器的各种工作方式及其使用方法,定时器的初始化,如何使用定时器实现周期信号的输出。以及相应的简单编程。
串行口:串行口的各工作方式及其使用,接收如何使能,多机通信
第五章:
三总线结构及其实现,片外扩展芯片的编址方式及其特点,片外程序及数据存储器的扩展实现并分析其地址区间,片外IO扩展的实现及其器件编址,简单编程。
第六章:
键盘,主要是行列式编码键盘的实现方法,识别方法,扫描法的工作原理,按键去抖动。LED段码实现方法,动态LED显示与静态LED显示的比较。
第二篇:51单片机控制的遥控车制作过程总结和体会
我于2010/7/16日才正式决定做遥控车。到2010/7/31中午正式全部完成。
首先 我做的遥控车目前的功能有:前进,后退,开始,停止,加速,减速,左转,右转
用的无线发送接收方式,用pt2262编码,pt2272解码!
1, 测速模块(虽然最后没用上,还是说说),测速的方式有很多很多,我们选择的方式有红外测速,光敏测速。最后查完资料决定用光敏测速,我是在机械鼠标上拆的光敏三极管,通过计固定时间内的低电平次数,就可以测出转速,但是使用时出了问题,几乎三极管集电极电压保持在1.7伏左右,主要是因为受自然光影响,随后对其进行密封,只留个很小的进光孔,效果还不错
2, 电机驱动部分。网上流传甚广的是如下电路图
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();
}
}