打印

求程序怎么写。。。。

[复制链接]
1645|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我用第一张图的两个573,分别控制8位数码管的段和位,通过单片机处理A/D的值控制20格音量,(我只用了8位中的两位显示)这样行,程序在下面。        但我用第二张图,用一个573,控制2位数码管的段选接P2.0口,数据接P0口,位选分别接单片机的P2.1,P2.2,A/D部分SCL接P2.3,SDA接P2.4,同样要显示20格音量的变化可程序不对,怎么写??就教。

第一张图程序
#include <reg52.h>
#include<intrins.h>               
#define AddWr 0x90   //写数据地址
#define AddRd 0x91   //读数据地址
#define  _Nop()  _nop_()  //定义空指令
#define DataPort P0
#define uchar unsigned char
#define uint unsigned int
sbit duan=P2^0;
sbit wei=P2^1;
sbit SDA=P2^2;
sbit SCL=P2^3;                       
bit ack;               //应答标志位
unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char TempData[8]; //存储显示值的全局变量
void DelayUs2x(unsigned char t)
{   
while(--t);
}
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
  DelayUs2x(245);
}
}
void Display(unsigned char FirstBit,unsigned char Num)
{
      static unsigned char i=0;
    DataPort=0;
    duan=1;     //段锁存
       duan=0;
       DataPort=WeiMa[i+FirstBit]; //取位码
       wei=1;     //位锁存
       wei=0;
       DataPort=TempData; //取显示数据,段码
       duan=1;     //段锁存
       duan=0;
      
    i++;
       if(i==Num)
       i=0;

}
void Init_Timer0(void)
{
TMOD |= 0x01;
TH0=(65536-2000)/256;    //重新赋值 2ms
TL0=(65536-2000)%256;   //使用模式1,16位定时
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2000)/256;    //重新赋值 2ms
TL0=(65536-2000)%256;

Display(0,2);//第0位显示,显示2位
}

void Start_I2c()
{
  SDA=1;   //发送起始条件的数据信号
  _Nop();
  SCL=1;
  _Nop();    //起始条件建立时间大于4.7us,延时
  _Nop();
  _Nop();
  _Nop();
  _Nop();   
  SDA=0;     //发送起始信号
  _Nop();    //起始条件锁定时间大于4μ
  _Nop();
  _Nop();
  _Nop();
  _Nop();      
  SCL=0;    //钳住I2C总线,准备发送或接收数据
  _Nop();
  _Nop();
}
void Stop_I2c()
{
  SDA=0;    //发送结束条件的数据信号
  _Nop();   //发送结束条件的时钟信号
  SCL=1;    //结束条件建立时间大于4μ
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  SDA=1;    //发送I2C总线结束信号
  _Nop();
  _Nop();
  _Nop();
  _Nop();
}
void  SendByte(unsigned char c)
{
unsigned char BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
    {
     if((c<<BitCnt)&0x80)SDA=1;   //判断发送位
       else  SDA=0;               
     _Nop();
     SCL=1;               //置时钟线为高,通知被控器开始接收数据位
      _Nop();
      _Nop();             //保证时钟高电平周期大于4μ
      _Nop();
      _Nop();
      _Nop();         
     SCL=0;
    }
   
    _Nop();
    _Nop();
    SDA=1;               //8位发送完后释放数据线,准备接收应答位
    _Nop();
    _Nop();   
    SCL=1;
    _Nop();
    _Nop();
    _Nop();
    if(SDA==1)ack=0;     
       else ack=1;        //判断是否接收到应答信号
    SCL=0;
    _Nop();
    _Nop();
}

