电平特性:
常用的逻辑电平有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
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单片机电路图: 流水灯的实现,完全可以依靠移位操作实现。 实际波形在按下与释放的时候有抖动现象。但我们通常用软件延时的方法来解决这个问题。 一般在检测按下时加入去抖动延时,检测松手时就不用了。 单片机的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; ISIS模拟软件中,常用的部件名称:电阻 res;按键(开关) button;普通电容 cap;极性电容 cap-elec;排阻 respack-7(8);数码管 7seg;发光二极管 led-(颜色,如red 、green等);晶振 crystal;扬声器 sounder;电感 inductor;