单片机开发的一点基础知识点

电平特性:

常用的逻辑电平有TTL,CMOS,LVTTL,ECL,PECL,GTL,RS-232,RS-422,RS-485,LVDS等。

5V TTL和5V CMOS 是通用的逻辑电平。

TTL和CMOS按逻辑电平可分为:5V系列,3.3V系列,2.5V系列,1.8V系列。

TTL电平信号系统,+5V等价于逻辑1,0V等价于逻辑0。

CMOS 电平Vcc可达12V,输出高电平为约0.9Vcc,低电平约为0.1Vcc。CMOS电路中不使用的输入端不能悬空,否则会造成逻辑混乱。

TTL电路和CMOS电路的逻辑电平关系:VOH,VOL,VIH,VIL

同或的运算法则:A同或B,相同为1,不同为0.

异或的运算法则:A异或B,相同为0,不同为1.

C51中的数据类型:

数据类型

关键字

所占位数

表示数的范围

无符号字符型

Unsigned char

8

0~255

有符号字符型

Char

8

-128~127

无符号整型

Unsigned int

16

0~65535

有符号整型

Int

16

-32768~32767

无符号长整型

Unsigned long

32

0~2(32)-1

有符号长整型

Long

32

-2(31)~2(31)-1

单精度实型

Float

32

3.4e-38~3.4e38

双精度实型

Double

64

1.7e-308~1.7e308

位类型

Bit

1

0~1

 

 

 

 

                    

一个字节=8位。

Sfr----特殊功能寄存器的数据声明,声明一个8位的寄存器。

Sfr16------16位特殊功能寄存器的数据声明。

Sbit------特殊功能位声明,也就是声明某一个特殊功能寄存器中的某一位。

Bit------位变量声明,当定义一个位变量时可以使用此符号。

例如:sfr scon = 0x98;scon是单片机的串行口控制寄存器,这个寄存器在单片机内存中的地址为0x98.

C51常用的头文件:reg51.h,reg52.h,math.h,ctype.h,stdio.h,stdlib.h,absacc.h,intrins.h。

但通常用的却只有:reg51.h,reg52.h,math.h.

 

C51中的运算符:

算术运算符

含义

+

加法

-

减法

*

乘法

/

除法

++

自加

--

自减

%

求余运算

 

 

关系(逻辑)运算符

含义

大于

>=

大于等于

小于

<=

小于等于

==

测试相等

!=

测试不等

&&

||

!

                          

位运算符

含义

&

按位与

|

按位或

^

异或

~

取反

>> 

右移

<< 

左移

 

C51中的基础语句:

语句

类型

If

选择语句

While

循环语句

For

循环语句

Switch/case

多分支选择语句

Do-while

循环语句

 

单片机最小系统能够运行的必要条件:1电源,2晶振,3复位电路

 

第一个程序:

#include//52系列单片机头文件

Sbit led1 = P1^0;//声明单片机P1口的第一位

Void main()//主函数

{

Led1 = 0;//点亮第一个放光二极管

}

 

排阻:就是一排电阻

认识电阻标号:103表示10*103Ω=10kΩ,150表示15*100Ω=15Ω。1002表示100*102欧姆,1001表示100*101欧姆。

一般的三位数表示5%精度,四位数表示1%精度。

发光二级管的导通电压为1.7V。

 

单片机是不能停止工作的,只要他有电,有晶振在起振,他就会不停的工作。不过我们可以将其设置为休眠状态或者掉电模式,最大限度的降低他的功耗。

 

时钟周期:也称振荡周期,定义为时钟频率的倒数。如12MHz的时钟周期是1/12M.即1/12μs。

状态周期:它是时钟周期的两倍。

机器周期:单片机的基本操作周期,在一个操作周期中,单片机完成一个基本操作。它由12个时钟周期(6个状态周期)组成。

指令周期:它是指CPU执行一条指令所需要的时间。一般一个指令周期含有1~4个机器周期。

 

左移操作:

                                             CY   最高位                      最低位

                           移位前   X    0  1  1   0    1   0  1   1

                                 ………………

                           移位后   0   1   1   0   1    0   1  1   0

 

右移操作:

                                           最高位                      最低位CY

                           移位前   0  1   1   0  1    0   1  1    X

                                                              ……………………

                           移位后   0  0   1   1  0    1   0  1    1

 

