明早要答辩,程序还有一点不懂,有没有大神可以帮帮我
时间:10-02
整理:3721RD
点击:
我要把单片机上AD转换的输入口从p1.7改成p1.0,可是试了半天都不行,希望会的人能帮我看看。明天早上答辩,我晚上还要赶飞机,真的很急,麻烦了。前面的几个定义的句子我看了好几遍,都没有找到哪里定义了p1.7这个口,所以无从下手。
#include"reg51.h"
#include"intrins.h"
#include"absacc.h"
#include"math.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
/* AD 转换寄存器 */
sfr P1ASF = 0x9D; //P1 口功能控制寄存器
sfr ADC_CONTR = 0xBC; //AD 控制寄存器
sfr ADC_RES = 0xBD; //AD 转换结果高位
sfr ADC_RESL = 0xBE; //AD 转换结果低位
sfr AUXR1 = 0xA2; //AD 转换结果寄存器
#define ADC_POWER 0x80 //AD 转换电源开启
#define ADC_FLAG 0x10 //AD 转换标志位
#define ADC_START 0x08 //AD 转换开始位
#define ADRJ1 0x40 //AD 转换结果:高2 位+低8 位
#define ADC_SPEEDLL 0x00 //AD 转换速度控制,540 个时钟周期
#define ADC_SPEEDL 0x20 //AD 转换速度控制,360 个时钟周期
#define ADC_SPEEDH 0x40 //AD 转换速度控制,180 个时钟周期
#define ADC_SPEEDHH 0x60 //AD 转换速度控制,90 个时钟周期
/* 液晶1602 口地址 */
#define wr_com XBYTE[0xC000] //写命令
#define wr_data XBYTE[0xC100] //写数据
#define rd_com XBYTE[0xC200] //读命令
#define rd_data XBYTE[0xC300] //读数据
#define LED=P1
sbit LED1=0xA0;
sbit LED2=0xA1;
sbit LED3=0xA2;
sbit LED4=0xA3;
sbit buzzer=P2^4;
sbit RELAY=0XA5;
unsigned char ah;
unsigned char AD_val_h; //AD 转换结果高位
unsigned char AD_val_l; //AD 转换结果低位
unsigned long AD_val;
float AD_float;
void InitADC();
void SendData(BYTE dat);
//void GetADCResult(BYTE ch);
void Delay(WORD n);
void Delay2(WORD n);
void ShowResult(BYTE ch);
void lcd_init(void); // lcd 初始化
void write_cmd(BYTE cmd); // lcd 写命令
//void write_string(unsigned char *s); // 写字符串
void write_data(BYTE dat) ; // 写数据
void set_display_place(BYTE line,column);
void write_string_lcd(BYTE line,column,unsigned char *string);
/********************************************************************
Function name: write_cmd
Descriptions: 向lcd 输入指令
********************************************************************/
void write_cmd(BYTE cmd)
{
BYTE dl;
do {
dl=rd_com;
} while((dl&0x80)!=0); //判忙
wr_com= cmd;
Delay(1);
}
/*******************************************************************
Function name: write_data
Descriptions: 写入数据
*******************************************************************/
void write_data(BYTE dat)
{
BYTE dl;
do {
dl=rd_com;
} while((dl&0x80)!=0); //判忙
wr_data= dat;
Delay(1);
}
/********************************************************************
Function name: write_string
Descriptions: 写入字符串
********************************************************************/
void write_string(BYTE *s)
{
while(*s != '\0') //'\0'为字符串结束标志
{
write_data(*s);
s++;
}
}
/***************************************************************
Function name: set_display_place
Descriptions: 设置字符的显示位置
**************************************************************/
void set_display_place(BYTE line,column)
{
BYTE address;
if(line == 1)
{
address = 0x80 + column;
}
else if(line == 2)
{
address = 0xc0 + column;
}
write_cmd(address);
}
/*****************************************************************
Function name: 将字符串写到指定的位置
Descriptions: 将字符串显示在lcd 的特定位置
*****************************************************************/
void write_string_lcd(BYTE line,column,unsigned char *string)
{
set_display_place(line,column);
write_string(string);
Delay(1);
}
/***************************************************
************液晶模块初始化******************************
****************************************************/
void lcd_init(void)
{
write_cmd(0x38);//
write_cmd(0x38);//
write_cmd(0x06);//
write_cmd(0x0c);//
write_cmd(0x01);//
}
void crti(unsigned long dat)
{
unsigned char dhi;
unsigned char dli;
unsigned char ddi;
unsigned char dei;
unsigned long datah;
unsigned long datal;
datah=dat;
dhi=0;
if (datah>=10)
{
do
{
datah/=10;
dhi++;
}while(datah>=10);
datah=dat;
ddi=dhi;
for (dli=0;dli<dhi;dli++)
{
datal=1;
for (dei=0;dei<ddi;dei++)
{
datal*=10;
}
datah=dat/datal;
dat=dat%datal;
datah+=0x30;
write_data(datah);
ddi--;
}
dat+=0x30;
write_data(dat);
}
else
{
dat=dat+0x30;
write_data(dat);
}
}
/*****************浮点数显示****************/
void crt_r(float x,unsigned char N)
{
unsigned char dli;
unsigned int dath;
unsigned int dat;
if (x<0.0)
{
dat=0x2d;
write_data(dat);
Delay(1);
x=fabs(x);
}
dath=(int)x;
crti(dath);
if (N>0)
{
dat=0x2e;
write_data(dat);
Delay(1);
dat=1;
for (dli=0;dli<N;dli++)
{
dat*=10;
}
dath=(int)(x*dat)-dath*dat;
crti(dath);
}
}
void crt_U()
{
write_string_lcd(2,0, "U:");
set_display_place(2,3);
crt_r(AD_float,3);
}
void GetADCResult(BYTE ch) //AD 转换
{
AUXR1 &=~ADRJ1;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
/*_nop_();
_nop_();
_nop_();
_nop_();*/
while(!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &=~ADC_FLAG;
AD_val_h=ADC_RES;
AD_val_l=ADC_RESL;
AD_val=AD_val_h*4+AD_val_l;
}
void InitADC()
{
P1ASF=0xff;
ADC_RES=0;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
Delay(1);
}
void Delay(WORD n)
{
WORD x;
while(n--)
{
x=500;
while(x--);
}
}
void Delay2(WORD n)
{
WORD x;
while(n--)
{
x=5000;
while(x--);
}
}
void main()
{
SP=0x60;
InitADC();
lcd_init();
AUXR1 &=~ADRJ1;
while(1)
{
//write_string_lcd(1,2, "P1.7");
GetADCResult(7);
AD_float=AD_val*5.0/1024.0;
crt_U();
if(AD_float>0.000&&AD_float<1.000 )
{
LED1=0; LED2=1; LED3=1; LED4=1;
//Delay2(50) ;
//LED1=1;
buzzer=1;
RELAY=1;
}
else if(AD_float>1.000&&AD_float<2.000)
{
LED1=1;LED2=0; LED3=1; LED4=1;
// Delay2(50) ;
buzzer=1;
RELAY=1;
}
else if(AD_float>2.000&&AD_float<3.000)
{
LED1=1 ;LED3=0; LED2=1; LED4=1;
//Delay2(50) ;
buzzer=1;
RELAY=1;
}
else if(AD_float>3.000&&AD_float<4.000)
{
LED4=0;
//Delay2(50) ;
LED3 =1;
LED2=1 ;
LED1=1 ;
buzzer=1;
RELAY=1;
}
else if(AD_float>4.000)
{
LED1=0;LED2=0;LED3=0;LED4=0;
Delay2(50);
LED1=1;LED2=1;LED3=1;LED4=1;
buzzer=0;
RELAY=0;
}
else
{
LED1=1;LED2=1;LED3=1;LED4=1;
buzzer=1;
RELAY=1;
}
Delay2(10);
}
}
#include"reg51.h"
#include"intrins.h"
#include"absacc.h"
#include"math.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
/* AD 转换寄存器 */
sfr P1ASF = 0x9D; //P1 口功能控制寄存器
sfr ADC_CONTR = 0xBC; //AD 控制寄存器
sfr ADC_RES = 0xBD; //AD 转换结果高位
sfr ADC_RESL = 0xBE; //AD 转换结果低位
sfr AUXR1 = 0xA2; //AD 转换结果寄存器
#define ADC_POWER 0x80 //AD 转换电源开启
#define ADC_FLAG 0x10 //AD 转换标志位
#define ADC_START 0x08 //AD 转换开始位
#define ADRJ1 0x40 //AD 转换结果:高2 位+低8 位
#define ADC_SPEEDLL 0x00 //AD 转换速度控制,540 个时钟周期
#define ADC_SPEEDL 0x20 //AD 转换速度控制,360 个时钟周期
#define ADC_SPEEDH 0x40 //AD 转换速度控制,180 个时钟周期
#define ADC_SPEEDHH 0x60 //AD 转换速度控制,90 个时钟周期
/* 液晶1602 口地址 */
#define wr_com XBYTE[0xC000] //写命令
#define wr_data XBYTE[0xC100] //写数据
#define rd_com XBYTE[0xC200] //读命令
#define rd_data XBYTE[0xC300] //读数据
#define LED=P1
sbit LED1=0xA0;
sbit LED2=0xA1;
sbit LED3=0xA2;
sbit LED4=0xA3;
sbit buzzer=P2^4;
sbit RELAY=0XA5;
unsigned char ah;
unsigned char AD_val_h; //AD 转换结果高位
unsigned char AD_val_l; //AD 转换结果低位
unsigned long AD_val;
float AD_float;
void InitADC();
void SendData(BYTE dat);
//void GetADCResult(BYTE ch);
void Delay(WORD n);
void Delay2(WORD n);
void ShowResult(BYTE ch);
void lcd_init(void); // lcd 初始化
void write_cmd(BYTE cmd); // lcd 写命令
//void write_string(unsigned char *s); // 写字符串
void write_data(BYTE dat) ; // 写数据
void set_display_place(BYTE line,column);
void write_string_lcd(BYTE line,column,unsigned char *string);
/********************************************************************
Function name: write_cmd
Descriptions: 向lcd 输入指令
********************************************************************/
void write_cmd(BYTE cmd)
{
BYTE dl;
do {
dl=rd_com;
} while((dl&0x80)!=0); //判忙
wr_com= cmd;
Delay(1);
}
/*******************************************************************
Function name: write_data
Descriptions: 写入数据
*******************************************************************/
void write_data(BYTE dat)
{
BYTE dl;
do {
dl=rd_com;
} while((dl&0x80)!=0); //判忙
wr_data= dat;
Delay(1);
}
/********************************************************************
Function name: write_string
Descriptions: 写入字符串
********************************************************************/
void write_string(BYTE *s)
{
while(*s != '\0') //'\0'为字符串结束标志
{
write_data(*s);
s++;
}
}
/***************************************************************
Function name: set_display_place
Descriptions: 设置字符的显示位置
**************************************************************/
void set_display_place(BYTE line,column)
{
BYTE address;
if(line == 1)
{
address = 0x80 + column;
}
else if(line == 2)
{
address = 0xc0 + column;
}
write_cmd(address);
}
/*****************************************************************
Function name: 将字符串写到指定的位置
Descriptions: 将字符串显示在lcd 的特定位置
*****************************************************************/
void write_string_lcd(BYTE line,column,unsigned char *string)
{
set_display_place(line,column);
write_string(string);
Delay(1);
}
/***************************************************
************液晶模块初始化******************************
****************************************************/
void lcd_init(void)
{
write_cmd(0x38);//
write_cmd(0x38);//
write_cmd(0x06);//
write_cmd(0x0c);//
write_cmd(0x01);//
}
void crti(unsigned long dat)
{
unsigned char dhi;
unsigned char dli;
unsigned char ddi;
unsigned char dei;
unsigned long datah;
unsigned long datal;
datah=dat;
dhi=0;
if (datah>=10)
{
do
{
datah/=10;
dhi++;
}while(datah>=10);
datah=dat;
ddi=dhi;
for (dli=0;dli<dhi;dli++)
{
datal=1;
for (dei=0;dei<ddi;dei++)
{
datal*=10;
}
datah=dat/datal;
dat=dat%datal;
datah+=0x30;
write_data(datah);
ddi--;
}
dat+=0x30;
write_data(dat);
}
else
{
dat=dat+0x30;
write_data(dat);
}
}
/*****************浮点数显示****************/
void crt_r(float x,unsigned char N)
{
unsigned char dli;
unsigned int dath;
unsigned int dat;
if (x<0.0)
{
dat=0x2d;
write_data(dat);
Delay(1);
x=fabs(x);
}
dath=(int)x;
crti(dath);
if (N>0)
{
dat=0x2e;
write_data(dat);
Delay(1);
dat=1;
for (dli=0;dli<N;dli++)
{
dat*=10;
}
dath=(int)(x*dat)-dath*dat;
crti(dath);
}
}
void crt_U()
{
write_string_lcd(2,0, "U:");
set_display_place(2,3);
crt_r(AD_float,3);
}
void GetADCResult(BYTE ch) //AD 转换
{
AUXR1 &=~ADRJ1;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
/*_nop_();
_nop_();
_nop_();
_nop_();*/
while(!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &=~ADC_FLAG;
AD_val_h=ADC_RES;
AD_val_l=ADC_RESL;
AD_val=AD_val_h*4+AD_val_l;
}
void InitADC()
{
P1ASF=0xff;
ADC_RES=0;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
Delay(1);
}
void Delay(WORD n)
{
WORD x;
while(n--)
{
x=500;
while(x--);
}
}
void Delay2(WORD n)
{
WORD x;
while(n--)
{
x=5000;
while(x--);
}
}
void main()
{
SP=0x60;
InitADC();
lcd_init();
AUXR1 &=~ADRJ1;
while(1)
{
//write_string_lcd(1,2, "P1.7");
GetADCResult(7);
AD_float=AD_val*5.0/1024.0;
crt_U();
if(AD_float>0.000&&AD_float<1.000 )
{
LED1=0; LED2=1; LED3=1; LED4=1;
//Delay2(50) ;
//LED1=1;
buzzer=1;
RELAY=1;
}
else if(AD_float>1.000&&AD_float<2.000)
{
LED1=1;LED2=0; LED3=1; LED4=1;
// Delay2(50) ;
buzzer=1;
RELAY=1;
}
else if(AD_float>2.000&&AD_float<3.000)
{
LED1=1 ;LED3=0; LED2=1; LED4=1;
//Delay2(50) ;
buzzer=1;
RELAY=1;
}
else if(AD_float>3.000&&AD_float<4.000)
{
LED4=0;
//Delay2(50) ;
LED3 =1;
LED2=1 ;
LED1=1 ;
buzzer=1;
RELAY=1;
}
else if(AD_float>4.000)
{
LED1=0;LED2=0;LED3=0;LED4=0;
Delay2(50);
LED1=1;LED2=1;LED3=1;LED4=1;
buzzer=0;
RELAY=0;
}
else
{
LED1=1;LED2=1;LED3=1;LED4=1;
buzzer=1;
RELAY=1;
}
Delay2(10);
}
}
。。
。。
是使用的STC系列单片机内置AD吧。你先要保证硬件上将P1.7转到了P1.0.然后,根据STC手册,先将P1.0端口设置为开漏,再将P1.0设置为AD通道即可,也就是修改两个寄存器的值而已。具体的,看手册吧,很简单的。就这两个寄存器
P1ASF //P1 口功能控制寄存器
ADC_CONTR AD //控制寄存器
具体赋值查手册吧,我也忘了
这个倒是查了,但是不知道怎么改,说是chs0 chs1,chs2都为0,可是不知道往哪里加,语言格式也不知道怎么写。我想找到定义p1.7的地方,然后照着样子改成p1.0的,但是没有找到p1.7的定义。网上查了半天资料也没看到好的办法,刚才去找老师答疑,说找到下面AD转换的输出程序那里的通道ch,再把括号里的7改成0就可以了,回来试了,依旧没有效果。
本人学渣,不知道描述清楚没。
呵呵,直接将定义P1.7改为P1.0,肯定是不行的,因为P1.7和P1.0是IO寄存器的位,你改了也只是改了IO输出,并不能改变AD寄存器。你就根据我说的两个寄存器改参数就行了
