① 51单片机数码管动态显示的过程中,怎么实现让最后一个闪烁,其他的不受影响
闪烁原理,别的数码管都是反复刷新,需要闪烁的那一位则刷新几十次后再有几十次不显示
下例是20次亮 20次灭
uchar modtable[6][4]={ {0,0,0,0},{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1},{1,1,1,1} };
//有1的那一位数码管不亮 {0,0,0,0}不闪烁 {1,1,1,1} 4位全闪烁
uchar ia;
uchar ,shi,ge;
uchar flag=0;
uint a=0;
//共阴数码管七段码,转成共阳的需取反,程序中已这样做了
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延时程序
{
uchar j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void display(uint m,uchar mode )//4位显示子程序 带某位闪烁功能
//mode=0,都不闪烁 mode=1 千位闪烁 mode=2 百位闪烁 mode=3 十位闪烁 mode=4 个位闪烁
//mode=5 全部闪烁
{
uchar a1,a2,a3,a4;
uchar modeaa;
a1=m/1000;
a2=m/100%10;
a3=m/10%10;
a4=m%10;
if(ia<20)
{
modeaa=mode;//可闪烁也可不闪烁,闪烁位有20次不亮
}
else
{
modeaa=0;//正常显示
}
dataport=~(table[a1]);
sm1=modtable[modeaa][0]; Delay1ms(2);sm1=1;
dataport=~(table[a2]);
sm2=modtable[modeaa][1]; Delay1ms(2);sm2=1;
dataport=~(table[a3]);
sm3=modtable[modeaa][2]; Delay1ms(2);sm3=1;
dataport=~(table[a4]);
sm4=modtable[modeaa][3]; Delay1ms(2);sm4=1;
ia++;
if(ia==40) ia=0;//40次一轮
}
② 51单片机 数码管动态显示时钟,位置不对
sbit gew=P2^4;
sbit shiw=P2^5;
sbit fengw=P2^6;
sbit shifengw=P2^7;
你把这几个的顺序调一下,自己试试看~
比如
sbit gew=P2^7;
sbit shiw=P2^6;
sbit fengw=P2^5;
sbit shifengw=P2^4;
③ 单片机C语言如何实现数组动态调用
sizeof一般是在编译时计算,不适合用在你这种情况,如下修改已仿真验证可切换传送。
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
/*********端口定义*************/
//SCLK串行同步时钟
//SID串行数据输入端
//CS片选,高#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
/*********端口定义*************/
//SCLK串行同步时钟
//SID串行数据输入端
//CS片选,高电平有效
sbitCS=P1^2;
sbitSID=P1^1;
sbitSCLK=P1^0;
/******************************/
/*******字幕显示定义***********/
ucharcodeTable1[]={"ILoveMCU"};
ucharcodeTable2[]={"我爱单片机!"};
/******************************/
voidDelaynms(ucharx)
{
uchari,j;
for(i=0;i<x;i++)
{
for(j=0;j<110;j++);
}
}
voidDatComOperation(uchardatas,uchardatcom)
{
uchartemp;
uinti;
temp=datas;
CS=1;
SCLK=0;
for(i=0;i<8;i++)
{
SID=(bit)(temp&0x80);
SCLK=0;
SCLK=1;
temp<<=1;
}
temp=datcom;
temp&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(temp&0x80);
SCLK=0;
SCLK=1;
temp<<=1;
}
temp=datcom;
temp<<=4;
for(i=0;i<8;i++)
{
SID=(bit)(temp&0x80);
SCLK=0;
SCLK=1;
temp<<=1;
}
CS=0;
Delaynms(10);
}
voidSendCommand(ucharcomm)//12232发送指令
{
DatComOperation(0xf8,comm);
}
voidSendData(uchardatas)//12232发送数据
{
DatComOperation(0xfa,datas);
}
voidLcd12Initial()
{
Delaynms(100);
SendCommand(0x30);
SendCommand(0x02);
SendCommand(0x06);
SendCommand(0x0c);
SendCommand(0x01);
SendCommand(0x80);
}
voidDispInfor(ucharx,ucharcode*arrays)//???????
{
uchari,j;
SendCommand(x);//定义字符显示的位置
//for(i=0;i<sizeof(arrays)/sizeof(arrays[0]);i++)
//SendData(arrays[i]);
i=0;
while(j=arrays[i++])SendData(j);
}
voidmain()
{
Lcd12Initial();
DispInfor(0x80,Table1);//DisInfor(0x80,Table1);
DispInfor(0x90,Table2);//DisInfor(0x90,Table2);
while(1);//等待
}
④ 51单片机有没有动态
51单片机本身是无所谓动态还是静态控制的,要实现动态控制(比如数码管显示,矩阵键盘扫描等等),是有软硬件共同协作完成的。动态控制,可以节省很大一部分的硬件资源,所以应用十分广泛。
⑤ 单片机数码管动态显示电路问题,程序/问题如下
进入主循环
P3=0x01;
然后P3<<=1;
然后
延时
所以当P3_0=1的时候
就立即位移了
所以
看不到P3_0=1
的效果
你只要把delay()
与p3<<=1换下位置就可以了
⑥ MCS-51单片机的位地址空间是如何分配的
MCS-51单片机的位地址空间: 总共有221位
由2部分构成:
内部数据存储器20H~2FH单元(16个单元 每个单元有8位 可以按位操作 共计128个位地址
地址编号:00H~7FH)
还有一部分在特殊寄存器块中 共有12个特殊寄存器可以进行位操作
分别是 ACC、B 、 PSW 、 P0、 P1 、P2 、P3 、IP 、 IE 、TCON 、 T2COIN 、 SCON (其为地址在80H~FFH之间)。
⑦ 单片机静态显示和动态显示的原理是什么各有什么特点
数码管静态显示就是每个数码管的驱动电平不会改变,知道这个数码管的数值发生变化。
动态显示就是利用人眼反应迟钝,数码管轮流显示一段时间,比如都是20ms,效果看起来是几个数码管同时亮(实际是只有一个在点亮,其他的是余晖)。
静态显示亮度比较亮,功耗大
动态显示亮度稍微差点,但是显示位数多
注意动态扫描频率不要低于50Hz,最好高于60Hz,否则会看到数码管闪烁
⑧ 单片机静态显示和动态显示的原理各有什么特点
一般在控制数码管显示的时候有:
1.
静态显示:每个数码管的段如8段和位有专门的硬件控制,如专门的译码器控制,单片机控制对应的译码器就可以了。每个数码管之间不相互影响。
2.
动态显示:多个数码管的段对应连接在一起,共用单片机的IO资源。位对应不同的IO资源,显示时需不停的改变段码和位选来控制显示。实际某个时刻只有一个数码管在显示。利于人眼的滞后效应,人眼看着感觉是全部在显示。所以动态扫描显示时对应的延时要控制好,同时还要做好消隐措施,防止相邻数码管之间串扰。
⑨ 51单片机数码管动态显示从右往左
这是四位数码管从右从左流动显示,像滚动字幕一样的。用不着矩阵按键哪。
其实程序很简单,没那么复杂。程序如下
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴段码码,0x00为灭
void delay()//延时子程序
{
uint y;
for(y=400;y>0;y--);
}
void main()
{
uchar n,x;
while(1)
{
n++;
if(n>50)//n为显示一屏显示次数,n大小可调节流动速度
{
n=0;
x++;//从下一个位置开始显示
if(x>8)x=0;
}
}
}
仿真结果