循环左移:

                           移位前    0  1   1   0    1  0   1   1

 

                           移位后    1  1   0   1    0   1  1   0

 

循环右移:

                           移位前    0  1   1   0    1   0  1   1

                                                                        

                           移位后    1  0   1   1    0  1   0   1

 

PSW寄存器:(ProgramStatus Word)

全称为程序状态字标志寄存器。是一个8位寄存器,位于单片机内的特殊功能寄存器区,字节地址D0H,用来存放运算结果的一些特征,如有无进位,借位等。

D7  D6   D5   D4  D3   D2   D1  D0

PSW   CY  AC   F0    RS1  RS0 OV    -    P  D0H

 

CY……进位标志

AC……辅助进位标志

F0……由用户使用的一个状态标志位

RS1,RS2……4组工作寄存器区选择控制位

OV……溢出标志位

P……奇偶标志位

 

使用万用表检测数码管的引脚

 

52单片机中断源

INT0……外部中断0,有P3.2端口线引入,低电平或下降沿引起。

INT1……外部中断1,有P3.3端口线引入,低电平或下降沿引起。

T0……定时器/计数器0中断,由T0计数器计满回零引起。

T1……定时器/计数器1中断,由T1计数器计满回零引起。

T2……定时器/计数器2中断,由T2计数器计满回零引起。

TI/RI……串行口中断,串行端口完成一帧字符发送/接收后引起。

 

中断级别

中断源

默认中断级别

序号(C语言使用)

入口地址(汇编使用)

INT0……外部中断0

最高

0

0003H

T0……定时器/计数器0中断

第2

1

000BH

INT1……外部中断1

第3

2

0013H

T1……定时器/计数器1中断

第4

3

001BH

TI/RI……串行口中断

第5

4

0023H

T2……定时器/计数器2中断

最低

5

002BH

 

中断允许寄存器IE:

位序号

D7

D6

D5

D4

D3

D2

D1

D0

位符号

EA

--

ET2

ES

ET1

EX1

ET0

EX0

位地址

AFH

--

ADH

ACH

ABH

AAH

A9H

A8H

 

中断优先级寄存器IP:

位序号

D7

D6

D5

D4

D3

D2

D1

D0

位符号

--

--

--

PS

PT1

PX1

PT0

PX0

位地址

--

--

--

BCH

BBH

BAH

B9H

B8H

 

51单片机内部共有两个16位可编程的定时器/计数器。他们既有定时功能,又有计数功能。即定时器T0和定时器T1。52单片机内部多一个T2定时器/计数器。通过设置特殊功能寄存器可以选择启动定时功能或计数功能。

TH0:定时器/计数器T0的高八位初值。

TH1:定时器/计数器T1的高八位初值。

TL0:定时器/计数器T0的低八位初值。

TL1:定时器/计数器T1的低八位初值。

 

加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;另一个是T0或T1引脚输入的外部脉冲源,每来一个脉冲,计数器加1.

 

定时器/计数器工作方式寄存器TMOD:

该寄存器在特殊功能寄存器中,字节地址为89H,不能位寻址。单片机复位时TMOD全部被清零。

位序号

D7

D6

D5

D4

D3

D2

D1

D0

位符号

GATE

C/

M1

M0

GATE

C/

M1

M0

|             定时器1              |          定时器0               |

由图可知,高四位用来设置定时器1,低四位用来设置定时器0,对应四位的含义如下:

GATE……门控制位。

C/……定时器模式和计数器模式选择位。

C/ = 1:为计数器模式;C/ = 0:为定时器模式。

M1M0……工作方式选择位。

M1

M0

工作方式

0

0

方式0,为13位定时器/计数器

0

1

方式1,为16位定时器/计数器

1

0

方式2,8位初值自动重装的8位定时器/计数器

1

1

方式3,仅适用于T0,分成两个计数器,T1停止计数

 

定时器/计数器控制寄存器TCON:

该寄存器在特殊功能寄存器中,字节地址为88H,位地址分别是88H~8FH,该寄存器可进行位寻址。TCON寄存器用来控制定时器的启、停,标志定时器溢出和中断情况。单片机复位时TCON全部被清0。TF1、TR1、TF0、TR0位用于定时器/计数器;IE1、IT1、IE0、IT0位用于外部中断。

位序号

D7

D6

D5

D4

D3

D2

D1

D0

位符号

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

位地址

8FH

8EH

8DH

8CH

8BH

