专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机驱动ADC0808电路图C51及汇编程序

作者:佚名   来源:本站原创   点击数:  更新时间:2013年11月13日   【字体:

        这两天刚刚完成了一个用C编写的程序,这是我第一个用C语言编写的程序,并且调试成功。

        第一个C程序,值得纪念,也值得以后参考。

        本程序的功能是:

          1.ADC0808转换功能;

   2.数据16进制显示;

          3.串行通信数据。

 


C51程序:工程文件下载: http://www.51hei.com/f/0808_c.rar

#include<absacc.h>
#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int
sbit START=P3^6;  //启动转换
sbit OE=P3^5;     //输出允许
sbit EOC=P3^7;    //转换结束
sbit WC=P3^4;     //通道选择
sbit WB=P3^3;     //通道选择
sbit WA=P3^2;     //通道选择
uchar data  led[12];
signed data  data1;
signed data  data2;
signed data  data3;
signed data  data4;
signed data  data5;
signed data  data6;
signed data  data7;
uchar code  tv[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb};
uchar code  dc[]={0xC0,  //"0"
                0xF9,  //"1"
                0xA4,  //"2"
                0xB0,  //"3"
                0x99,  //"4"
                0x92,  //"5"
                0x82,  //"6"
                0xF8,  //"7"
                0x80,  //"8"
                0x90,  //"9"
                0x88,  //"A"
                0x83,  //"B"
                0xC6,  //"C"
                0xA1,  //"D"
                0x86,  //"E"
                0x8E,  };//"F"};/十六进制显示方式
void delay(void)                      //延时程序
{
  uint i;
  for(i=0;i<10;i++);
}
void ledxianshi(void)       //显示模块
{
  uchar k,i;
  led[0]=data1%16;        //编码1个位
  led[1]=data1/16%16;     //编码1十位

  led[2]=data2%16;        //数据1个位
  led[3]=data2/16%16;     //数据1十位

  led[4]=data3%16;        //编码2个位
  led[5]=data3/16%16;     //编码2十位

  led[6]=data4%16;        //数据2个位
  led[7]=data4/16%16;     //数据2十位

  led[8]=data5%16;        //编码3个位
  led[9]=data5/16%16;     //编码3十位

  led[10]=data6%16;        //数据3个位
  led[11]=data6/16%16;     //数据3十位

  for(k=0;k<12;k++)
  {
   P2=tv[k];  //位选用
   i=led[k];
   P1=dc[i];  //段码数显示
   delay();
  }
}

void csh(void)
 {
 SM0=0;
 SM1=1;
 REN=1;
 TI=0;
 RI=0;
 PCON=0;
 TH1=0xF3;
 TL1=0XF3;
 TMOD=0X20;
 EA=1;
 ET1=0;
 ES=1;
 TR1=1;

 TI=0;
 SBUF=data1;
 while(!TI);
 TI=0;
 SBUF=data2;
 while(!TI);
 TI=0;
 SBUF=data3;
 while(!TI);
 TI=0;
 SBUF=data4;
 while(!TI);
 TI=0;
 SBUF=data5;
 while(!TI);
 TI=0;
 SBUF=data6;
 while(!TI);
 TI=0;
 }
void ad1(void)
{
 WA=0;            //通道1
    WB=0;
    WC=0;
    START=1;
    START=0;          //启动转换
    while(EOC==0);    //转换结束信号,为0则说明转换结束
    OE=1;             //输出允许信号,为真,可以输出
    data7=P0;       //P0口的测量值送到TVDATE
    OE=0;             //关输出允许
}
void ad2(void)
{
 WA=1;            //通道1
    WB=0;
    WC=0;
    START=1;
    START=0;          //启动转换
    while(EOC==0);    //转换结束信号,为0则说明转换结束
    OE=1;             //输出允许信号,为真,可以输出
    data4=P0;       //P0口的测量值送到TVDATE
    OE=0;             //关输出允许
}
void ad3(void)
{
 WA=0;            //通道1
    WB=1;
    WC=0;
    START=1;
    START=0;          //启动转换
    while(EOC==0);    //转换结束信号,为0则说明转换结束
    OE=1;             //输出允许信号,为真,可以输出
    data6=P0;       //P0口的测量值送到TVDATE
    OE=0;             //关输出允许
}
void main(void)
{
    data1=0X01;
    data3=0X02;
    data5=0X03;
 ad1();
 ad2();
 ad3();
 loop:
 ledxianshi();
 ad1();
 if ((data7-data2)>0)
 {
 data2=data7;
 ad2();
 ad3();
 csh();
 goto loop ;
 }
 else
 goto loop ;

 }

----------------------------------------------------------------------------------
A51汇编程序:

   ;;;;;;;;;;;;;;;;;;;;;;;;;;;
    DATA1    DATA    60H
    DATA2    DATA    61H
    DATA3    DATA    62H
    DATA4    DATA    63H
    DATA5    DATA    64H
    DATA6    DATA    65H
    DATA7    DATA    66H
    DATA8    DATA    67H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LDATA    DATA    54H
;;;;;;;;;;;;;;;;;;;;;;;
    EOC BIT P3.7            ;接口定义
    ST  BIT P3.6
    OE  BIT P3.5
    WC  BIT P3.4
    WB  BIT P3.3
    WA  BIT P3.2
    K1  BIT P2.4
    K2  BIT P2.5
    K3  BIT P2.6
    K4  BIT P2.7
    ORG 0000H
    AJMP SEND
    ORG 0030H
