北航单片机实验报告.docx

上传人:b****4 文档编号:6689214 上传时间:2023-05-10 格式:DOCX 页数:12 大小:99.21KB
下载 相关 举报
北航单片机实验报告.docx_第1页
第1页 / 共12页
北航单片机实验报告.docx_第2页
第2页 / 共12页
北航单片机实验报告.docx_第3页
第3页 / 共12页
北航单片机实验报告.docx_第4页
第4页 / 共12页
北航单片机实验报告.docx_第5页
第5页 / 共12页
北航单片机实验报告.docx_第6页
第6页 / 共12页
北航单片机实验报告.docx_第7页
第7页 / 共12页
北航单片机实验报告.docx_第8页
第8页 / 共12页
北航单片机实验报告.docx_第9页
第9页 / 共12页
北航单片机实验报告.docx_第10页
第10页 / 共12页
北航单片机实验报告.docx_第11页
第11页 / 共12页
北航单片机实验报告.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

北航单片机实验报告.docx

《北航单片机实验报告.docx》由会员分享,可在线阅读,更多相关《北航单片机实验报告.docx(12页珍藏版)》请在冰点文库上搜索。

北航单片机实验报告.docx

北航单片机实验报告

目录

目录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的工作原理,以及相应的编程方法以及显示原理与方法。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2