在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2690|回复: 3

[求助] 初学单片机做个数码管显示遇到问题请教大家!

[复制链接]
发表于 2010-4-3 16:03:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
用STC12C5410AD的2路AD转换接收0-5V电压信号,MAX7219驱动数码管显示。现在的情况是在程序里开单路AD(P1.0或P1.1)显示其数据正常。但想2路AD同时开,在数码管上前四位显示P1.0的数据,后四位显示P1.1的数据。数码管显示的2路数据却都是P1.1的。应该是程序的问题吧?本人初学基础较差请高手帮我看看问题出在哪?帮我改改程序非常感谢!!
#include <STC12C5410AD.h>   
#define uchar unsigned char
#define uint  unsigned int   
#define DECODE_MODE  0x09  
#define INTENSITY    0x0A  
#define SCAN_LIMIT   0x0B  
#define SHUT_DOWN    0x0C  
#define DISPLAY_TEST 0x0F
#define N 11   
sbit DIN=P1^4;      
sbit CLK=P1^5;
sbit LOAD=P1^6;   
void delayms(uint xms);
void write7219(uchar address,uchar dat);
void max7219_init();
void ad_init();
uchar getad(uchar channel);
uchar ad_av(uchar channel);
void main()
{
uchar b0,s0,g0,b1,s1,g1, ad0_result,ad1_result;
ad_init();
max7219_init();
delayms(1);
while(1)
{
ad0_result=ad_av(0);
ad1_result=ad_av(1);
b0=ad0_result/100;
s0=ad0_result%100/10;
g0=ad0_result%10;
b1=ad1_result/100;
s1=ad1_result%100/10;
g1=ad1_result%10;
   
write7219(1,0);
write7219(2,b0);
write7219(3,s0);
write7219(4,g0);
write7219(5,0);
write7219(6,b1);
write7219(7,s1);
write7219(8,g1);
}
}
void delayms(uint xms)
{
uint i,j;
    for(i=xms;i>0;i--)
     for(j=120;j>0;j--);
}
void ad_init()
{
ADC_CONTR=0xe0 ;  
delayms(20);     
P1M0=0x03;
P1M1=0x03;        
}
uchar getad(uchar channel)
{
uchar AD_finished=0;
uchar result=0;
ADC_DATA&=0;
ADC_CONTR|=channel;   //选择AD通道号
ADC_CONTR|=0x08;      //启动AD转换
while(AD_finished==0) //等待AD转换结束
AD_finished=(ADC_CONTR&0x10);//查询ADC_FLAG位是否置1
ADC_CONTR&=0xef;   //清除转换结束标志
result=ADC_DATA;     
return (result);      //返回结果给函数
}
uchar ad_av(uchar channel)
{
   uchar value_buf[N];
   uchar count,i,j,temp;
   for ( count=0;count<N;count++)
   {
      value_buf[count] = getad(channel);
      delayms(5);
   }
   for (j=0;j<N-1;j++)
   {
      for (i=0;i<N-j;i++)
      {
         if ( value_buf[i]>value_buf[i+1] )
         {
            temp = value_buf[i];
            value_buf[i] = value_buf[i+1];
            value_buf[i+1] = temp;
         }
      }
   }
   return value_buf[(N-1)/2];
}
void write7219(uchar address,uchar dat)
{
uchar i;
LOAD=0;

  for (i=0;i<8;i++)      
  {
   CLK=0;  
     DIN=(bit)(address&0x80);      
     address<<=1;   
     CLK=1;   
   }
   
  for (i=0;i<8;i++)     
  {
   CLK=0;
     DIN=(bit)(dat&0x80);     
     dat<<=1;  
     CLK=1;   
   }
  LOAD=1;              
}
void max7219_init()      
{
write7219(SHUT_DOWN,0x01);      //开启正常工作模式(0xX1)
write7219(DISPLAY_TEST,0x00);   //选择工作模式(0xX0)
write7219(DECODE_MODE,0xff);   //选用全译码模式
write7219(SCAN_LIMIT,0x07);   //几个数码管亮
write7219(INTENSITY,0x04);    //设置初始亮度      
}
 楼主| 发表于 2010-4-3 17:57:24 | 显示全部楼层
