16.4.2 程序设计
下面采用C51语言在KeilµVision3集成开发环境中编写程序,具体操作步骤如下。
(1)在KeilµVision3集成开发环境中,选择“Project”→“New”→“µVision Project”命令,新建一个工程,并保存。
(2)在弹出的选择器件对话框中选择Atmel公司的AT89S51,如图16.12所示。
(3)单击“确定”按钮,此时询问是否添加启动代码,如图16.13所示。单击“是”按钮选择添加启动代码,完成工程的建立。
图 16.12 选择单片机AT89S51
图 16.13 添加启动代码
(4)选择“File”→“New”命令,新建一个程序文件,并保存为*.C文件,可以在其中输入如下所示的程序源代码。
01:#include<reg51.h>
02:
03:/*/
04:#define WriteDeviceAddress 0xAE//写器件地址
05:#define ReadDviceAddress 0xAF
06:
07:/*/
08:sbit SCL=P1^0;//I 2 C时钟线SCL
09:sbit SDA=P1^1;//I 2 C数据线SDA
10:sbit STATUS=P3^1;//程序运行状态
11:
12:/*/
13:void Delays(unsigned int number);//延时子函数
14:void Startic();//起始信号子函数
15:void Stopic();//终止信号子函数
16:void Ackic();//发送应答位子函数
17:void NoAckic();//发送非应答位子函数
18:bit TestAckic();//应答位检查子函数
19:bit Write8Bitic(unsigned char input);//单字节写子函数
20:unsigned char Read8Bitic();//单字节读子函数
21://多字节写子函数
22:void Writeic(unsigned char*Wdata,unsigned char RomAddress,unsigned char number);//多字节读子函数
23:
24:void ReadI2C(unsigned char*RamAddress,unsigned char RomAddress,unsigned char bytes);
25:/*/
26:void main()
27:{
28:unsigned char writeData[10]={0xC0,0x10,0x34,0x12,0x11,0x15,0x22,0x01,0xAE,0xAF};
29://需要写的10个字节USB数据ID
30:
unsigned char readData[10];//用于存读入的10个字节数据
31:
unsigned char*writeadd;//写数据指针操作
32:
unsigned char*readadd;//读数据指针操作
33:
unsigned char i;
34:
unsigned char ok=0;
35:
STATUS=0;
36:
37:
writeadd=writeData;//写地址映射
38:
readadd=readData;//读地址映射
39:
Writeic(writeadd,0x00,8);//写数据
40:
ReadI2C(readadd,0x00,8);//读数据
41:
for(i=0;i<8;i++)//判断每个字节读写是否一致
42:
{
43:
if(writeData[i]==readData[i])
44:
{
45:
ok++;
46:
}
47:}
48:
49:if(ok==8)
50:STATUS=1;//当读写一致时,点亮LED
51:else
52:STATUS=0;//当读写不一致时,熄灭LED
53:
54:while(1)
55:{
56:}
57:}
提示
这里写的只是主函数,在该主函数中将调用本章前面编写的各类子函数。在使用测试程序时,必须将本章前面介绍的各类子函数添加到主函数后面。
本程序的功能是利用单片机的P1.0、P1.1作为I2C串行总线的SCL、SDA接口,向AT24C08写入10个字节的数据,然后再将写入的数据读出,并比较读写的数据是否完全一致。如果数据的读写一致,则点亮LED,表示写入正确;否则熄灭LED报警。
提示
第4、5行定义读写地址,由于AT24C08地址的高4位固定为1010(十六进制的A),而从图16.11又可看到,AT24C08的A0~A2这3个接脚都接的是高电平,因此其地址为1010111,在后面加上一位方向位,得出写器件地址为0xFE(二进制为10101110),读器件地址为0xFF(二进制为10101111)。