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的运行菜单上面运行呢