高手帮我看看哦,在线等。。。。。。。
 楼主| 发表于 2010-4-3 23:01:05 | 显示全部楼层
郁闷了~~~~~~~~~~~~~~~~~
发表于 2010-5-31 12:35:57 | 显示全部楼层
初学单片机做个数码管显示遇到问题请教大家!
用STC12C5410AD的2路AD转换接收0-5V电压信号,MAX7219驱动数码管显示。现在的情况是在程序里开单路AD(P1.0或P1.1)显示其数据正常。但想2路AD同时开,在数码管上前四位显示P1.0的数据,后四位显示P1.1的数据。数码管显示的2路数据却都是P1.1的。应该是程序的问题吧?本人初学基础较差请高手帮我看看问题出在哪?帮我改改程序非常感谢!!
#include <STC12C5410AD.h>   
#define uchar unsigned char
#define uint  unsigned int   
#define DECODE_MODE  0x09  
#define INTENSITY    0x0A  
#define SCAN_LIMIT   0x0B  
#define SHUT_DOWN    0x0C  
#define DISPLAY_TEST 0x0F
#define N 11   
sbit DIN=P1^4;      
sbit CLK=P1^5;
sbit LOAD=P1^6;   
void delayms(uint xms);
void write7219(uchar address,uchar dat);
void max7219_init();
void ad_init();
uchar getad(uchar channel);
uchar ad_av(uchar channel);
void main()
{
uchar b0,s0,g0,b1,s1,g1, ad0_result,ad1_result;
ad_init();
max7219_init();
delayms(1);
while(1)
{
ad0_result=ad_av(0);
ad1_result=ad_av(1);
b0=ad0_result/100;
s0=ad0_result%100/10;
g0=ad0_result%10;
b1=ad1_result/100;
s1=ad1_result%100/10;
g1=ad1_result%10;
   
write7219(1,0);
write7219(2,b0);
write7219(3,s0);
write7219(4,g0);
write7219(5,0);
write7219(6,b1);
write7219(7,s1);
write7219(8,g1);
}
}
void delayms(uint xms)
{
uint i,j;
    for(i=xms;i>0;i--)
     for(j=120;j>0;j--);
}
void ad_init()
{
ADC_CONTR=0xe0 ;  
delayms(20);     
P1M0=0x03;
P1M1=0x03;        
}
uchar getad(uchar channel)
{
uchar AD_finished=0;
uchar result=0;
ADC_DATA&=0;
ADC_CONTR|=channel;   //选择AD通道号
ADC_CONTR|=0x08;      //启动AD转换
while(AD_finished==0) //等待AD转换结束
AD_finished=(ADC_CONTR&0x10);//查询ADC_FLAG位是否置1
ADC_CONTR&=0xef;   //清除转换结束标志
result=ADC_DATA;     
return (result);      //返回结果给函数
}
uchar ad_av(uchar channel)
{
   uchar value_buf[N];
   uchar count,i,j,temp;
   for ( count=0;count<N;count++)
   {
      value_buf[count] = getad(channel);
      delayms(5);
   }
   for (j=0;j<N-1;j++)
   {
      for (i=0;i<N-j;i++)
      {
         if ( value_buf[i]>value_buf[i+1] )
         {
            temp = value_buf[i];
            value_buf[i] = value_buf[i+1];
            value_buf[i+1] = temp;
         }
      }
   }
   return value_buf[(N-1)/2];
}
void write7219(uchar address,uchar dat)
{
uchar i;
LOAD=0;

  for (i=0;i<8;i++)      
  {
   CLK=0;  
     DIN=(bit)(address&0x80);      
     address<<=1;   
     CLK=1;   
   }
   
  for (i=0;i<8;i++)     
  {
   CLK=0;
     DIN=(bit)(dat&0x80);     
     dat<<=1;  
     CLK=1;   
   }
  LOAD=1;              
}
void max7219_init()      
{
write7219(SHUT_DOWN,0x01);      //开启正常工作模式(0xX1)
write7219(DISPLAY_TEST,0x00);   //选择工作模式(0xX0)
write7219(DECODE_MODE,0xff);   //选用全译码模式
write7219(SCAN_LIMIT,0x07);   //几个数码管亮
write7219(INTENSITY,0x04);    //设置初始亮度      
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-9-29 03:32 , Processed in 0.016577 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表