main();错了
把函数体用{}括起来
还有你P0和P1应该是单片机的口吧?不要用unsigned定义,直接用就行了,用之前先置1。
看看这个能不能用:
#include<reg51h>
void Delay(unsigned char n)
{unsigned char i;
do { for(i=0;i<23;i++) ; }
while(n--);
}
unsigned char a;
unsigned char code SM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
main()
{
a=0;
P0=0xff;
P1=0xff;
while(1) //你原来的while(1);是死循环,程序到这就死了,不往下执行
{
{P1=0xfe;
P0=SM[a];
Delay(20);
a++;
if(a>9){a==0;}}
}
}
最后,下次不要发错地方了。
#include<reg52h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
//
/ 延时函数 /
//
void delay(unsigned int cnt)
{
while(--cnt);
}
//
/ 主函数 /
//
main()
{
TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式1,16位定时
TH0=0xd8;
TL0=0xf0;
IE= 0x82; //打开中断
TR0=1; //打开定时开关
while(1)
{
P0=Dis_Shiwei;//显示十位
P2=0;
delay(300); //短暂延时
P0=Dis_Gewei; //显示个位
P2=1;
delay(300);
}
}
//
/ 定时器中断函数 /
//
void tim(void) interrupt 1 using 1
{
static unsigned char second,count;
TH0=0xd8; //重新赋值
TL0=0xf0;
count++;
if (count==100) //100x10ms=1S,大致延时时间
{
count=0;
second++; //秒加1
if(second==100)
second=0;
Dis_Shiwei=tab[second/10];//十位显示值处理
Dis_Gewei=tab[second%10]; //个位显示处理
}
可能原因:1你的延时时间可能太短,超过人眼视觉暂留时间,你可以改你的delayms(3)或者直接把delay 函数里的110改小一些(当然改了110就不是1ms一次了,不过本身就不是精确计时无所谓)
2你的数码管开关顺序不对,不知道你用的是共阴还是共阳,不过一般是写完数据后再开数码管控制位,如果你的程序里1是开,0是关的话,那么这个程序相当于是两个数码管在P1=table之后会有一个同时工作的时间,之后才关断其中一个,这时数码管的显示会受到影响。推荐编写顺序是shu12=0;
shu11=1;
P1=table[shi1];
delayms(5);
shu11=0;
shu12=1;
P1=table[ge1];
delayms(5);这样保证一个时间内只有一个数码管工作,新写入的数据不会对另一个数码管造成影响。下面的程序同样采用这种顺序。
3虽然可能性不大,不过也有可能是硬件电路的连接接触不良导致的信号跳变,这个万用表测下就能知道了
以上就是关于51单片机一位数码管c程序全部的内容,包括:51单片机一位数码管c程序、电路如下图请问单片机动态数码管显示C语言程序怎么写呢、怎么用C语言程序使双位数码管显示出稳定的数字等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)