专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
上升沿问题
2019-07-15 19:59
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
8399
14
1557
在这里上升沿为什么不是由0到1,而是由1到0,而且调试的时候前面的没有问题,后面的就会乱闪??求教!!!!!
在这里上升沿为什么不是由0到1,而是由1到0,而且调试的时候前面的没有问题,后面的就会乱闪??求教!!!!!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
14条回答
一路拾遗
2019-07-16 18:57
上善若水120 发表于 2014-4-27 22:09
上升沿肯定是由0到1啊!由0上升到1后就触发起作用了
非常感谢前辈的细心回答,第一次发帖子,请见谅。不过我还是有点想不明白,所以把程序贴上来,请前辈们指教,不胜感激:这是一个16*16的点阵,通过两片74Hc595D级联来送位码和段码。
第一个程序
#include<reg52.h>
#include <intrins.h>
unsigned char segout[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //8列
unsigned char code tab[]={0x08,0x1C,0x3E,0x7F,0x1C,0x1C,0x1C,0x1C};
sbit LATCH = P1^0;
sbit SRCLK= P1^1;
sbit SER = P1^2;
sbit LATCH_B = P2^2;
sbit SRCLK_B= P2^1;
sbit SER_B= P2^0;
void DelayUs2x(unsigned char t) //延时
{
while(--t);
}
void DelayMs(unsigned char t) //延时
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
void SendByte(unsigned char dat) //送段码
{
unsigned char i;
for(i=0;i<8;i++)
{
SRCLK=0;
SER=dat&0x80;
dat<<=1;
SRCLK=1;
}
void Send2Byte(unsigned char dat1,unsigned char dat2)
{
SendByte(dat1);
SendByte(dat2);
}
void Out595(void)
{
LATCH=1;
_nop_();
LATCH=0;
}
void SendSeg(unsigned char dat) // 送位码
{
unsigned char i;
for(i=0;i<8;i++) //发送字节
{
SRCLK_B=0; //
这里是先0后1,上升沿。
SER_B=dat&0x80;
dat<<=1;
SRCLK_B=1;
}
LATCH_B=1; //锁存// ?????????????????
在这里为什么是先1而不是先0开始呢?74595 是上升沿锁存的。
_nop_();
LATCH_B=0;
}
void main()
{
unsigned char i,j,k;
while(1)
{
for(i=0;i<8;i++) //8列显示
{
SendSeg(segout
);
Send2Byte(~tab
,0xff);
Out595();
DelayMs(1);
Send2Byte(0xff,0xff);
Out595();
}
}
}
第二个程序,这个不是16*16点阵的,但是是74595的,在串行输入移位的时候为什么又是先shcp1=1,后shcp1=0?不是上升沿才移位的吗?
#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int sbit stcp1=P2^2; //STcpsbit ds1=P2^1; //DSsbit shcp1=P2^0; //SHcp sbit stcp2=P2^5; //STcpsbit ds2=P2^4; //DSsbit shcp2=P2^3; //SHcpuchar code DAT[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//
共阴数码管显示码
uchar code tab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};uchar code wei[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};void delay(uint ms){ uint x,y; for(x=ms;x>0;x--) for(y=255;y>0;y--);}void QR0_5951(uchar num1){ uchar j; for (j=0;j<8;j++) { num1=num1<<1 ; ds1=CY; shcp1=1;//
上升沿发生移位
shcp1=0; } }void OUT_5951()//
将移位寄存器内的数据锁存到输出寄存器并显示
{ stcp1=0; stcp1=1;//
上升沿将数据送到输出锁存器
stcp1=0;} void QR1_5952(uchar num2){ uchar j; for (j=0;j<8;j++) { num2=num2<<1 ; ds2=CY; shcp2=1;//
上升沿发生移位
shcp2=0; } } void OUT_5952()//
将移位寄存器内的数据锁存到输出寄存器并显示
{ stcp2=0; stcp2=1;//
上升沿将数据送到输出锁存器
stcp2=0;}void main(){ uchar i; while(1) { for(i=0;i<2;i++) { QR0_5951(DAT[0]); OUT_5951(); QR1_5952(wei
); OUT_5952(); delay(1); } }} 再次感谢回复的每个人,谢谢你们指教哈!!
加载中...
查看其它14个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
非常感谢前辈的细心回答,第一次发帖子,请见谅。不过我还是有点想不明白,所以把程序贴上来,请前辈们指教,不胜感激:这是一个16*16的点阵,通过两片74Hc595D级联来送位码和段码。第一个程序
#include<reg52.h>
#include <intrins.h>
unsigned char segout[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //8列
unsigned char code tab[]={0x08,0x1C,0x3E,0x7F,0x1C,0x1C,0x1C,0x1C};
sbit LATCH = P1^0;
sbit SRCLK= P1^1;
sbit SER = P1^2;
sbit LATCH_B = P2^2;
sbit SRCLK_B= P2^1;
sbit SER_B= P2^0;
void DelayUs2x(unsigned char t) //延时
{
while(--t);
}
void DelayMs(unsigned char t) //延时
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
void SendByte(unsigned char dat) //送段码
{
unsigned char i;
for(i=0;i<8;i++)
{
SRCLK=0;
SER=dat&0x80;
dat<<=1;
SRCLK=1;
}
void Send2Byte(unsigned char dat1,unsigned char dat2)
{
SendByte(dat1);
SendByte(dat2);
}
void Out595(void)
{
LATCH=1;
_nop_();
LATCH=0;
}
void SendSeg(unsigned char dat) // 送位码
{
unsigned char i;
for(i=0;i<8;i++) //发送字节
{
SRCLK_B=0; // 这里是先0后1,上升沿。
SER_B=dat&0x80;
dat<<=1;
SRCLK_B=1;
}
LATCH_B=1; //锁存// ?????????????????在这里为什么是先1而不是先0开始呢?74595 是上升沿锁存的。
_nop_();
LATCH_B=0;
}
void main()
{
unsigned char i,j,k;
while(1)
{
for(i=0;i<8;i++) //8列显示
{
SendSeg(segout);
Send2Byte(~tab,0xff);
Out595();
DelayMs(1);
Send2Byte(0xff,0xff);
Out595();
}
}
}
第二个程序,这个不是16*16点阵的,但是是74595的,在串行输入移位的时候为什么又是先shcp1=1,后shcp1=0?不是上升沿才移位的吗?
#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int sbit stcp1=P2^2; //STcpsbit ds1=P2^1; //DSsbit shcp1=P2^0; //SHcp sbit stcp2=P2^5; //STcpsbit ds2=P2^4; //DSsbit shcp2=P2^3; //SHcpuchar code DAT[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴数码管显示码uchar code tab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};uchar code wei[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};void delay(uint ms){ uint x,y; for(x=ms;x>0;x--) for(y=255;y>0;y--);}void QR0_5951(uchar num1){ uchar j; for (j=0;j<8;j++) { num1=num1<<1 ; ds1=CY; shcp1=1;//上升沿发生移位 shcp1=0; } }void OUT_5951()//将移位寄存器内的数据锁存到输出寄存器并显示 { stcp1=0; stcp1=1;//上升沿将数据送到输出锁存器 stcp1=0;} void QR1_5952(uchar num2){ uchar j; for (j=0;j<8;j++) { num2=num2<<1 ; ds2=CY; shcp2=1;//上升沿发生移位 shcp2=0; } } void OUT_5952()//将移位寄存器内的数据锁存到输出寄存器并显示 { stcp2=0; stcp2=1;//上升沿将数据送到输出锁存器 stcp2=0;}void main(){ uchar i; while(1) { for(i=0;i<2;i++) { QR0_5951(DAT[0]); OUT_5951(); QR1_5952(wei); OUT_5952(); delay(1); } }} 再次感谢回复的每个人,谢谢你们指教哈!!
一周热门 更多>