您的当前位置:首页单片机学习笔记

单片机学习笔记

2024-01-09 来源:乌哈旅游
MC51单片机学习笔记

一准备知识:

1.内部结构:4K Rom 程序存储器(硬件) 128节Ram随机存储器(软件)

8位cpu,4个8位并口,1个全双串行口,2个16位定时器/计数器;

寻址范围64k 布尔处理器

CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;

RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;

ROM:用以存放程序、一些原始数据和表格;

I/O口:四个8位并行I/O口,既可用作输入,也可用作输出; T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式

五个中断源的中断控制系统;

一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;

片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率取决于单片机型号及性能。

2.分类:arm(快)凌阳(处理声音较好)

3.型号说明:STC (公司名) 89(系列) C(CMOS;CAD:自带AD转换;S:串行下载 无需专门的编程器;lv:工作电压为3v) 51(1*4=4K) RC 40(晶振最高频率)

C(商业级:温度0--85,I工业级温度-40--125) ----PDIP (双列直插式)0721(07年 第21周)......... 4.电平:TTL:高:+5v--低0v;

RS232:计算机串口:+12v--低-12v,故计算机和单片机通信需要电平转换芯片

5.二进制与十六进制之间的转换:每4位转变一次 6.二进制转换逻辑符号:&与,//或,---非,异或 7. P3第二功能各引脚功能定义: P3.0:RXD串行口输入

P3.1:TXD串行口输出 P3.2:INT0外部中断0输入 P3.3:INT1外部中断1输入 P3.4:T0定时器0外部输入 P3.5:T1定时器1外部输入 P3.6:WR外部写控制(计数) P3.7:RD外部读控制

RST :复位管脚,高电平有效,时间大于两个机器周期 VPD:备用电源

注:机器周期和指令周期

(1) 振荡周期: 也称时钟周期, 是指为单片机提供时钟脉

冲信号的振荡源的周期,TX实验板上为11.0592MHZ。 

(2) 状态周期: 每个状态周期为时钟周期的 2 倍, 是振荡周期经二分频后得到的。 

(3) 机器周期: 一个机器周期包含 6 个状态周期S1~S6, 也就是 12 个时钟周期。 在一个机器周期内, CPU可以完成一个独立的操作。 

(4) 指令周期: 它是指CPU完成一条操作所需的全部时间。 每条指令执行时间都是有一个或几个机器周期组成。MCS - 51 系统中, 有单周期指令、双周期指令和四周期指令。

8.int(16):-32768------32767; float(32):3.4e-38-----3.4e38; double(64):1.7e-308-----1.7e308; uint(16)0----65536 9.C-51的运算符

与C语言基本相同:

+ - * / (加 减 乘 除)

> >= < <= (大于 大于等于 小于 小于等于) == != (测试等于 测试不等于) && || ! (逻辑与 逻辑或 逻辑非 )

>> << (位右移 位左移)(最高位为0,最低位移出)

& | (按位与 按位或)

^ ~ (按位异或 按位取反) 10.编程与C语言的不同: 1 中断服务程序;

函数名()interrupt n using m

{

函数内部实现 ….

}

2 I/O口定义: sbit beep=P2^3;

3 C-51的数据类型扩充定义: sfr:特殊功能寄存器声明

sfr16:sfr的16位数据声明 sbit:特殊功能位声明 bit:位变量声明

例:sfr SCON = 0X98; sfr16 T2 = 0xCC; sbit OV = PSW^2;

11.锁存器介绍:

把信号暂存以维持某种电平状态 FUNCTION TABLE

INPUTS OUTPUT OE LE D Q

L H H H L H L L L L X Q0

H X X Z(不工作)

在数码管中应用:一个端口控制两个锁存端控制八个数码管(

10K

内部电流较小)

原理:先使位选选好,L锁存,在段,L锁存,再控制位.. 12.硬件知识;

A.复位电路B.蜂鸣器,继电器

二点亮第一个发光二极管:

1.点亮电流:3~10mA,u(总)=5v,u(灯)=1.7v, R=3.3/3mA=1K欧

2.操作方式1.位操作:sbit D1=p1^0;

2.总线操作:p1=oxfe;

3._crol_(变量名,移动的位数); 4.源程序:

#include

#include #define uchar unsigned char #define uint unsigned int uchar temp;

void delay(uint z); void main() {

temp=0x01; P1= temp; while(1) {

delay(10000); } }

void delay(uint z) {

uint x; uchar y;

for(x=0;x<=z;x++) {

for(y=0;y<=20;y++) ; temp=_crol_(temp,1); P1=temp;

}

5.调试:

}

A. D REST 全速执行(Run) {}(箭头内部每步执行,

箭头外跳跃执行)

B . P eripherals(硬件)(I/O口。。。)

View--->Watch&Call--->观察某个变量(可以改变进制查看) C . 设置断点,全速执行,取消双击

三数码管静态显示和动态扫描 1.编码表:

uchar table_we[]={0x08,0x04,0x02,0x01};

uchar table_du[]={0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8, 0x80,0x90,0xff };//0~9,\"空\

code code

2.思想及原理:

先确定有多少位,比如想显示999个数,其中2显示为002,则在显示函数中搞一个3位循环,段先打开段,段位2,再关闭段,让段不显示以清楚痕迹,再打开位,让位为1,再关闭位,

最后延时一段时间,再选第二位控制第二为的段0,再选第三位控制第三位段0,至于如何让显示数自加,位,和段应该选什么,则通过:设一个num,首先它等于0,然后算他的个位为0,十位为0,百位为0,将得到的信息传给显示函数,再延时,延时后自加,加到999后num为0,继续循环。

