北航单片机系统试验报告 下载本文

内容发布更新时间 : 2024/12/24 2:05:08星期一 下面是文章的全部内容请认真阅读。

北京航空航天大学研究生课程考核记录

北京航空航天大学研究生课程考核记录

2009-2010 学年 第一学期

学号 姓名 成绩

课程名称:《单片机系统试验(1)》

论文题目:实验报告

一、 实验目的

1. 了解单片机的原理及其应用,熟悉单片机的资源,掌握单片机的最小系

统设计及扩展技术,掌握一门单片机的语言(汇编语言或单片机的C51语言)。

2. 通过本实验了解I2C总线的特点,以及51系统中对I2C器件的使用和编

程方法,包括:了解I2C总线系统中显示键盘驱动器ZLG7290,掌握其使用和编程方法;了解带有I2C总线接口的实时时钟芯片PCF8563的工作原理,掌握其使用和编程方法;掌握字符型液晶驱动芯片PCF8576的工作原理,掌握其使用和编程方法。

3. 通过本实验了解字符型液晶的显示方法。 二、 实验设备

单片机综合仿真实验仪一台,PC机一台。 三、 实验原理

(1)I/O口实验:P1口作为准双向口,每一位可独立定义为输入输出。CPU对P1口的操作可以是字节操作,也可以是位操作。实验中P1.0-P1.3接发光二极管,编写程序,通过P1口控制LED状态,熟悉CPU对P1口操作指令。P1.4脚接按键,作为数字输入。

(2)I2C器件实验:I2C总线的原理及软件包,各个器件的器件地址及地址引脚等原理。具体原理图可参看参考书目【1】或从网上下载www.21IC.com。

(3)点阵液晶实验:掌握LCD12864点阵液晶的控制方法。 四、 内容与步骤

1. 学会使用KEIL C51的仿真调试环境以及仿真器的使用,并能使4个灯全

亮。

2. I/O口实验:循环定时(用定时器做)点亮4个灯,即每2秒闪烁点亮(亮

1秒,灭1秒)一个灯,循环往复(或叫跑马灯实验)。

3. 选作其中任意一个实验:(1)PCF8576驱动的字符液晶上显示“ENG。”;

(2)能对TLC549芯片的内部寄存器进行操作,输入电压变化是给出相应的值。

北京航空航天大学研究生课程考核记录

4. 如有感兴趣的同学还可以做实验箱上具备的其他实验组合。 五、 源代码和说明 1、4个灯全亮实验

C51源代码如下:

# include # include sbit P1_0=P1^0; sbit P1_1=P1^1; sbit P1_2=P1^2; sbit P1_3=P1^3; void delay(void); void main() {

delay(); while(1) { P1_0=0;

P1_1=0;

P1_2=0; P1_3=0; }

}

void delay() { }

int i;

for(i=0;i<10000;i++) { }

_nop_();

北京航空航天大学研究生课程考核记录

实验时看到P1口低4位对应的4个LED灯均点亮。因共阴极LED对应的P1口的数位均置“0”。 2、I/O口实验

定时1秒控制4个灯循环点亮的C51源程序如下:

#include #include #define uchar unsigned char #define uint unsigned int

sbit LED0=P1^0; //定义LED对应的P1口 sbit LED1=P1^1; sbit LED2=P1^2; sbit LED3=P1^3;

void Timer0() interrupt 1 {

static uint count=0; if(++count=25)

{

P0=_crol_(P0.1); }

TH0=(65536-40000)/256; TL0=(65536-40000)%6; } main() {

P0=0xFE;

TMOD=0x01; //timer0方式1

北京航空航天大学研究生课程考核记录

TH0=(65536-40000)/256; //初始化计数初值(假设晶振频率为12MHz) TL0=(65536-40000)%6; //40毫秒溢出一次

EA=1; //开总中断允许 ET0=1; //开timer0中断 TR0=1; //启动timer0 for(;;){}

}

实验时,P1.0-P1.3对应的LED灯每1秒闪烁点亮一个,循环往复。 选择的定时/计数器为timer0方式1,定时初值(65536-40000)由

1212?106?40000?0.01s?40ms确定,中断周期为10ms。

3、选做实验,PCF8576控制的字符液晶上显示“ENG”。

C51源代码如下:

#include #include

#define uchar unsigned char #define uint unsigned int sbit SDA=P1^7; sbit SCL=P1^6;

//P1.7作为数据线SDA //P1.6作为时钟线SCL

sbit RST=P1^0;

extern void sta(); //函数声明 extern void stop(); extern void cack();

extern void wrbyt(uchar shu); extern void wrbyt0(); extern void wrbyt1();

extern void wrnbyta(uchar slaw,uchar gg[],uchar n);

extern void wrnbyt(uchar slaw,uchar number,uchar ff[]); void sta() //启动I2C总线 {

SDA=1;

SCL=1;

while(SCL==0){;} _nop_(); SDA=0; _nop_(); _nop_(); SCL=0;

北京航空航天大学研究生课程考核记录

}

void stop()

{ SDA=0; SCL=1;

while(SCL==0){;} _nop_(); SDA=1; _nop_();

_nop_();

SCL=0; }

void cack() { SDA=1; SCL=1; F0=0;

if(SDA==0) { SCL=0;

_nop_();

_nop_(); } else { F0=1; SCL=0; _nop_(); _nop_();

}

}

void wrbyt(uchar shu) { uchar i;

if((shu&0x80)>0) { SDA=1; } else { SDA=0; } SCL=1;

while(SCL==0){;} _nop_();

SCL=0; SDA=0;

shu=_crol_(shu,1);

//停止I2C总线

//应答位检查

//发送一个字节数据