8AH

89H

88H

 

当用定时器的方式1时,即16位定时器,设机器周期为Tcy,定时器产生一次中断的时间为t,那么需要技术的个数N = t/Tcy,装入THX和TLX中的数分别为:

THX = (65536 - N)/256,TLX = (65536 - N)%256。

Tcy =12 * (1/频率)

 

中断服务程序的写法:

Void 函数名()interrupt中断号 using 工作组

{

                           中断服务程序内容

}

中断函数不能返回任何值,不带任何参数,中断号指单片机中几个中断源序号。C51编译器在编译程序时会自动分配工作组,故通常省略不写。

例如:

Void T1_time() interrupt3

{

TH1 = (65536 - 10000)/256;

TL1 = (65536 - 10000)%256;

}

 

定时器的初始化过程如下:

1、对TMOD赋值,确定T0和T1的工作方式。

2、计算初值,并将初值写入TH0,TL0或TH1,TL1。

3、中断方式时,则对IE赋值,开放中断。

4、使TR0或TR1置位,启动定时器/计数器定时或计数。

一旦开启定时器,定时器便开始计数,当计数溢出时,自动进入中断服务程序执行代码,执行完中断程序后再回到原来出继续执行,也就是继续等待。(Page74)

 

能在主程序中完成的功能就不再中断函数中写,若非要在中断函数中实现功能,那么一定要高效、简洁。

                                              

7段数码管的编码数组:

在用C语言编程时,编码定义方式如下:   

Unsigned char code table[] = {

0x3f, 0x06, 0x5b, 0x4f,                     

0x66, 0x6d, 0x7d,0x07,                          

0x7f, 0x6f, 0x77,0x7c

0x39, 0x5e, 0x79,0x71};                        

直接定义数字                                          

Unsigned charnum[] = {                              

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,                                    

0x80,0x90,0x7f}                                     

对应的二进制表达式为:

1100 0000,  1111 1001, 1010 0100,  1011 0000,

1001 1001,  1001 0010, 1000 0010,  1111 1000,

1000 1000,  1001 0000, 0111 1111                           

分别对应于:

0,1,2,3,

4,5,6,7,

8,9,.

即多了一个code关键字,code表示编码的意思。单片机C语言中定义数组时是占用内存空间的,而定义编码时是直接分配到程序空间中,编译后编码占用的是程序存储空间,而非内存空间。

Unsigned char codetable [] = {

0x3f, 0x06, 0x5b, 0x4f,

0x66, 0x6d, 0x7d, 0x07,

 0x7f,0x6f, 0x77, 0x7c,

0x39, 0x5e, 0x79, 0x71};

 

在编写中断程序中,常用到的几个寄存器为:

TMOD:设置定时器工作方式,

TH0,TL0,TH1,TL1:设置定时器的初始值,

EA:开总中断,

ET0,ET1:开定时器中断,

TR0,TR1:启动定时器;

 

sbit led0 =P1^0;//要控制的LED灯

sbit led1 =P1^1;//要控制的LED灯

 

sbit P20 = P2^0;//关闭数码管

sbit P21 = P2^1;//关闭数码管

主函数中:

P1 = 0xff;

P20 = 0;

P21 = 0;

 

STC12C5A60S2单片机中,P1寄存器表示对应的LED灯,P0寄存器表示对应的数码管。

使能控制信号:当电平为1时,表示无效,禁用。

sbit P20=P2^0;//表示点状数码管的控制端

sbit P21=P2^1;//表示7段数码管的控制端

 

P20 = 0;//表示启用点状数码管

P21 = 1;//表示禁用7段数码管

 

输入输出端口P0,P1,P2,P3

P1:对端口写1时,通过内部的上拉电阻吧端口拉到高电位,这是可用作输入口。P1做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流(IIL)。在对Flash ROM编程和程序校验时,P1接收低8位地址。

P2:对端口写1时,通过内部上拉电阻把端口拉到高电位,这时可作为输入口。P2作输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流(IIL)。在访问外部数据存储器(如执行MOVX @DPTR指令时)P2送出高八位地址。在访问8位地址的外部数据存储器(如执行MOVX @R1指令时)P2口引脚上的内容(就是专用寄存器(SFR)区中P2寄存器的内容),在整个访问期间不会改变。在对Flash ROM编程和程序校验期间,P2也接收高位地址和一些控制信号。

