STC 12C5A60S2芯片的实验板报告.docx
《STC 12C5A60S2芯片的实验板报告.docx》由会员分享,可在线阅读,更多相关《STC 12C5A60S2芯片的实验板报告.docx(28页珍藏版)》请在冰豆网上搜索。
STC12C5A60S2芯片的实验板报告
第一章单片机概述
1.1主要芯片介绍
1.1.1MAX232芯片
MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源平转换芯片,使用+5V单电源供电。
特点:
符合所有的RS-232C技术标准;只需要单一的+5V电源供电;片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压;功耗低、典型供电电流5mA;内部集成2个RS-232C驱动器;内部集成两个RS-232C接收器。
引脚介绍:
第一部分是电荷泵电路。
由1、2、3、4、5、6脚和4只电容构成。
功能是产生+12V和-12V两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、9、10、11、12、13、14脚构成两个数据通道。
其中14脚(T1OUT)、13脚(RIN)、12脚(R1OUT)、11脚(T1IN)为第一数据通道。
7脚(T2OUT)、8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、为第二数据通道。
TTL/COMS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从T1IN、T2IN输入转换成TTL/COMS数据后从R1OUT、R2OUT输出。
第三部分是供电。
15引脚GND、16引脚VCC(+5V)。
图1-1MAX232芯片
1.1.2LCD1602液晶显示
液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在各类仪表和低功耗系统中得到广泛的应用。
能显示16行2列,32个字符。
引脚介绍如下:
1引脚:
VSS接地
2引脚:
VDD接+5V电源
3引脚:
V0为液晶显示器对比度调节,接正电源时对比度最低,接地电源对比度最高,对比度过高会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
4引脚:
RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。
5引脚:
RW为读写信号线,高点评时进行读操作,低电平时进行写操作。
6引脚:
E端为使能端,当E端由高电平跳到低电平,液晶模块执行命令。
7-14引脚:
D0-D78位双向数据线
15、16引脚:
悬空引脚
图1-21602引脚
1.1.312C5A60S2
STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统的8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2位PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。
1、增强型8051CPU,1T(1024G),单时钟/机器周期
2、工作电压 5.5-3.5V
3、1280字节RAM
4、通用I/O口,复位后为:
准双向口/弱上拉
可设置成四种模式:
准双向口/弱上拉,强推挽/强上拉,仅为输入/高阻,开漏
每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA
5、有EEPROM功能
6、看门狗
7、内部集成MAX810专用复位电路
8、外部掉电检测电路
9、时钟源:
外部高精度晶体/时钟,内部R/C振荡器
10、4个16位定时器
两个与传统8051兼容的定时器/计数器,16位定时器T0和T1
11、3个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟,独立波特率发生器可以在P1.0口输出时钟
12、外部中断I/O口7路,传统的下降沿中断或电平触发中断,并新增支持上升沿中断的PCA模块,Power Down模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0,CCP0/P1.3,CCP0/P1.3
13、PWM2路
14、A/D转换,10位精度ADC,共8路,转换速度可达250K/S
15、通用全双工异步串行口(UART)
16、双串口,RxD2/P1.2,TxD2/P1.3
17、工作范围:
-40~85
18、封装:
LQFP-48,LQFP-44,PDIP-40,PLCC
管脚说明:
P0.0~P0.7 P0:
P0口既可以作为输入/输出口,也可以作为地址/数据复用总线使用。
当P0口作为输入/输出口时,P0是一个8位准双向口,内部有弱上拉电阻,无需外接上拉电阻。
当P0作为地址/数据复用总线使用时,是低8位地址线A0~A7,数据线D0~D7 。
P1.0/ADC0/CLKOUT2
标准IO口、ADC输入通道0、独立波特率发生器的时钟输出 。
P1.1/ADC1。
P1.2/ADC2/ECI/RxD2
标准IO口、ADC输入通道2、PCA计数器的外部脉冲输入脚,第二串口数据接收端。
P1.3/ADC3/CCP0/TxD2
外部信号捕获,高速脉冲输出及脉宽调制输出、第二串口数据发送端。
P1.4/ADC4/CCP1/SS非
SPI同步串行接口的从机选择信号。
P1.5/ADC5/MOSI
SPI同步串行接口的主出从入(主器件的输入和从器件的输出) 。
P1.6/ADC7/SCLK
SPI同步串行接口的主入从出。
P2.0~P2.7
P2口内部有上拉电阻,既可作为输入输出口(8位准双向口),也可作为高8位地址总线使用。
P3.0/RxD
标准IO口、串口1数据接收端。
P3.1/INT0非
外部中断0,下降沿中断或低电平中断。
P3.3/INT1。
P3.4/T0/INT非/CLKOUT0
定时器计数器0外部输入、定时器0下降沿中断、定时计数器0的时钟输出 。
A/D转换器的结构:
STC12C5A60AD/S2系列带A/D转换的单片机的A/D转换口在P1口,有8路10位高速A/D转换器,速度可达到250KHz(25万次/秒)。
8路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、频谱检测等。
上电复位后P1口为弱上拉型IO口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不须作为A/D使用的口可继续作为IO口使用。
单片机ADC由多路开关、比较器、逐次比较寄存器、10位DAC、转换结果寄存器以及ADC_CONTER构成。
该单片机的ADC是逐次比较型ADC。
主次比较型ADC由一个比较器和D/A转换器构成,通过逐次比较逻辑,从最高位(MSB)开始,顺序地对每一输入电压与内置D/A转换器输出进行比较,经过多次比较,使转换所得的数字量逐次逼近输入模拟量对应值。
逐次比较型A/D转换器具有速度高,功耗低等优点。
需作为AD使用的口先将P1ASF特殊功能寄存器中的相应位置为‘1’,将相应的口设置为模拟功能
芯片引脚图:
图1-312C5A60S2芯片引脚
第二章实验板介绍
2.1实验板介绍
SCKJ-I型实验板包括:
单片机、ISP程序下载器、数码管动态显示电路、8位LED指示灯、液晶显示模块1602和12864、时钟芯片DS12C887、温度传感器DS18B20、74HC573输出口扩展、A/D转换、按键、遥控接收、继电器输出、蜂鸣器报警等电路,可进行相关电路和程序运行。
同时,单片机、74HC573输出口扩展等接有外部插针,也可用于其它相关外围设别的调试。
实验板实物图如下:
图2-1实验板实物图
整体电路:
图2-2整体电路图
2.2实验板地址分配及跳线说明
地址分配:
时钟芯片DS12C887地址:
0000H——1FFFH
74HC573扩展I/O口地址:
6000H——7FFFH
液晶显示模块LCD地址:
0C000H——0DFFFH
跳线说明:
J1、J2:
单片机引脚
J4、J5、J6:
用于DS18B20的硬件连接
J7、J15:
数码管的位选和段选输入
J8:
蜂鸣器、继电器的控制输入
J9、J10:
继电器的控制输出
J11:
按键的行列引脚
J12:
扩展至J11附近的P1口引脚
J13:
8位LED灯的控制输入
J14:
I/O扩展74HC573的输出,与J13或者J15可用跳线连接
J16、J17:
电位器引出端
J18:
STC单片机下载输入端,可用跳线器与电路板上的下载器输出端Ju1连接
J19:
可用跳线器将遥控输出、DS12C887中的中断信号连接到单片机的INT1、INT0
J21:
地线引出端
J22:
+5V引出端
第三章调试
3.1LED灯从低八位到高八位一次亮
3.1.1调试程序
#include
#defineucharunsignedchar
#defineuintunsignedint
voidDelay(uintdel)
{
uinti,j;
for(i=0;ifor(j=0;j<1827;j++);
}
voidMain(void)
{
while
(1)
{
P1=0xfe;
Delay(100);
P1=0xfd;
Delay(100);
P1=0xfb;
Delay(100);
P1=0xf7;
Delay(100);
P1=0xef;
Delay(100);
P1=0xdf;
Delay(100);
P1=0xbf;
Delay(100);
P1=0x7f;
Delay(100);
}
}
3.2A/D电路
3.2.1程序
voidDelay(WORDn)
{
WORDy;
while(n--)
{
y=500;
while(y--);
}
}
/************************************************************************
Functionname:
write_cmd
Descriptions:
向lcd输入指令
************************************************************************/
voidwrite_cmd(BYTEcmd)
{
P20=0;//写指令模式
P21=0;
P27=1;
P37=0;
P36=0;
P0=cmd;
P27=0;
P37=0;
P36=0;
Delay(10);
}
/**********************************************************************
Functionname:
write_data
Descriptions:
写入数据
**********************************************************************/
voidwrite_data(BYTEdat)
{
P20=1;//写数据模式
P21=0;
P27=1;
P37=0;
P36=0;
P0=dat;
P27=0;
P37=0;
P36=0;
Delay(10);
}
/***********************************************************************
Functionname:
write_string
Descriptions:
写入字符串
***********************************************************************/
/*voidwrite_string(BYTE*s)
{
while(*s!
='\0')//'\0'为字符串结束标志
{
write_data(*s);
s++;
}
}
*/
/**********************************************************************
Functionname:
set_display_place
Descriptions:
设置字符的显示位置
**********************************************************************/
voidset_display_place(BYTEline,column)
{
BYTEaddress;
if(line==1)
{
address=0x80+column;
}
elseif(line==2)
{
address=0xc0+column;
}
write_cmd(address);
}
/*******************************************************************
Functionname:
将字符串写到指定的位置
Descriptions:
将字符串显示在lcd的特定位置
*******************************************************************/
/*voidwrite_string_lcd(BYTEline,column,unsignedchar*string)
{
set_display_place(line,column);
write_string(string);
Delay
(1);
}
*/
voidwrite_data_lcd(BYTEline,column,dat)
{
set_display_place(line,column);
write_data(dat);
Delay
(1);
}
/******************************************************************
Functionname:
将字符写到指定的位置
Descriptions:
将字符串显示在lcd的特定位置
*******************************************************************/
/***************************************************
************液晶模块初始化******************************
****************************************************/
voidlcd_init(void)
{
write_cmd(0x06);//
write_cmd(0x38);//
//write_cmd(0x38);//
write_cmd(0x0c);//
write_cmd(0x01);//
}
/*****************LED显示位置********************/
voiddisplay(uintz)
{
uchari;
disbuf[8]=z/10000+0x30;
disbuf[10]=z%10000/1000+0x30;
disbuf[11]=z%1000/100+0x30;
disbuf[12]=z%100/10+0x30;
disbuf[13]=z%10+0x30;
for(i=0;i<14;i++)
write_data_lcd(1,1+i,disbuf[i]);
}
/*voidread_ad(void)
{
uintad_data[8];
uintx,a,b;
uchari;
uintres,res1;
ucharstatus=0;
ADC_CONTR=0x80;
Delay
(1);
for(i=0;i<8;i++)
{
ADC_CONTR=(0x80|i);
ADC_CONTR|=0x80;
status=0;
while(!
(ADC_CONTR&0x10));
ADC_CONTR&=0xE7;
res=ADC_RES;
res1=ADC_RESL;
ad_data[i]=res*256+res1;
}
for(i=0;i<8;i++)
{
x=ad_data[i];
a=x/10+0x30;
b=x%10+0x30;
write_data_lcd(2,1,a);
write_data_lcd(2,2,b);
}
}
*/
//------------------------------------------------------------------------------
uintAD_get(ucharchannel)
{
ADC_CONTR=0x88|channel;//开启AD转换10001000即POWERSPEED1SPEED0ADC_FLAGADC_STARTCHS2CHS1CHS0
_nop_();_nop_();_nop_();_nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR寄存器
while(!
(ADC_CONTR&0x10));//等待转换完成
ADC_CONTR&=0xe7;//关闭AD转换,ADC_FLAG位由软件清0
return(ADC_RES*4+ADC_RESL);//返回AD转换完成的10位数据(16进制)
}
//------------------------------------------------------------------------------
floatAD_work(ucharchannel)
{
floatAD_val;//定义处理后的数值AD_val为浮点数
uchari;
for(i=0;i<100;i++)
AD_val+=AD_get(channel);//转换100次求平均值(提高精度)
AD_val/=100;
AD_val=(AD_val*5)/1024;//AD的参考电压是单片机上的5v,所以乘5即为实际电压值
AD_val=AD_val*10000;
returnAD_val;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
voidAD_init()
{
P1ASF=0x01;//P1.0作为模拟功能AD使用
ADC_RES=0;//清零转换结果寄存器高8位
ADC_RESL=0;//清零转换结果寄存器低2位
ADC_CONTR=0x80;//开启AD电源
Delay
(2);//等待1ms,让AD电源稳定
ES=1;
EA=1;
}
3.31602显示学号和姓名拼音
3.3.1调试程序
#include"reg51.h"
#include"absacc.h"
typedefunsignedcharBYTE;
typedefunsignedintWORD;
/*液晶1602口地址*/
#definewr_comXBYTE[0xC000]//写命令
#definewr_dataXBYTE[0xC100]//写数据
#definerd_comXBYTE[0xC200]//读命令
#definerd_dataXBYTE[0xC300]//读数据
voidlcd_init(void);//lcd初始化
voidwrite_cmd(BYTEcmd);//lcd写命令
//voidwrite_string(unsignedchar*s);//写字符串
voidwrite_data(BYTEdat);//写数据
voidset_display_place(BYTEline,column);
voidwrite_string_lcd(BYTEline,column,unsignedchar*string);
//voidwrite_data_lcd(BYTEline,column,dat);
//voidcrti(unsignedlongdat);
//voidcrt_r(floatx,BYTEN);
voidDelay(WORDn)
{
WORDx;
while(n--)
{
x=500;
while(x--);
}
}
/*
voidDelay2(WORDn)
{
WORDx;
while(n--)
{
x=5000;
while(x--);
}
}
*/
/************************************************************************
Functionname:
write_cmd
Descriptions:
向lcd输入指令
************************************************************************/
voidwrite_cmd(BYTEcmd)
{
BYTEdl;
do{
dl=rd_com;
}while((dl&0x80)!
=0);//判忙
wr_com=cmd;
Delay
(1);
}
/**********************************************************************
Functionname:
write_data
Descriptions:
写入数据
**********************************************************************/
voidwrite_data(BYTEdat)
{
BYTEdl;
do{
dl=rd_com;
}while((dl&0x80)!
=0);//判忙
wr_data=dat;
Delay
(1);