北航单片机实验报告.docx
《北航单片机实验报告.docx》由会员分享,可在线阅读,更多相关《北航单片机实验报告.docx(12页珍藏版)》请在冰点文库上搜索。
![北航单片机实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/f7581e5e-f31e-4194-9d06-e69bbb04676d/f7581e5e-f31e-4194-9d06-e69bbb04676d1.gif)
北航单片机实验报告
目录
目录1
实验一、LED点亮实验2
1、实验目的2
2、实验设备2
3、实验内容2
4、实验原理2
5、程序流程图2
6、源代码2
实验二、跑马灯实验3
1、实验目的3
2、实验设备3
3、实验内容3
4、实验原理3
5、程序流程图3
6、源代码4
实验三、LCD液晶显示6
1、实验目的6
2、实验设备6
3、实验内容6
4、实验原理6
5、程序流程图7
6、源代码7
实验总结12
实验一、LED点亮实验
1、实验目的
通过简单的I/O口操作,熟练单片机在KeilC51编程环境下的操作步骤,为后续实验打下基础。
2、实验设备
单片机综合仿真实验仪一台,PC机一台。
3、实验内容
在KeilC51编程环境下,编写相应程序,点亮四盏LED灯。
4、实验原理
P1口作为准双向口,每一位均可独立完成定义输入输出,故而CPU对P1口的操作可以是字节操作,也可以是位操作。
通过对实验设备电路图分析可知,只需对P1口输出0X00,即可保证点亮P1口对应的八个发光二极管。
5、程序流程图
图2、LED点亮程序流程图
6、源代码
#include
voidmain()
{
P1=0x00;
}
实验二、跑马灯实验
1、实验目的
1、学习单片机I/O口的简单操作;
2、学习单片机内部定时器的使用,以及相应延时子程序的编写和使用。
2、实验设备
单片机综合仿真实验仪一台,PC机一台。
3、实验内容
P1口做输出口,外接八个发光二极管,编写程序使发光二极管循环亮一秒、灭一秒,实现跑马灯效果。
4、实验原理
P1口为准双向口,P1口的每一位都能独立地定义为输入位或输出位。
作为输入位时,必须向锁存器相应位写入“1”,该位才能作为输入。
单片机中所有口锁存器在复位时均置为“1”,如果后来在口锁存器写过“0”,在需要时应写入一个“1”,使它成为一个输入。
再来看一下延时程序的实现。
现常用的有两种方法,一是用定时器中断来实现,一是用指令循环来实现。
在系统时间允许的情况下可以采用后一种方法。
在本次实验时,采用定时器中断实现。
实验要求定时需要达到一秒,但是由于单片机定时器的限制不可能达到这么长时间,本次实验采用多次中断的方式实现,每次中断20ms,则需要50次中断才能达到一秒。
5、程序流程图
图2、主程序流程图
如图1所示为此次实验的主程序流程图。
在程序开始设定用于点亮对于二极管的P1口的值,当计时1秒之后,灭掉所有二极管,再隔一秒之后使P1值更改以点亮另一个发光二极管,依次循环。
图3、定时子程序流程图
如图2所示为定时1秒子程序流程图。
程序开始对定时器进行初始化,置入相应的计数初值并且打开相应的定时器中断,接着程序就开始等待中断,当产生中断达到50次,即慢一秒时,开始更改P1口的值,实现定时循环。
6、源代码
#include
#include
#include
bitflag=1;/*定义标志位,初值为1*/
#defineucharunsignedchar
#defineuintunsignedint
ints=0;/*s为循环次数控制变量*/
voidset()/*定时器设定,选用定时器0*/
{
TH0=(65536-20000)/256;/*将计数初值高8位装入TH0中*/
TL0=(65536-20000)%256;/*将计数初值低8位装入TL0中*/
EA=1;/*开CPU中断*/
ET0=1;/*开定时中断*/
TR0=1;/*启动定时器*/
}
voidsettime()
{
uinti=1;
while(i<=50)
{
set();
while(flag);/*等待结束*/
flag=1;/*中断产生flag置1,i加1,再次进入循环执行set*/
i++;
}
}
voidtime0(void)interrupt1using1/*中断服务子程序*/
{
flag=0;/*标志位置0*/
}
voidmain()
{
ucharstate[8]={0xfe,0xfd,0xfb,0xf7};/*控制四个灯点亮的P1值*/
TMOD=0x01;/*设定定时器0工作方式1*/
while
(1)
{
P1=state[s%4];/*循环点灯*/
settime();/*亮1秒*/
P1=0xff;/*灯灭*/
settime();/*灭1秒*/
s++;
}
}
实验三、LCD液晶显示
1、实验目的
1、学习液晶显示的编程方法,了解液晶显示模块的工作原理;
2、掌握液晶显示模块与单片机的接口方法;
3、了解I2C总线的特点,以及C51系统中对I2C期间的使用和编程方法;
4、掌握字符型液晶驱动芯片PCF8576的工作原理,掌握相应的编程方法以及显示原理与方法。
2、实验设备
单片机综合仿真实验仪一台,PC机一台。
3、实验内容
编程实现在液晶显示屏上显示英文字母“BENG”。
4、实验原理
单片机内部并没有集成I2C模块,则只能通过I/O口模拟I2C通讯,本次实验选择P1.7口作为SDA传输数据,P1.6口提供SCL负责时钟。
通过实验材料可以查到PCF8576的芯片地址为0x72,查资料PCF8576得到内部控制字如图所示,选择驱动方式1:
4多级,1/3偏压。
注:
M1M0为驱动方式选择;B为LCD偏置选择;E为显示状态控制;LP为工作方式选择。
图2、方式选择指令
注:
P0~P5为六位二进制数值,反映了0~30数值。
该立即数传送到数据指针中,用以确定40个显示RAM地址中的一个。
图3、数据指示器装载指令
A2、A1、A0为三位二进制值(0~7),该三位(A2、A1、A0)立即数传送给子地址计数器以确认8个硬件子地址。
图4、器件选择指令
图2所示为1:
4多级驱动方式下的显示RAM原理图。
字符BENG的字符编码为0xEF,0x8F,0xEC,0xCD。
图2、1:
4多级驱动方式下的显示RAM原理图
5、程序流程图
图3LCD显示程序流程图
6、源代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
externvoiddelay(uintx);
externvoidsta();
externvoidstop();
externvoidmack();
externvoidcack();
externvoidwrbyt(ucharshu);
externvoidwrbyt0();
externvoidwrbyt1();
externvoidwrnbyt(ucharslaw,ucharnumber,ucharff[]);
externvoidwrnbyta(ucharslaw,uchargg[],ucharn);
voidrdnbyt(number,slar,qq);
sbitSDA=P1^7;/*P1.7作为数据线SDA*/
sbitSCL=P1^5;/*P1.5作为时钟线SCL*/
sbitRST=P1^0;
voidsta()/*启动I2C总线*/
{
SDA=1;
SCL=1;
while(SCL==0){;}
_nop_();
SDA=0;
_nop_();
_nop_();
SCL=0;
}
voidstop()/*停止I2C总线*/
{
SDA=0;
SCL=1;
while(SCL==0){;}
_nop_();
SDA=1;
_nop_();/*代表运行一个机器周期*/
_nop_();
SCL=0;
}
voidmack()/*发送应答位*/
{
SDA=0;
SCL=1;
_nop_();
_nop_();
SCL=0;
SDA=1;
}
voidcack()/*应答位检查*/
{
SDA=1;
SCL=1;
F0=0;
if(SDA==0)
{
SCL=0;
_nop_();
_nop_();
}
else
{
F0=1;
SCL=0;
_nop_();
_nop_();
}
}
voidwrbyt(ucharshu)/*发送一个字节数据*/
{
uchari;
if((shu&0x80)>0)
{SDA=1;}
else
{SDA=0;}
SCL=1;
while(SCL==0){;}
_nop_();
SCL=0;
SDA=0;
shu=_crol_(shu,1);
for(i=1;i<8;i++)
{
if((shu&0x80)>0)
{wrbyt1();}
else
{wrbyt0();}
shu=_crol_(shu,1);
}
}
voidwrbyt0()/*写0子函数*/
{
SDA=0;
SCL=1;
_nop_();
_nop_();
SCL=0;
}
voidwrbyt1()/*写1子函数*/
{
SDA=1;
SCL=1;
_nop_();
_nop_();
SCL=0;
SDA=0;
}
voidwrnbyta(ucharslaw,uchargg[],ucharn)/*写第N个字节*/
{
do{
sta();
wrbyt(slaw);
cack();
}while(F0==1);
wrbyt(gg[n]);
cack();
}
voidwrnbyt(ucharslaw,ucharnumber,ucharff[])/*发送N个字节数据*/
{
ucharidatak;
do{
sta();
wrbyt(slaw);
cack();
}while(F0==1);
for(k=0;k{
wrbyt(ff[k]);
cack();
while(F0==1)
{wrnbyta(slaw,ff,k);}
}
stop();
}
voidmain()
{
uchara3[]={0xC8,0xE0,0x00,0xef,0x8F,0xec,0xcd};//后4个元素为"BENG"的编码
wrnbyt(0x72,7,a3);
}
实验总结
通过三次的单片机实验,将本科所学单片机相关知识在实际中再一次得到应用,加深了对单片机的内部结构和工作原理的理解,同时掌握了在KeilC51环境下对单片机系统的开发流程和方法,对以后的科研和学习奠定了相应的基础。
本次实验设计到LCD显示实验。
在LCD显示试验中,了解了I2C总线的特点,以及C51系统中对I2C期间的使用和编程方法;同时掌握字符型液晶驱动芯片PCF8576的工作原理,以及相应的编程方法以及显示原理与方法。