STC 12C5A60S2芯片的实验板报告.docx
《STC 12C5A60S2芯片的实验板报告.docx》由会员分享,可在线阅读,更多相关《STC 12C5A60S2芯片的实验板报告.docx(57页珍藏版)》请在冰豆网上搜索。
STC12C5A60S2芯片的实验板报告
第一章实习的目的及意义
1.1生产实习的目的
此次生产实习的目的是在理论学习的基础上,通过完成一个设计51单片机的多种资源应用并具有综合功能的最小系统目标板的设计与编程应用。
锻炼我们的动手动脑能力,进一步理解课本中所学的知识,巩固和深化对单片机的认识。
同时有助于我们对理论知识的理解,帮助我们学习专业知识为以后的学习打好基础。
实习要求我们了解单片机原理和各元器件的主要作用。
还要掌握焊接的技术。
独立编程序下到实验板中实现所需功能。
1.2生产实习的意义
通过对实习基地进行有针对性的参观、学习,提高学习对本专业真的了解和认识,增加学习兴趣和增强专业自豪感,为日后专业知识的学习打下良好的基础。
同时,实习对我们了解社会、接触生产实际、加强劳动观念、培养动手能力和理论与实践相结合的能力等方面亦具有重要的意义。
1.3生产实习的重要性
生产实习是电子信息工程专业教学计划的一个重要部分,是培养学生理论学习与实践相结合的重要实践性教学环节。
通过生产实习使学生了解实习单位的工作方式和工作流程;对以后大单片机课程设计,帝业设计做基础,了解一个开发板的开发制作的整个过程以及元器件的采购;对生产现场、生产过程中的电子信息设备、计算机设备的应用状况有较为深刻的认识,掌握常规电子信息设备的使用维护方法;在实践中进一步加强专业教育,了解本专业工程技术岗位和生产劳动岗位的工作情况和工作内容,培养团队精神和吃苦耐劳的精神;同时可以使学生学到企业的管理经验和工人师傅的艰苦创业精神,激励学生奋发向上的开拓精神。
第二章单片机的最小系统
2.1部分芯片介绍
2.1.1AT89S52
AT89S52是一种低功耗、高性能CMOS8位微控制器,
具有8K在系统可编程Flash存储器。
使用Atmel公司高
密度非易失性存储器技术制造,与工业80C51产品指令和
引脚完全兼容。
片上Flash允许程序存储器在系统可编程,
亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和
在系统可编程Flash,使得AT89S52在众多嵌入式控制应用
系统中得到广泛应用。
在单芯片上,拥有灵巧的8位CPU和在系统可编程
Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵
活、超有效的解决方案。
AT89S52具有以下标准功能:
8k
图2.1AT89S52芯片引脚图
字节Flash,256字节RAM,32位I/O口线,看门狗定时器
,2个数据指针,三个16位定时器/计数器
,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继
续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
AT89S52的主要特性是:
与MCS-51单片机产品兼容;8K字节在系统可编程Flash存储器;1000次擦写周期;全静态操作:
0Hz~33Hz;三级加密程序存储器;32个可编程I/O口线;三个16位定时器/计数器;八个中断源;全双工UART串行通道;低功耗空闲和掉电模式;掉电后中断可唤醒;看门狗定时器;双数据指针;掉电标识符。
部分引脚介绍:
P0、P1、P2、P3均可做双向I/O口,当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
P2口作为高8位地址线,也有第二功能。
P1.0T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)
P1.5MOSI(在系统编程用)
P1.6MISO(在系统编程用)
P1.7SCK(在系统编程用)
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2INTO(外中断0)
P3.3INT1(外中断1)
P3.4TO(定时/计数器0)
P3.5T1(定时/计数器1)
P3.6WR(外部数据存储器写选通)
P3.7RD(外部数据存储器读选通)
此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。
RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。
XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
2.1.2MAX232芯片
MAX232芯片是美信公司专门为电脑的RS-232标准串口设计
的单电源电平转换芯片,使用+5v单电源供电。
主要特点:
符合所有的RS-232C技术标准;只需要单一+5V
电源供电;片载电荷泵具有升压、电压极性反转能力,能够产生+10
V和-10V电压V+、V-;4、功耗低,典型供电电流5mA;内部集
成2个RS-232C驱动器;内部集成两个RS-232C接收器。
引脚介绍:
第一部分是电荷泵电路。
由1、2、3、4、5、6
图2.2MAX232引脚图
脚和4只电容构成。
功能是产生+12v和-12v两个电源,提供给
RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、
9、10、11、12、13、14脚构成两个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
第三部分是供电。
15脚GND、16脚VCC(+5v)。
2.1.3LCD1602液晶显示器
液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多
优点,在各类仪表和低功耗系统中得到广泛的应用。
工业字符型液晶,
图2.31602引脚图
能够同时显示16x2即32个字符(16列2行)。
引脚介绍:
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接
地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一
个10K的电位器调整对比度(建议接地,弄不好有的模块会不显示)。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15~16脚:
空脚(有的用来接背光)
第三章单片机电路板焊接
3.1单片机的焊接
图3-1
3.2焊接原件清单
表3-1原件清单
序号
名称
型号
数量
说明
1
电容
20p
2
C01C02
2
104
6
C1-C6
3
电解电容
100uf/16V
1
C7
4
4.7uf/16V
1
C9
5
1uf/16V
5
C10-C14
6
晶振
11.0592MHz
1
Y1
7
电位器
10k
3
3296VR1VR2VR3
8
电阻
10Ω
1
R13
9
200Ω
8
10
43
2
R7R8
11
1k
6
R2R3R9-R12
12
2k
1
R6
13
4.7k
1
R4
14
8.2k
1
R1
15
10k
1
R7
16
电阻排
430Ω
1
9p
17
10k
1
9p
18
发光二极管
白发红Φ
9
D1-D8
19
白发绿Φ
1
20
白发蓝Φ
1
21
二极管
IN4148
1
D9
22
三极管
8550
6
T1-T6
23
接插件
单排插针
2
间距2.54mm
24
双排插针
1
间距2.54mm
25
单排插座40p
1
间距2.54mm
26
USB母座
1
Mini90度弯针(5PF)
27
集成电路
4016
1
替换74CS14
28
74HC573
1
U6
29
74LS00
1
U7
30
STC12C5A60S2
1
DIP40封装U1
31
HS0038
1
红外接收XK1
32
DS12C887
1
U4时钟
33
MAX232
1
U5
34
温度传感器
DS18B20
1
DS1
35
数码管
MT03641B
1
U9
36
按键
4脚
16
6*6*6mm
37
自锁开关
自锁开关
1
7*7mm
38
蜂鸣器
5V
连续声
39
IC座
DIP8
1
40
DIP14
2
41
DIP16
1
序号
名称
型号
数量
说明
42
DIP20
1
43
DIP24
1
宽
44
DIP40
1
45
液晶模块
LCD1602
1
蓝背光
46
Jn12864J
1
蓝背光
下载器
47
集成电路
CH341A
1
SOL-28
48
电容
20p
2
贴片0805
49
104
2
贴片0805
50
10uF
1
贴片0805
51
电阻
0
1
贴片0805
52
50
2
贴片0805
53
1k
1
贴片0805
54
发光二极管
白发红
1
贴片0805
55
晶振
12MHz
1
56
自锁开关
自锁开关
1
7*7mm
3.3焊接注意事项
焊接操作注意事项有:
①保持烙铁头的清洁,因为焊接时烙铁头长期处于高温状态,其表面很容易氧化并沾上一层黑色杂质形成隔热层,使烙铁头失去加热作用。
②采用正确的加热方法,要靠增加接触面积加快传热,而不要用烙铁对焊件加力。
应该让烙铁头与焊件形成面接触而不是点接触。
③加热要靠焊锡桥,要提高烙铁头加热的效率,需要形成热量传递的焊锡桥。
④在焊锡凝固之前不要使焊件移动或振动用镊子夹住焊件时,一定要等焊锡凝固后再移去镊子。
⑤焊锡量要合适,过量的焊锡会增加焊接时间,降低工作速度。
⑥不要用过量的焊剂,适量的焊剂是非常有必要的。
过量的松香不仅造成焊后焊点周围脏不美观,而且当加热时间不足时,又容易夹杂到焊锡中形成“夹渣”缺陷。
在我自己的焊接当中,也出现了焊锡量不足和过多的状况,最后导致接入电源后无法正常使用的现象。
同时注意元件的焊接顺序也很重要,选择合适的焊接顺序,不仅便于焊接,而且不至于导致元件破损。
第四章c语言应用程序
4.1KeiluVision的使用
打开“KeiluVision”,点击“project”,在弹出的对话窗口中选择“newproject”新建工程,建立工程文件。
在弹出的窗口中选择“Atmel”中的“AT89S52”确定后即可添加8051源代码。
选中工程文件右键点“Optionfortarget”再点“Output”“CreateHEX”创建HEX文件;点“File”之后点击“NEW”即可在出现的文本框中输入程序,保存路径与工程文件相同,且用英文名,格式为“.c”。
再添加源文件到project。
程序输入完了要保存,编译查看有无错误,有就修改,如果没有,将PC机与单片机用ISP下载线连接起来,USB驱动文件中,选择isp编程下载软件中“progisp”运行程序,在文件夹下选“调入flash”,调入hex文件,之后点击“自动”即可运行程序查看现象。
串行通信的调试可利用串行通信助手软件,查看单片机是如何与PC机进行数据通信的。
4.2流水灯程序
#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);
}
}
4.3流水灯高低位循环闪烁
#include
#defineucharunsignedchar
#defineuintunsignedint
voidDelay(uintdel)
{
uinti,j;
for(i=0;ifor(j=0;j<1827;j++)
;
}
voidmain(void)
{
inti;
while
(1)
{
for(i=0;i<2;i++)
{
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);
}
for(i=0;i<2;i++)
{
P1=0x7f;
Delay(100);
P1=0xbf;
Delay(100);
P1=0xdf;
Delay(100);
P1=0xef;
Delay(100);
P1=0xf7;
Delay(100);
P1=0xfb;
Delay(100);
P1=0xfd;
Delay(100);
P1=0xfe;
Delay(100);
}
for(i=0;i<2;i++)
{
P1=0x00;
Delay(200);
P1=0xff;
Delay(200);
}
}
}
4.4AD转换测温度
#include
#include
typedefunsignedcharBYTE;
typedefunsignedintWORD;
#definewr_comXBYTE[0xD000]//写命令
#definewr_dataXBYTE[0xD100]//写数据
#definerd_comXBYTE[0xD200]//读命令
#definerd_dataXBYTE[0xD300]//读数据
sbitDQ=P1^7;//ds18b20与单片机连接口
unsignedcharcodestr1[]={""};
unsignedcharcodestr2[]={"TEMP:
"};
unsignedchardatadisdata[5];//百、十、个、小数位
unsignedinttvalue;//温度值
unsignedchartflag;//温度正负标志
voiddelay1ms(unsignedintms)//延时1毫秒子函数,形参为ms
{
unsignedinti,j;
for(i=0;ifor(j=0;j<500;j++);
}
voidwrite_cmd(BYTEcmd)
{
BYTEdl;
do{
dl=rd_com;
}while((dl&0x80)!
=0);//判忙
wr_com=cmd;
delay1ms
(1);
}
voidwrite_data(BYTEdat)
{
BYTEdl;
do{
dl=rd_com;
}while((dl&0x80)!
=0);//判忙
wr_data=dat;
delay1ms
(1);
}
voidlcd_init()//lcd初始化设置子函数,不带参数,0x38是显示模式设置,其余是显示开/关及光标设置,无顺序
{
delay1ms(15);
write_cmd(0x38);//调用写控制指令子函数,并用实参"00111000"代替形参com
//0x38表示设置为16*2显示,每个块为5*7点阵,8位数据接口
delay1ms(5);
write_cmd(0x08);//调用写控制指令子函数,并用实参"00001000"代替形参com
//0x08表示设置为关显示、不显示光标、光标不闪烁
delay1ms(5);
write_cmd(0x01);//调用写控制指令子函数,并用实参"00000001"代替形参com
//0x01表示显示数据清屏(数据指针清0,所有显示清0)
delay1ms(5);
write_cmd(0x06);//调用写控制指令子函数,并用实参"00000110"代替形参com
//0x06表示当读或写一个字符后地址指针加1,且光标加1;当写一个字符时,整屏显示不移动
delay1ms(5);
write_cmd(0x0c);//调用写控制指令子函数,并用实参"00001100"代替形参com
//0x0c打开显示、不显示光标、光标不闪烁
delay1ms(5);
}
voiddisplay(unsignedchar*p)//lcd显示字符串子函数
{
while(*p!
='\0')//测试是否等于'\0',即判断是否结尾
{
write_data(*p);//显示指针所指的字符串
p++;//指针加1
delay1ms
(1);
}
}
voidinit_play()//初始化显示子函数
{
lcd_init();//调用lcd初始化设置子函数,对LCD进行初始化
write_cmd(0x80);//调用写控制指令子函数,并用实参"10000000"代替形参com
//并将数据指针定位到第一行第一个字符处
display(str1);//从第一行第一个字符处显示字符串str1
write_cmd(0x80+0x40);//调用写控制指令子函数,并用实参"10000000"代替形参com
//并将数据指针定位到第二行第一个字符处
display(str2);//从第二行第一个字符处显示字符串str2
}
voidwrite_string(BYTE*s)
{
while(*s!
='\0')//'\0'为字符串结束标志
{
write_data(*s);
s++;
}
}
voidset_display_place(BYTEline,column)
{
BYTEaddress;
if(line==1)
{
address=0x80+column;
}
elseif(line==2)
{
address=0xc0+column;
}
write_cmd(address);
}
voidwrite_string_lcd(BYTEline,column,unsignedchar*string)
{
set_display_place(line,column);
write_string(string);
delay1ms
(1);
}
voiddelay_18b20(unsignedinti)//延时1微秒
{
while(i--);
}
voidds18b20rst()//ds18b20初始化子函数
//要求"数据线拉高-延时-数据线拉低-延时大于480微妙-数据线拉高-延时等待"
{
unsignedcharx=0;
DQ=1;//信号线DQ复位
delay_18b20(40);//延时
DQ=0;//DQ拉低
delay_18b20(4000);//精确延时大于480us
DQ=1;//拉高
delay_18b20(400);
}
voidds18b20wr(unsignedcharwdata)/*写数据子函数,无返回值,含参数*/
{
unsignedchari=0;
for(i=8;i>0;i--)//要写完一个字节,故需要重复8次以下操作
{
DQ=0;//数据线拉低
DQ=wdata&0x01;//wdata是一个形参,将其与00000001进行按位与
//按从低到高的顺序发送数据(一次发送一位)
delay_18b20(100);
DQ=1;//最后将数据线拉高
wdata>>=1;//将wdata右移1位
}
}
unsignedchards18b20rd()//读数据子函数,是有返回值dat
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)//要读完一个字节,故需要重复8次以下操作
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18b20(100);
}
return(dat);//返回dat
}
read_temp()//读取温度值并转换的子函数,有返回值温度值tvalue
{
unsignedchara,b;
ds18b20rst();//调用ds18b20初始化子函数
ds18b20wr(0xcc);//调用写数据子函数,向ds18b20写命令0xcc
//ccH表示跳过ROM读序列号,适用于单机工作,直接向18b20发送温度变换命令
ds18b20wr(0x44);//调用写数据子函数,向ds18b20写命令0x44