求救啊!小弟万分感谢。
时间:10-02
整理:3721RD
点击:
求救啊!我刚写啦一个STC12C5A60S2的ADC转换用数码管显示的电压表程序 。但程序烧进以后芯片以后,没反应。求高手看看我的程序那里错啦,小弟万分感谢
#include <STC12C5AS60.h> //STC125A.h 头文件.
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char;
#define uint unsigned int;
float AD_val; //定义处理后的数值AD_val为浮点数
sbit DataPort=P0; //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;// 位锁存
unsigned char TempData[8]; //存储显示值的全局变量
bit ReadTempFlag;//定义读时间标志
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
void AD_Init();
uint AD_Get( );
float AD_Chanl( );
void Display(unsigned char FirstBit,unsigned char Num);
void Init_Timer0( );
void DELAY_MS (unsigned int a);
void AD_Init( )
{
P1ASF=0xff; //P1口AD通道使用
EA=1; //打开总中断
EADC=1; //允许ADC中断
ADC_RES=0; //清零转换结果寄存器高8位
ADC_RESL=0; //清零转换结果寄存器低2位
ADC_CONTR=0x80; //开启AD电源
DELAY_MS(2); //等待2ms,让AD电源稳定
}
uint AD_Get( )
{
ADC_CONTR |=0xc0; //开启AD转换(P1.0)1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_(); //要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
while(!(ADC_CONTR&0x10)); //等待转换完成
ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0
return((ADC_RES<<2)|ADC_RESL); //返回AD转换完成的10位数据(16进制)
}
float AD_Chanl( )
{
AD_val=AD_Get( );
AD_val=(AD_val*5*1000)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值
return AD_val; //高精度场合需要外接基准电压来得到MCU实际电压值VCC.
}
void main (void)
{
unsigned int TempH,temp;
Init_Timer0( );
AD_Init( );
while (1) //主循环
{
if(ReadTempFlag==1)
{
ReadTempFlag=0;
temp=AD_Chanl( );
if(TempH/1000==0)
TempData[0]=0;
else
TempData[0]=dofly_DuanMa[TempH/1000];
if((TempH%1000)/100==0)
TempData[1]=0;
else
TempData[1]=dofly_DuanMa[(TempH%1000)/100];
if((((TempH%1000)%100)/10)==0)
TempData[2]=0;
else
TempData[2]=dofly_DuanMa[((TempH%1000)%100)/10];
if((((TempH%1000)%100)%10)==0)
TempData[3]=0;
else
TempData[3]=dofly_DuanMa[((TempH%1000)%100)%10];
}
}
}
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;
DataPort=0; //清空数据,防止有交替重影
LATCH1=1; //段锁存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位码
LATCH2=1; //位锁存
LATCH1=0;
DataPort=TempData[i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
i++;
if(i==Num)
i=0;
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00; //给定初值
//TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned int num;
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;
Display(0,8); // 调用数码管扫描
num++;
if(num==300) //
{
num=0;
ReadTempFlag=1; //读标志位置1
}
}
void DELAY_MS (unsigned int a)
{
unsigned int i;
while( --a != 0)
{
for(i = 0; i < 600; i++);
}
}
#include <STC12C5AS60.h> //STC125A.h 头文件.
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char;
#define uint unsigned int;
float AD_val; //定义处理后的数值AD_val为浮点数
sbit DataPort=P0; //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;// 位锁存
unsigned char TempData[8]; //存储显示值的全局变量
bit ReadTempFlag;//定义读时间标志
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
void AD_Init();
uint AD_Get( );
float AD_Chanl( );
void Display(unsigned char FirstBit,unsigned char Num);
void Init_Timer0( );
void DELAY_MS (unsigned int a);
void AD_Init( )
{
P1ASF=0xff; //P1口AD通道使用
EA=1; //打开总中断
EADC=1; //允许ADC中断
ADC_RES=0; //清零转换结果寄存器高8位
ADC_RESL=0; //清零转换结果寄存器低2位
ADC_CONTR=0x80; //开启AD电源
DELAY_MS(2); //等待2ms,让AD电源稳定
}
uint AD_Get( )
{
ADC_CONTR |=0xc0; //开启AD转换(P1.0)1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_(); //要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
while(!(ADC_CONTR&0x10)); //等待转换完成
ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0
return((ADC_RES<<2)|ADC_RESL); //返回AD转换完成的10位数据(16进制)
}
float AD_Chanl( )
{
AD_val=AD_Get( );
AD_val=(AD_val*5*1000)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值
return AD_val; //高精度场合需要外接基准电压来得到MCU实际电压值VCC.
}
void main (void)
{
unsigned int TempH,temp;
Init_Timer0( );
AD_Init( );
while (1) //主循环
{
if(ReadTempFlag==1)
{
ReadTempFlag=0;
temp=AD_Chanl( );
if(TempH/1000==0)
TempData[0]=0;
else
TempData[0]=dofly_DuanMa[TempH/1000];
if((TempH%1000)/100==0)
TempData[1]=0;
else
TempData[1]=dofly_DuanMa[(TempH%1000)/100];
if((((TempH%1000)%100)/10)==0)
TempData[2]=0;
else
TempData[2]=dofly_DuanMa[((TempH%1000)%100)/10];
if((((TempH%1000)%100)%10)==0)
TempData[3]=0;
else
TempData[3]=dofly_DuanMa[((TempH%1000)%100)%10];
}
}
}
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;
DataPort=0; //清空数据,防止有交替重影
LATCH1=1; //段锁存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位码
LATCH2=1; //位锁存
LATCH1=0;
DataPort=TempData[i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
i++;
if(i==Num)
i=0;
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00; //给定初值
//TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned int num;
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;
Display(0,8); // 调用数码管扫描
num++;
if(num==300) //
{
num=0;
ReadTempFlag=1; //读标志位置1
}
}
void DELAY_MS (unsigned int a)
{
unsigned int i;
while( --a != 0)
{
for(i = 0; i < 600; i++);
}
}