专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于51单片机的TLC5615电压发生器

作者:佚名   来源:本站原创   点击数:  更新时间:2012年02月01日   【字体:
//本程序是基于51单片机的,可由矩阵键盘设置TLC5615 ad芯片要输出的电压值,
//并由1602液晶屏显示输入的电压值.
//完整代码下载: http://www.51hei.com/f/TLC56151602.rar 
//此程序测试成功,51hei版权所有,如果需要应用到你的项目中只需更改端口即可
#include "reg51.h"
#include"intrins.h"     //_nop_();延时函数用
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P2^5;                 //三线控制
sbit DIN=P2^4;
sbit CS=P2^6;
sbit rs=P0^0;//命令/数据选择
sbit rw=P0^1;//读写口
sbit e=P0^2; //锁存控制
uchar data  dis1[15]={"output volt is:"};     //显示两行
uchar data  dis2[13]={".V"};
float vout;//系统输出电压
int shuzi;//给da数字量
int ge,shifen,baifen;//定义个位十分位百分位
unsigned int Data[10] = {0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039};
//延时函数
delay(uint z)
{
 uint i,j;
 for(i=0;i<z;i++)
 for(j=0;j<120;j++);
}
//键盘扫描函数
 saomiao (  )
{  
    unsigned char X,Y,Z;

 P3=0x0f;         //对P3置数进行行扫描
 if(P3!=0x0f)     //判断是否有键按下
 {delay(40);      //延时去抖动,一般为5ms~10ms(由于机械触点的弹性作用,按键在闭合时不会马上稳定地接通,
                  //而在闭合瞬间伴随有一连串的抖动,键抖动会引起一次按键被误读多次)
  if(P3!=0x0f)    //确认按键按下
 {
 X=P3;            //保存行扫描时有键按下时状态
 P3=0xf0;         //列扫描
 Y=P3;            //保存列扫描时有键按下时状态
  Z=X|Y;           //取出键值
return(Z);
} 
// 取值转换
void fa5615(uint ad)
{
 uchar i;
 CS=0;//CS拉低,开始送转换数值;
 _nop_();
 for(i=0;i<16;i++)
 {
  if((ad&0x8000)!=0)
  {DIN=1;}
  else
  {DIN=0;}
  CLK=1;
  _nop_();_nop_();
  CLK=0;
  ad=ad<<1
  _nop_();_nop_();
 }

CLK=0;
_nop_();_nop_();
CS=1;
}
//向LCD写一命令
wcode(uchar t)
{
 rs=0;//写的是命令
 rw=0;//写状态
 e=1;
 P1=t;
 delay(7);
 e=0;//数据的锁定
}
//向LCD写数据
wdata(uchar t)
{
 rs=1;//写的是数据
 rw=0;//写状态
 e=1;
 P1=t;
 delay(7);
 e=0;//数据的锁定
}
//功能:LCD显示第一行
xian1()
{
  uchar i;


  wcode(0x81);   //设置第一行显示地址

  for(i=0;i<15;i++)
    {
      wdata(dis1[i]);
    }
}


//************************************************************************************
//功能:LCD显示第二行
//************************************************************************************

xian2()
{
   uchar i;

   wcode(0xc0);   //设置第二行显示地址

   for(i=0;i<13;i++)
    {
      wdata(dis2[i]);
    }
}
//功能:LCD 初始化  InitLCD
//************************************************************************************
InitLCD()
   {
    
   wcode(0x01);   //清屏

   wcode(0x06);   //输入方式控制

   wcode(0x0e);   //显示开关控制

   wcode(0x38);   //功能设定:设置16x2显示,5x7显示,8位数据接口 
    
   } 
//功能:数据分离和显示并给数据送DA输出
fenxiaoout(float Vo)
{
 ge=Vo*100/100;//分离得到个位值
 shifen=Vo*100;
 shifen=shifen%100/10;//十分位
 baifen=Vo*100;
 baifen=baifen%100%10;//百分位
 wcoad(0xc4);//设置个位显示地址
 wdata(Data[ge]);//显示个位
 wcode(0xc5);//设置第二行中小数点的显示地址
 wdata(dis2[0]);//显示小数点
    wcode(0xc6);        //设置分位的显示地址
 wdata(Data[shifen]);//显示十分位
    wdata(Data[baifen]);//显示百分位

    wcode(0xca);        //设置单位伏特V的显示地址
    wdata(dis2[1]);  //显示单位伏特"V"


 shuzi=(vout/4.92)*1024*4;
    fa5615(shuzi);

}  
 //解码函数
uchar chuli(uchar tt)
{
  switch(tt)
  {
   case 0xee:
   {
   vout=vout+1.0;
   if(vout>4.5)vout=2.0;
   fenxianout(vout);
   return(0);
   break;
   }
   case 0xde:
   {
   vout=vout-1.0;
   if(vout<0) vout=2.0;
   fenxianout(vout);
   return(1);
   break;
   }
  
    
   case 0xbe:  
   {
   vout=vout+0.1;
   if(vout>4.5)vout=2.0;
   fenxianout(vout);

   return(2);
   break;
   } 

   case 0x7e:
   {

   vout=vout-0.1;
   if(vout<0) vout=2.0;
 
   fenxianout(vout);
   return(3);
   break;
   }
    
 
   default:{return(0x10);break;} 
  }
  
}
main()
{


   uchar kk=0xff;//键盘扫描返回码11111111
 

   InitLCD();    //初始化1602

   vout=2.00;
   fenxianout(vout);
    

   xian1();        //显示第一行   

 
  while(1)
   {
      
  kk=saomiao();     //扫描键盘
     chuli(kk); //按键处理
   
 
   }
}
关闭窗口

相关文章