P0:当P0作为输入口使用时,应先向口锁存器地址(80H)写入全1,此时P0口的全部引脚浮空,可作为高阻抗输入。做输入口使用时要先写1,这就是准双向的含义。在CPU访问片外存储器(89C51片外EPROM或RAM)时,P0口分时提供低八位地址和八位数据的复用总线。在此期间,P0口内部上拉电阻有效。

P3:对端口写1时,通过内部的上拉电阻把端口拉到高电位,这是可作为输入口。P3作输入口使用时,因为有内部的上拉电阻,哪些被外部信号拉低的引脚会输出一个电流(IIL)。P3 端口还用于一些复用功能。例如:

端口引脚

复用功能

P3.0

RXD(串行输入口)

P3.1

TXD(串行输出口)

P3.2

(外部中断0)

P3.3

(外部中断1)

P3.4

T0(定时器0的外部输入)

P3.5

T1(定时器1的外部输入)

P3.6

(外部数据存储器写选通)

P3.7

(外部数据存储器读选通)

 

 

有一个问题,为什么延时在主函数中,时间较长,在子函数中,就变的很短。

例如主函数中有一下语句:for( i =0;i<60000;i++);,当把其抽取为函数后即:

void delayms(uintxms)

{

    uint i;

    for( i = 0;i

},时间明显的变短。

 

AT89C52单片机电路图:

 

流水灯的实现,完全可以依靠移位操作实现。

实际波形在按下与释放的时候有抖动现象。但我们通常用软件延时的方法来解决这个问题。

一般在检测按下时加入去抖动延时,检测松手时就不用了。

ISIS模拟软件中,常用的部件名称:电阻 res;按键(开关) button;普通电容 cap;极性电容 cap-elec;排阻 respack-7(8);数码管 7seg;发光二极管 led-(颜色,如red 、green等);晶振 crystal;扬声器 sounder;电感 inductor;

 

单片机的S2,S3,S4,S5为独立键盘,分别于单片机的P3.4~P3.7相连。

 

中断初始化与中断处理函数:

TMOD = 0x01;//设置定时器0的工作方式为1

    TH0 = (65536-45872)/256;设置初值

    TL0 = (65536-45872)%256;

    TR0=1;             //启动定时器

    ET0=1;   //打开定时器0中断

EA=1;     //打开总中断

 

Void timer0() interrupt 1

{

TH0 = (65536-45872)/256;重设初值

        TL0= (65536-45872)%256;

        Num++;

    If(num == 20)//约1S的时间到了

{

    Num= 0;

              Flag = 1;//设置标志位,用以处理操作。

}

}

 

Sfr:特殊功能寄存器声明

Sfr16:sfr的16位数据声明

Sbit:特殊功能位声明

Bit:位变量声明

 

Reg51.h,reg51.h,math.h

 

二极管的接通电流为3mA~10mA,压降是1.7V。

位操作

Sbit led1 = P1^0;

Led1 = 0;

总线操作:

P1 = 0xfd;

 

单片机的编程的时候,时刻注意时序的概念,有时序的思想。状态的保持,震动的检测等。

 

关闭数码管的方法:

Sbit P20 = P2^0;

Sbit P21 = P2^1;

P1 = 0xff;

P20 = 0;P21 = 0;//当为1的时候为打开状态。

P1 控制着二极管。

P07接了蜂鸣器(参照PCB原理图)

Sbit beep = P0^7;

Beep = 1;

 

//P26是段选锁存端,P27是位选锁存端。

Sbit dula = P2^0;

Sbit wela = P2^1;

使用数码管的时候,可以将点阵数码管摘下。

位选时:

P1 = 0x00;//消除位选混乱残影

Wela = 1;

P1 = 0x01;//位选信号,讲那个置1.高电平表示启用。

Wela = 0;

 

P1 = 0xff;//消除段选混乱残影

Dula = 1;

P1 = 0xf9;//段选信号,低电平表示亮。

Dula = 0;

 

定时器假设频率为12MHz,12个时钟周期为一个机器周期,一个机器周期大概为1微秒。计满TH0和TL0,需要计数为216-1个,大概为65535μs,即65.5ms,如要定时50ms,则需要在TH0和TL0中分别装入初值,然后再计数50000个,即为50ms。

那么:TH0 = (65536 –50000)/256;

      TL0 = (65536 – 50000)%256;

 

你可能感兴趣的:(单片机)