51单片机数码管显示实验纠错
发布网友
发布时间:2022-04-30 00:09
我来回答
共3个回答
热心网友
时间:2022-06-26 20:57
#include <reg51.h>
#include <intrins.h>
unsigned char data dis_digit;
unsigned char key_s, key_v;
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
unsigned char dis_buf[8]; // 显示缓冲区
unsigned char sec_bcd[8]; // 秒计数值, BCD码
unsigned char dis_index; //
unsigned char key_times; // K1 按下次数 //
void clr_time();
void update_disbuf();
bit scan_key();
void proc_key();
void delayms(unsigned char ms);
sbit K1 = P1^0;
void main(void)
{
P0 = 0xff;
P3 = 0xff;
TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式
TH1 = 0xdc;
TL1 = 0;
TH0 = 0xFC;
TL0 = 0x17;
clr_time(); //
dis_digit = 0x7f; // 初始显示P30口数码管
dis_index = 0; //
key_times = 0;
key_v = 0x01;
IE = 0x8a; // 使能timer0, timer1中断
TR0 = 1;
TR1 = 0;
while(1)
{
if(scan_key())
{
delayms(10);
if(scan_key())
{
key_v = key_s;
proc_key();
}
}
}
}
void clr_time()
{
sec_bcd[0] = 0x0;
sec_bcd[1] = 0x0;
sec_bcd[2] = 0x0;
sec_bcd[3] = 0x0;
sec_bcd[4] = 0x0;
sec_bcd[5] = 0x0;
sec_bcd[6] = 0x0;
sec_bcd[7] = 0x0;
update_disbuf();
}
bit scan_key()
{
key_s = 0x00;
key_s |= K1;
return(key_s ^ key_v);
}
void proc_key()
{
if((key_v & 0x01) == 0)
{
key_times++;
if(key_times == 1)
{
TR1 = 1;
}
else if(key_times == 2)
{
TR1 = 0;
}
else
{
clr_time();
key_times = 0;
}
}
}
void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
// 选通P2.0口数码管
// dis_buf --- 显于缓冲区基地址
{
TH0 = 0xFC;
TL0 = 0x17;
P3 = 0xff; // 先关闭所有数码管
P0 = dis_buf[dis_index]; // 显示代码传送到P0口
P3 = dis_digit; //
dis_digit = _cror_(dis_digit,1); // 位选通值右移(P30<-P37), 下次中断时选通下一位数码管
dis_index++; //
dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}
void timer1() interrupt 3
//
{
unsigned char i;
TH1 |= 0xdc;
for(i = 0; i < 8; i++)
{
sec_bcd[i]++; // 低位加1
if(sec_bcd[i] < 10) // 如果低位满10则向高位进1
break; // 低位未满10
sec_bcd[i] = 0; // 低位满10清0
}
update_disbuf(); // 更新显示缓冲区
}
void update_disbuf()
// 更新显示缓冲区
{
dis_buf[0] = dis_code[sec_bcd[0]];
dis_buf[1] = dis_code[sec_bcd[1]];
dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f; // 加上小数点
dis_buf[3] = dis_code[sec_bcd[3]];
dis_buf[4] = dis_code[sec_bcd[4]];
dis_buf[5] = dis_code[sec_bcd[5]];
dis_buf[6] = dis_code[sec_bcd[6]];
dis_buf[7] = dis_code[sec_bcd[7]];
}
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
热心网友
时间:2022-06-26 20:58
P2_X这个是不能直接操作的,位定义下,另外数码管的位要打开
热心网友
时间:2022-06-26 20:58
1. P2_0 P2_1 ... 是否被定义 如果在你头文件定义了 是否是 一个管脚
2. 将char 赋值给一个位变量 肯定是有错误的 后面 P2_0=a[ge] ......
3. P2 究竟是驱动的段码还是位码?看起来逻辑上比较混乱!
4. 这个要用动态刷新的形式 ,找下别人程序和电路参考下
51单片机仿真时,数码管第一位显示的怎么不是0
明显错误:temp没有初始化,直接调用P2=table[temp];仔细想想,P2=table[temp]这句执行时,temp只可能是1、2、3、4。应该是0、1、2、3就可以了吧。因此 temp=0;...while(1){ P2=table[temp];temp++;if(temp==4){ temp=0;} } ...
51单片机,我在学习控制数码管静态显示时,总跟我实验的结果相反(如,我...
按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将...
51单片机C语言写的数码管显示哪里出问题了?
f(P3_6==0) //按下后,数码管闪烁 { delay(10);while(!P3_7);flag=0;} 这个地方你是不是写错了?应该是查询while(!P3_6);吧?另外,你在中断里面等待flag==1是不行的,因为你采用查询方式,而且是在主程序里面查询,因此,在中断里面等待是不行的,程序可能会在这个地方进入死循环 ...
51单片机数码管显示问题
delay_ms(1);//保持显示1ms LED_1=1;//关闭d1位数码管显示,准备显示下一位
关于proteus 中51单片机的动态数码管的显示问题
是两位共阳数码管,用二位一体的共阳数码管,段控直接连到P0口,位控直接用P2口,把电阻,总线,三极管统统去掉。还有就是显示时,要先输出位选码,后输出段选码。否则,就是你说的情况。你看看下面的仿真图,那简单,显示还正常。
利用51单片机的T0定时器控制数码管显示的问题,我想控制他亮的时间,但...
有错:while(1){ if(tt=100) //这里应该是双等号“==”{ tt=0;i++;if(i==16)i=0;……
51单片机动态显示,程序调试的时候很好没有出错但是在实际的工作中,数码...
速度调一下,也就是延时调一下,实在不行加一个消影的动作,动态扫是这样的,动态不就是利用人眼的视觉特性嘛 ,可是要是动态扫的慢了就会闪,要是扫得太快就会分不清,消影就是加个P1=1;这种全部关断一下,在位切换之前加就好了,你可以试试。
51单片机控制数码管显示不正常问题,为什么后面4位数码管1234和5678都...
9的数据,之后定义一个display显示函数,传递参数但不返回参数,然后将传递的参数(1234或5678)分解成4哥单个数,然后依次选择要显示的数码管和数据,紧接消影和简单暂时,这样一个数码管显示就完成了,之后三个跟这个一样。最后在主函数里调用这个显示函数并传递参数。希望我的回答能帮助到你。
51单片机中断控制数码管显示
在51单片机中断控制数码管显示的应用中,通常的做法是将数码管显示的内容存储在单片机的内存中,然后通过中断服务程序来更新数码管的显示内容。当需要更新数码管显示内容时,单片机产生一个中断请求,然后执行相应的中断服务程序。在中断服务程序中,单片机读取内存中存储的显示内容,并通过相应的接口电路将内容...
单片机编程,数码管显示异常
这是当然,你在定时器里面加循环和延时,时间就变得混乱了。display又不是定时器控制,所以会出现不可预料的现象。