下面是一个单片机程序,我的目的是要显示定时器0作为计数器时,最后TL0中的数据以字符型数据显示在液晶屏上,,也不知道程序哪里有问题,液晶屏一直显示的结果是00.0000

MichaelZgh 发布于 2012/05/24 20:01
阅读 932
收藏 0

MySQL连接为什么挂死了?别踩坑!>>>

下面是一个单片机程序,我的目的是要显示定时器0作为计数器时,最后TL0中的数据以字符型数据显示在液晶屏上,,也不知道程序哪里有问题,液晶屏一直显示的结果是00.0000

#include <reg52.H>
#include <intrins.h>
//*****************设置液晶显示的端口
//#define LCD_Data P0;
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit DR=P3^6;//485数据传送方向控制
int num;
int i=0;
unsigned int D;
unsigned int receive;
unsigned char busy;
unsigned char first;
unsigned char dw[3]={"kwh"};
xdata unsigned int T=0;
xdata unsigned int counter=0;
unsigned char display1[]="TIME:";
unsigned char display2[]="ENERGY:";
xdata unsigned char DataAsk[14]={0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x02,0x43,0xC3,0xDA,0x16};//表
xdata unsigned char DataAsk1[14]={0x68,0x02,0x00,0x00,0x00,0x00,0x00,0x68,0x01,0x02,0x43,0xC3,0xDB,0x16};//表
xdata unsigned char DataReceive[21]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
xdata unsigned char DataDisplay[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
xdata unsigned char Data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void DataConvert();
void delay(int t);
void Init_LCD();
void Write_Data(unsigned char Data);
unsigned char Read_State();
void Write_Command(unsigned char Command);
void InitCom();
void Timer2Init();
void data_Ask();   //请求读电表数据,累计电量
void data_Ask1();
void data_Send();  //485通讯
void data_Send1();
void xianshicounter();
void xianshiTL0();
void delay_us(int us)  reentrant //延时程序1
{
  while(us--);
}
void main()
{
Init_LCD();//液晶初始化

//***********串行通信模式设置***************//
 InitCom();
 ES=1;//串口中断使能; 
 EA = 1; //总中断使能
 receive=0;
//while(1)
 //{       
 Timer2Init();
xianshiTL0();
 // Write_Data((TL0%10)+0x30);
 // }

}

void delay(int t)//ms
{unsigned int j,i;
for(j=t;j>0;j--)
{
for(i=0;i<11059;i++);
}

}
void Init_LCD()//液晶初始化
{
 delay(15);
 Write_Command(0x38);
 delay(5);
 Write_Command(0x38);
 delay(5);
 Write_Command(0x38);
 while(Read_State()!=0);
 Write_Command(0x38);
 while(Read_State()!=0);
 Write_Command(0x08);
 while(Read_State()!=0);
 Write_Command(0x01);
 while(Read_State()!=0);
 Write_Command(0x06);
 while(Read_State()!=0);
 Write_Command(0x0c);

 

 

while(Read_State()!=0);
Write_Command(0x80+0x02);
for(num=0;num<5;num++)
{
while(Read_State()!=0);
Write_Data(display1[num]);
}
while(Read_State()!=0);
Write_Command(0x80+0x40);
for(num=0;num<7;num++)
{
while(Read_State()!=0);
Write_Data(display2[num]);
}

}
void Write_Data(unsigned char Data)//写入数据
{
LCD_EN=0;
LCD_RS=1;
LCD_RW=0;
P0=Data;
LCD_EN=1;
_nop_();
_nop_();
_nop_();
LCD_EN=0;
LCD_RS=0;
LCD_RW=1;
}
unsigned char Read_State() //读取状态(一般为忙碌状态)
{
P0=0xFF;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
_nop_();
_nop_();
_nop_();
busy=P0;
busy=busy&0x80;
LCD_EN=0;
LCD_RS=1;
LCD_RW=0;
return busy;
}
void Write_Command(unsigned char Command)
{
LCD_EN=0;
LCD_RS=0;
LCD_RW=0;
P0=Command;
LCD_EN=1;
_nop_();
_nop_();
_nop_();
LCD_EN=0;
LCD_RS=1;
LCD_RW=1;
}

void InitCom()//串口设置
{
  PCON=0x00;
  //SCON=0xC0;//设置为方式3,禁止接收,允许发送,非中断
  SCON=0xD0;
  /*设置波特率为1200kbps*/
  TMOD=0x20;
  TL1=0xE8;
  TH1=0xE8;
  TR1=1;//启动定时器1
  /************************/
}

void data_Ask()
{

unsigned char i=0;
DR=1;  //485发送模式
ES=0;//关中断
for(i=0;i<14;i++)
{
ACC=DataAsk[i];


if(PSW^0)
TB8=1;
else
TB8=0;


SBUF=DataAsk[i];//发送数据
while(~TI);///等待发送结束 
TI=0;//软件复位
//delay_us(20);

}
SCON=0xD0;//允许接收
DR=0;//485接收模式
ES=1;

}
void uart_isr() interrupt 4 //串行通信中断,用于外部接收数据
{
    RI=0;
    first=SBUF;
   if(first=='A')
        {
          data_Ask();
         }
   else if(first=='a')
        {
           Timer2Init();

           xianshiTL0();
         }
   else if(first=='B')
        {
           data_Ask1();
         }
   else if(first=='b')
        {
          Timer2Init();
         // xianshicounter();
         }
   else
    {
      DataReceive[receive]=SBUF;
      receive++;
      if(receive>=20)
       {
         receive=0;
         DataConvert();
         while(Read_State()!=0);
         Write_Command(0x80+0x47);
         for(num=0;num<8;num++)
        {
          while(Read_State()!=0);
          Write_Data(DataDisplay[num]);
         }
         SCON=0xC0;
        }
      }
 }

 

void data_Ask1()
{

unsigned char i=0;
DR=1;  //485发送模式
ES=0;//关中断
for(i=0;i<14;i++)
{
ACC=DataAsk1[i];


if(PSW^0)
TB8=1;
else
TB8=0;


SBUF=DataAsk1[i];//发送数据
while(~TI);///等待发送结束 
TI=0;//软件复位
//delay_us(20);

}
SCON=0xD0;//允许接收
DR=0;//485接收模式
ES=1;

}


void DataConvert()
{
char i,j;
for(i=18,j=0;i>=15;i--,j++)
{
DataReceive[i]=DataReceive[i]-0x33;
DataDisplay[j]=0x30+DataReceive[i]/16;
DataDisplay[j+1]=0x30+DataReceive[i]%16;
j++;
}

}
void data_Send()
{

unsigned char i=0;
//DR=1;  //485发送模式
ES=0;//关中断
for(i=0;i<8;i++)
{
ACC=DataDisplay[i];


if(PSW^0)
TB8=1;
else
TB8=0;


SBUF=DataDisplay[i];//发送数据 
while(~TI);///等待发送结束 
TI=0;//软件复位
//delay_us(20);
}


SCON=0xD0;//允许接收
//DR=0;//485接收模式
ES=1;

}
void data_Send1()
{

unsigned char i=0;
//DR=1;  //485发送模式
ES=0;//关中断
for(i=0;i<8;i++)
{
ACC=DataDisplay[i];


if(PSW^0)
TB8=1;
else
TB8=0;


SBUF=DataDisplay[i];//发送数据 
while(~TI);///等待发送结束 
TI=0;//软件复位
//delay_us(20);
}


SCON=0xD0;//允许接收
//DR=0;//485接收模式
ES=1;

}
void xianshiTL0()
{ int i=0;
  //D=D*60;
   //while(Read_State()!=0);
//Write_Command(0x80+0x00);
//while(Read_State()!=0);
//Write_Data((TL0*600000/1600%10)+0x30);
   TL0=TL0*600000;
   TL0=TL0/1600;
   Data[0]=TL0/100000;
   Data[1]=TL0%100000/10000;
   Data[2]=TL0%10000/1000;
   Data[3]=TL0%1000/100;
   Data[4]=TL0%100/10;
   Data[5]=TL0%10;
   while(Read_State()!=0);
   Write_Command(0x80+0x47);
  
   for(i=0;i<2;i++)
    {
       while(Read_State()!=0);
       Write_Data(Data[i]+0x30);
   
     }
   Write_Data('.');
   for(i=2;i<6;i++)
   {
      while(Read_State()!=0);
      Write_Data(Data[i]+0x30);
    }
 }
void xianshicounter()
{
  counter=counter*60;
  counter=counter*10000;
  counter=counter/1600;
  Data[0]=counter/100000;
  Data[1]=counter%100000/10000;
   Data[2]=counter%10000/1000;
  Data[3]=counter%1000/100;
  Data[4]=counter%100/10;
   Data[5]=counter%10;
   while(Read_State()!=0);
   Write_Command(0x80+0x47);
 
    for(i=5;i>1;i--)
   {
       while(Read_State()!=0);
      Write_Data(Data[i]+0x30);
   
    }
   Write_Data('.');
   for(i=1;i>=0;i--)
   {
       while(Read_State()!=0);
       Write_Data(Data[i]+0x30);
    }
 }
    
void InterruptT2() interrupt 5
{
 TF2=0;//清中断标志位
 T++;
//while(Read_State()!=0);
//Write_Command(0x80+0x01);
//while(Read_State()!=0);
//Write_Data(TL2%10+0x30);

//while(Read_State()!=0);
//Write_Command(0x80+0x09);
//while(Read_State()!=0);
//Write_Data((T/100)%10+0x30);


if(T>=12000)  //定时一分钟
{
D=TL0;
TR2=0;//定时器2停止定时
ET2=0;
EX1=0;
TR0=0;
//TL0=TL0*60;
//TL0=TL0*10000/1600;
//while(Read_State()!=0);
//Write_Command(0x80+0x47);
//while(Read_State()!=0);
//Write_Data(TL0+0x30);
//counter=counter*60;
//counter=counter*10000/1600;
//while(Read_State()!=0);
//Write_Command(0x80+0x47);
//while(Read_State()!=0);
//Write_Data(counter+0x30);
//while(Read_State()!=0);
//Write_Command(0x80+0x00);
//while(Read_State()!=0);
//Write_Data(D%10+0x30);
}
}
void Timer2Init()  //5毫秒@11.0592MHz
{  
    ET2=1;
 T2MOD = 0;  //初始化模式寄存器
 T2CON = 0;  //初始化控制寄存器
 TL2 = 0x00;  //设置定时初值
 TH2 = 0x28;  //设置定时初值
 RCAP2L = 0x00;  //设置定时重载值
 RCAP2H = 0x28;  //设置定时重载值
 TR2 = 1;  //定时器2开始计时
 EX1=1;   //允许外部中断
 IT1=1;//边沿触发方式
 TMOD=TMOD|0x05;//定时器0工作在方式1,16位计数器模式
 TR0=1;


}

void Init1() interrupt 2
{
counter++;


}

 

加载中
0
中山野鬼
中山野鬼
这代码乱的。从头到尾我没看到主循环在哪。
M
MichaelZgh
子函数多一些,所以程序长一些,主函数里面是我要显示的数据
M
MichaelZgh
第46行开始主函数
0
johnzhang68
johnzhang68
硬件没有问题吗?
M
MichaelZgh
没有,不对TL0进行处理的话显示的不是0,但是数据处理之后就显示0了,对TL0的处理是void xianshiTL0这个小函数
返回顶部
顶部