为什么原先程序是跑起来的,加上显示模块不运行了呢?
时间:10-02
整理:3721RD
点击:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint a,b;
uint c=0;
uint d=0;
uint zh;
uchar num;
uchar code table1[]="Speed(n/min):";
sbit PWM=P0^0;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit RS=P0^1; //RW直接接地
sbit EN=P0^2; //LCD1602控制
void de(uchar z) //延时
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void cutiao() //粗调
{
if(a==c)
{
PWM=0;
}
if(b==10)
PWM=1;
}
void PWM_init() //PWM初始
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
}
/**************************lcd1602显示******************************/
void write_com(uchar com) //写指令到1602
{
RS=0;
EN=0;
P2=com;
de(1);
EN=1;
de(1);
EN=0;
}
void write_date(uchar date) //写数据到1602
{
RS=1;
EN=0;
P2=date;
de(1);
EN=1;
de(1);
EN=0;
}
void LCD_init() //初始化
{
EN=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
/**********************LCD显示****************/
void display()
{
write_com(0x80);
for(num=0;num<13;num++)
{
write_date(table1[num]);
de(1);
}
write_com(0x80+0x40);
write_date(zh+0x30);
de(1);
}
/****************************主函数**************************************/
void main()
{
PWM_init();
LCD_init();
while(1)
{
display(); !就是这里,加了显示就不运行了。但是去掉,程序就是运行的。为什么?求大神
if(b>10) //PWM范围
{a=0;b=0;}
/***************键盘控制*****************************/
if(key1==0) //键盘控制,加
{de(50);//消抖
if(key1==0)
{ c++;
if(c==9)c=9;
}
while(!key1);
}
if(key2==0) //减
{ de(50);
if(key2==0)
{
c--;
}
while(!key2);
}
if(key3==0) //停止
{
d++;
while(1)
{
PWM=0;
if(key4==0)
{
d++;
if(d>=2)
break;
}
}
}
/*******************频道选择**********************/
switch(c)
{
case 0:cutiao();zh=0;
case 1:cutiao();zh=1;
case 2:cutiao();zh=2;
case 3:cutiao();zh=3;
case 4:cutiao();zh=4;
case 5:cutiao();zh=5;
case 6:cutiao();zh=6;
case 7:cutiao();zh=7;
case 8:cutiao();zh=8;
case 9:cutiao();zh=9;
}
cutiao(); //粗调
}
}
void DS0() interrupt 1 //中断服务程序
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
a++;
b++;
}
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint a,b;
uint c=0;
uint d=0;
uint zh;
uchar num;
uchar code table1[]="Speed(n/min):";
sbit PWM=P0^0;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit RS=P0^1; //RW直接接地
sbit EN=P0^2; //LCD1602控制
void de(uchar z) //延时
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void cutiao() //粗调
{
if(a==c)
{
PWM=0;
}
if(b==10)
PWM=1;
}
void PWM_init() //PWM初始
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
}
/**************************lcd1602显示******************************/
void write_com(uchar com) //写指令到1602
{
RS=0;
EN=0;
P2=com;
de(1);
EN=1;
de(1);
EN=0;
}
void write_date(uchar date) //写数据到1602
{
RS=1;
EN=0;
P2=date;
de(1);
EN=1;
de(1);
EN=0;
}
void LCD_init() //初始化
{
EN=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
/**********************LCD显示****************/
void display()
{
write_com(0x80);
for(num=0;num<13;num++)
{
write_date(table1[num]);
de(1);
}
write_com(0x80+0x40);
write_date(zh+0x30);
de(1);
}
/****************************主函数**************************************/
void main()
{
PWM_init();
LCD_init();
while(1)
{
display(); !就是这里,加了显示就不运行了。但是去掉,程序就是运行的。为什么?求大神
if(b>10) //PWM范围
{a=0;b=0;}
/***************键盘控制*****************************/
if(key1==0) //键盘控制,加
{de(50);//消抖
if(key1==0)
{ c++;
if(c==9)c=9;
}
while(!key1);
}
if(key2==0) //减
{ de(50);
if(key2==0)
{
c--;
}
while(!key2);
}
if(key3==0) //停止
{
d++;
while(1)
{
PWM=0;
if(key4==0)
{
d++;
if(d>=2)
break;
}
}
}
/*******************频道选择**********************/
switch(c)
{
case 0:cutiao();zh=0;
case 1:cutiao();zh=1;
case 2:cutiao();zh=2;
case 3:cutiao();zh=3;
case 4:cutiao();zh=4;
case 5:cutiao();zh=5;
case 6:cutiao();zh=6;
case 7:cutiao();zh=7;
case 8:cutiao();zh=8;
case 9:cutiao();zh=9;
}
cutiao(); //粗调
}
}
void DS0() interrupt 1 //中断服务程序
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
a++;
b++;
}
自己先顶下。求大神帮忙!
你这个问题出在了这个显示函数部分,但是先跟你说一下,程序中尽量不要使用空循环来延时,使用定时器延时,因为空循环延时的时候cpu浪费了,没干事情,只有等待。现在看看你的程序,你的显示函数里面包含了延时,然后函数里面又有函数调用了延时函数,这样这个函数占用了大量的时间,等运行完这个函数才开始检测b的值(if(b>10){a=0;b=0;}),问题就出在这里,应该把这个放到定时器中断里面,因为等执行这条语句时,display占用了的时间让b和a加了很多很多次,导致很大的时候才清零,也就是说你的pwm周期很大很大,高电平时间一定,那么占空比变得非常非常小了,因此就出现了你看到的情况了
当把display这个函数去掉时由于程序运行很顺畅没有延时所以程序能正常
哎妈呀。大神啊。 听你这么一说,思路一下子清楚不少。非常感谢。 我去试试看吧。
程序不是不运行吧
现在程序正常了没啊?
呵呵 。昨天程序正常了。
最后怎么处理的?求教,小白一枚