微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求大神助攻,我想用STC12单片机采集模拟信号,再用LCD显示...

求大神助攻,我想用STC12单片机采集模拟信号,再用LCD显示...

时间:10-02 整理:3721RD 点击:
下面是自己抄抄写写的程序,仔细读了好长时间了,解决不了啊!
谢啦!
#include <STC12C5A.H>
#include<intrins.h>
#define ulong unsigned long
#define uchar unsigned char
#define uint unsigned int
uchar adc;
ulong i;
uchar star;
sbit Ctrl_EN = P2^0;  //发送接收控制端
sbit E=P2^7;                //1602使能引脚
sbit RW=P2^6;                //1602读写引脚       
sbit RS=P2^5;                //1602数据/命令选择引脚
sbit p20=P2^0;
sbit p21=P2^1;
sbit p22=P2^2;
sbit p23=P2^3;
/*------------------------------------------------
                 函数声明
------------------------------------------------*/
void SendByte(unsigned char dat);
uchar AD(void);
void SendStr(unsigned char *s);
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
void delay()
{
        _nop_();
        _nop_();
}
void Delay(uint del)
{
        uint i,j;
        for(i=0;i<del;i++)
        for(j=0;j<=148;j++)
        {
        }       
}
/********************************************************************
* 名称 : bit Busy(void)
* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void Busy(void)
{
        bit busy_flag = 1;
        P0 = 0xff;
        RS = 0;
        delay();
        RW = 1;
        delay();
        E = 1;
        //Delay(1);
        while(1)
        {
                busy_flag = (bit)(P0 & 0x80);
                if(busy_flag == 0)
                {
                        break;
                }
        }
        E = 0;
}
/********************************************************************
* 名称 : wcmd(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void wcmd(uchar del)
{
        RS = 0;
        delay();
        RW = 0;
        delay();
        E = 0;
        delay();
        P0 = del;
        delay();
        E = 1;
        delay();
        E = 0;
}
/********************************************************************
* 名称 : wdata(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void wdata(uchar del)
{
        delay();
        RS = 1;
        delay();
        RW = 0;
        delay();
        E = 0;
        delay();
        P0 = del;
    delay();
        E = 1;
        delay();
        E = 0;
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
        Delay(15);
        wcmd(0x38);
        Delay(5);
        wcmd(0x38);
        Delay(5);
        wcmd(0x38);
        wcmd(0x38);
        Busy();
        wcmd(0x08);
        Busy();       
        wcmd(0x01);
        Busy();
        wcmd(0x06);
        Busy();
        wcmd(0x0c);
}
/********************************************************************
* 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
                 L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
        uchar a;
        if(hang == 1)
        {
                a = 0x80;
        }
        if(hang == 2)
        {
                a = 0xc0;
        }
        a = a + lie - 1;
        Busy();
        wcmd(a);
        Busy();
        wdata(sign);
}
/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
                  L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
        uchar a;
        if(hang == 1)
        {
                a = 0x80;
        }
        if(hang == 2)
        {
                a = 0xc0;
        }
        a = a + lie - 1;
        while(1)
        {
                Busy();
                wcmd(a);
                Busy();
                wdata(*p);
                a++;
                p++;                       
                if((*p == '\0')||(a==0x90)||(a==0xd0))
                {
                        break;
                }
        }
}

uchar AD(void)
{
    uchar temp;
    ulong a;
    uchar data_temp;
    data_temp=0;
    ADC_CONTR|=0x80;//启动AD
        ADC_CONTR|=0x08;
        p20=0;
    for(a=0;a<10000;a++);
    ADC_RES=0;
    ADC_RESL=0;
    re: temp=0x10;
    temp&=ADC_CONTR;//查询ADC_FLAG,忙标志,转换完否
    if(temp==0)
    goto re;
    ADC_CONTR&=0xe0;//P1.0为AD输入口
        p21=0;
    data_temp=ADC_RES;
    return data_temp;
   }                        
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
    uchar  B=0,C=0;
    P1ASF=0x01;
    ADC_CONTR=0xe0;//P1.0为AD输入口         
        L1602_init();
        while(1)
        {
           B=AD()/10;
           C=AD()%10;
           L1602_char (1,3,C);
           L1602_char (1,2,B);
           L1602_string(2,4,"adcb");
        }
   }

你的程序有什么问题呀

采集不到模拟信号,不知道为什么!

求帮助啊,我都研究一天,实在不知道哪里出了问题,只要采集到模拟信号就可以了,在LCD上显示只为了验证

我感觉你的程序有个问题,我不知道算不算问题,我先提出来:
就是在检测忙状态的函数里,用while(1)循环了,当别的函数调用BUSY()的时候,会不会出不来呀?

可以的,我试了好多次,觉得应该是AD转换的那一块的问题,可是就是不知道出在了什么地方!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top