单片机--iic

来源:互联网 发布:linux telnet连接拒绝 编辑:程序博客网 时间:2024/06/09 17:25

iic.c

#include "myhead.h"xdata unsigned char alarm_hour = 13;xdata unsigned char alarm_min = 1;xdata unsigned char alarm_sec = 59;bit ack = 0;void iic_start(){           SDA = 1;//先操作SDA保证SCL=1期间SDA只有一个下降沿信号    SCL = 1;      delay_us(1);      SDA = 0;      delay_us(1);      SCL = 0;//钳住总线,让IIC失效}void iic_stop(){    SDA = 0;      SCL = 1;      delay_us(1);      SDA = 1;      delay_us(1);      SCL = 0;}void iic_send_byte(unsigned char byte)//每次发送最高位{      unsigned char i;      for(i = 0;i < 8;i++)      {              SDA = byte & 0x80;//赋值非零,SDA=1,赋值为零,SDA=0              SCL = 1;              delay_us(1);              SCL = 0;              byte <<= 1;                 }        SCL = 1;        SDA = 1;        delay_us(1);        if(0 == SDA)        {                ack = 1;        }        else        {                ack = 0;        }        SCL = 0;}unsigned char iic_rcv_byte(){      unsigned char i;      unsigned char temp = 0;      unsigned char a;      SDA = 1;      for(i = 0;i < 8;i++)      {          SCL = 0;              delay_us(1);              SCL = 1;              if(SDA)                {                      a = 0x01;                }                else                {                      a = 0;                }                temp |= a << (7 - i);                delay_us(1);        }        SCL = 0;        return temp;}// void iic_ack()// {//    SDA = 0;//      SCL = 1;//      delay_us(1);//      SCL = 0;// }void iic_noack(){    SDA = 1;      SCL = 1;      delay_us(1);      SCL = 0;}//向AT24C02发送字符串unsigned char AT24C02_send_str(unsigned char devaddr,unsigned char romaddr,unsigned char *s,unsigned char num){      unsigned char i;      iic_start();//起始信号      iic_send_byte(devaddr);         if(0 == ack)        {              return ERR;        }        iic_send_byte(romaddr);        if(0 == ack)        {            return ERR;        }        for(i = 0;i < num;i++)        {              iic_send_byte(*s);              if(0 == ack)                {                      return ERR;                }                s++;        }        iic_stop();        return SUCC;}//从AT24C02读数据unsigned char AT24C02_rcv_time(unsigned char devaddr,unsigned char romaddr){      unsigned char t;      iic_start();      iic_send_byte(devaddr);      if(0 == ack)        {              return ERR;        }        iic_send_byte(romaddr);        if(0 == ack)        {              return ERR;        }        iic_start();        iic_send_byte(devaddr + 1);        t = iic_rcv_byte();        iic_noack();        iic_stop();        return t;}void iic(){      unsigned char i;      unsigned char time[4] = {0};      unsigned char clock[4] = {0};      unsigned char flag1 = 1;      unsigned char key;      lcd_init();      uart_init();      time0_init();      hour = AT24C02_rcv_time(0xae,16);      min = AT24C02_rcv_time(0xae,17);      sec = AT24C02_rcv_time(0xae,18);      delay_ms(500);          alarm_hour = AT24C02_rcv_time(0xae,24);      alarm_min = AT24C02_rcv_time(0xae,25);      alarm_sec = AT24C02_rcv_time(0xae,26);        while(flag1)        {              if(flag)                {                    if(ch[0] == 't')                        {                                                  TR0 = 0;                           lcd_dis_str(0,1,"change time     ");               hour = (ch[1] - '0') * 10 +(ch[2] - '0');                         min = (ch[4] - '0') * 10 +(ch[5] - '0');                         sec = (ch[7] - '0') * 10 +(ch[8] - '0');               lcd_dis_time();               delay_s(3);                             lcd_dis_str(0,1,"        ");                             lcd_dis_time();                     lcd_dis_alarm_time();               TR0 = 1;                                                 }                        if(ch[0] == 'c')                        {                                                lcd_dis_str(0,0,"change clock    ");               alarm_hour = (ch[1] - '0') * 10 +(ch[2] - '0');                         alarm_min = (ch[4] - '0') * 10 +(ch[5] - '0');                         alarm_sec = (ch[7] - '0') * 10 +(ch[8] - '0');               lcd_dis_alarm_time();               delay_s(5);                 lcd_dis_str(0,0,"                ");                             lcd_dis_time();                     lcd_dis_alarm_time();                                              }                        uart_send_str(ch);                        flag = 0;                }                else                {                  lcd_dis_time();                  lcd_dis_alarm_time();                }                if(alarm_hour == hour && alarm_min == min)                {//                  PlayMusic();//                  lcd_dis_time();//              lcd_dis_alarm_time();                    for(i = 0;i < 100;i++)                    {                        beep = ~beep;                        delay_ms(10);                    }                }                time[0] = hour;                time[1] = min;                time[2] = sec;                clock[0] = alarm_hour;                clock[1] = alarm_min;                clock[2] = alarm_sec;                AT24C02_send_str(0xae,16,time,3);                delay_ms(500);                AT24C02_send_str(0xae,24,clock,3);                delay_s(1);                key = key_scan();                if(0xe7 == key)                {                      lcd_init();                      lcd_over();                      flag1 = 0;                      iic_stop();                                 }        }}

iic.h

#ifndef _UART_H#define _UART_Hextern void uart_init(void);extern void uart_isr();extern void uart_send_byte(unsigned char byte);extern void uart_send_str(unsigned char *str);extern void uart();#endif
0 0