忘川 发表于 2013-8-28 00:10:18

整了一天的角度传感器AD转化 虽然有显示 但还有问题 求...

先贴代码:
#include<stc12c5a60s2.h>
#include<intrins.h>
#include<stdio.h>
#include"LCD1602.h"
#define uchar unsigned char
#define uintunsigned int
#define FOSC    11059200L        //选择外部晶振
#define BAUD    9600

typedef unsigned char BYTE;
typedef unsigned int WORD;

/*申报相关SFR ADC*/
//sfr ADC_CONTR   =   0xBC;         //ADC control registerADC控制寄存器地址为BCH
//sfr ADC_RES   =   0xBD;         //ADC high 8-bit result register ADC转换结果寄存器高八位地址
sfr ADC_LOW2    =   0xBE;         //ADC low 2-bit result register
//sfr P1ASF       =   0x9D;         //P1 secondary function control register        P1辅助控制寄存器地址

/*定义常量的ADC的若干ADC操作*/
#define ADC_POWER   0x80 //打开AD转换开关
#define ADC_FLAG    0x10 //模数转换结束标志位
#define ADC_START   0x08 //模数转换启动控制位
#define ADC_SPEEDLL 0x00            //420 clocks
#define ADC_SPEEDL0x20            //280 clocks
#define ADC_SPEEDH0x40            //140 clocks
#define ADC_SPEEDHH 0x60            //70 clocks
void LCD();
void Init_Uart();
void InitADC();
void SendData(BYTE dat);
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
void ShowResult(BYTE ch);


void ShowResult(BYTE ch)
{
    SendData(ch);                   //Show Channel NO.
    SendData(GetADCResult(ch));   //Show ADC high 8-bit result

//if you want show 10-bit result, uncomment next line
//    SendData(ADC_LOW2);             //Show ADC low 2-bit result
}
/*延时函数*/
void Delay(WORD n)
{
    WORD x;

    while (n--)
    {
      x = 5000;
      while (x--);
    }
}
/*得到ADC 结果*/
BYTE GetADCResult(BYTE ch)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    _nop_();                        //Must wait before inquiry
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC

    return ADC_RES;               //Return ADC result

}

/* SendData发送数据*/
void SendData(BYTE dat)
{
    while (!TI);                  //Wait for the previous data is sent
    TI = 0;                         //Clear TI flag
    SBUF = dat;                     //Send current data
}

/*ADC初始化*/
void ADC_init()
{
        P1ASF = 0x01;                   //Open 8 channels ADC function
    ADC_RES = 0;                  //Clear previous result
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    Delay(2);                     //ADC power-on and delay
}
/*初始化 UART 通用异步收发传输器*/
void Uart_init()
{
        SCON = 0x5a;                  //8 bit data ,no parity bit        串口控制寄存器
    TMOD = 0x20;                  //T1 as 8-bit auto reload
    TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
    TR1 = 1;                                                //T1 start running
}
/*LCD程序*/
void lcd()
{
        LCD_init();
        DelayMs(15);       //延时保证信号稳定
        sprintf(Test1,"angle:%04d",ADC_RES); //打印输出第一行信息 //16位空格
        ShowString(0,Test1);
}


void main()
{          uchar i;
    Uart_init();                     //Init UART, use to show ADC result
    ADC_init();                      //Init ADC sfr
    while (1)
    {       
                for(i=0;i<10;i++)
                {
               LCD();
               Delay(2);
               }
      ShowResult(0);            //Show Channe0
    }
}




#ifndef _LCD1602_H_
#define _LCD1602_H_
#define uchar unsigned char
#define uintunsigned int
#define DataP0//数据端口
sbit RS = P2^4; //Pin4   数据/命令选择位定义
sbit RW = P2^5; //Pin5       读写选择位
sbit E= P2^6; //Pin6       使能信号
sbit wela=P2^7;//数码管锁存器
voidwrite_com();
char data TimeNum;
char data Test1;               
/**********延时函数*****************/
/*微秒*/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;      /*12MHz频率*/
while(--uscnt);
}
/*毫秒*/
void DelayMs(unsigned char ms)
{
while(--ms)
   {
   DelayUs(250);
   DelayUs(250);
       DelayUs(250);
       DelayUs(250);
   }
}

/************写入命令函数************/
void write_com(uchar C)
{
        DelayMs(5);//操作前短暂延时,保证信号稳定
        E=1;
        Data=C;
        E=0;               
}
/*************写入数据函数**************/
void write_data(uchar D)
{
        DelayMs(5);//操作前短暂延时,保证信号稳定
        RS=1;
        E=1;
        Data=D;
        E=0;
        RS=0;
}

/**********写入字符串函数**********/
void ShowString (unsigned char line,char *ptr)
{
unsigned char p;
if (line==0)
    p=0x80; //是第二行则命令代码高4位为0xc
else
    p=0xc0; //是第二行则命令代码高4位为0x8
write_com (p);//写命令
for (;*ptr!='\0';ptr++)
{       
        write_data (*ptr);   //写数据
}
}
/***********LCD初始化************/
void LCD_init()
{
        wela=0;
        E=0;
        RS=0;
        RW=0;
        write_com(0x38)        ;//display mode
        write_com(0x38)        ;//display mode
        write_com(0x38)        ;//display mode
        write_com(0x80);
       
        write_com(0x06)        ;//显示光标移动位置
        write_com(0x0c)        ;//显示开及光标设置
        write_com(0x01)        ;//显示清屏

}



#endif

忘川 发表于 2013-8-28 00:13:57

问题一:源代码是从官网例程序修改来的UART 通用异步收发传输器 是干嘛的?通过串口回传数据?传到电脑?

忘川 发表于 2013-8-28 00:14:36

/* SendData发送数据*/
void SendData(BYTE dat)
{
    while (!TI);                  //Wait for the previous data is sent
    TI = 0;                         //Clear TI flag
    SBUF = dat;                     //Send current data
}

这是干嘛的程序?

so_so_so_so 发表于 2013-10-10 10:53:52

忘川 发表于 2013-8-28 00:14 static/image/common/back.gif
/* SendData发送数据*/
void SendData(BYTE dat)
{


查询方式发送数据。
LZ,用的角度传感器是什么型号?

songshanxiaozi 发表于 2014-7-9 15:48:12

没看明白什么问题啊
页: [1]
查看完整版本: 整了一天的角度传感器AD转化 虽然有显示 但还有问题 求...