2343258 发表于 2011-5-20 13:06:46

STC12c5a60s2 AD 数码管驱动 没图有真相

#include "intrins.H"
#include "STC12C5A60S2.H"
#define AD_SPEED 0x60         //0110,0000   11   90个时钟周期转换一次
#define uchar unsigned char
#define uintunsigned int
sbit P24 = P2 ^ 4; //千位
sbit P25 = P2 ^ 5; //百位
sbit P26 = P2 ^ 6; //十位
sbit P27 = P2 ^ 7; //个位
sbit P07 = P0 ^ 7; //小数点
uchar DATA_LED={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF};
//延时函数
//---------------------------------------------------------------------
void delay(uchar delay_time)      
{
    uint n;
    while(delay_time--)
    {
      n = 600;
      while(--n);
    }
}
//数码管显示及数据处理程序
//---------------------------------------------------------------------
void led(uint n)         
{
   P0 = 0xFF;
   P0 = DATA_LED;                  //个位
   P27 = 0;
   delay(1);
   P27 = 1;

   P0 = 0xFF;
   P0 = DATA_LED;    //十位
   P26 = 0;
   delay(1);
   P26 = 1;

   P0 = 0xFF;
   P0 = DATA_LED;   //百位
   P25 = 0;
   delay(1);
   P25 = 1;

   P0 = 0xFF;
   P0 = DATA_LED;//千位
   P24 = 0;
   P07=0;                                                  //千位显示小数点
   delay(1);                                                  
   P24 = 1;
}
//AD转换函数
//---------------------------------------------------------------------
uint get_AD_result(uchar channel)   
{
    uchar AD_finished=0;            //存储 A/D 转换标志
    ADC_RES = 0;                  //高八位
    ADC_RESL = 0;                   //低二位(本例未使用)
    channel &= 0x07;                //0000,0111 清0高5位
    ADC_CONTR = AD_SPEED;                        //定义A/D转换速度
    _nop_();
    ADC_CONTR |= channel;         //选择 A/D 当前通道
    _nop_();
    ADC_CONTR |= 0x80;            //启动 A/D 电源
    delay(1);                     //使输入电压达到稳定
        ADC_CONTR |= 0x08;            //0000,1000 令 ADC_START = 1, 启动A/D转换,
    AD_finished = 0;
    while (AD_finished ==0 )      //等待A/D转换结束
    {
      AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
    }
    ADC_CONTR &= 0xE7;            //1110,0111 清 ADC_FLAG 位, 关闭A/D转换,
    return (ADC_RES);               //返回 A/D 高 8 位转换结果
}
//主函数
//---------------------------------------------------------------------
void main()
{
    uint ADC_result;
    P1ASF = 0x01;                     //0000,0001, 将 P1.0 置成模拟口
    AUXR1 &= 0x00;                  //0000,0000, 令 ADRJ=0 : 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
    ADC_CONTR |= 0x80;                //1000,0000 打开 A/D 转换电源
    while(1)
    {
      ADC_result = get_AD_result(0);//根据参数可改变A/D通道。
      led(ADC_result*17.3);         //显示数值。 17.4 是AD转换系数,实际显示值等于:系数*ADC_result=vin/vcc*256(8位)
           }
}

2343258 发表于 2011-5-20 13:07:55

沙发自已占!

2343258 发表于 2011-5-20 20:33:02

没人顶!我自己顶!

xiaobendan 发表于 2011-5-20 20:54:33

啥意思?

erxun 发表于 2011-5-20 20:59:04

楼主看看我刚才发的帖子,http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4754105,
数码管的驱动,不要老是教科书上面的思维,换个思路呗~~~

2343258 发表于 2011-5-20 22:35:20

回复【4楼】erxun 老孟
-----------------------------------------------------------------------

在下是新手目前追求简单能用,高深的学不来。

2343258 发表于 2011-5-20 22:38:22

回复【3楼】xiaobendan 仲跻东
-----------------------------------------------------------------------

没啥意思!我想这些东西会有一些人用到,就贴出来了。

xiaobendan 发表于 2011-5-23 12:19:18

我以为是哪里有问题,但是却没有提问,哈哈
感谢您的无私

wdc014 发表于 2011-5-31 09:18:16

非常受用,感谢楼主

2343258 发表于 2011-12-10 23:19:12

vvbvbvbvb

jacky2011 发表于 2011-12-12 22:55:14

好人一个

2343258 发表于 2011-12-16 11:23:14

自己再顶一下
./emotion/em025.gif

jqfsjt 发表于 2011-12-16 12:22:51

mark

auto01 发表于 2012-2-12 21:00:11

mark一下

ResetLife 发表于 2012-5-21 12:03:12

多谢楼主的AD例程

lijinen 发表于 2012-6-11 00:44:20

学习学习顶一下。。。

ym7205 发表于 2012-6-12 17:48:11

顶      
页: [1]
查看完整版本: STC12c5a60s2 AD 数码管驱动 没图有真相