标题:
哪位大佬帮忙看看单片机仿真时,按键不起作用,非常感谢
[打印本页]
作者:
228684556
时间:
2020-6-3 11:09
标题:
哪位大佬帮忙看看单片机仿真时,按键不起作用,非常感谢
51hei图片_20200603110733.png
(109.86 KB, 下载次数: 33)
下载附件
2020-6-3 11:08 上传
单片机源程序如下:
#include <reg51.h>
#include <intrins.h>
#include<absacc.h>
#define uint unsigned int
#define unchar unsigned char
unchar templ, temph, i, y, z, n;
unchar a, b; //LCD 的变量
unchar sign=0; //标志变量
bit k; //判断正负变量
sbit dq=P3^5;
sbit rs=P2^0; //LCD 显示的定义取值
sbit rw=P2^1;
sbit e=P2^2;
sbit bf=P0^7;
sbit DQ=P2^5;
//键盘定义
sbit read=P3^0;
sbit incH=P3^2;
sbit desH=P3^3;
sbit reset=P3^4;
//蜂鸣器
sbit BUZZER=P2^6;
float t4, t5, t6, t7, tt; //温度转换的变量
uint tp;
unchar temperature, Htemp, Ltemp;
unchar D1, D2, D3;
uint D4, D5, D6, D9, D7, D8;
unchar code dis1[]={"0123456789"} ;
unchar code dis2[]={"temp: "} ;
unchar code dis3[]={"WARN"} ;
unchar code dis4[]={"Htemp: "} ;
unchar code dis5[]={"working"} ;
unchar code dis6[]={"Ltemp: "} ;
bit flag_1820_1;
bit flag_1820_2;
void delay_ms(unsigned char time) ;
void ledshow(void) ;
void keypress(void) ;
void init(void) ;
void gettemp() ;
void init1820(void) ;
void write1820(unchar) ;
unsigned char read1820(void) ;
void delay_us(unchar) ;
void delay3(unchar) ;
/* 延时*/
void delay(uint t)
{ uint i;
while(t--)
{ for(i=0; i<121; i++)
{}
}
}
//LCD 显示函数
void delay1(unchar time)
{ unchar n;
n=0;
while(n<time)
{n++; }
return;
}
void delay3(unchar x)
{ for(y=x; y>0; y--)
for(z=x; z>0; z--) ;
}
unchar testBF()
{ bit result;
rs=0;rw=1;e=1;
_nop_() ; _nop_() ; _nop_() ; _nop_() ;
result=bf; e=0;
return result;
}
void writecmd(unchar ZL)
{ while(testBF() ==1) ;
rs=0; rw=0; e=0;
_nop_() ; _nop_() ;
P0=ZL; e=1;
_nop_() ; _nop_() ; _nop_() ; _nop_() ;
e=0;
}
void pos(unchar pos)
{ writecmd(pos| 0x80) ;
}
void writedate(unchar date)
{while(testBF() ==1) ;
rs=1; rw=0; e=0;
_nop_() ;_nop_() ;
P0=date; e=1;
_nop_() ; _nop_() ; _nop_() ; _nop_() ;
e=0;
}
void init()
{ delay3(20) ;
writecmd(0x38) ;
delay3(30) ;
writecmd(0x0d) ;
delay3(30) ;
writecmd(0x06) ;
delay3(30) ;
writecmd(0x01) ;
delay3(30) ;
}
//键盘程序
//主程序
void main(void)
{
TMOD=0x01;
TH0=50000/256;
TL0=50000%256;
Htemp=121;Ltemp=20;
P3=0xFF;
init() ;
if(sign==0)
{EA=1; TR0=1; ET0=1;
EX0=0; //关闭外部中断 0
EX1=0; //关闭外部中断 1
while(1)
{
if(read==0)
{
delay3(2000) ;
if(read==0)
{sign++;}
}
}
}
if(sign==1)
{
BUZZER=1; //关闭蜂鸣器
EX0=1; //开启外部中断 0
EX1=1; //开启外部中断 1
init() ;
pos(0) ;
for(i=0; i<6; )
{ writedate(dis4[i]);i++;
}
D6=Htemp%10;
D7=Htemp%100/10;
D8=Htemp/100;
pos(0x6) ;
writedate(dis1[D8]);
writedate(dis1[D7]) ; }
if(sign==2)
{BUZZER=1; //关闭蜂鸣器
EX0=1; //开启外部中断 0
EX1=1; //开启外部中断 1
init() ;
pos(0) ;
for(i=0; i<6; )
{ writedate(dis6[i]) ; i++; }
D6=Htemp%10;
D7=Htemp%100/10;
D8=Htemp/100;
pos(0x6) ;
writedate(dis1[D8]) ;
writedate(dis1[D7]) ;
writedate(dis1[D6]) ;
}
if(sign>2)
{ sign=0; }
}
//中断程序
void int0(void) interrupt 0
{
EX0=0; //关外部中断 0
if(desH==0&&sign==1)
{
Htemp--;
if(Htemp<Ltemp)
Htemp=Ltemp;
}
else if(desH==0&&sign==2)
{
Ltemp--;
}
}
/*****外部中断 1 服务程序*****/
void int1(void) interrupt 2
{
EX1=0; //关外部中断 1
if(incH==0&&sign==1)
{
Htemp++;
}
else if(incH==0&&sign==2)
{
Ltemp++;
if(Ltemp>Htemp)
Ltemp=Htemp;
}
}
//定时器 T0 服务程序
void isr_t0(void) interrupt 1
{ TH0=50000/256;
TL0=50000%256;
TMOD=0x10;
TH1=50000/256;
TL1=50000%256;
gettemp() ;
delay(50) ;
if (tp<Htemp)
{ BUZZER=1;
pos(0x04) ;
for(i=0; i<7; )
{
writedate(dis5[i]) ;
i++;
}
pos(0x40) ;
for(i=0; i<5; )
{writedate(dis2[i]) ;
i++; }
D1=(unchar) (tp%10) ;
D2=(unchar) (tp%100/10) ;
D3=(unchar) (tp/100) ;
D4=(uint) (tt*10) ;
D5=((uint) (tt*100) ) %10;
if(k==1)
{pos(0x46);
writedate('-');}
else
pos(0x47);
writedate(dis1[D3]) ;
writedate(dis1[D2]) ;
writedate(dis1[D1]) ;
writedate('.');
writedate(dis1[D4]) ;
writedate(dis1[D5]) ;
writedate(0xdf) ;
writedate('C') ;
}
else
{ init() ;
pos(0x04) ;
for(i=0; i<4; )
{
writedate(dis3[i]) ;
i++; }
BUZZER=0;
}
}
//DS18B20 读取温度
void gettemp()
{
init1820() ;
write1820(0xcc) ;
write1820(0x44) ;
init1820() ;
write1820(0xcc) ;
write1820(0xbe) ;
templ=read1820() ; //低 8 位(其中的第四位是小数点后的)
temph=read1820() ; //高 8 位(其中前五位是符号值)
z=temph; //把符号位留下判断正负
k=(bit) (z>>7) ;
if(k==1) //负数就取反加一
{ templ=~templ;
templ=templ+1;
temph=~temph;
}
else
{templ=templ;
temph=temph; }
n=templ;
y=n&0x01;
t7=y*0.0625;
n>>=1;
y=n&0x01; //小数点最后的数
t4=y*0.125;
n>>=1;
y=n&0x01;
t5=y*0.25;
n>>=1;
y=n&0x01;
t6=y*0.5;
tt=t4+t5+t6+t7;
init1820() ;
tp=temph*256+templ;
temperature=tp;
tp=tp>>4;
}
//1820 初始化
void init1820()
{
DQ = 1; _nop_() ;
DQ = 0;
delay_us(120) ; //延时 510us,
delay_us(120) ;
DQ = 1;
delay_us(15) ;
while(DQ)
{ _nop_() ; }
delay_us(60) ;
DQ = 1;
}
//******write********
void write1820(unchar a)
{
unchar i;
for(i=0; i<8; i++)
{if(a & 0x01) //低位在前;
{DQ = 0;
_nop_() ; _nop_() ; _nop_() ;
DQ = 1; }
else
DQ = 0;
_nop_() ; _nop_() ; _nop_() ;
delay_us(30) ;
DQ = 1;
_nop_() ;
a >>= 1;
}
}
//*******read************
unsigned char read1820(void)
{
unsigned char i;
unsigned char tmp=0;
DQ = 1; _nop_() ;
for(i=0; i<8; i++)
{
tmp >>= 1;
DQ = 0;
_nop_() ;
DQ = 1;
delay_us(2) ;
_nop_() ;
if(DQ)
tmp |= 0x80;
delay_us(30) ;
DQ = 1; _nop_() ;
}
return tmp; }
void delay_us(unchar a)
{
while(--a) ;
}
void delay_ms(unchar a)
{
unchar i, j;
for(i=0; i<a; i++)
for(j=0; j<200; j++)
{
_nop_() ;
_nop_() ;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1