输出模拟

来源:互联网 发布:网络定制蛋糕 编辑:程序博客网 时间:2024/05/17 07:05
/*-----------------------------------------------  名称:IIC协议 PCF8591 AD/DA转换  论坛:www.doflye.net  编写:shifang  修改:无  内容:使用DA输入,数码管显示输出数字量,LED显示模拟电压大小------------------------------------------------*/  #include <reg52.h>                #include "i2c.h"#include "delay.h"#include "display.h"#define AddWr 0x90   //写数据地址 #define AddRd 0x91   //读数据地址sbit RS = P2^6;   //定义端口 sbit RW = P2^5;sbit EN = P2^7;sbit spk = P1^5;sbit P1_1 = P1^1;sbit P1_2 = P1^2;sbit P1_3 = P1^3;sbit P1_4 = P1^4;sbit P1_6 = P1^6;sbit P1_7 = P1^7;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0unsigned char second;unsigned char minute;unsigned char hour;unsigned char flag;unsigned char sflag;unsigned char mflag,j = 5;unsigned char num;extern bit ack;bit WriteDAC(unsigned char dat);/*------------------------------------------------              主程序------------------------------------------------*//*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------*/void DelayUs2x(unsigned char t){    while(--t);}/*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){ while(t--) {     //大致延时1mS     DelayUs2x(245);     DelayUs2x(245); }}/*------------------------------------------------              判忙函数------------------------------------------------*/ bit LCD_Check_Busy(void)  {  DataPort= 0xFF;  RS_CLR;  RW_SET;  EN_CLR;  _nop_();  EN_SET; return (bit)(DataPort & 0x80); }/*------------------------------------------------              写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com)  {  // while(LCD_Check_Busy()); //忙则等待 DelayMs(5); RS_CLR;  RW_CLR;  EN_SET;  DataPort= com;  _nop_();  EN_CLR; }/*------------------------------------------------              写入数据函数------------------------------------------------*/ void LCD_Write_Data(unsigned char Data)  {  //while(LCD_Check_Busy()); //忙则等待 DelayMs(5); RS_SET;  RW_CLR;  EN_SET;  DataPort= Data;  _nop_(); EN_CLR; }/*------------------------------------------------                清屏函数------------------------------------------------*/ void LCD_Clear(void)  {  LCD_Write_Com(0x01);  DelayMs(5); }/*------------------------------------------------              写入字符串函数------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)  {      if (y == 0)     {          LCD_Write_Com(0x80 + x);     //表示第一行    } else     {          LCD_Write_Com(0xC0 + x);      //表示第二行    }         while (*s)     {      LCD_Write_Data( *s);      s ++;         } }/*------------------------------------------------              写入字符函数------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)  {      if (y == 0)     {         LCD_Write_Com(0x80 + x);         }     else     {         LCD_Write_Com(0xC0 + x);         }         LCD_Write_Data( Data);   }/*------------------------------------------------              初始化函数------------------------------------------------*/ void LCD_Init(void)  {   LCD_Write_Com(0x38);    /*显示模式设置*/    DelayMs(5);    LCD_Write_Com(0x38);    DelayMs(5);    LCD_Write_Com(0x38);    DelayMs(5);    LCD_Write_Com(0x38);     LCD_Write_Com(0x08);    /*显示关闭*/    LCD_Write_Com(0x01);    /*显示清屏*/    LCD_Write_Com(0x06);    /*显示光标移动设置*/    DelayMs(5);    LCD_Write_Com(0x0C);    /*显示开及光标设置*/   }void ISR_time() interrupt 1{    unsigned char i;    EA = 0;    TMOD = 0x01;    TH0 = 0x3c;    TL0 = 0xb0;    i++;    if(i == 20)    {        i = 0;        second++;                //flag++;    }        EA = 1;}void time_add(){    if(second == 60)        {            second = 0;            minute++;            sflag = 1;        }        if(minute == 60)        {            minute = 0;            hour++;            mflag = 1;        }        if(hour == 24)        {            hour = 0;        }        if(sflag == 1 && mflag == 1)        {            while(1)            {                while(j--)                {                    spk = !spk;                    DelayMs(1);                }                flag = 1;                if(flag == 1)                {                    sflag = 0;                    mflag = 0;                    flag = 0;                    break;                }                WriteDAC(num);                num++;//连续累加,值从0-255反复循环,并显示在数码管上,                TempData[0]=dofly_DuanMa[num/100];                  TempData[1]=dofly_DuanMa[(num%100)/10];                TempData[2]=dofly_DuanMa[(num%100)%10];                DelayMs(100);            }        }}void keyscanf(void){    if(!P1_1)    {        DelayMs(2);        if(!P1_1)        {            while(!P1_1);            second++;            if(second == 60)             {                second = 0;            }        }    }    if(!P1_2)    {        DelayMs(2);        if(!P1_2)        {            while(!P1_2);            minute++;            if(minute == 60)             {               minute = 0;            }        }    }    if(!P1_3)    {        DelayMs(2);        if(!P1_3)        {            while(!P1_3);                hour++;                if(hour == 24)                 {                hour = 0;                }        }    }    if(!P1_4)    {        DelayMs(2);        if(!P1_4)        {            while(!P1_4);            EA = 0;            ET0 = 0;           }    }    if(!P1_6)    {        DelayMs(2);        if(!P1_6)        {            while(!P1_6);            EA = 1;            ET0 = 1;            TR0 = 1;          }    }    if(!P1_7)    {        DelayMs(2);        if(!P1_7)        {            while(!P1_7);            P0 = 0x00;            second = 0;        }    }}main(){// unsigned char num=0; Init_Timer0(); TMOD = 0x01;TR0 = 1;EA = 1;TH0 = 0x3c;TL0 = 0xb0;ET0 = 1;LCD_Init(); LCD_Clear();//清屏DelayMs(5); while (1)         //主循环  {  time_add();    keyscanf();    LCD_Write_Char(7,0,0x30 + second%10);       LCD_Write_Char(6,0,0x30 + second/10);    LCD_Write_Char(5,0,0x3a);    LCD_Write_Char(4,0,'0' + minute%10);        LCD_Write_Char(3,0,'0' + minute/10);    LCD_Write_Char(2,0,0x3a);    LCD_Write_Char(1,0,'0' + hour%10);      LCD_Write_Char(0,0,'0' + hour/10); //WriteDAC(num);// num++;//连续累加,值从0-255反复循环,并显示在数码管上,// TempData[0]=dofly_DuanMa[num/100];     //TempData[1]=dofly_DuanMa[(num%100)/10]; //TempData[2]=dofly_DuanMa[(num%100)%10];// DelayMs(100);  }}/*------------------------------------------------               写入DA转换数值输入参数:dat 表示需要转换的DA数值,范围是0-255------------------------------------------------*/bit WriteDAC(unsigned char dat){   Start_I2c();               //启动总线   SendByte(AddWr);             //发送器件地址     if(ack==0)return(0);   SendByte(0x40);            //发送器件子地址     if(ack==0)return(0);   SendByte(dat);             //发送数据     if(ack==0)return(0);   Stop_I2c();  }
0 0
原创粉丝点击