
用keil写,C语言编程,怎么写才能运行出来呀,我主要问题温度不变,一直显示53,数码管一直在闪,按键9按的过程中会停止闪锁,显示53.55,再按一次显示53.5,但是松手就会一直闪,根本看不清是什么

关注让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek
如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞
#include <reg51.h>
sbit DQ = P3^7;
void delay(unsigned int time) {
unsigned int i, j;
for(i = time; i > 0; i--)
for(j = 110; j > 0; j--);
}
unsigned char ReadOneChar(void) {
unsigned char i, dat = 0;
for(i = 8; i > 0; i--) {
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ) dat |= 0x80;
delay(5);
}
return(dat);
}
void ReadTemp(void) {
unsigned char a, b;
DQ = 1;
DQ = 0;
delay(10);
DQ = 1;
delay(40);
if(DQ == 0) {
a = ReadOneChar();
b = ReadOneChar();
temp = ((a << 4) | (b >> 4));
if(temp > 127) {
temp = ~temp + 1;
flag = 1;
} else flag = 0;
}
}
- 采集到温度数据后,要确保正确更新显示部分的代码。比如将温度值转换为适合数码管显示的格式(假设数码管显示为整数部分和小数部分分开显示)。
// 假设已经采集到温度值temp,数码管显示函数
void DisplayTemp() {
unsigned char tens = temp / 10;
unsigned char units = temp % 10;
// 显示十位
// 根据数码管驱动方式进行相应操作,假设数码管段码存储在code数组中
P0 = code[tens];
P2 = 0x01;
delay(1);
P2 = 0x00;
// 显示个位
P0 = code[units];
P2 = 0x02;
delay(1);
P2 = 0x00;
}
void Timer0_ISR(void) interrupt 1 {
static unsigned char digit = 0;
TH0 = (65536 - 10000) / 256;
TL0 = (65536 - 10000) % 256;
switch(digit) {
case 0:
P0 = code[0];
P2 = 0x01;
break;
case 1:
P0 = code[1];
P2 = 0x02;
break;
// 依次类推,设置其他数码管位
}
digit++;
if(digit >= 8) digit = 0;
P2 = 0x00;
}
- 适当调整扫描频率,比如将扫描周期延长到20 - 50ms,以减少闪烁感。
sbit KEY9 = P1^0;
bit key9_pressed = 0;
unsigned char display_state = 0; // 0:正常显示,1:按键按下显示特定值
void KeyScan() {
if(KEY9 == 0) {
delay(20); // 消抖
if(KEY9 == 0) {
while(!KEY9); // 等待按键释放
key9_pressed = 1;
if(display_state == 0) {
display_state = 1;
// 显示53.55
} else {
display_state = 0;
// 恢复正常显示
}
}
} else {
key9_pressed = 0;
}
}
void Display() {
if(display_state == 0) {
DisplayTemp();
} else {
// 显示53.55或53.5的代码
unsigned char tens = 53 / 10;
unsigned char units = 53 % 10;
P0 = code[tens];
P2 = 0x01;
delay(1);
P2 = 0x00;
P0 = code[units];
P2 = 0x02;
delay(1);
P2 = 0x00;
// 显示小数部分
tens = 5 / 10;
units = 5 % 10;
P0 = code[tens];
P2 = 0x04;
delay(1);
P2 = 0x00;
P0 = code[units];
P2 = 0x08;
delay(1);
P2 = 0x00;
}
}
需要注意的是,以上代码是基于常见的51单片机和基本的硬件假设编写的,实际应用中可能需要根据具体硬件电路和需求进行调整。
希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。