3346lkl

    1. 头文件 STC12C5A60S2 5/7324 电源技术 2011-04-24
      请问:     有谁用过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');   }       }
    2. 关于STC12C5A60S2的AD基准电压怎么设置? 10/22623 嵌入式系统 2011-04-24
      请问:     有谁用过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');   }       }
    3. 请问:     有谁用过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');   }       }

最近访客

< 1/1 >

统计信息

已有61人来访过

  • 芯积分:--
  • 好友:--
  • 主题:--
  • 回复:3

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言