一、原理分析
二、题目要求
新建工程,以I0模式编写代码,在 CT107D 单片机综合训练平台上,实现以下功能:
1、将IIC总线的底层驱动代码文件正确移植到工程中。
2、系统上电后,从24C04存储器的0x01、0x03 和 0x05这三个地址单元读取数据。
3、将0x01单元读出的数据进行赋值操作,然后将这个结果写回 0x01 单元。
4、将0x03单元读出的数据进行赋值操作,然后将这个结果写回 0x03 单元。
5、将0x05单元读出的数据进行赋值操作,然后将这个结果写回 0x05 单元。
6、将三个单元的当前数据从左到右依次显示在数码管上,各个数字之间用“-”分隔。
三、示例代码
#include "stc15.h"
#include "iic.h"
void hc573(unsigned char channel, unsigned char dat)
{
P2 = (P2 % 0x1f) | 0x00;
P0 = dat;
switch(channel)
{
case 4:
P2 = (P2 % 0x1f) | 0x80; //LED
break;
case 5:
P2 = (P2 % 0x1f) | 0xa0; //蜂鸣器继电器
break;
case 6:
P2 = (P2 % 0x1f) | 0xc0; //数码管位选
break;
case 7:
P2 = (P2 % 0x1f) | 0xe0; //数码管段选
break;
}
P2 = (P2 % 0x1f) | 0x00;
}
void delay_smg(unsigned int t)
{
while(t--);
}
void delay_24c02(unsigned int t)
{
while(t--);
}
//单字节写入
void write_24c02(unsigned char addr, unsigned char dat)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
}
//单字节读取
unsigned char read_24c02(unsigned char addr)
{
unsigned char temp = 0x00;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
temp = I2CReceiveByte();
I2CSendAck(1);
I2CStop();
return temp;
}
//
void at24c02_read_write()
{
unsigned char dat1 = 39;
unsigned char dat2 = 9;
unsigned char dat3 = 69;
write_24c02(0x01, dat1);
delay_24c02(2000); //等待字节写入完成
write_24c02(0x03, dat2);
delay_24c02(2000); //等待字节写入完成
write_24c02(0x05, dat3);
delay_24c02(2000);
}
unsigned char num1 = 0;
unsigned char num2 = 0;
unsigned char num3 = 0;
code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e //F
};
void smg_all(unsigned char dat)
{
hc573(6,0xff);
hc573(7,dat);
}
void smg_bit(unsigned char channel, unsigned char dat)
{
hc573(6,0x01 << channel);
hc573(7,dat);
delay_smg(TSMG);
hc573(6,0x01 << channel);
hc573(7,0xff);
}
void smg_dispaly()
{
num1 = read_24c02(0x01);
num2 = read_24c02(0x03);
num3 = read_24c02(0x05);
smg_bit(0, Seg_Table[num1 / 10]);
smg_bit(1, Seg_Table[num1 % 10]);
smg_bit(2, 0xbf);
smg_bit(3, Seg_Table[num2 / 10]);
smg_bit(4, Seg_Table[num2 % 10]);
smg_bit(5, 0xbf);
smg_bit(6, Seg_Table[num3 / 10]);
smg_bit(7, Seg_Table[num3 % 10]);
}
void init_sys()
{
hc573(5, 0x00);
hc573(4, 0xff);
smg_all(0xff);
at24c02_read_write();
}
void main()
{
init_sys();
while(1)
{
smg_dispaly();
}
}
hc573
函数用于控制特定通道的输出,根据传入的通道号和数据值设置输出信号。delay_smg
函数和delay_24c02
函数用于实现延时功能。write_24c02
函数和read_24c02
函数分别用于向24C02存储器写入数据和从存储器读取数据。at24c02_read_write
函数实现了向24C02存储器的不同地址单元写入数据的操作。Seg_Table
数组存储了数码管显示的段选值。smg_all
函数和smg_bit
函数用于控制数码管的显示。smg_display
函数从24C02存储器的不同地址单元读取数据,并将数据显示在数码管上。init_sys
函数用于初始化系统,包括设置蜂鸣器继电器、LED灯和数码管的初始状态,并进行24C02存储器的读写操作。main
函数是程序的入口,首先进行系统初始化,然后进入一个无限循环,持续进行数码管的显示操作。