完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
本想通过计算机向单片机传送数据,然后在数码管上显示,同时单片机把接受到的数据传回给计算机,在串口助手上显示,但得到的现象跟预期不大一样,求大神指出编程问题所在。
#include #define uchar unsigned char #define uint unsigned int uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71}; ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4; uint temp=0,mm,nn,aa,flag; void display(uchar bai); void init(); void main() { init(); while(1) { if(flag==1) { ES=0; SBUF=temp; while(!T1); ti=0; ES=1; flag=0; } display(temp); } } void init() { SCON=0X50; TMOD=0X20; PCON=0X80; TH1=0XF3; TL1=0xF3; EA=1; TR1=1; ES=1; } void display(uchar bai) { LSA=0,LSB=0,LSC=0; P1=table[bai]; } void chuangkou() interrupt 4 { RI=0; temp=SBUF; flag=1; } |
|
相关推荐
19个回答
|
|
|
来大神解答一下,萌新的问题
|
|
|
|
|
|
建议先调试数码管显示,先确定能正确显示想要显示的数据,看你的数码管显示程序像是静态驱动方式,但似乎是3个数码管,这样的话,如果是静态驱动方式,有三个数码管,按你的程序就会是三个数码管显示相同的内容。
其次调试串口发送数据,这样可以确定单片机与计算机之间串口的参数是否设置一致。 最后就可以按你所要求的功能来调试了 |
|
|
|
|
人中狼 发表于 2017-9-7 09:49 额,那个LSA,LSB,LSC,是用来控制数码管的位显的,现在得情况是没传数据前显示0,传数据后只显示8,其他的数显示不出 |
|
|
|
|
|
还是之前的建议,既然LSA,LSB,LSC是位显,那也就是有三位数码管,按现在的显示程序,只会是三位都显示相同的数据。
一个字节的数据按十六进制格式需要两位数码管才能显示出来,按你现在的程序来推断,数码管显示采用了动态扫描的驱动方式,但你的驱动程序却用了静态驱动的方式。 你说传数据后只显示8,但没说明计算机发送的是什么数据,按你的程序推断,如果显示8的话,那么发送的数据是0x08吗 |
|
|
|
|
|
|
|
|
|
|
|
这个改回来之后,单片机给计算机发送的数据是正确的,但是数码管的显示还是不对 |
|
|
|
|
人中狼 发表于 2017-9-7 10:28 我把动态数码管改为静态数码管后,还是一样的情况,计算机发送完数据后单片机数码管不显示了 #include #define uchar unsigned char #define uint unsigned int uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e}; uint temp,flag; void init(); void main() { init(); while(1) { P0=table[temp]; } } void init() { SCON=0X50; TMOD=0X20; PCON=0X80; TH1=0XF3; TL1=0xF3; EA=1; ES=1; TR1=1; } void chuangkou() interrupt 4 { RI=0; temp=SBUF; SBUF=temp; while(!TI); TI=0; } |
|
|
|
|
人中狼 发表于 2017-9-7 10:28 不知道是不是跳不出中断服务程序 |
|
|
|
|
人中狼 发表于 2017-9-7 10:28 发送的数据2,3,4,5,6都发过了,不知道是不是跳不出中断服务程序,静态数码管没显示了。。 |
|
|
|
|
|
LSA,LSB,LSC这三个引脚现在是如何控制的。
现在需要说明一下运行情况: 一,在计算机未发送数据时,数码管显示什么,是否正常,temp最好初始化一个固定的数值。 二,计算机发送数据后,单片机是否能正确返回,如果可以正常返回的话,那就是只有显示有问题。 三,计算机最好发送小于0x0f的数据,大于这个值得数据如果能正确显示的话,显示的并不是正常数值,需要按数据位和数码管的段对应来判断是什么数值。 |
|
|
|
|
人中狼 发表于 2017-9-7 17:05 改为静态数码管后,就不用LSA,LSB,LSC,控制了,计算机发送数据后可以正确返回数据,但是数码管刚开始时为0,发送数据后就不亮,发的数据是1,2,3,4,这些小于16的数。 |
|
|
|
|
阿尔法UU 发表于 2017-9-7 16:29 在你的程序基础上改为三位动态显示 #include #define uchar unsigned char #define uint unsigned int uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71}; ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4; uint temp=0,aa=0,flag=0; uchar bai,shi,ge; uchar x=0; void display(); void init(); void main() { init(); while(1) { if(flag==1) { ES=0; flag=0; SBUF=temp; while(!TI); TI=0; ES=1; } /*************数据分解***************/ bai=temp/100; // 百位 shi=temp/10%10; // 十位 ge =temp%10; // 个位 display(); } } void init() { SCON=0X50; TMOD=0X20; PCON=0X80; TH1=0XF3; TL1=0xF3; EA=1; TR1=1; ES=1; } void display() { aa++; if(aa>=100) //0~65535根据主循环速度调整到约1ms为佳 { aa=0; switch(x) { case 0: P1=0x00; //消隐 LSA=0; //显示百位 LSB=LSC=1; //关闭十、个位 P1=table[bai]; x=1; //循环动态显示 break; case 1: P1=0x00; LSB=0; //显示十位 LSA=LSC=1; P1=table[shi]; x=2; break; case 2: P1=0x00; LSC=0; //显示个位 LSA=LSB=1; P1=table[ge]; x=0; break; } } } void chuangkou() interrupt 4 { RI=0; temp=SBUF; flag=1; } |
|
|
|
|
|
你这里有几个问题:一,你所使用的数码管是什么型号的,即几位(也就是几个8字),是共阴的还是共阳的,第一次贴的程序是共阴数码管的段码,之后改过的程序是共阳数码管的段码。二,你先后的两个程序都是静态驱动数码管的程序,并没有任何一个是动态驱动的,动态驱动是指多位数码管(即多个8字)在显示时是每次只显示一个数码管,经过一定的延时后,再显示下一个数码管。三,三个数码管的位控制引脚再静态驱动方式下一定是一个固定的电平,在改过的程序里没有对这三个引脚进行控制,如果是共阴数码管,这三个引脚应该置0,或直接接地。
|
|
|
|
|
|
感谢大佬,我修改你的程序后,可以了,但是有个问题,为什么要用三个数码管显示,还有就是为啥不能直接显示我想要的数,就是输入3得到3,而是得到3的ASCII码051呢,我有点疑惑,还有就是为啥我用静态数码管显示不了呢 #include #define uchar unsigned char #define uint unsigned int uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71}; ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4; uint temp=0,aa=0,flag=0; uchar bai,shi,ge; uchar x=0; void display(); void init(); void main() { init(); while(1) { if(flag==1) { ES=0; flag=0; SBUF=temp; while(!TI); TI=0; ES=1; } /*************数据分解***************/ bai=temp/100; // 百位 shi=temp/10%10; // 十位 ge =temp%10; // 个位 display(); } } void init() { SCON=0X50; TMOD=0X20; PCON=0X80; TH1=0XF3; TL1=0xF3; EA=1; TR1=1; ES=1; } void display() { aa++; if(aa>=100) //0~65535根据主循环速度调整到约1ms为佳 { aa=0; switch(x) { case 0: P1=0x00; //消隐 LSA=0,LSB=0,LSC=0; //显示百位 P1=table[bai]; x=1; //循环动态显示 break; case 1: P1=0x00; LSA=1,LSB=0,LSC=0; //显示十位 P1=table[shi]; x=2; break; case 2: P1=0x00; LSA=0,LSB=1,LSC=0; //显示个位 P1=table[ge]; x=0; break; } } } void chuangkou() interrupt 4 { RI=0; temp=SBUF; flag=1; } |
|
|
|
|
人中狼 发表于 2017-9-7 18:38 程序修改后可以了 #include #define uchar unsigned char #define uint unsigned int uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71}; ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4; uint temp=0,aa=0,flag=0; uchar bai,shi,ge; uchar x=0; void display(); void init(); void main() { init(); while(1) { if(flag==1) { ES=0; flag=0; SBUF=temp; while(!TI); TI=0; ES=1; } /*************数据分解***************/ bai=temp/100; // 百位 shi=temp/10%10; // 十位 ge =temp%10; // 个位 display(); } } void init() { SCON=0X50; TMOD=0X20; PCON=0X80; TH1=0XF3; TL1=0xF3; EA=1; TR1=1; ES=1; } void display() { aa++; if(aa>=100) //0~65535根据主循环速度调整到约1ms为佳 { aa=0; switch(x) { case 0: P1=0x00; //消隐 LSA=0,LSB=0,LSC=0; //显示百位 P1=table[bai]; x=1; //循环动态显示 break; case 1: P1=0x00; LSA=1,LSB=0,LSC=0; //显示十位 P1=table[shi]; x=2; break; case 2: P1=0x00; LSA=0,LSB=1,LSC=0; //显示个位 P1=table[ge]; x=0; break; } } } void chuangkou() interrupt 4 { RI=0; temp=SBUF; flag=1; } |
|
|
|
|
阿尔法UU 发表于 2017-9-7 19:32 因为串口发送/接收在HEX模式下是8位16进制数,一位数码管最多只能显示0~F,至少2位数码管显示00~FF,按十进制显示0~255至少需要3位数码管,并要把十六进制数转换成十进制。你用静态显示方式只能是所有相连的数码管显示相同数字。 |
|
|
|
|
|
会不会是没有延时。。。。(猜测 ) |
|
|
|
|
|
|
|
|
|
|
|
while循环里的是TI不是T1
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
880 浏览 0 评论
644 浏览 0 评论
667 浏览 0 评论
925 浏览 0 评论
999 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
17099 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-18 10:24 , Processed in 1.076417 second(s), Total 109, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
5059