51的AD/DA(模数转换)

来源:互联网 发布:中日双边贸易数据 编辑:程序博客网 时间:2024/05/13 08:53
#include <reg52.h>
#include "./delay/delay.h"
#include <stdio.h>
#include <stdlib.h>


#define ERR 0
#define SUCC 1


#define LCDPORT P0
#define LCD_WRITE_DATA 1
#define LCD_WRITE_COM 0


sbit SCL = P2^2;
sbit SDA = P2^3;
bit ack = 0;


sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;


unsigned char shi = 11,fen = 22,miao = 33;
unsigned char time[3];
unsigned char test;
unsigned char flag = 0;
unsigned char buf[10];


//-------------------------------------------------------------------------------------
void lcd_write(unsigned char byte,unsigned char flag)
{
    if(flag)
{
RS = LCD_WRITE_DATA;
}
else 
{
RS = LCD_WRITE_COM;
}
RW = 0;
E = 1;
LCDPORT = byte;
delay_us(10);
E = 0;
}
//-------------------------------------------------------------------------------------
void lcd_dis_char(unsigned char x,unsigned char y,unsigned char byte)
{
    if(y == 0)
{
lcd_write(x + 0x80,LCD_WRITE_COM);
}
else
{
lcd_write(x + 0x80 + 0x40,LCD_WRITE_COM);
}
lcd_write(byte,LCD_WRITE_DATA);
}
//-------------------------------------------------------------------------------------
void lcd_dis_str(unsigned char x,unsigned char y,unsigned char *src)
{
if(y == 1)
{
lcd_write(x + 0x80,LCD_WRITE_COM);
}
else
{
lcd_write(x + 0x80 + 0x40,LCD_WRITE_COM);
}
while(*src != '\0')
{
lcd_write(*src,LCD_WRITE_DATA);
src++;
}
}
//-------------------------------------------------------------------------------------
void lcd_init()
{
 delay_ms(15);
 lcd_write(0x38,LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x38,LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x38,LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x38,LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x08,LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x01,LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x06,LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x0c,LCD_WRITE_COM);
 delay_ms(5);  
}


//-------------------------------------------------------------------------------------
//ÆðʼÐźÅ
void iic_start()
{
SDA = 1;
SCL = 1;
delay_us(1);//2t+12=14
SDA = 0;//ÔÚʱÖÓΪ¸ßµçƽʱ£¬À­µÍÊý¾ÝÏߣ¬²úÉúÆðʼÐźÅ
delay_us(1);
SCL = 0;//ǯס×ÜÏß
}
//-------------------------------------------------------------------------------------
//ÖÕÖ¹ÐźÅ
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Êý¾Ýλ
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;
}
//-------------------------------------------------------------------------------------
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();
return SUCC;
}
//-------------------------------------------------------------------------------------
void lcd_dis_charge()
{
unsigned char t; 
    t = test * 100 / 255;
lcd_write(0x40,LCD_WRITE_COM);//°Ëλһ¸ö×Ô¶¨Ò壬´Ó0x40¿ªÊ¼£¬Ã¿¸ö+°Ëλ

lcd_write(0x0e,LCD_WRITE_DATA);
lcd_write(0x0e,LCD_WRITE_DATA);
lcd_write(0x1f,LCD_WRITE_DATA);

if(t >= 100)
{
lcd_write(0x1f,LCD_WRITE_DATA);
}
else
{
lcd_write(0x11,LCD_WRITE_DATA);
}

if(t >=  75)
{
lcd_write(0x1f,LCD_WRITE_DATA);
}
else
{
lcd_write(0x11,LCD_WRITE_DATA);
}

if(t >=  50)
{
lcd_write(0x1f,LCD_WRITE_DATA);
}
else
{
lcd_write(0x11,LCD_WRITE_DATA);
}

if(t >=  25)
{
lcd_write(0x1f,LCD_WRITE_DATA);
}
else
{
lcd_write(0x11,LCD_WRITE_DATA);
}

lcd_write(0x1f,LCD_WRITE_DATA);

lcd_write(0x80+4,LCD_WRITE_COM);
lcd_write(0x0,LCD_WRITE_DATA);//CGRAMÖÐÒ»¹²¿ÉÒ԰˸ö×Ô¶¨ÒåÄ£ÐÍ£¬Ñ¡ÔñµÚ0¸ö
}
//-------------------------------------------------------------------------------------
//ÇåÆÁ
 void LCD_Clear(void) 
 { 
lcd_write(0x01,LCD_WRITE_COM);
delay_ms(5);
 }
 
 
void main()
{
unsigned char num;
lcd_init();

while(1)
{

   test = AD_Read();
if(255 == test)
{
lcd_dis_char(0,0,test * 100 / 255 / 100 + 0x30);
lcd_dis_char(1,0,'0');
lcd_dis_char(2,0,'0');
lcd_dis_char(3,0,'%');
}
else
{
LCD_Clear();
lcd_dis_char(0,0,test * 100 / 255 / 10 + 0x30);
lcd_dis_char(1,0,test * 100 / 255 % 10 + 0x30);
lcd_dis_char(2,0,'%');
}

lcd_dis_charge();
lcd_dis_char(0,1,test * 100 / 255 * 5 / 100 + 0x30);
lcd_dis_char(1,1,'.');
lcd_dis_char(2,1,test * 100 / 255 * 5 / 10 % 10 + 0x30);
lcd_dis_char(3,1,test * 100 / 255 * 5 % 10 + 0x30);
lcd_dis_char(4,1,'V');

delay_ms(20);

DA_Write(num);
num++;
delay_ms(2);


}
}
0 0
原创粉丝点击