SEND:     MOV   TMOD,#20H            ;串口初始化
          MOV   TH1,#0F3H            ;传输波特率2400
          MOV   TL1,#0F3H
          MOV   SCON,#50H
          MOV   PCON,#00H
          SETB  TR1
          MOV DATA1,#01H             ;识别码定义,每个识别码对应一个数据
          MOV DATA3,#02H
          MOV DATA5,#03H
LP1: CLR WB   ;AD口选择:000位通道0数据
     CLR WA
     CLR WC
     CLR  ST
     SETB ST
     CLR  ST
     JNB EOC,$
     SETB OE
     MOV DATA2,P0    ;将临时存储器上的数据送给数据1
LP2: CLR WC          ;AD口选择:001位通道1数据
     CLR WB
     SETB WA
     CLR  ST
     SETB ST
     CLR  ST
     JNB EOC,$
     SETB OE
     MOV DATA4,P0    ;将检测的数据送给数据2
     CLR OE
LP3: CLR WC          ;AD口选择:010位通道2数据
     SETB WB
     CLR WA
     CLR  ST
     SETB ST
     CLR  ST
     JNB EOC,$
     SETB OE
     MOV DATA6,P0    ;将检测的数据送给数据3
     CLR OE
     LCALL TT0       ;调用串口数据传输程序
LP:  LCALL LEDSHOW   ;调用显示程序
     CLR WC
     CLR WB
     CLR WA
     CLR  ST
     SETB ST
     CLR  ST
     JNB EOC,$
     SETB OE
     MOV LDATA,P0    ;将通道0的检测数据送送给临时存储器
     CLR OE
     MOV A,LDATA
     CJNE A,DATA2,DADA    ;数据1不等于临时数据,跳转到数据比较,
     AJMP LP              ;如果相等,执行这条指令;
DADA:JC XIXI              ;临时数据小于数据1,跳转到小值指令;
     AJMP LP1             ;临时数据大于数据1,跳到重新判断三个数据值
XIXI:AJMP LP              ;数据1小于临时数据,执行这条指令,继续判断;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TT0:      MOV SBUF,DATA1 ;编码1送入串口SBUF
SENT0:    JBC TI,SENWT1  ;判断发送是否完成,完成则跳到SENWT1,没有完成,执行下一条指令
          LCALL LEDSHOW  ;调用数据显示程序
          SJMP SENT0     ;返回继续检测发送完成指令
SENWT1:   CLR TI         ;关闭发送
          MOV SBUF ,DATA2;将数据1送入串口SBUF
SENWT2:   JBC TI,SENWT3  ;判断发送是否完成,完成则跳到SENWT3,没有完成,执行下一条指令
          LCALL LEDSHOW  ;
          AJMP SENWT2    ;返回继续检测发送完成指令
SENWT3:   CLR TI         ;关闭发送
                         ;以下程序相同功能,发送另外两组数据
TT0_2:    MOV SBUF,DATA3 ;
SENT0_2:  JBC TI,SENWT1_2;
          LCALL LEDSHOW  ;
          SJMP SENT0_2   ;
SENWT1_2: CLR TI         ;
          MOV SBUF ,DATA4;
SENWT2_2: JBC TI,SENWT3_2;
          LCALL LEDSHOW  ;
          AJMP SENWT2_2  ;
SENWT3_2: CLR TI         ;
                         ;
TT0_3:    MOV SBUF,DATA5 ;
SENT0_3:  JBC TI,SENWT1_3;
          LCALL LEDSHOW  ;
          SJMP SENT0_3   ;
SENWT1_3: CLR TI         ;
          MOV SBUF ,DATA6;
SENWT2_3: JBC TI,SENWT3_3;
          LCALL LEDSHOW  ;
          AJMP SENWT2_3  ;
SENWT3_3: CLR TI         ;
          RET            ;数据发送完成,退出子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;数据显示
LEDSHOW:  MOV R1,#60H
          MOV P2,#0F0H
LEDSHOW_1:
          MOV A,@R1
          MOV B,#16
          DIV AB
          LCALL LED
          INC P2
          MOV A,B
          LCALL LED
          INC P2

          INC R1
          MOV A,R1
          CJNE A,#66H,LEDSHOW_1
          RET
;;;;;;;;;;;;;;数码管显示
LED:  MOV DPTR,#TABLE
      MOVC A,@A+DPTR
      MOV P1,A
      LCALL DELAY1
      RET
TABLE:   
   DB  0C0H        ;"0"
   DB  0F9H        ;"1"
   DB  0A4H        ;"2"
   DB  0B0H        ;"3"
   DB   99H        ;"4"
   DB   92H        ;"5"
   DB   82H        ;"6"
   DB  0F8H        ;"7"
   DB   80H        ;"8"
   DB   90H        ;"9"
   DB  0C8H        ;"A"
   DB  083H        ;"B"
   DB  0C6H        ;"C"
   DB  0A1H        ;"D"
   DB  086H        ;"E"
   DB  08EH        ;"F"
   DB  0BFH        ;"-"
DELAY1:
       MOV R7,#10
L1:    MOV R6,#50
       DJNZ R6,$
       DJNZ R7,L1
       RET
DELAY:
       MOV R5,#250
D1:    MOV R6,#200
D2:    DJNZ R6,D2
       DJNZ R5,D1
       RET
       END

关闭窗口

相关文章