C51单片机总结

自己作为大学生作为小白的学习总结,想有个写学习总结类博客的习惯.若有侵权请私信联系

单片机总览

在这里插入图片描述

<1> 四组8位并行I/O端口:

P0端口:PC门,集电极开路输出,必须接上拉电阻才能输出高电平。
P1端口:无特殊之处。
P2端口:访问外部存储器时,作高8位地址用。
P3端口:功能复用端口,详情看表。

<2> 三大外设:外部中断、定时/计数、串行通信

(1)外部中断

外部中断初始化程序应完成如下工作:

1.对TCON赋值,以确定触发方式(电平or边沿)。
2.中断方式时,则对EA赋值,开放外部中断。(IE中打开总线EA和外部中断EX0 )
3.等待外部中断信号

/*************外部中断初始化***************/
void Init_Into()
{
	IT0 = 1;            //触发方式
	EX0 = 1;			//使能外部中断0
	EA = 1;				//使能总中断
}

/*************外部中断0中断服务函数********************/
void ServiceInto0() interrupt 0
{
	/*************中断后去干啥******************/
}

在51单片机中有INT0(P3.2)和INT1(P3.3)两个中断模块,外部的触发信号可以是电平,也可以是边沿,由寄存器TCONIT0IT1位来决定。
在这里插入图片描述

(2)定时/计数

在51单片机中有T0和T1两个定时器,对内部可以定时,对外部可以计数。在初始化的时候,需要确定该模块是定时功能还是技术功能,工作模式是什么,最大计数值是多少。

定时初始化程序应完成如下工作:

1.对TMOD赋值,以确定T0T1的工作方式。
2.计算初值,并将其写入TH0TL0TH1TL1。(TMOD & TCON)位于T0 T1
3.中断方式时,则对EA赋值,开放定时器中断。(IE)
4.使TR0TR1置位,启动定时/计数器定时或计数(TCON)

/*************定时器0初始化***************/
void Init_Timer0()
{
	TMOD = 0x01;            				//定时器0定时功能,16位模式
	TH0 = (65536 - 50000) / 256;			//最大计数值的高八位
	TL0 = (65536 - 50000) % 256;			//最大计数值的低八位
	ET0 = 1;								//使能定时器0中断
	EA = 1;									//使能总中断
	TR0 = 1;								//启动定时器0
}

/*************定时器0中服务断函数********************/
void ServiceInto0() interrupt 0
{
	/*************中断后去干啥******************/
}

(3)串行通信

在51单片机的串行接口中,产生波特率需要占用定时器T1,发送数据时,将内容放到SBUF中,数据发送完毕,TI会置1。当完整接收到一个数据后,RI会置1,这时从SBUF中将内容读出即可。不管是TI还是RI标志位,都需要人工清0。

串行口初始化程序应完成如下工作:

1.对TMOD赋值,.确定T1的工作方式;
2.计算T1的初值,装载TH1、TL1;(TMOD & TCON)
3.使TCON中的TR1置位,启动T1
4.对SCON赋值,确定串行口控制;
5.串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。


如需要用到波特率翻倍要使PCON = 0x80,即第八位为1.

/*************定时器0初始化***************/
void Init_Uart()
{
	TMOD = 0x20;            				//定时器0定时功能,16位模式
	TH1 = 0xfd;								//设置波特率为9600
	TL1 = 0xfd;								//11.0592或12M的12分频
	TR1 = 1;								//启动定时器1
	SCON = 0x50;							//串口参数模式1和允许接收
	ES = 1;									//使能串口中断
	EA = 1;									//使能总中断
}

/*************串行接口中服务断函数********************/
void SendByte(unsigned char dat)
{
	SBUF = dat;								//将数据放进SBUF缓存器
	while (TI == 0);						//等待发送数据完成
	TI =0;									//清除发送完成标志
}
/*************串行接口中服务断函数********************/
void ServiceUart() interrupt 4
{
	if(RI == 1)								//接收到一个完整的字节
	{
		RI = 0;								//清除接收完成的状态
		/*************便携中断服务函数逻辑代码********************/
    }
}

数据传输图示
在这里插入图片描述

补充

IE/IP寄存器

在这里插入图片描述

定时器计算初值

例如j晶振为12MHZ,机器周期为1/1M=1us
我们定时1ms
1ms/1us = 1000.
因为216=65536
65536 - 1000 = 64536 = FC18H

TH0 = 0xFC;
TL0  = 0x18;
自动重装载

在重装载时对TH0 TL0 赋值时,低八位溢出后装载高八位

PCON

在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。
在这里插入图片描述

<3> 五个中断源:2个外部中断、2个定时/计数中断、1个串行通信中断

注意:要记住中断号与中断源的对应关系…编程时会用到!
在这里插入图片描述

<4> 三大特殊功能寄存器:TCON、SCON、TMOD

(1)TCON寄存器

在这里插入图片描述

(2)SCON寄存器

在这里插入图片描述

(3)TMOD定时/计数寄存器

在这里插入图片描述

  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值