stc12c5a开发中遇到问题,求助大家!谢谢!
用数码管做了一个温度器,但运行过程中AD转化不了,不知道什么原因,求助大家!#include "stc12c5a.h" //包含STC12C5A60S2单片机寄存器定义文件
unsigned char data ge _at_ 0x30; //四位七段数码管个位数据存放
unsigned char data shi _at_ 0x31; //四位七段数码管十位数据存放
unsigned char data bai _at_ 0x32; //四位七段数码管百位数据存放
unsigned char data qian _at_ 0x33;//四位七段数码管千位数据存放
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//个、十、千位七段数码管数字显示表
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//百位七段数码管显示表,里面含小数点,即dp段永远被点亮
void main(void)
{
unsigned long i;
unsigned long K;
unsigned char status;
unsigned int y;
unsigned int a;
unsigned int b;
unsigned int c;
unsigned int d;
unsigned int e;
ge=table;
shi=table;
bai=table1;
qian=table;
ADC_CONTR|=0x80; //开A/D转换电源,第一次使用时要打开内部模拟电源
for (i=0;i<10000;i++); //适当延时
P1ASF=0x04; //选择P1.2作为A/D转换通道
ADC_CONTR=0xEA;
for (i=0;i<10000;i++); //适当延时
status=0;
while(status==0)
{
status=ADC_CONTR&0x10;
}
ADC_CONTR&=0xE7; //将ADC_FLAG清零
e= ADC_RES; // 保存AD转化结果
y=2569.002+10.5859375*e; //AD转换后的结果于温度之间的函数关系
a=y%10 ; //四位七段数码管个位数
b=(y%100)/10; //四位七段数码管十位数
c=(y%100)/100; //四位七段数码管百位数
d=y/1000 ; //四位七段数码管千位数
ge=table; //四位七段数码管个位显示数据
shi=table; //四位七段数码管十位显示数据
bai=table1; //四位七段数码管百位显示数据
qian=table; //四位七段数码管千位显示数据
while(1) //七段数码管显示循环
{
P2=0x0E; //选择四位七段数码管的千位
P0=qian; //显示四位七段数码管的千位
for (i=0;i<100;i++);
P2=0x0D; //选择四位七段数码管的百位
P0=bai; //显示四位七段数码管的百位
for (i=0;i<100;i++);
P2=0x0B; //选择四位七段数码管的十位
P0=shi; //显示四位七段数码管的十位
for (i=0;i<100;i++);
P2=0x07; //选择四位七段数码管的个位
P0=ge; //显示四位七段数码管的个位
for (i=0;i<100;i++);
}
} 回复【楼主位】putin
-----------------------------------------------------------------------
求帮忙!!!谢谢!!! 精度处理互相矛盾,既然有LONG,为何不用十位的?还有ADC_RES能直接带如表达式? 回复【2楼】KEN_ZHOU
-----------------------------------------------------------------------
ADC_RES 好像可以直接带表达式,我看到一本参考书上面有类似的表达。
请问怎么修改?谢谢! /* ADC操作『ADC_CONTR寄存器』常量定义 */
#define ADC_POWER 0x80 //ADC 电源控制位
#define ADC_FLAG 0x10 //ADC 完成标志
#define ADC_START 0x08 //ADC 启动控制位
#define ADC_speed_LL 0x00 //540 时钟
#define ADC_speed_L 0x20 //360 时钟
#define ADC_speed_H 0x40 //180 时钟
#define ADC_speed_HH 0x60 // 90 时钟
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:A/D转换初始化,P1.0、P1.1高阻模式,P1.0、P1.1口作为模拟功能A/D使用
初次使用和更换 A/D 转换通道要适当延时(20uS~200uS), 使输入电压稳定。
以后如果不更换 A/D 转换通道的话, 不需要加延时。
如果输入电压信号源的内阻在10K以下,可不加延时。
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void AD_Init()
{
P1M0 |= 0x03; //P1.0、P1.1高阻模式
P1M1 |= 0x03;
ADC_RES = 0;
P1ASF = 0x03; // P1.0、P1.1口作为模拟功能A/D使用
ADC_CONTR = ADC_POWER | ADC_speed_H ;//打开A/D电源 ,转换1次/270时钟,默认P1.0通道
YS14520us(); //开电源后延时
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:A/D转换程序
输入:通道号0~7
返回:8位转换值
说明:更换 A/D 转换通道要适当延时(20uS~200uS)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
uint8 ADC(uint8 CHa)
{
s_uint8 CHb;
if(CHa != CHb) //检测是否更换通道号
{
ADC_CONTR &= 0xF8; //清通道
ADC_CONTR |= CHa; //更换通道
YS660us(); //更换 A/D 转换通道要适当延时(20uS~200uS)
}
CHb = CHa; //保存此次通道号
ADC_CONTR |= ADC_START; //ADC_START = 1启动 AD 转换,转换结束ADC_START = 0
NOP12(); //经过4个时钟延时后,才能够正确读到ADC_CONTR控制寄存器的值
while(!(ADC_CONTR & 0x10));
ADC_CONTR &= ~ADC_FLAG; //清0 ADC_FLAG 位, 停止A/D转换
return ADC_RES; //返回转换结果
}
void main(void)
{
uint8Value,TL431;
uint16 Voltage;
Init_1602();
Send(0,0x01); //清屏
AD_Init();
while(1)
{
Value = ADC(0);
TL431 = ADC(1);
Voltage = 250*Value/TL431;
// 显示 测量电压值
Set_xy(0,0);
Send(1,0);
Send(1,1);
Send(1,':');
Send(1,' ');
Send(1,'0'+ Voltage/100);
Send(1,'.');
Send(1,'0'+ Voltage/10%10);
Send(1,'0'+ Voltage%10);
Send_S("V");
// 显示 测量转换值 : 基准源转换值
Set_xy(9,1);
Send(1,'0'+ Value/100);
Send(1,'0'+ Value/10%10);
Send(1,'0'+ Value%10);
Send(1,':');
Send(1,'0'+ TL431/100);
Send(1,'0'+ TL431/10%10);
Send(1,'0'+ TL431%10);
YSms(10);
}
}
页:
[1]