51单片机c语言问题,麻烦各位大哥大姐帮帮忙。。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机c语言问题,麻烦各位大哥大姐帮帮忙。。。相关的知识,希望对你有一定的参考价值。

我想让七段数码管每隔一秒由0加到9999,程序如下,已经可以显示了,就是数码管显示不清楚,会模糊的出现下一个数字的轮廓,麻烦各位帮忙一下。。真的谢谢了,分剩下不多了,抱歉。。。
#include <reg52.h>
#include <intrins.h>
#define uc unsigned char
void delayus(uc);
void delayms(uc);
void display(int,int,int,int);
char code duan[]=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8e;
unsigned int jnum=0;
uc num=0;
sbit oe=P2^7;
void main()


IE=0x82;
ET0=1;
TMOD=0x01;
TH0=0x1f;
TL0=0x00;
delayus(1);
TR0=1;
while(1)

if(num==32)

num=0;
if(jnum==9999)
jnum=0;
jnum++;
display(jnum/1000,jnum%1000/100,jnum%1000/10,jnum%10);
while(num!=32)

display(jnum/1000,jnum%1000/100,jnum%1000/10,jnum%10);




void int1() interrupt 1

TH0=0x1f;
TL0=0x00;
num++;


void display(int qian,int bai,int shi,int ge)

int s[4];
char i,temp;
s[3] = qian ;
s[2] = bai;
s[1] = shi;
s[0] = ge;
temp=0x77;
for(i=0;i<4;i++)

P0=temp;
WR=0;
delayus(1);
WR=1;
P0=0xff;
delayus(1);
P0=duan[s[3-i]];
delayus(10000);
temp=_cror_(temp,1);


void delayus(uc k)

uc z;
for(z=0;z<k;z++);

好像都不行,不过还是谢谢前面三位朋友,我想补充一下就是这个七段数码管位选在锁存器的右边,段选在锁存器左边,我想是不是怎么写程序都会影响到数码管的啊? 因为视频教程的段选和位选在不同的锁存器右边的。感觉这样就没问题了、、、

三种可能,
1、如果是多个数码管都很亮的话,是数码管的驱动电流太大,这种情况可串接一个小电阻实现。
2、是显示子程序里面的延时时间太长,一般5MS就够了。
3、也可能是因为你定义int s[4];是局部变量,当这个子程序执行结束后,变量释放,数值是随机的。虽然说单片机的程序的执行速度很快能够弥补这一点,但还是有可能会出问题的。建议把int s[4];定义为全局变量来试试。

不会有大问题的。加油!

我不知道你的整体电路时怎么实现的。你补充的很对,单片机的输出的控制信号应接到锁存器的输入端,锁存器的输出信号应与数码管的控制引脚相连接,这样才有锁存的意义,锁存器的输入输出如果弄反了,肯定不能工作的。如果还不行,建议你先试试把数码管的位选和段选直接接到单片机的IO来试一试,看程序本身有没有问题。程序没问题的话,那就是电路的问题了。
参考技术A 刷的速度太慢了。你改一改delayus(10000);里的参数,改小一点就好了,试一下。 参考技术B 数码管是一位一位的显示,是靠人的视觉暂留和数码管的余晖作用使人看到清晰的数字,人眼的视觉暂留大约是0.1秒,因此对各个数码管一遍扫描下来的总时间不能超过0.1秒!我一般使用8位数码管各个位显示间隔5毫秒就已经很清晰了 。
还有就是调用显示程序的时间间隔太大的话也会导致显示不清晰
参考技术C 你定义的num是unsigned char 类型,单片机里面对应无符号8位数据,所以num最大也就是256,你后面的判断条件num==9999 是不会成立的。

C语言作业:用递归法怎么做猴子摘桃?知道的大哥大姐帮帮忙,我自己想破脑袋想不出来!

#include <stdio.h>
const unsigned int &fun_last(const int &n,const int &day)

if(n<0) return -1;
if(day==1) return n;
return fun_last(2*(n+1),day-1); //当天剩n个,前一天剩下2*(n+1)个

int main(void)

int day=10,n=1;
printf("第一天摘下%d个桃子\n",fun_last(n,day));
return 0;

参考技术A #include<stdio.h>
int peach(int n)
//第N天只剩下一个桃子了

if(n==1)return 1;
return 2*(peach(n-1)+1);

int main()

printf("%d\n",peach(10));
return 0;
参考技术B 感觉就是递归调用嘛。。函数调用自己。每次传一个比上一个参数大的值。。上限是猴子能搬动的最大值(自己设置。)然后递归调用就行了。追问

谢谢 !可是我没有基础 很多语言都不懂 根本做不来 会的话帮我做下 急需 !放假都陪老婆了,可是这个作业拉下了 下午就教啊!

追答

哎。。。陪老婆。。首先鄙视你下,还没结婚就乱叫。。你付得起责吗。。
是这个题?
http://zhidao.baidu.com/question/276555822.html&push=ql

追问

是这个题!这位哥哥或是姐姐,您批评的是

参考技术C int tz(int day);
printf("%d\n",tz(1));
int tz(int day)int c;if(day==10)c=1;else c=tz(day+1)*2;return c;
手机打字,没验证。

以上是关于51单片机c语言问题,麻烦各位大哥大姐帮帮忙。。。的主要内容,如果未能解决你的问题,请参考以下文章

我的stm32串口使用printf函数总是不能成功发送数据啊,各位大哥大姐能帮忙看一下吗?实现的功能就是循环

请问各位大哥大姐哪些命令可以在WINXP的运行菜单上面运行呢

那位大哥大姐帮忙我下面一段摘要翻译成英文

c语言设计猜数字游戏

跪求 八年级下册(人教版)英语 1~6单元单词 神仙大哥大姐帮帮我!

各位兄台大哥帮忙啊,急用