标签:定时 start img main 不能 eeprom 其他 ref 中断方式
————————————————————————————————————————————
参考地址:
http://blog.csdn.net/junyeer/article/details/46480863
http://blog.csdn.net/bob_fly1984/article/details/22690381
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
硬件结构:
p.s. 当总线空闲状态时,两根线被上拉电阻拉高,保持高电平。连接总线上的任一器件输出的低电平都将使总线的信号变低
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
总线特征:
p.s. 地址分为7位或10位,此处只介绍7位
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
工作方式:
p.s. 是没有I2C总线硬件接口的单片机采用软件模拟I2C总线常用的工作方式
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
通信时序(主从工作方式):
p.s. SDA线必须在SCL时钟的高电平周期才能保持稳定,SDA数据线的高或低电平状态只能在SCL低电平时才能改变
p.s. 非应答信号规定:当主机为接收设备,主机对最后一个字节不应答,以向发送设备表示数据传送结束
7位地址码:其中DA3~DA0(硬件出厂时固有的地址编码)及A2~A0(用户设定)为从机地址
p.s. 并不是所有的字节传输都必须有一个应答位,比如:当从设备不能再接收主设备发送的数据时,从设备回传一个非应答位
在一次传输中可以传输多个字节,图中只画出首字节
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
p.s. 实际上主从机的SDA信号是在同一根线上的,分开画有助于理解各自的行为
————————————————————————————————————————————
AT24C02
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
主要型号:
ATMEL公司生产的AT24C系列EEPROM中具有I2C总线接口。
这类芯片可以解决掉电而造成的数据丢失的问题,可以保存数据100年,擦写100w次以上。
芯片地址固定部分为1010
型号 |
存储容量 |
AT24C01 |
128*8 |
AT24C02 |
256*8 |
AT24C04 |
512*8 |
AT24C08 |
1024*4 |
AT24C16 |
2048*8 |
芯片特性:略
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
引脚描述:
————————————————————————————————————————————
AT24C02应用实例
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
设计要求:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
设计思路:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
硬件清单及连线情况:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
实现代码:
1 #include <reg51.h> 2 typedef unsigned char uchar; 3 typedef unsigned int uint; 4 sbit scl = P3 ^ 0; 5 sbit sda = P3 ^ 1; 6 uchar second = 0; 7 uchar count = 0; 8 bit flag = 0; 9 uchar code table[] = 10 { 11 0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6, 0xEE, 0x3E, 0x9C, 0x7A, 0x9E, 0x8E 12 }; 13 void Init(); //初始化总线 14 void Start(); //开始 15 void Stop(); //停止 16 void Respons(); //响应位 17 uchar ReadByte(); //读数据 18 uchar ReadAddress(uchar address); //读地址 19 void WriteByte(uchar dat); //写字节 20 void WriteAddress(uchar address, uchar dat); //写地址 21 void Display(); //显示数码管 22 void Delay1ms(uchar m); //延时1ms 23 void Delay(); //延时2个机器周期 24 void main() 25 { 26 /* 初始化总线 */ 27 Init(); 28 /* 初始化LED */ 29 P1 = 0xff; 30 /* 设置定时器 */ 31 TMOD = 0x01; 32 TH0 = (65536 - 50000) / 256; 33 TL0 = (65536 - 50000) % 256; 34 /* 中断初始化 */ 35 EA = 1; 36 ET0 = 1; 37 /* 定时器开始 */ 38 TR0 = 1; 39 /* 显示数码管并写入 */ 40 while(1) 41 { 42 if (flag == 1) 43 { 44 flag = 0; 45 WriteAddress(2, second); 46 } 47 Display(); 48 } 49 50 } 51 void Init() 52 { 53 //空间状态时SCL与SDA均保持高电平 54 sda = 1; 55 Delay(); 56 scl = 1; 57 Delay(); 58 } 59 void Start() 60 { 61 //SCL高电平情况下,SDA下降沿启动 62 sda = 1; 63 Delay(); 64 scl = 1; 65 Delay(); 66 sda = 0; 67 Delay(); 68 } 69 void Stop() 70 { 71 //SCL高电平情况下,SDA上升沿停止 72 sda = 0; 73 Delay(); 74 scl = 1; 75 Delay(); 76 sda = 1; 77 Delay(); 78 } 79 void Respons() 80 { 81 //在SCL位为高电平时产生响应信号,数据传输正确时产生应答且SDA拉低 82 uchar i; 83 scl = 1; //此处scl拉高后在while循环中降低,参照时序图 84 Delay(); 85 while ((sda == 1) && (i < 255)) 86 { 87 //SDA拉低时跳出循环,表示数据传输正确,产生应答.如果在一段时间内未收到应答,则不再等待跳出循环 88 i++; 89 scl = 0; 90 Delay(); 91 } 92 } 93 void WriteAddress(uchar address, uchar dat) 94 { 95 Start(); //开始 96 WriteByte(0xA0); //写入 1010 0000 高4位为固定值,5-7位为A0 A1 A2,最低位0为写操作标识 97 Respons(); 98 WriteByte(address); //写入 0000 0010 99 Respons(); 100 WriteByte(dat); //写入数据(秒数) 101 Respons(); 102 Stop(); //停止 103 } 104 void WriteByte(uchar dat) 105 { 106 uchar i, temp; 107 temp = dat; //将dat读入temp 108 for (i = 0; i < 8; ++i) 109 { 110 temp = temp << 1; //temp左移,最高位移入CY 111 scl = 0; //SCL复位,等待最高位存入SDA后置位 112 Delay(); 113 sda = CY; //CY在头文件中已规定,通过SDA发送bit 114 Delay(); 115 scl = 1; //SCL置位,延迟2个机器周期后复位 116 Delay(); 117 } 118 scl = 0; //为最后一个SCL高电平复位 119 Delay(); 120 sda = 1; //一个字节数据发送完毕后置位准备响应 121 Delay(); 122 } 123 uchar ReadAddress(uchar address) 124 { 125 uchar byte; 126 Start(); 127 WriteByte(0xA0); 128 Respons(); 129 WriteByte(address); 130 Respons(); 131 Start(); 132 WriteByte(0xA1); //写入地址 1010 0001,读写标志位1为读 133 Respons(); 134 byte = ReadByte(); 135 Stop(); 136 return byte; 137 } 138 uchar ReadByte() 139 { 140 uchar i, k; 141 scl = 0; 142 Delay(); 143 sda = 1; 144 Delay(); 145 for (i = 0; i < 8; ++i) 146 { 147 scl = 1; 148 Delay(); 149 k = (k << 1) | sda; 150 scl = 0; 151 Delay(); 152 } 153 return k; 154 } 155 void Display() 156 { 157 P2 = 0xfe; 158 P1 = table[second % 10]; 159 Delay1ms(1); 160 P2 = 0xfd; 161 // P1 = table[second / 10 %10]; 162 P1 = table[second / 10]; 163 Delay1ms(1); 164 // P2 = 0xfb; 165 // P1 = table[second / 100]; 166 // Delay1ms(5); 167 } 168 void Delay() 169 { 170 ;; 171 } 172 void Delay1ms(uchar m) //使用1ms时二极管闪烁,此处将y=110改成y=50 173 { 174 uchar x, y; 175 for (x = m; x > 0; ++x) 176 for (y = 50; y > 0; --y) 177 ; 178 } 179 void time()interrupt 1 180 { 181 TH0 = (65536 - 50000) / 256; 182 TL0 = (65536 - 50000) % 256; 183 count++; 184 if (count == 20) 185 { 186 count = 0; 187 flag = 1; 188 second++; 189 if (second == 60) 190 second = 0; 191 } 192 }
标签:定时 start img main 不能 eeprom 其他 ref 中断方式
原文地址:http://www.cnblogs.com/hughdong/p/6993583.html