标题:
可以帮我看看这个单片机程序有什么问题吗?1602显示不了,还有按键都控制不了
[打印本页]
作者:
hometown
时间:
2017-4-16 10:13
标题:
可以帮我看看这个单片机程序有什么问题吗?1602显示不了,还有按键都控制不了
仿真6.jpg
(117.22 KB, 下载次数: 92)
下载附件
2017-4-16 10:13 上传
//宏定义
#define uchar unsigned char
#define uint unsigned int
//包含头文件
#include <reg52.h>
#include <18b20.h>
#include <stdlib.h>
#include <intrins.h>
#include <eeprom52.h>
#include <lcd1602.h>
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2; //按键定义
sbit BUZZ=P1^4;
sbit PWM=P2^0; //PWM输出
unsigned char Im[4]={0x00,0x00,0x00,0x00};//红外编码
//uchar displaydata[4]; //显示暂存数组
//全局变量
char f,dang,count,count1,a_a; //档位
unsigned long m,Tc;
unsigned char IrOK; //定义红外工作变量
void jisuan(); //声明计算函数
uchar mode;
char sec_b=0;
bit flag_b=0;
uint TH,TL; //上下限变量
uchar baif,suiji;
uchar code zhuanhuan[4]={0,3,5,10};//转换数组
/*ascii码*/
unsigned char mun_char_table[]={"0123456789abcdef- "};
unsigned char temp_table[] ={"L:00.0C H:00.0C"};
unsigned char temp_set_table[]={"D:0 T:00.0C"};
void write_eeprom() //内部eeprom写函数
{
SectorErase(0x2000); //清空
SectorErase(0x2c00);
SectorErase(0x2e00);
byte_write(0x2c00,TH/256);
byte_write(0x2c01,TH%256);
byte_write(0x2c02,TL/256);
byte_write(0x2c03,TL%256); //将上下限数据保存到eeprom
byte_write(0x2c04,dang);
byte_write(0x2c05,mode);
byte_write(0x2060,0x01);
}
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
mode = byte_read(0x2c05);
dang = byte_read(0x2c04);
TH = byte_read(0x2c00)*256+byte_read(0x2c01);
TL = byte_read(0x2c02)*256+byte_read(0x2c03);
a_a = byte_read(0x2060);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
a_a = byte_read(0x2060);
if(a_a != 1) //新的单片机初始单片机内问eeprom
{
a_a = 1;
write_eeprom(); //保存数据
}
}
/*********************************************************/
//毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void delay(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<110;j++);
}
void display() //显示函数
{
lcd_char_write(7,1,mun_char_table[disdata[1]]);
lcd_char_write(8,1,mun_char_table[disdata[2]]);
lcd_char_write(10,1,mun_char_table[disdata[3]]);
lcd_char_write(2,1,mun_char_table[dang]);
lcd_char_write(2,0,mun_char_table[TL%1000/100]);
lcd_char_write(3,0,mun_char_table[TL%100/10]);
lcd_char_write(5,0,mun_char_table[TL%10]);
lcd_char_write(11,0,mun_char_table[TH%1000/100]);
lcd_char_write(12,0,mun_char_table[TH%100/10]);
lcd_char_write(14,0,mun_char_table[TH%10]);
}
void key() //按键函数
{
if(K1==0) //按键1按下或者遥控器上的按键按下
{
delay(5); //延时去抖
if(K1==0) //再次判断按键按下
{
BUZZ=0;
delay(20);
BUZZ=1; //按键音
mode++; //模式加
if(mode>4) //模式加到大于4
mode=0; //模式清零
// Im[2]=0;
IrOK=0; //变量清零
write_eeprom(); //写入eeprom数据
while(!K1); //按键释放
}
}
if(K2==0)
{
delay(5);
if(K2==0)
{
BUZZ=0;
delay(20);
BUZZ=1;
if(mode==0) //模式等于1时
{
TH++; //上限加
if(TH>999) //上限加到大于99.9度
TH=TL+1; //上限等于下限加一
}
else if(mode==1) //模式等于2时
{
TL++; //下限加
if(TL>=TH) //下限加到大于等于上限
TL=TH-1; //下限等于上限减一
}
else if(mode==3) //模式等于3时
{
dang++; //档位加一
if(dang>3) //档位大于3时
dang=0; //档位清零
}
//Im[2]=0;
//IrOK=0; //红外变量清零
write_eeprom(); //写入eeprom数据
while(!K2); //按键释放
}
}
if(K3==0)
{
delay(5);
if(K3==0)
{
BUZZ=0;
delay(20);
BUZZ=1;
if(mode==0)
{
TH--;
if(TH<=TL)
TH=TL+1;
}
else if(mode==1)
{
TL--;
if(TL>=TH)
TL=TH-1;
}
else if(mode==3)
{
dang++;
if(dang>3)
dang=0;
}
//Im[2]=0;
//IrOK=0;
write_eeprom();
while(!K3);
}
}
}
void jisuan() //计算函数
{
if(mode==0||mode==1||mode==2) //模式0、1、2
{
if(tvalue<=TL) //温度小于下限时
PWM=1; //关闭输出,占空比0%
else if(tvalue>=TH) //温度大于等于上限
PWM=0; //打开输出,占空比100%
else //其他状态时
{
if(tvalue<(TL+(TH-TL)/2))
{
baif=15; //占空比控制变量
if(count1>baif) //根据变量判断占空比大小pwm=0.3
PWM=1; //关闭风扇
else
PWM=0; //打开风扇*/
}
else
{
baif=25; //占空比控制变量
if(count1>baif) //根据变量判断占空比大小pwm=0.3
PWM=1; //关闭风扇
else
PWM=0; //打开风扇*/
}
}
}
else if(mode==3) //模式3时
{
if(count1>(zhuanhuan[dang]*5)) //根据档位计算出占空比
PWM=1;
else
PWM=0;
}
}
void main() //主函数
{
/*uint count; //定义变量
unsigned int i=0,j=0;
EA=1; //打开中断总开关
EX1=1; //打开外部中断1
IT1=1; //下降沿有效
TMOD=0x11; //定时器工作方式
TR0=0; //关闭T0
TH0=0;
TL0=0; //初值0
ET1=1; //T1允许中断
TR1=1; //T1打开中断
TH1=0xfc;
TL1=0x18; //T1初值1ms
mode=0; //初始模式0
TH=300;
TL=200; //上下限初始值
init_eeprom(); //初始化eeprom
read_eeprom(); //读取eeprom数据
lcd_system_reset(); //LCD1602 初始化
for (i=0;i<16;i++) lcd_char_write(i,0,temp_table[i]);
for (j=0;j<12;j++) lcd_char_write(j,1,temp_set_table[j]);
while(1) //进入循环
{
jisuan(); //计算函数
count++; //变量加
if(count>200) //加到大于200
{
count=0; //清零
TR1=0; //关闭定时器T1
read_wendu(); //读取温度
TR1=1; //打开定时器T1
}
jisuan(); //计算函数
display(); //显示函数 */
while(1) key(); //按键函数
//jisuan(); //计算函数
// }
}
void timer1() interrupt 3 //定时器T1工作函数
{
TH1=0xfc;
TL1=0x18; //重新赋初值
count1++; //加
if(count1>50)
{
count1=0;
}
}
void intersvr1(void) interrupt 2 //红外工作函数
{
TR0=1;
Tc=TH0*256+TL0;//提取中断时间间隔时长
TH0=0;
TL0=0; //定时中断重新置零
if((Tc>Imin)&&(Tc<Imax))
{
m=0;
f=1;
return;
} //找到启始码
if(f==1)
{
if(Tc>Inum1&&Tc<Inum3)
{
Im[m/8]=Im[m/8]>>1|0x80; m++;
}
if(Tc>Inum2&&Tc<Inum1)
{
Im[m/8]=Im[m/8]>>1; m++; //取码
}
if(m==32)
{
m=0;
f=0;
if(Im[2]==~Im[3])
{
IrOK=1;
TR0=0;
}
else
{
IrOK=0; //取码完成后判断读码是否正确
}
}
//准备读下一码
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1