中科因仑“3+1”工程特种兵精英论坛
标题:
2051时针程序练手,全是自己写的,有仿真文件
[打印本页]
作者:
因为思念谁
时间:
2016-6-4 01:16
标题:
2051时针程序练手,全是自己写的,有仿真文件
之所以贴出来,一个也是因为这个电路并不像实验板那么整洁,大家看附件的仿真文件就清楚,另一方面也是之前学习的笔记吧
程序
/* 本程序仅应用于‘4位单片机电子钟电路’
2051
晶振 3.579MHz
main.c
*/
#include <STC11.H>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0xfd,0x25,0xbb,0xaf,0x67,0xcf,0xdf,0xa5,0xff,0xef}; //0~9仅限本电路,正常显示
uchar code table2[]={0xfc,0x24,0xba,0xae,0x66,0xce,0xde,0xa4,0xfe,0xee};
uchar x,h,m,s,flag,ID,flag_set; //ID=1调整分钟 ID=2调整时钟
void delay(uint a) //延时函数0~65535
{
while(a--);
}
void display() //显示函数
{
uchar x=1000; //x延时时间
if(flag_set!=1)
{
P37=0; //显示分个位
P1=table[m%10];
delay(x);
P37=1;
P32=0; //显示分十位
P1=table[m/10];
delay(x);
P32=1;
}
else
{
if (flag)
{
P37=0; //显示分个位
P1=0x01;
delay(x);
P37=1;
P32=0; //显示分十位
P1=0x01;
delay(x);
P32=1;
}
else
{
P37=0; //显示分个位
P1=table[m%10];
delay(x);
P37=1;
P32=0; //显示分十位
P1=table[m/10];
delay(x);
P32=1;
}
}
if(flag_set!=2)
{
P31=0; //显示时个位
P1=table[h%10];
delay(x);
P31=1;
if (flag) //闪烁秒和显示时十位
{
P30=0;
P1=table[h/10];
delay(x);
P30=1;
}
else
{
P30=0;
P1=table2[h/10];
delay(x);
P30=1;
}
}
else
{
if(flag)
{
P31=0; //显示时个位
P1=0x01;
delay(x);
P31=1;
P30=0;
P1=0x01;
delay(x);
P30=1;
}
else
{
P31=0; //显示时个位
P1=table[h%10];
delay(x);
P31=1;
P30=0; //显示时十位
P1=table[h/10];
delay(x);
P30=1;
}
}
}
void keyscan()
{ uchar x=1000; //x消抖延时系数
delay(x);
if(P34==0)
{ while(P34==0)
display();
ID++;
switch(ID)
{
case 1: //set m flag_set=1
flag_set=1;
while(P34)
{if(P35==0)
{ while(P35==0)
display();
m++;
if(m==60)
m=0;
}
else
{
display();
}
}
break;
case 2: //set h flag_set=2
flag_set=2;
while(P34)
{if(P35==0)
{ while(P35==0)
display();
h++;
if(h==24)
h=0;
}
else
{
display();
}
}
break;
case 3:
ID=0;
flag_set=0;
break;
}
}
}
void main(void)
{
TH0=(65536-29825)/256; //中断初始化,100ms
TL0=(65536-29825)%256;
TMOD=0x01; //定时器0方式1
ET0=1; //中断T0允许
TR0=1; //开T0
//EX0=1; //开外部中断0
//IT0=1; //下降沿触发
EA=1; //开总中断
while(1)
{
display();
if (P34==0)
keyscan();
}
}
void t0() interrupt 1
{ x++;
if(x%5==0) //闪烁标志
flag=~flag;
if(x==10) //定时1s
{ x=0;
s++;
if(s==60)
{ s=0;
m++;
if(m==60)
{ m=0;
h++;
if(h==24)
{ h=0; }
}
}
}
TH0=(65536-29825)/256; //晶振3.579MHz,定时4ms减1193;定时100ms减29825;定时200ms减59650
TL0=(65536-29825)%256;
}
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/)
Powered by Discuz! X3.4