单片机开发的一点基础知识点
来源:互联网 发布:小学生机器人编程入门 编辑:程序博客网 时间:2024/06/06 03:39
电平特性:
常用的逻辑电平有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<reg52.h>//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<xms;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;
- 单片机开发的一点基础知识点
- 项目开发过程中遇到的一点小知识点
- 51单片机的一点感想
- java一点小的知识点
- InnoDB一点零散的知识点
- Java Map的一点知识点
- 配置PCA的一点总结12单片机
- 有关View的几个基础知识点-IOS开发
- 有关View的几个基础知识点-IOS开发
- 有关View的几个基础知识点-IOS开发
- 有关View的几个基础知识点-IOS开发
- 有关View的几个基础知识点-IOS开发
- 有关UIView、subview的几个基础知识点-IOS开发
- 有关View的几个基础知识点-IOS开发
- 有关UIView、subview的几个基础知识点-IOS开发
- 有关View的几个基础知识点-IOS开发
- 有关View的几个基础知识点-IOS开发
- UIView、subview的几个基础知识点-iOS开发(实例)
- 光照模型
- 一个全新自主操作系统LMOS
- 深入Java字符串(三)
- 深入理解Linux内核个人小结8---内存区管理
- Tika解析非结构文档处理过程的简单分析
- 单片机开发的一点基础知识点
- 一个光线跟踪的简单实例
- main 主函数执行完毕后,是否可能会再执行一段代码,给出说明?
- 控制台界面控制(九):读取键盘操作
- Oracle 11g 新特性简介
- 输入两个正整数m和n,求其最大公约数和最小公倍数 C/C++
- 一个合格的程序员应该读过哪些书
- 指针参数问题
- android中多个activity之间不能实现Intent通信