unsigned char  RcvByte()
{
  unsigned char retc;
  unsigned char BitCnt;
  
  retc=0;
  SDA=1;             //置数据线为输入方式
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop();           
        SCL=0;       //置时钟线为低,准备接收数据位
        _Nop();
        _Nop();      //时钟低电平周期大于4.7us
        _Nop();
        _Nop();
        _Nop();
        SCL=1;       //置时钟线为高使数据线上数据有效
        _Nop();
        _Nop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
        _Nop();
        _Nop();
      }
  SCL=0;   
  _Nop();
  _Nop();
  return(retc);
}
void NoAck_I2c(void)
{
  
  SDA=1;
  _Nop();
  _Nop();
  _Nop();      
  SCL=1;
  _Nop();
  _Nop();              //时钟低电平周期大于4μ
  _Nop();
  _Nop();
  _Nop();  
  SCL=0;                //清时钟线,钳住I2C总线以便继续接收
  _Nop();
  _Nop();   
}
unsigned char ReadADC(unsigned char Chl)
{
   unsigned char Val;
   Start_I2c();               //启动总线
   SendByte(AddWr);             //发送器件地址
     if(ack==0)return(0);
   SendByte(0x40|Chl);            //发送器件子地址
     if(ack==0)return(0);
   Start_I2c();
   SendByte(AddWr+1);
      if(ack==0)return(0);
   Val=RcvByte();
   NoAck_I2c();                 //发送非应位
   Stop_I2c();                  //结束总线
  return(Val);
}
main()
{
unsigned char num=0;
Init_Timer0();

while (1)         //主循环
   {
   
  num=ReadADC(0);
  DelayMs(5);
   switch(num)
   {
   case 0x00:
       TempData[0]=DuanMa[0];
       TempData[1]=DuanMa[0];break;//音量0
   case 0x0c:
       TempData[0]=DuanMa[0];
       TempData[1]=DuanMa[1];break;//音量1
   case 0x19:
       TempData[0]=DuanMa[0];
       TempData[1]=DuanMa[2];break;//音量2
   case 0x26:
       TempData[0]=DuanMa[0];
       TempData[1]=DuanMa[3];break;//音量3
   case 0x33:
       TempData[0]=DuanMa[0];
       TempData[1]=DuanMa[4];break;//音量4
   case 0x40:
       TempData[0]=DuanMa[0];
       TempData[1]=DuanMa[5];break;//音量5
   case 0x4d:
       TempData[0]=DuanMa[0];
       TempData[1]=DuanMa[6];break;//音量6
   case 0x5a:
       TempData[0]=DuanMa[0];
       TempData[1]=DuanMa[7];break;//音量7
   case 0x67:
       TempData[0]=DuanMa[0];
       TempData[1]=DuanMa[8];break;//音量8
   case 0x74:
       TempData[0]=DuanMa[0];
       TempData[1]=DuanMa[9];break;//音量9
   case 0x81:
       TempData[0]=DuanMa[1];
           TempData[1]=DuanMa[0];break;//音量10
   case 0x8e:
       TempData[0]=DuanMa[1];
           TempData[1]=DuanMa[1];break;//音量11
   case 0x9b:
       TempData[0]=DuanMa[1];
           TempData[1]=DuanMa[2];break;//音量12
   case 0xa8:
       TempData[0]=DuanMa[1];
           TempData[1]=DuanMa[3];break;//音量13
   case 0xb5:
       TempData[0]=DuanMa[1];
           TempData[1]=DuanMa[4];break;//音量14
   case 0xc2:
       TempData[0]=DuanMa[1];
           TempData[1]=DuanMa[5];break;//音量15
   case 0xcf:
       TempData[0]=DuanMa[1];
           TempData[1]=DuanMa[6];break;//音量16
   case 0xdc:
       TempData[0]=DuanMa[1];
           TempData[1]=DuanMa[7];break;//音量17
   case 0xe9:
       TempData[0]=DuanMa[1];
           TempData[1]=DuanMa[8];break;//音量18
   case 0xf6:
       TempData[0]=DuanMa[1];
           TempData[1]=DuanMa[9];break;//音量19
   case 0xff:
       TempData[0]=DuanMa[2];
           TempData[1]=DuanMa[0];break;//音量20
   }
   }
}



相关帖子

沙发
kan_cb| | 2013-5-9 15:21 | 只看该作者
这个我没话说,因为我不喜欢看超长的程序,而且问题又那么笼统,外加这个什么字体我的眼睛都快模糊了,这个程序利用PCF8591的模数转换,(哪里有音频输入明明就只有一个滑动变阻器在模拟),通过IIC协议传输数据到单片机,再让单片机驱动573做锁存显示。这个是单片机学习里面的基础课程

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

5

帖子

0

粉丝