单片机应用论文模板.docx
- 文档编号:24839378
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:28
- 大小:503.44KB
单片机应用论文模板.docx
《单片机应用论文模板.docx》由会员分享,可在线阅读,更多相关《单片机应用论文模板.docx(28页珍藏版)》请在冰豆网上搜索。
单片机应用论文模板
单片机应用设计
摘要:
关键字:
一、单片机的应用:
AT89C52兼容MCS51指令系统,具有8k可反复擦写(大于1000次)FlashROM,32个双向I/O口,256x8bit内部RAM,3个16位可编程定时/计数器中断,时钟频率0-24MHz,2个串行中断,可编程UART串行通道,2个外部中断源,共8个中断源,2个读写中断口线,3级加密位,低功耗空闲和掉电模式,软件设置睡眠和唤醒功能,这次我们的单片机应用设计,把下位机与上位机通过串口连接起来,并把单片机处理的数据发送到PC机显示出来,还可以用LCD1602显示数字温度DS18B20芯片测得的温度和PCF8563时钟日历芯片的日期。
二、单片机的功能及引脚的介绍:
AT89C52是8位通用微处理器,采用工业标准PDIP封装,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
P0口
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX),参见表1。
Flash编程和程序校验期间,P1接收低8位地址。
P2口
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。
Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻
辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能。
P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
XTAL1
振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2
振荡器反相放大器的输出端。
单片机的硬件组成图:
三、各种模块芯片的介绍:
(1)LCD1602
LCD1602是市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,下面是LCD1602的引脚图:
LCD1602的11条指令:
LCD0602的流程图:
以下是LCD1602的部分程序:
/****************************************
**函数名:
sentbyte
**功能:
发送一节数
**子函数:
readbusy()
**变量:
数据或命令tybe=1数据0命令
----------------------------------------
****************************************/
voidsentbyte(unsignedchari,unsignedchartybe)
{
unsignedchartemp;
readbusy();
if(tybe==1)
{
RW_0();
RS_1();
}
if(tybe==0)
{
RW_0();
RS_0();
}
temp=i&0xf0;
DATA_PORT&=0x0f;
DATA_PORT|=temp;
E_1();
E_0();
temp=(i<<4)&0xf0;
DATA_PORT&=0X0f;
DATA_PORT|=temp;
E_1();
E_0();
}
/****************************************
**函数名:
Init_1602()
**功能:
初始化1602液晶显示
****************************************/
voidInit_1602(void)
{
sentbyte(0x30,0);
sentbyte(0x30,0);
sentbyte(0x30,0);
sentbyte(0x02,0);
sentbyte(0x28,0);//设置工作方式:
4位总线字符两行0x28,8位总线字符两行0x38
sentbyte(0x01,0);//清屏
sentbyte(0x02,0);//数据指针清零
sentbyte(0x0c,0);//开光标,但光标不闪
sentbyte(0x06,0);//写字符后光标加一
sentbyte(0x01,0);//清屏
}
/****************************************
**函数名:
Locate_xy()
**功能:
定位写位置
**变量:
x,y
****************************************/
voidLocate_xy(unsignedcharx,unsignedchary)
{
unsignedcharaddr=0;
if(y==0)addr=0x80+x;
if(y==1)addr=0xc0+x;
sentbyte(addr,0);
}
/****************************************
**函数名:
Displaychar()
**功能:
1602液晶显示一个字符
**变量:
x,y,wdata
----------------------------------------
****************************************/
voidDisplaychar(unsignedcharx,unsignedchary,unsignedcharwdata)
{
Locate_xy(x,y);
sentbyte(wdata,1);
}
/****************************************
**函数名:
Displaypstr()
**功能:
1602液晶显示一个字符串
**变量:
x,y,*str
----------------------------------------
****************************************/
voidDisplaypstr(unsignedcharx,unsignedchary,unsignedchar*str)
{
unsignedinti=0;
Locate_xy(x,y);
while(str[i]!
='\0')
{
sentbyte(str[i++],1);
x++;
if(x>15)
{
x=0;
y++;
if(y==2)y=0;
Locate_xy(x,y);
}
}
}
(2)PCF8563
PCF8563有16个位寄存器,一个可自动增量的地址寄存器,一个内置32.768KHz的振荡器,带有一个内部集成的电容,一个分频器用于给实时时钟RTC提供源时钟,一个可编程时钟输出一个定时器,一个报警器,一个掉电检测器和一个400KHzI2C总线接口。
所有16个寄存器设计成可寻址的8位并行寄存器,但不是所有位都用前两个寄存器内存地址00H,01H。
用于控制寄存器和状态寄存器内存地址02H08H用于时钟计数器秒~年计数器地址09H0CH用于报警寄存器定义报警条件地址0DH控制CLKOUT管脚的输出频率地址0EH和0FH分别用于定时器控制寄存器和定时器寄存器秒分钟小时日月年分钟报警小时报警日报警寄存器编码格式为BCD,星期报警寄存器不以BCD格式编码。
以下是芯片管脚和描述:
PCF8563的流程图:
以下是PCF8563的部分程序:
//=======写一个字节=====
unsignedcharwritebyte_8563(unsignedchardat)
{
unsignedinti;
unsignedcharack=1;
scl_8563=0;
for(i=8;i>0;i--)
{
if(dat&0x80){sda_8563=1;}
else{sda_8563=0;}
delay_8563
(1);
scl_8563=1;
delay_8563
(2);
scl_8563=0;
delay_8563
(1);
dat<<=1;
}
sda_8563=1;
scl_8563=1;
while(sda_8563){i++;if(i==50000)break;}
ack=sda_8563;
scl_8563=0;
return(ack);//有应答则返回0,无的返回1
}
//======读一个字节=======
unsignedcharreadbyte_8563(void)
{
unsignedchari=8;
unsignedchardat=0x00;
scl_8563=0;
sda_8563=1;
for(;i>0;i--)
{
scl_8563=1;
dat=dat<<1;
if(sda_8563)dat|=0x01;
scl_8563=0;
delay_8563
(2);
}
sda_8563=1;
scl_8563=1;
scl_8563=0;
return(dat);
}
//=====初始化pcf8563=======
voidInit_pcf8563(void)
{
unsignedchari,j;
for(i=8;i<8;i--)
{
if(i==4)j=(time[i])&0x07;
elsej=(((time[i]/10)<<4)&0xf0)|((time[i]%10)&0x0f);
start();
writebyte_8563(0xa2);//选择写8563芯片
writebyte_8563(i+0x02);//写地址
writebyte_8563(j);//写数据
stop();
delay_8563
(2);
}
}
//=========读日期==========
voidread_time_8563(void)
{
unsignedchari;
for(i=0;i<7;i++)
{
start();
writebyte_8563(0xa2);//选择写8563芯片
writebyte_8563(i+0x02);//写地址
start();
writebyte_8563(0xa3);//选择读8563芯片
switch(i)
{
case0:
sec=(readbyte_8563())&0x7f;break;
case1:
min=(readbyte_8563())&0x7f;break;
case2:
hou=(readbyte_8563())&0x3f;break;
case3:
day=(readbyte_8563())&0x3f;break;
case4:
week=(readbyte_8563())&0x07;break;
case5:
mon=(readbyte_8563())&0x1f;break;
case6:
year=(readbyte_8563())&0xff;break;
default:
break;
}
stop();
}
sec=((sec&0xf0)>>4&0x0f)*10+(sec&0x0f);//BCD码转换成10进制数
min=((min&0xf0)>>4&0x0f)*10+(min&0x0f);//BCD码转换成10进制数
hou=((hou&0xf0)>>4&0x0f)*10+(hou&0x0f);//BCD码转换成10进制数
day=((day&0xf0)>>4&0x0f)*10+(day&0x0f);//BCD码转换成10进制数
mon=((mon&0xf0)>>4&0x0f)*10+(mon&0x0f);//BCD码转换成10进制数
year=((year&0xf0)>>4&0x0f)*10+(year&0x0f);//BCD码转换成10进制数
}
//=========写日期============
voidwrite_time_8563(void)
{
start();//写年份
writebyte_8563(0xa2);
writebyte_8563(0x08);
writebyte_8563(year);
stop();
delay_8563
(2);
start();//写月份
writebyte_8563(0xa2);
writebyte_8563(0x07);
writebyte_8563(mon);
stop();
start();//写日
writebyte_8563(0xa2);
writebyte_8563(0x05);
writebyte_8563(day);
stop();
delay_8563
(2);
start();//写时
writebyte_8563(0xa2);
writebyte_8563(0x04);
writebyte_8563(hou);
stop();
delay_8563
(2);
start();//写分
writebyte_8563(0xa2);
writebyte_8563(0x03);
writebyte_8563(min);
stop();
delay_8563
(2);
start();//写秒
writebyte_8563(0xa2);
writebyte_8563(0x02);
writebyte_8563(sec);
stop();
delay_8563
(2);
start();//写星期
writebyte_8563(0xa2);
writebyte_8563(0x06);
writebyte_8563(week);
stop();
delay_8563
(2);
}
(3)DS18B20
DS18B20单总线数字式智能型传感器直接将温度物理量转化为数字信号并以总线方法传送到计算机进行数据处理。
DS18B20数字式智能型温度传感器对于实测的温度提供了9~12位的数据和报警温度寄存器它的测温范围为-55℃~+125℃,其中在-10℃~+85℃的范围内的测量精度为±0.5℃。
此传感器可适用于各种领域、各种环境的自动化测量及控制系统。
它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点。
DS18B20内部结构主要由4部分组成:
“位RoM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
每一个DS18B20,包括一个唯一的“位长的序号该序号值存放在DS18B⒛内部的RoM(只读存储器)中。
寄存器操作时序图:
读写操作时序图:
以下是温度检测的流程图:
以下是DS18B20的部分程序:
/********************************************************************
*名称:
ucharread_one_char(void)
*功能:
从DS18B20中读出一个字节数据
*返回值:
dat:
读出一个自己的数据,包括温度等其他数据
********************************************************************/
ucharread_one_char(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;//先进行移位操作,以免最后一位不能读出
DQ=1;//给脉冲信号
if(DQ)
{
dat|=0x80;
}
nop(4);
}
returndat;
}
/********************************************************************
*名称:
voidwrite_one_char(unsignedchardat)
*//功能:
从DS18B20中读出一个字节数据
*功能:
一个字节数据从单片机中写到DS18B20中去
*输入:
dat:
ROM操作指令或存储器操作指令
*******************************************************************/
voidwrite_one_char(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
nop(5);
DQ=1;
dat>>=1;
}
}
/********************************************************************
*名称:
intread_temperature(void)
*功能:
初始化及修改18b20中时间数据
********************************************************************/
intread_temperature(void)
{
unsignedchara=0;
unsignedcharb=0;
intt=0;
init_DS18B20();//初始化
write_one_char(0xCC);//跳过读序号列号的操作
write_one_char(0x44);//启动温度转换
init_DS18B20();
write_one_char(0xCC);//跳过读序号列号的操作
write_one_char(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=read_one_char();
b=read_one_char();
t=b;
t<<=8;
t|=a;
//t>>=4;
//t=t*0.0625*1000;
returnt;
}
(3)串口通信:
#include"uart.c"
/********************************************************************
**函数名:
uart_send()
**功能:
串口送数
********************************************************************/
voiduart_send(unsignedchartemp)
{
//unsignedchartemp;
ES=0;//先关闭串口中断
SBUF=0xFF;/*发送温度命令,供上位机识别用*/
while(TI==0);/*等待发送完*/
TI=0;/*清除TI标志*/
SBUF=(unsignedchar)(temp/10000);
while(TI==0);/*等待发送完*/
TI=0;/*清除TI标志*/
SBUF=(unsignedchar)(temp%10000/100);
while(TI==0);/*等待发送完*/
TI=0;/*清除TI标志*/
/****************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 应用 论文 模板
![提示](https://static.bdocx.com/images/bang_tan.gif)