四中断: 一、中断的概念

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);

CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);

待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。

主程序A断点

返回

中断服务程序B

RETI

二、80C51中断系统的结构

80C51的中断系统有5个中断源(8052有 6个) ,2个优先级,可实现二级中断嵌套 。

……

响应

TCONIT0101 IE0EX01IEEA1IPPX0101硬件查询自然优先级中断源高级INT0T0 INT1 ET01TF0PT010中断入口IT11 0 1EX11IE1PX110自然优先级中断源 T1 RXTX ET11TF1PT1100低级RITIES1≥1PS10中断入口SCON

TCON介绍:(控制寄存器)

TCON介绍:(控制寄存器)

IT0(TCON.0),外部中断0触发方式控制位。 (中段时控制eg:IT=1;或者TCON=OX01选择外部中断触发方式;) 当IT0=0时,为电平触发方式。

当IT0=1时,为边沿触发方式(下降沿有效)。 IE0(TCON.1),外部中断0中断请求标志位。 IT1(TCON.2),外部中断1触发方式控制位。 IE1(TCON.3),外部中断1中断请求标志位。

(定时器/计数器的开关TR0/TR1=1) TR1(TCON.4), 定时/计数器开关

TF0(TCON.5),定时/计数器T0溢出中断请求标志位。 T R1(TCON.6), 定时/计数器开关

TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。

TF1(TCON.7),定时/计数器T1溢出中断请求标志位。

TMOD介绍:(工作方式寄存器)

工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:

GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。

C/T :定时/计数模式选择位。 C/T =0为定时模式; =1C/T为计数模式。

M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。

SCON(串行口控制寄存器)

RI(SCON.0),串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。 TI(SCON.1),串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。

中断允许寄存器IE

(外部中断开关) EX0(IE.0),外部中断0允许位;

ET0(IE.1),定时/计数器T0中断允许位; EX1(IE.2),外部中断1允许位; ET1(IE.3),定时/计数器T1中断允许位; ES(IE.4),串行口中断允许位;

(中段时的总开关) EA (IE.7), CPU中断允许(总允许)位

中断优先级寄存器IP/PH

PX0(IP.0),外部中断0优先级设定位; PT0(IP.1),定时/计数器T0优先级设定位;

PX1(IP.2),外部中断0优先级设定位; PT1(IP.3),定时/计数器T1优先级设定位; PS (IP.4),串行口优先级设定位;

PT2 (IP.5) ,定时/计数器T2优先级设定位。

PX0(IPH.0),外部中断0优先级设定位; PT0(IPH.1),定时/计数器T0优先级设定位; PX1(IPH.2),外部中断1优先级设定位; PT1(IPH.3),定时/计数器T1优先级设定位; PS (IPH.4),串行口优先级设定位;

PT2 (IPH.5) ,定时/计数器T2优先级设定位。

同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:

设置52单片机的4个中断源,使他们的优顺序为T1,INT1,INT0,T0.

IPH = 0X08; PT1 = 1; IP = 0X40; PX1 = 1;

80C51单片机的中断优先级有三条原则:

CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。正在进行的低优先级中断服务,能被高优先级中断请求所中断。 为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。

中断响应条件:

1.中断源有中断请求; 2.此中断源的中断允许位为1;

3. CPU开中断(即EA=1)。

以上三条同时满足时,CPU才有可能响应中断。

计时/计数器

1.工作方式: GATETF1TR1TF0TR0C/TC/TM1M0M1M0TH1TL1TH0TL0T1引脚T0引脚机器周期脉冲内部总线GATETCONTMOD外部中断相关位T1方式T0方式

2.定时/计数器的工作原理:

加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。

可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

3.方式举例:

方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。

申请中断 申请 中断TCONTF1TR1TF0TR0溢出TH08位T0引脚溢出1TL08位&≥1机器周期TMOD11M0M1C/T0机器周期GATEM01M1C/TGATED7D0

D0INT0引脚

4.初始化程序应完成如下工作:

1.对TMOD赋值,以确定T0和T1的工作方式。 2.计算初值,并将其写入TH0、TL0或TH1、TL1。 3.中断方式时,则对IE赋值,开放中断。

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

计时/计数器举例:

#include

#define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit d1=P1^0;

uchar num,num1;tt; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay(uint z); void main() { num=0; tt=0; TMOD=0x11;//设置定时器0为工作方式1 TH0=(65536-10000)/256; TL0=(65536-10000)%256; TH1=(65536-20000)/256; TL1=(65536-20000)%256; // EA=1;//开总中断 ET0=1;//开定时器0中断 ET1=1; TR0=1;//启动定时器0 TR1=1; wela=1;//11101010 P0=0xea; wela=0;

dula=1; P0=0x3f; dula=0; while(1) { if(num1==25) { num1=0; P1=~P1; } if(tt==100) { tt=0; num++; if(num==16) num=0; dula=1; P0=table[num]; dula=0; } } }

void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

void time0() interrupt 1 { TH0=(65536-10000)/256; TL0=(65536-10000)%256; tt++; }

void time1() interrupt 3 { TH1=(65536-20000)/256; TL1=(65536-20000)%256; num1++; }

中断举例:

#include

#define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit d1=P1^0; uchar num;

uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay(uint z); void main() { EA=1;//开总中断 EX0=1;//开外部中断0 //IT0=1; TCON=0x01; wela=1;//11101010 P0=0xea; wela=0; while(1) { for(num=0;num<16;num++) { d1=1; dula=1; P0=table[num]; dula=0; delay(1000); } } }

void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

void exter0() interrupt 0 { d1=0; }

因篇幅问题不能全部显示,请点此查看更多更全内容