- #include <reg52.h>
- #include "./delay/delay.h"
- #define LCD_WRITE_DATA 1
- #define LCD_WRITE_COM 0
- #define LCDPORT P0
- #define SUCC 0
- #define ERR 1
- sbit RS = P2^4;
- sbit RW = P2^5;
- sbit E = P2^6;
- sbit SCL = P1^0;
- sbit SDA = P1^1;
- bit ack = 0;
- void iic_start()
- {
- SDA = 1;
- SCL = 1;
- delay_us(1);
- SDA = 0;
- delay_us(1);
- SCL = 0;
- }
- void iic_stop()
- {
- SDA = 0;
- SCL = 1;
- delay_us(1);
- SDA = 1;
- delay_us(1);
- SCL = 0;
- }
- bit iic_send_byte(unsigned char byte)
- {
- unsigned char i;
- SDA = 1;
- for(i = 0;i < 8;i++)
- {
- SDA = byte & 0x80;
- 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;
- return ack;
- }
- void iic_noack()
- {
- SDA = 1;
- SCL = 1;
- delay_us(1);
- SCL = 0;
- }
- void iic_ack()
- {
- SDA = 0;
- SCL = 1;
- delay_us(1);
- 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 == 1)
- {
- a = 0x01;
- }
- else
- {
- a = 0x0;
- }
- temp |= (a<<(7-i));
- delay_us(1);
- }
- SCL = 0;
- return temp;
- }
- unsigned char AT24C02_send_str(unsigned char devaddr,unsigned char romaddr,unsigned charchar *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;
- }
- unsigned char AT24C02_rcv_byte(unsigned char devaddr,unsigned char romaddr,unsigned charchar *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;
- iic_start();
- iic_send_byte(devaddr + 1);
- for(i = 0;i < num - 1;i++)
- {
- *s = iic_rcv_byte();
- iic_ack();
- s++;
- }
- *s = iic_rcv_byte();
- iic_noack();
- iic_stop();
- return SUCC;
- }
- void lcd1602_write_data(unsigned char byte,unsigned char flag)
- {
- if(flag)
- {
- RS = 1;
- }
- else
- {
- RS = 0;
- }
- RW = 0;
- E = 1;
- LCDPORT = byte;
- delay_us(5);
- E = 0;
- }
- void lcd_init()
- {
- delay_ms(15);
- lcd1602_write_data(0x38,LCD_WRITE_COM);
- delay_ms(5);
- lcd1602_write_data(0x38,LCD_WRITE_COM);
- delay_ms(5);
- lcd1602_write_data(0x38,LCD_WRITE_COM);
- delay_ms(5);
- lcd1602_write_data(0x38,LCD_WRITE_COM);
- delay_ms(5);
- lcd1602_write_data(0x08,LCD_WRITE_COM);
- delay_ms(5);
- lcd1602_write_data(0x01,LCD_WRITE_COM);
- delay_ms(5);
- lcd1602_write_data(0x06,LCD_WRITE_COM);
- delay_ms(5);
- lcd1602_write_data(0x0c,LCD_WRITE_COM);
- delay_ms(5);
- }
- void lcd_write_str(unsigned char x,unsigned char y,unsigned charchar *p)
- {
- if((x > 15) || (y > 1))
- {
- return;
- }
- if(0 == y)
- {
- lcd1602_write_data(0x80+x,LCD_WRITE_COM);
- }
- else
- {
- lcd1602_write_data(0x80+0x40+x,LCD_WRITE_COM);
- }
- while(*p != '\0')
- {
- lcd1602_write_data(*p,LCD_WRITE_DATA);
- p++;
- }
- }
- unsigned char AD_read()
- {
- unsigned char temp;
- iic_start();
- iic_send_byte(0x90);
- if(0 == ack) return ERR;
- iic_send_byte(0x40);
- iic_start();
- iic_send_byte(0x90+1);
- if(0 == ack) return ERR;
- }
- temp = iic_rcv_byte();
- iic_noack();
- iic_stop();
- return temp;
- void lcd_dis_char(unsigned char x, unsigned char y, unsigned char byte)
- {
- if((x > 15) || (y > 1))
- {
- return ;
- }
- if(0 == y)
- {
- lcd1602_write_data(0x80 + x,LCD_WRITE_COM);
- }
- else
- {
- lcd1602_write_data(0x80 + 0x40 + x,LCD_WRITE_COM);
- }
- lcd1602_write_data(byte,LCD_WRITE_DATA);
- }
- unsigned char DA_write(unsigned char num)
- {
- iic_start();
- iic_send_byte(0x90);
- if(0 == ack) return ERR;
- iic_send_byte(0x40);
- if(0 == ack) return ERR;
- iic_send_byte(num);
- if(0 == ack) return ERR;
- iic_stop();
- return SUCC;
- }
- void main()
- {
- unsigned char num;
- unsigned char test;
- unsigned char v;
- lcd_init();
- while(1)
- {
- test = AD_read();
- v = test*100 / 51;
- lcd_dis_char(0,0,(test/100)+0x30);
- lcd_dis_char(1,0,(test%100/10)+0x30);
- lcd_dis_char(2,0,(test%10)+0x30);
- lcd_dis_char(0,1,(v/100)+0x30);
- lcd_dis_char(1,1,'.');
- lcd_dis_char(2,1,(v%100)/10+0x30);
- lcd_dis_char(3,1,(v%10)+0x30);
- DA_write(num);
- num++;
- delay_ms(2);
- }
- }
AD/DA的转换
最新推荐文章于 2025-02-08 21:58:20 发布
本文介绍了一种使用51单片机进行IIC接口编程的方法,包括IIC总线的基本操作如启动、停止、发送和接收数据等,并实现通过IIC接口与AT24C02 EEPROM进行数据读写。此外还展示了如何初始化LCD1602显示器并显示数据,以及如何读取AD转换结果。
4462

被折叠的 条评论
为什么被折叠?



