赞
踩
这个是学校单片机上机考试的一个例题,自己简单编了一下。
上方是一个简单的原理图,利用的是共阳极的八位数码管。
下方就直接附上程序。
- #include <reg51.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code t[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- uchar code seg1[]={0xa4,0xc0,0xa4,0xb0,0xf9,0xa4,0xa4,0x80};//20231228
- uchar list[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
- uchar seg2[8]={0xa4,0xb0,0xbf,0x92,0x90,0xbf,0x92,0xc0}; //重点,如果数组里的数需要改变的话,不能定义为uchar code ,23-59-50
- uchar a=23,b=59,c=50;//a存储小时,b存储分钟,c存储秒
- uchar a1,a2,b1,b2,c1,c2;//a1,a2存储小时拆分成十位和个位,其他同理
- uchar temp=0;//存储50ms的计数值,满20使秒数进1
- void delayXms(uint x)
- {
- uchar j;
- while(x--)for(j=0;j<125;j++){;}
- }
- void int0() interrupt 1 using 1
- {
- TH0=0x3c; //定时值50ms
- TL0=0xb0;
- temp++;
- if(temp==20)
- {
- temp=0;
- c++;
- c1=c/10;
- c2=c%10;
- seg2[6]=list[c1];
- seg2[7]=list[c2];
- if(c==60)
- {
- c=0;
- c1=c/10; //重新对于c清零后的数组赋值
- c2=c%10;
- seg2[6]=list[c1];
- seg2[7]=list[c2];
- b++;
- b1=b/10;
- b2=b%10;
- seg2[3]=list[b1];
- seg2[4]=list[b2];
- if(b==60)
- {
- b=0;
- b1=b/10; //重新对于b清零后的数组赋值
- b2=b%10;
- seg2[3]=list[b1];
- seg2[4]=list[b2];
- a++;
- a1=a/10;
- a2=a%10;
- seg2[0]=list[a1];
- seg2[1]=list[a2];
- if(a==24)
- {
- a=0;
- a1=a/10; //重新对于a清零后的数组赋值
- a2=a%10;
- seg2[0]=list[a1];
- seg2[1]=list[a2];
- }
- }
- }
- }
- }
- void main(void)
- {
- uchar i;
- TMOD=0x01;
- EA=1;
- ET0=1;
- TH0=0x3c; //定时值50ms
- TL0=0xb0;
- TR0=1;
- while (1)
- {
- if(c2>=0&&c2<5)
- {
- for(i=0;i<8;i++)
- {
- P2=t[i];
- P0=seg2[i];
- delayXms(3);
- }
- }
- if(c2>=5&&c2<=9)
- {
- for(i=0;i<8;i++)
- {
- P2=t[i];
- P0=seg1[i];
- delayXms(3);
- }
- }
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。