IIC_AD/DA

来源:互联网 发布:java服务器端环境搭建 编辑:程序博客网 时间:2024/05/01 05:35

主函数文件:

#include <reg52.h>#include <intrins.h>#include "./delay/delay.h"sbit SCL = P1^0;sbit SDA = P1^1;bit ack = 0;sbit RS = P2^4;sbit RW = P2^5;sbit E  = P2^6;#define SUCC 1#define ERR  0#define LCDPORT P0#define LCD_WRITE_DATA 1#define LCD_WRITE_COM  0void lcd1602_write(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_dis_char(unsigned char x, unsigned char y, unsigned char byte){    if((x > 15) || (y > 1)){  return ;}if(0 == y){  lcd1602_write(0x80 + x,LCD_WRITE_COM);}else{  lcd1602_write(0x80 + 0x40 + x,LCD_WRITE_COM);}lcd1602_write(byte,LCD_WRITE_DATA);}void lcd1602_dis_str(unsigned char x, unsigned char y, unsigned char *str){  if((x > 15) || (y > 1)){  return ;}if(0 == y){  lcd1602_write(0x80 + x,LCD_WRITE_COM);}else{  lcd1602_write(0x80 + 0x40 + x,LCD_WRITE_COM);}while(*str != '\0'){  lcd1602_write(*str,LCD_WRITE_DATA);  str++;}}void lcd_init(){  delay_ms(15);  lcd1602_write(0x38,LCD_WRITE_COM);  delay_ms(5);lcd1602_write(0x38,LCD_WRITE_COM);   delay_ms(5);lcd1602_write(0x38,LCD_WRITE_COM);   delay_ms(5);lcd1602_write(0x38,LCD_WRITE_COM);   delay_ms(5);lcd1602_write(0x08,LCD_WRITE_COM);  delay_ms(5);lcd1602_write(0x01,LCD_WRITE_COM);   delay_ms(5);  lcd1602_write(0x06,LCD_WRITE_COM);   delay_ms(5);lcd1602_write(0x0c,LCD_WRITE_COM);   delay_ms(5);}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;  for(i = 0; i < 8; i++)  {  SDA = byte & 0x80;     SCL = 1;  delay_us(1);  SCL = 0;  delay_us(1);  byte <<= 1;}SCL = 1;SDA = 1;delay_us(1);if(0 == SDA){  ack = 1;}else{  ack = 0;}SCL = 0;return ack;}unsigned char iic_rcv_byte(){  unsigned char i;  unsigned char temp;  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;}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;}unsigned char AT24C02_rcv_byte(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;  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;}unsigned char AD_Read(){  unsigned char temp;  iic_start();  iic_send_byte(0x90);  if(0 == ack) return ERR;  iic_send_byte(0x40);  if(0 == ack) return ERR;    iic_start();  iic_send_byte(0x90 + 1);  if(0 == ack) return ERR;  temp = iic_rcv_byte();  iic_noack();  iic_stop();  return temp;}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;}void main(){  unsigned char test;//   unsigned char num;  lcd_init();  while(1){    test = AD_Read(); test = test*50 / 255;  lcd_dis_char(0,0,(test / 10) + 0x30);  lcd_dis_char(1,0,'.');  lcd_dis_char(2,0,(test % 10) + 0x30);//   DA_Write(num);//   num++;  delay_ms(20);}}



延时函数文件:

void delay_us(unsigned char t){    while(--t);}void delay_ms(unsigned char t){    while(t--){        delay_us(245);  delay_us(245);    }}void delay_s(unsigned char t){    while(t--)    {    delay_ms(200);  delay_ms(200);  delay_ms(200);  delay_ms(200);  delay_ms(200);    }}



0 0