这个程序主要是利用红外对管来实现一个计数这样子的功能,现在程序出了一点小问题,还望各位大佬指导一下,谢谢。以下是程序
#include <reg52.h>
#define uchar unsigned char
//定义变量
sbit LED3=P2^2; //LED3
sbit LED2=P2^3; //LED2
sbit LED5=P2^4; //LED5
sbit LED4=P2^5; //LED4
sbit IR_Input_IO=P2^1;
sbit Light_Input_IO=P2^7;
sbit en=P1^2; //1602 6管脚
sbit rs=P1^0; //1602端口 4管脚
sbit rw=P1^1;//lcd1602控制端口 5管脚
bit bTime1ms,bTime10ms,bTime100ms;
uchar Time01ms,Time1ms,Time10ms,People_Number;
bit IR_Input_IO_Flag;
#define uchar unsigned char
#define uint unsigned int
void delay(uint z)//延时1ms函数
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void write_com(uchar com)//向1602写一字节(控制指令)
{
rs=0;
P0=com;
delay(5);
en=0;
delay(10);
en=1;
}
void write_data(uchar date)//向1602写一字节(数据)
{
rs=1;
P0=date;
delay(5);
en=0;
delay(5);
en=1;
}
/*------------------------------------------------
定时器0中断处理
------------------------------------------------*/
void tim0_isr (void) interrupt 1 using 1
{
TH0=0xFF;
TL0=0xB2;
Time01ms++;
if(Time01ms>10)
{
Time01ms=0;
bTime1ms=1;
}
}
/*---------------------------------------------- --
定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
{
TMOD=0x01;//定时器0工作方式1
TH0=0xFF;
TL0=0xB2; //0.1ms初值
ET0=1; //开中断
TR0=1;
EA = 1; //开总中断
}
/*------------------------------------------------
系统初始化
------------------------------------------------*/
void system()
{
Time01ms=0;
Time01ms=0;
Time1ms=0;
Time10ms=0;
}
/*------------------------------------------------
IO口检测
------------------------------------------------*/
void IO_Test()
{
if(IR_Input_IO==0)
{
if(IR_Input_IO_Flag)//扫描10ms
{
if(IR_Input_IO==0)
{
People_Number++;//人数++
LED2=0;//有人就一盏灯
if(10<=People_Number<=20) //小于20人亮两盏
{
LED2=0;
LED3=0;
LED4=1;
LED5=1;
}
else if(People_Number<=40)//超过20人亮3盏
{
LED2=0;
LED3=0;
LED4=0;
LED5=1;
}
else //超过40人亮4盏
{
LED2=0;
LED3=0;
LED4=0;
LED5=0;
}
}
IR_Input_IO_Flag=0;
}
else
{
IR_Input_IO_Flag=1;
}
}
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main()
{
system();
TIM0init();
write_com(0x80);
write_data('P');
write_data(':');
while(1)
{
write_com(0x87);
if(People_Number/10000!=0)
write_data(People_Number/10000+0x30); //如果人数的万位不为0 正常显示否则显示空格
else
write_data(' ');
if(People_Number/1000==0)
write_data(' ');
else
write_data(People_Number%10000/1000+0x30); //如果人数小于1000 千位为空格 否则正常显示
if(People_Number/100==0)
write_data(' ');
else
write_data(People_Number%10000%1000/100+0x30); //如果人数小于100 百位为空格 否则正常显示
if(People_Number/10==0)
write_data(' ');
else
write_data(People_Number%10000%1000%100/10+0x30); //如果人数小于10 十位为空格 否则正常显示
write_data(People_Number%10000%1000%100%10+0x30);
write_com(0xd0); //如果没有这句,当中断内的显示函数执行完,就会在人数的位置显示占空比数据,导致乱码
//-----定时1ms-----
if(bTime1ms)
{
bTime1ms=0;
Time1ms++;
//-----定时10ms-----
if(Time1ms>10)
{
IO_Test();//检测
Time1ms=0;
Time10ms++;
bTime10ms=1;
//-----定时100ms-----
if(Time10ms>10)
{
Time10ms=0;
bTime100ms=1;
}
}
}
}
}
按照以上程序烧录进单片机之后发现液晶显示屏完全没有反应,真心求教大佬指导一下。
万分感谢!!!!
|