搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 2013-8-28 00:10:18 | 显示全部楼层 |阅读模式
先贴代码:
#include<stc12c5a60s2.h>
#include<intrins.h>
#include<stdio.h>
#include"LCD1602.h"
#define uchar unsigned char
#define uint  unsigned int
#define FOSC    11059200L        //选择外部晶振
#define BAUD    9600

typedef unsigned char BYTE;
typedef unsigned int WORD;

/*申报相关SFR ADC*/
//sfr ADC_CONTR   =   0xBC;           //ADC control register  ADC控制寄存器地址为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_SPEEDL  0x20            //280 clocks
#define ADC_SPEEDH  0x40            //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 uint  unsigned int
#define Data  P0//数据端口
sbit RS = P2^4; //Pin4   数据/命令选择位定义
sbit RW = P2^5; //Pin5         读写选择位
sbit E  = P2^6; //Pin6         使能信号
sbit wela=P2^7;//数码管锁存器
void  write_com();
char data TimeNum[16];
char data Test1[16];               
/**********延时函数*****************/
/*微秒*/
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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-8-28 00:13:57 | 显示全部楼层
问题一:源代码是从官网例程序修改来的  UART 通用异步收发传输器 是干嘛的?通过串口回传数据?传到电脑?

出0入0汤圆

 楼主| 发表于 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
}

  这是干嘛的程序?

出0入0汤圆

发表于 2013-10-10 10:53:52 | 显示全部楼层
忘川 发表于 2013-8-28 00:14
/* SendData发送数据*/
void SendData(BYTE dat)
{

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

出0入0汤圆

发表于 2014-7-9 15:48:12 | 显示全部楼层
没看明白什么问题啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表