实习教程110625.docx
- 文档编号:30213861
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:32
- 大小:1.68MB
实习教程110625.docx
《实习教程110625.docx》由会员分享,可在线阅读,更多相关《实习教程110625.docx(32页珍藏版)》请在冰豆网上搜索。
实习教程110625
1.1单片机学习用书
《8051单片机C语言开发环境与务实》科学出版社赖麒文编著(附电子版)
重点看第六章、九、十、十一、十一、十二、十四、十五章,其余部分只做参考。
本次实习所采用的单片机原理图
1.2单片机编译环境
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。
Keil比较适合使用C语言编程,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会具有事半功倍的效果。
(附编译软件及使用教程)
图1所示为Keilc编译环境
图1Keilc编译界面
1.3PCB画图
本次实习需要画出PCB原理图和PCB图,画图时可参考画图教程(附电子版)
1.4实习所用的主要芯片
单片机为STC12C5A16S2,无线模块为TI公司生产的CC1101低功耗无线收发芯片以及串口RS232电平转换芯片(分别附有中英文芯片手册)以及液晶显示模块
1.5液晶显示模块
电路中所采用的显示器为1602(附中文手册)
1.5.11602字符表
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图1所示,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如“A”。
以下是1602的16进制ASCII码表:
图21602字符表
1.5.2指令集:
1602通过D0~D7的8位数据端传输数据和指令,如图3所示
显示模式设置:
(初始化)
00111000[0x38]设置16×2显示,5×7点阵,8位数据接口;
显示开关及光标设置:
(初始化)
00001DCBD显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效) 000001NSN=1(读或写一个字符后地址指针加1&光标加1),
N=0(读或写一个字符后地址指针减1&光标减1),
S=1且N=1(当写一个字符后,整屏显示左移)
S=0当写一个字符后,整屏显示不移动
数据指针设置:
数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)
其他设置:
01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。
图31602指令集
通常推荐的初始化过程:
延时15ms
写指令38H
延时5ms
写指令38H
延时5ms
写指令38H
延时5ms
(以上都不检测忙信号)
(以下都要检测忙信号)
写指令38H
写指令08H关闭显示
写指令01H显示清屏 写指令06H光标移动设置
写指令0cH显示开及光标设置
完毕
LCD屏代码介绍
上面已经介绍了所用LCD屏为1602型,可显示2行16列32个字符,所以每次无线发射的字符长度限制在32个字符。
具体屏的真值表和指令集上面已经介绍,下面的代码就是根据真值表和指令集编的。
unsignedcharLCD_DATA;
sbitRS=P3^4;
sbitRW=P3^5;
sbitEN=P3^6;
这里定义了lcd屏所用到的数据变量,LCD_DATA是往屏上写数据的缓存,RS,RW,EN为控制管脚,分别为P3^4,P3^5,P3^6这三个端口。
voidDelayms(uintms)(延时程序)
{
}
ucharBusy_Check()(忙闲状态检查)
{
returnLCD_Status;
}
voidWrite_LCD_Command(ucharcmd)
{
while((Busy_Check()&0x80)==0x80);
}
voidWrite_LCD_Data(uchardat)
{
while((Busy_Check()&0x80)==0x80);
Delayms
(1);
EN=0;
}
voidInitialize_LCD()
{
Write_LCD_Command(0x38);
Delayms
(1);
Write_LCD_Command(0x01);
Delayms
(1);
Write_LCD_Command(0x06);
Delayms
(1);
Write_LCD_Command(0x0f);
Delayms
(1);
}
voidShowString(ucharx,uchary,uchar*s)
{
uchari=0;
if(y==0)
Write_LCD_Command(0x80|x);
if(y==1)
Write_LCD_Command(0xc0|x);
Write_LCD_Data(*s);
}
这里的函数是LCD屏所用的子函数。
Delayms函数是一个延时函数。
Busy_Check是检测屏当前是否处于忙状态。
Write_LCD_Command是向屏写命令,具体命令可参照上面的1602指令集。
Write_LCD_Data是向LCD屏写数据,数据对应参照上面的lcd屏真值表。
Initialize_LCD是LCD初始化的函数,通过向屏写十六进制的38、01、06、0f将LCD屏初始化,具体这四个指令的作用请参照上面的LCD指令集。
ShowString是在屏上显示一个字符,形参x为所显示字符位置的列数,y为所显示字符位置的行数,*s为所显示数据。
1.6键盘模块
键盘是有5
6共30个按键组成的,如图4所示。
1.6.1工作原理:
(1)显示字符原理:
如显示字符P,对照图1,P对应的高位为0101(十进制为5),低位是0000(十进制为0),即Ox50即为字符P。
(2)按键与字符的一一对应原理:
例如,1602液晶显示屏上显示字母P,会面临识别出是哪个按键按下的问题。
下面,先介绍下电路原理,还以第3行4列的按键为例,如图3所示,电路上电后,此时所有按键均未按下,按键处于悬空状态,未接入电路。
首先找出第四列,即P0.2。
置P0.2为低电平,其他列为高电平(P0.0,P0.1P0.3P0.4,P0.5为高电平)。
也就是说,3行4列的按键SW-16的右端为低电平。
其左端由于上拉电阻R6的作用,处于高电平,当把按键SW-16按下时,其左端的高电平立刻变为低电平,其他行仍为高,这样就可以找出是第三行了。
于是,就找出是第三行了,在此处写下对应显示字符P的命令LCD_DATA=0x50,就可以显示字母P了。
同理,分别置某一列为低电平,其余列为高电平就可以根据按键按下后该列哪个按键左端变为低电平就可以确定所在的行了。
图4键盘
1.6.1部分代码:
if(flagsw!
=1)
{
S1=1;//表示第1列置高
S2=1;//表示第2列置高
S3=1;//表示第3列置高
S4=0;//表示第4列置低
S5=1;//表示第5列置高
S6=1;//表示第6列置高
if(SW1==0)(表示第4列第1行按键左端为低电平)
{
LCD_DATA=0x44;
flag=1;
flagsw=1;
}
elseif(SW2==0)
{
LCD_DATA=0x4A;
flag=1;
flagsw=1;
}
elseif(SW3==0)(表示第4列第3行按键左端为低电平)
{
LCD_DATA=0x50;对应字母P
flag=1;
flagsw=1;
}
elseif(SW4==0)
{
LCD_DATA=0x56;
flag=1;
flagsw=1;
}
elseif(SW5==0)
{
LCD_DATA=0x00;
flag=1;
flagsw=1;
}
}
1.7无线收发模式及切换
通过单片机的P0.6、P0.7和P3.7三个I/O口来控制无线模块,单片机通过P1.5
P1.6、P1.7三个管脚来和无线模块实现通信,图中铁丝起接受与发送信号所用的天线的作用
电路所设计的的主要功能是实现短距离无线通信。
是在两块相同的电路板之间完成的。
这样电路就有两种工作模式,分别是接受和发送两种模式,分别有指示灯D2和D3来说明电路出于哪个工作状态。
1.7.1发送模式
此时,D2灯亮,当输入“ABCDEF”时,键盘上显示“ABCDEF”,如图
1.7.2接收模式
此时,另一块电路板的D3灯亮,在这种情况下,在第一块电路板的键盘上按下“send”键,即可在接收电路的显示屏上显示“ABCDEF”,如图所示。
1.8串口模块
单片机的P3.0和P3.1两个串口通过与SP3232EEN的11和12脚连接来控制串口
电路的串口模块
串口线
串口母头
将串口线上的公头插入电路板上的的母头,从而完成电路连接
另附本次实习电路原理图
1.8实验步骤:
1学习原理,绘制原理图及PCB图(附画图教程);
2学习焊接技术,完成电路的焊接;
注意:
单片机的正确插放如图所示,有凹口一端的要与电路板相对应,本例中凹口向右
3熟悉编译环境,编写程序(附教程);
4将程序通过串口线和烧录软件烧入单片机(利用软件STC-ISP);
选择好自己电脑对应的串口(我的电脑—属性—硬件—设备管理器—串口)
5调试电路,实现电路设计的功能。
焊接电路注意事项:
1焊接时应先焊接表贴元器件,其次再焊接直插器件
2极性电容和二极管均有正负极,不可随便焊接,具体来讲极性电容长正短负,二极管有黑色线圈的为负极
3D1,D2,D3为LED指示灯,一般电源指示灯为绿灯,其他两个可任意。
这个三种也是有正负的,判断的方法是用万用表的蜂鸣档,当万用表的正极和负极分别与指示灯的正负极对应接触时,灯就会亮,否则灯一直不亮
程序主框架
程序的框架主要是由主程序和两段外部中断函数组成,主函数中主要是单片机初始化以及各模块的初始化,然后是一个while
(1)的无限循环,循环中判断收发模式的标志位,并实现收发功能。
外部中断0函数用来切换整个系统的接受或者发送模式,外部中断1函数是用来扫描键盘。
附录
主函数
voidmain(void)
{
//**********************************lcd******************************************//
inti,j;
//***********************************lcd***************************************//
//xdatau8TxBuf[32]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};//8字节,如果需要更长的数据包,请正确设置
//xdatau8RxBuf[32]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
P4SW=P4SW|0x70;
SWRS=1;
P4=0x20;
//***********************************lcd***************************************//
i=0;
j=0;
IE=0x81;
IT1=1;
EX1=1;
EA=1;
F0=0;
flag=0;
P0&=0xc0;
Initialize_LCD();
//***********************************lcd***************************************//
CpuInit();
POWER_UP_RESET_CC1100();
halRfWriteRfSettings();
halSpiWriteBurstReg(CCxxx0_PATABLE,PaTabel,8);//功率参数
//halRfSendPacket(TxBuf,8);//TransmitTxbufferdata
delay(6000);
while
(1)
{
if(SWRS==0)
{
if(halRfReceivePacket(RxBuf,32))//判断是否接收到数据
{
/*if(i<16)
{
for(i=0;i<16;i++)
{
ShowString(i,0,&RxBuf[i]);
}
}
elseif(i>=16)
{*/
for(i=0;i<16;i++)
{
ShowString(i,0,&RxBuf[i]);
}
for(i=16;i<32;i++)
{
ShowString(i-16,1,&RxBuf[i]);
}
//}
}
}
else
{
if(flag==1)
{
flag=0;
if(j<16)
{
if(LCD_DATA==0x00)
{
if(j!
=0)
{
j--;
LCD_DATA=0x20;
ShowString(j,0,&LCD_DATA);
RS=0;
RW=0;
Write_LCD_Command(0x10);
}
}
elseif(LCD_DATA==0x01)
{
halRfSendPacket(TxBuf,32);
}
else
{
//DATA[j]=LCD_DATA;
ShowString(j,0,&LCD_DATA);
TxBuf[j]=LCD_DATA;
j++;
}
}
elseif((j>=16)&(j<=31))
{
if(LCD_DATA==0x00)
{
if(j==16)
{
j--;
LCD_DATA=0x20;
ShowString(j,0,&LCD_DATA);
RS=0;
RW=0;
Write_LCD_Command(0x10);
}
else{
j--;
LCD_DATA=0x20;
ShowString(j-16,1,&LCD_DATA);
RS=0;
RW=0;
Write_LCD_Command(0x10);
}
}
elseif(LCD_DATA==0x01)
{
halRfSendPacket(TxBuf,32);
}
else
{
//DATA[j]=LCD_DATA;
ShowString(j-16,1,&LCD_DATA);
TxBuf[j]=LCD_DATA;
j++;
}
}
else
{
if(LCD_DATA==0x00)
{
j--;
LCD_DATA=0x20;
ShowString(j-16,1,&LCD_DATA);
RS=0;
RW=0;
Write_LCD_Command(0x10);
}
elseif(LCD_DATA==0x01)
{
halRfSendPacket(TxBuf,32);
}
}
}
}
}
}
中断0函数
voidexint0()interrupt0
{
Delayms(1000);
if(SWRS==0)
{
SWRS=1;
P4=~P4;
}
else
{
SWRS=0;
P4=~P4;
}
}
中断1函数
voidexint1()interrupt2
{
uintflagsw=0;
EA=0;
Delayms(50);
/////////////S1=0////////////////////
S1=0;
S2=1;
S3=1;
S4=1;
S5=1;
S6=1;
if(SW1==0)
{
LCD_DATA=0x41;
flag=1;
flagsw=1;
}
elseif(SW2==0)
{
LCD_DATA=0x47;
flag=1;
flagsw=1;
}
elseif(SW3==0)
{
LCD_DATA=0x4D;
flag=1;
flagsw=1;
}
elseif(SW4==0)
{
LCD_DATA=0x53;
flag=1;
flagsw=1;
}
elseif(SW5==0)
{
LCD_DATA=0x59;
flag=1;
flagsw=1;
}
/////////////S1=0////////////////////
/////////////S2=0////////////////////
if(flagsw!
=1)
{
S1=1;
S2=0;
S3=1;
S4=1;
S5=1;
S6=1;
if(SW1==0)
{
LCD_DATA=0x42;
flag=1;
flagsw=1;
}
elseif(SW2==0)
{
LCD_DATA=0x48;
flag=1;
flagsw=1;
}
elseif(SW3==0)
{
LCD_DATA=0x4E;
flag=1;
flagsw=1;
}
elseif(SW4==0)
{
LCD_DATA=0x54;
flag=1;
flagsw=1;
}
elseif(SW5==0)
{
LCD_DATA=0x5A;
flag=1;
flagsw=1;
}
}
/////////////S2=0////////////////////
/////////////S3=0////////////////////
if(flagsw!
=1)
{
S1=1;
S2=1;
S3=0;
S4=1;
S5=1;
S6=1;
if(SW1==0)
{
LCD_DATA=0x43;
flag=1;
flagsw=1;
}
elseif(SW2==0)
{
LCD_DATA=0x49;
flag=1;
flagsw=1;
}
elseif(SW3==0)
{
LCD_DATA=0x4F;
flag=1;
flagsw=1;
}
elseif(SW4==0)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实习 教程 110625