求救求救!各位大佬,这是什么原因啊!编译无误,但没有实现功能?(程序如下)
时间:10-02
整理:3721RD
点击:
#include "UART.H" // 包含IAP15W4K58S4寄存器定义文件
#define VCC 5.06 // 存放用万用表实测的单片机供电电压
sbit up=P2^1;
sbit dn=P2^2;
sbit key=P2^3;
unsigned int dat=39,addr=0;
void DAC(unsigned char addr,bit rng,unsigned char dat);
void init_5620();
unsigned int ADC_P11()
{
unsigned int i; // 用于软件延时程序
unsigned char status; // 用于判断AD转换结束的标志
unsigned int AD_Dat=0; // 10位AD转换值
unsigned char Tmp; // 临时变量用于将AD转换出来的2个字节合成一个字节
ADC_CONTR|=0x80; // 开AD转换电源,第一次使用时要打开内部模拟电源
for (i=0;i<10000;i++); // 适当延时等待AD转换供电稳定,一般延时1ms以内即可,为了缩短AD
// 调用时间,可把这2行剪切到主程序中去。
P1ASF|=0x02; // 选择P1.1作为AD转换通道,0x02= 0000 0010
ADC_CONTR=0xE1; // 选择P1.1作为AD转换通道,最高转换速度,清转换完成标志。
for (i=0;i<1000;i++); // 如果是多通道模拟量进行AD转换,则更换AD转换通道后要适当延时,
ADC_CONTR|=0x08; // 启动 A/D 转换,ADC_START=1。
status=0;
while(status==0) // 等待AD转换结束。
{
status=ADC_CONTR&0x10; // 判断ADC_FLAG是否等于1,0x10=0001 0000B。
}
ADC_CONTR&=0xE7; // 将ADC_FLAG清0, 0xE7=1110 0111B,ADC_FLAG=0,ADC_START=0。
AD_Dat = ADC_RES; // 默认高字节高8位。
AD_Dat <<= 2;
Tmp = ADC_RESL; // 默认低字节低2位。
Tmp &= 0x03; // 屏蔽无关位
AD_Dat |= Tmp; // 高低字节拼接成一个10位数。
return AD_Dat;
}
unsigned int scan()
{
if(up==0)
{
dat+=1;
if(dat>=255)
dat=255;
while(!up);
}
if(dn==0)
{
dat-=1;
if(dat<=1)
{
dat=1;
}
while(!dn);
}
return dat;
}
unsigned int zidong()
{
float vo;
unsigned int temp;
temp=ADC_P11();
vo=VCC*temp/1023;
printf("%.3f ",vo);
vo=(int)vo;
if(vo==2)
{
dat=78;
}
if(vo==3)
{
dat=117;
}
if(vo>5)
{
dat=1;
}
return dat;
}
void main(void)
{
unsigned int s=0;
UART_init(); // 串口初始化9600/22.1184MHz
init_5620(); //初始化5620
while(1)
{
if(key==0)
{
s=s+1;
if(s==2)
{s=0;}
}
switch(s)
{
case 0:DAC(0,0,zidong()); break;
case 1:DAC(0,0,scan()); break;
default:s=0;break;
}
delay500ms();
}
}
#define VCC 5.06 // 存放用万用表实测的单片机供电电压
sbit up=P2^1;
sbit dn=P2^2;
sbit key=P2^3;
unsigned int dat=39,addr=0;
void DAC(unsigned char addr,bit rng,unsigned char dat);
void init_5620();
unsigned int ADC_P11()
{
unsigned int i; // 用于软件延时程序
unsigned char status; // 用于判断AD转换结束的标志
unsigned int AD_Dat=0; // 10位AD转换值
unsigned char Tmp; // 临时变量用于将AD转换出来的2个字节合成一个字节
ADC_CONTR|=0x80; // 开AD转换电源,第一次使用时要打开内部模拟电源
for (i=0;i<10000;i++); // 适当延时等待AD转换供电稳定,一般延时1ms以内即可,为了缩短AD
// 调用时间,可把这2行剪切到主程序中去。
P1ASF|=0x02; // 选择P1.1作为AD转换通道,0x02= 0000 0010
ADC_CONTR=0xE1; // 选择P1.1作为AD转换通道,最高转换速度,清转换完成标志。
for (i=0;i<1000;i++); // 如果是多通道模拟量进行AD转换,则更换AD转换通道后要适当延时,
ADC_CONTR|=0x08; // 启动 A/D 转换,ADC_START=1。
status=0;
while(status==0) // 等待AD转换结束。
{
status=ADC_CONTR&0x10; // 判断ADC_FLAG是否等于1,0x10=0001 0000B。
}
ADC_CONTR&=0xE7; // 将ADC_FLAG清0, 0xE7=1110 0111B,ADC_FLAG=0,ADC_START=0。
AD_Dat = ADC_RES; // 默认高字节高8位。
AD_Dat <<= 2;
Tmp = ADC_RESL; // 默认低字节低2位。
Tmp &= 0x03; // 屏蔽无关位
AD_Dat |= Tmp; // 高低字节拼接成一个10位数。
return AD_Dat;
}
unsigned int scan()
{
if(up==0)
{
dat+=1;
if(dat>=255)
dat=255;
while(!up);
}
if(dn==0)
{
dat-=1;
if(dat<=1)
{
dat=1;
}
while(!dn);
}
return dat;
}
unsigned int zidong()
{
float vo;
unsigned int temp;
temp=ADC_P11();
vo=VCC*temp/1023;
printf("%.3f ",vo);
vo=(int)vo;
if(vo==2)
{
dat=78;
}
if(vo==3)
{
dat=117;
}
if(vo>5)
{
dat=1;
}
return dat;
}
void main(void)
{
unsigned int s=0;
UART_init(); // 串口初始化9600/22.1184MHz
init_5620(); //初始化5620
while(1)
{
if(key==0)
{
s=s+1;
if(s==2)
{s=0;}
}
switch(s)
{
case 0:DAC(0,0,zidong()); break;
case 1:DAC(0,0,scan()); break;
default:s=0;break;
}
delay500ms();
}
}
这种类似模块化的程序且自定义H文件别人看不明白,自己慢慢找问题吧。