7308|5

47

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

头文件 STC12C5A60S2 [复制链接]

挺好的  大家快下

头文件 STC12C5A60S2系列双串口1T 8051单片机.rar

4.22 KB, 下载次数: 460

此帖出自电源技术论坛

最新回复

感谢分享  详情 回复 发表于 2016-11-15 11:38
点赞 关注
 
 

回复
举报

13

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
谢谢,楼主!!!!!!!!!!!!!!!
此帖出自电源技术论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
感谢楼主!!
此帖出自电源技术论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

4
 

STC12C5A60S2单片机电压表采集问题?

请问:

    有谁用过STC12C5A60S2单片机的,我要用到内部的ad转换模块,我在网上弄了个一路通道的程序,可是我要采集两路的电压,然后对两个数据进行比较,得出最大的值,然后到单片机中进行处理,最后显示出来。

     可是我不知道在选通一个ad通道后,得到数据。然后在采集第二个通道的数据。请各位前辈帮忙指点指点。谢谢!

    下面是通过lcd1602实现的。









#include
#include

//接口定义   
//1602的数据接口为P0      
sbit RSPIN = P2^0;
sbit RWPIN = P2^1;
sbit EPIN =  P2^2;

unsigned char xdata shuzi[]={'0','1','2','3','4','5','6','7','8','9'};


///////////    延时函数/////////////////////////
void delay(unsigned int  t)  //毫秒延时(用在延时不需很精确地情况下)
{  unsigned int xdata j;
   while(--t){
   for(j=600;j>0;j--);}
}

//下面的是1602的驱动   
void testbusy(void)//判忙   
{  
   P0=0xff;
   RSPIN=0;
   RWPIN=1;
  _nop_();  
  _nop_();
   EPIN=1;
   while((P0&0x80)==0x80);
   EPIN=0;
}

void lcdcmd(unsigned char c) //写入命令字符的底层操作         
{  
   RSPIN=0;
   RWPIN=0;
   P0=c;
  _nop_();  
  _nop_();
   EPIN=1;
   _nop_();
   _nop_();
   EPIN=0;
}

void inputcmd(unsigned char c)  //写入名令字符的底层函数        
{
   testbusy();
   //delay(5);
   lcdcmd(c);
}

void lcdwd(unsigned char d)  //写入数据字符的底层函数
{  testbusy();
  // delay(5);
   RSPIN=1;
   RWPIN=0;
   P0=d;
  _nop_();
   _nop_();
   EPIN=1;
   _nop_();
    _nop_();
   EPIN=0;
}

void add (signed char x,signed char y)//确定字符的显示位置            
{
signed char xdata a;
switch(x)
{
case 1:
  a=y;
  break;
case 2:
  a=0x40+y;
  break;
}
a+=0x80;
inputcmd(a);
}
void lcdreset()          //液晶屏初始化        
{
   delay(50);
   inputcmd(0x38);          //0011 1000  四位总线  双行显示  5*7         
   inputcmd(0x38);              
   inputcmd(0x08);               //0000 1000   关显示 关光标  光标不闪
   inputcmd(0x01);               //0000 0001   清屏         
   inputcmd(0x06);               //0000 0110   光标右移  文字不移         
   inputcmd(0x0c);               //0000 1100   开显示 关光标  光标不闪
}
//上面的1602驱动*********************************************************

//此函数用于显示屏幕上固定不变的字符
void _char()
{
    add(1,0);     //确定字符的显示位置        
   lcdwd('V');
   lcdwd('1');
   lcdwd('=');
   add(2,0);
   lcdwd('V');
   lcdwd('2');
   lcdwd('=');
}
//下面的也是我从杜洋工作室的网站上下载的stc12c5a60s2的ad转换有关的函数                  
/*********************************************************************************************
函数名:10位A/D转换初始化函数
调  用:Read_init (?)     
参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无   
结  果:开启ADC功能并设置ADC的输入端口           
备  注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)               
/**********************************************************************************************/
void ADC_init (unsigned char  CHA   )            //CHA选择转换通道   
{  

    CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)                  
    ADC_CONTR = 0x40;                //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
    _nop_();
     _nop_();
    ADC_CONTR |= CHA;       //选择A/D当前通道   
    _nop_();
     P1ASF=0x01;      //选择A/D当前通道     
    _nop_();
    ADC_CONTR |= 0x80;      //启动A/D电源      
    delay(1);            //使输入电压达到稳定(1ms即可)      
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:10位A/D转换函数
调  用:ADC_Read ();
参  数:无     
返回值:无(10位ADC数据高8位存放在ADC_RES中,低2位存放在ADC_RESL中)
结  果:读出指定ADC接口的A/D转换值,并返回数值
备  注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
/**********************************************************************************************/
void ADC_Read (void){

    unsigned char xdata AD_FIN=0; //存储A/D转换标志           
    ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)      
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    while (AD_FIN ==0){     //等待A/D转换结束     
    AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否      
    }
    ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,
}
/**********************************************************************************************/

void main ()  //主函数   
{  
  
   unsigned long int v1;   
   
   EPIN=0;       //1602能使端的初始状态   
   _nop_();  
   _nop_();
   _nop_();
   lcdreset();   //液晶屏初始化   
   ADC_init(0);  //AD转化初始化  选择通道P1^0      
   inputcmd(0x01);   //0000 0001   清屏         
   _char();              //确定要显示的固定不变的显示字符         

while(1)
   {
    delay(500); //读取延时 (此处延时是因为读取电压的速度太快)
   ADC_Read();    //AD转换启动函数           
   _nop_();
   _nop_();
  _nop_();

   v1=ADC_RES*50000/256;   //计算转换结果   
   add(1,3);     //电压数值字符显示开始地址         

   lcdwd(shuzi[(v1/10000)]);  //提取万位
   v1=v1%10000;   // 求余除掉万位
     lcdwd('.');  //一下的数值为小数点后面的数字
   lcdwd(shuzi[(v1/1000)]);   //提取千位
  v1=v1%1000;    //求余去掉千位
   lcdwd(shuzi[(v1/100)]);    //提取百位
  v1=v1%100;     //求余去掉百位
   lcdwd(shuzi[(v1/10)]);     //提取十位
  v1=v1%10;     //求余去掉十位
   lcdwd(shuzi[v1]);
   lcdwd('v');
  }  
   
}
此帖出自电源技术论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢楼主!
此帖出自电源技术论坛
 
 
 

回复

221

帖子

0

TA的资源

一粒金砂(中级)

6
 
感谢分享
此帖出自电源技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表