求大神助攻,我想用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");
}
}
谢啦!
#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转换的那一块的问题,可是就是不知道出在了什么地方!