内容发布更新时间 : 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
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
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
#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总线
//应答位检查
//发送一个字节数据