赞
踩
目录
使用51单片机设计一个数字时钟,显示格式的如图所示:实验要求显示学号一段时间后然后再开始显示时钟,同时具备时分校准功能”
1.先在proteus仿真软件把电路搭建好.
2.然后在KIEL5编程软件中编写时钟代码.
3.最后生成HEX文件将其导入proteus软件中的单片机中进行测试.
(器件名称参考:)
74HC573芯片在此作用是提高I/O口的的驱动能力,输入和输出都是一样的。
74LS138芯片是一款三八译码器,简单理解就是三个输入端控制8个输出端,在此电路中起到的作用是节省I/O口:
74LS138真值表:
代码参考:
- #include <reg52.h>//头文件
- #define uchar unsigned char
- #define uint unsigned int
- uchar code seg[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x7c};//段选数据(0-9,熄灭,—,b)
- uchar code dis[]={0,1,2,3,4,5,6,7};//位选(8位数码管)
- char hour=0,min=0,second=0,con=0;//时,分,秒,中断计数
- sbit key1=P3^0;//定义管脚
- sbit key2=P3^1;
- sbit key3=P3^2;
- sbit key4=P3^3;//定义管脚
- void delayms(uint ms)//ms延时函数
- {
- uchar i;
- while(ms--)
- for(i=0;i<123;i++);
- }
-
- void ID_stu()//显示学号410B000函数
- {
- uchar i=200;
- while(i--)
- {
- P0=seg[4];//数码管第一位显示“4”
- P2=dis[0];
- delayms(2);
- P0=seg[10];//消影
-
- P0=seg[1];//数码管第二位显示“1”
- P2=dis[1];
- delayms(2);
- P0=seg[10];
-
- P0=seg[0];//数码管第三位显示“0”
- P2=dis[2];
- delayms(2);
- P0=seg[10];
-
- P0=seg[12];//数码管第四位显示“b”
- P2=dis[3];
- delayms(2);
- P0=seg[10];
-
- P0=seg[0];//数码管第五位显示“0”
- P2=dis[4];
- delayms(2);
- P0=seg[10];
-
- P0=seg[0];//数码管第六位显示“0”
- P2=dis[5];
- delayms(2);
- P0=seg[10];
-
- P0=seg[0];//数码管第七位显示“0”
- P2=dis[6];
- delayms(2);
- P0=seg[10];
-
- P0=seg[0];//数码管第八位显示“0”
- P2=dis[7];
- delayms(2);
- P0=seg[10];
- }
-
- }
-
- void KEY_can()//按键处理函数
- {
- if(key1==0||key2==0||key3==0||key4==0)
- {
- delayms(20);
- if(key1==0||key2==0||key3==0||key4==0)
- {
-
- if(key1==0)//时+1
- {
- hour++;
- if(hour>23)
- hour=0;
- while(key1==0);
- }
- else if(key2==0) //时-1
- {
- hour--;
- if(hour<0)
- hour=23;
- while(key2==0);
- }
- else if(key3==0) //分+1
- {
- min++;
- if(min>59)
- min=0;
- while(key3==0);
- }
- else if(key4==0) //分-1
- {
- min--;
- if(min<0)
- min=59;
- while(key4==0);
- }
-
- }
-
- }
-
- }
- void Clock()//时钟显示函数
- {
- P0=seg[hour/10];//数码管第一位显示“时高位”
- P2=dis[0];
- delayms(2);
- P0=seg[10];
-
- P0=seg[hour%10];//数码管第二位显示“时低位”
- P2=dis[1];
- delayms(2);
- P0=seg[10];
-
- P0=seg[11];//数码管第三位显示“-”
- P2=dis[2];
- delayms(2);
- P0=seg[10];
-
- P0=seg[min/10];//数码管第四位显示“分高位”
- P2=dis[3];
- delayms(2);
- P0=seg[10];
-
- P0=seg[min%10];//数码管第五位显示“分低位”
- P2=dis[4];
- delayms(2);
- P0=seg[10];
-
- P0=seg[11];//数码管第六位显示“-”
- P2=dis[5];
- delayms(2);
- P0=seg[10];
-
- P0=seg[second/10];//数码管第七位显示“秒高位”
- P2=dis[6];
- delayms(2);
- P0=seg[10];
-
- P0=seg[second%10];//数码管第八位显示“秒高位”
- P2=dis[7];
- delayms(2);
- P0=seg[10];
-
- }
-
- void T0_init()//T0定时器初始化”
- {
- TMOD=0x01;//设置定时器计数方式1
- TH0=(65536-50000)/256;//12Mhz晶振 机器周期=12*(1/foc)
- TL0=(65536-50000)%256;
- TR0=1;//开启定时器
- ET0=0;//中断允许位开启
- EA=1;//开启总中断允许位
- }
- void main ()
- {
- uchar i;
- T0_init();
- ID_stu();
- delayms(2000);
- ET0=1;
- while(1)
- {
- KEY_can();
- Clock();
- }
-
- }
-
- void T0_ET0()interrupt 1//T0定时器中断服务函数
- {
- TH0=(65536-50000)/256;//赋初值
- TL0=(65536-50000)%256;
-
- if(++con==20)//1s
- {
- con=0;
- if(++second==60)//1min
- {
- second=0;
- if(++min==60)//1hour
- { min=0;
- if(++hour==24)//1day
- hour=0;
- }
- }
-
- }
-
-
-
- }
-
-
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。