江西理工大学2012届专科生毕业设计(论文)
附录1 单片机定时闹钟程序源代码
#include
#define uchar unsigned char #define uint unsigned int #define fmq RD
sbit key1=P2^0; //位声明 sbit key2=P2^1; sbit key3=P2^2; sbit key4=P2^3;
uchar code table[]={0x3f,0x06,0x5b,//数码管显示的数值 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, 0xbf,0x86,0xdb,//带小数点的数值 0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
void plus(); //函数声明
void minus(); void sint();
uchar table_1[6]; //定义数组,数组内含有6个数值
uchar table_2[6];
uchar shi=1,fen=1,miao=30; //显示初始值
uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;//定义全局变量 uchar flag,flag1,flag2,cnt,cnt1,count;//定义全局变量
void delay(uchar i) //延时函数,用于动态扫描数码管 {
uchar x,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--); }
void init() //初始化函数 {
TMOD=0X21; //工作方式1
TH0=(65536-50000)/256; //定时时间为:50ms TL0=(65536-50000)%6; ET0=1; //打开定时器 EA=1; //开总中断
//MODIFIED
//宏定义 //宏定义
31
江西理工大学2012届专科生毕业设计(论文)
TR0=1; //启动定时器 SCON = 0x50; (串口初始化)
//0101 0000 SM1SM2=10,方式二 REN=1允许接受
TH1 = 0xFD;
TR1 = 1; //启动T/C1 ES = 1;
}
void display() //显示子函数,用于显示时间数值 {
uchar i,j;
table_1[0]=miao; //分离秒的各位与十位 table_1[1]=miao/10;
table_1[2]=fen+11; //分离分的各位与十位 table_1[3]=fen/10;
table_1[4]=shi+11; //分离时的各位与十位 table_1[5]=shi/10;
j=0x7f; //从秒到时的扫描 for(i=2;i<6;i++)
{
P2=j;
P0=table[table_1[i]];//显示数值 delay(10);
j=_cror_(j,1);//循环右移 }
}
void display_1() //显示子函数,用于显示定时时间 {
uchar i,j;
table_2[0]=miao2; //以下含义同上 table_2[1]=miao2/10; table_2[2]=fen2+11; table_2[3]=fen2/10; table_2[4]=shi2+11; table_2[5]=shi2/10; j=0x7f; for(i=2;i<6;i++) {
P2=j;
P0=table[table_2[i]]; delay(10);
32
江西理工大学2012届专科生毕业设计(论文)
j=_cror_(j,1); } }
void shijian() //时间子函数
{
if(flag>=20) //判断是否到一秒 {
flag=0; //到了,则标志位清零 miao++; //秒加1
if(miao>=60) //判断秒是否到60s {
miao=0;//到了,则清零 fen++; //分加1
if(fen>=60) //以下含义同上
{
fen=0; shi++; if(shi>23) shi=0; }
} } }
void key_scan() //键盘扫描子函数 {
uchar i; //定义局部变量
if(key1==0) //判断key1是否按下 {
while(!key1) //防止掉显 {
if(cnt==0) {
display(); }
if(cnt==3||cnt==4) {
display_1();
} if(cnt==1&&(cnt1==0||cnt1==2))
33
//MODIFIED
江西理工大学2012届专科生毕业设计(论文)
display_1();
if(cnt==2&&(cnt1==0||cnt1==2)) {display(); cnt=0; if(cnt1==1&(cnt==1||cnt==2))
}
display();
}
cnt++; //记下按键key1按下的次数
cnt=cnt%5;
if(cnt==1&&cnt1==1) //以下含义同上
{
fen1=fen; fen=99;
for(i=0;i<100;i++) display(); fen=fen1; }
if(cnt==2&&cnt1==1) {
shi1=shi; shi=99;
for(i=0;i<100;i++) display(); shi=shi1; }
if(cnt==3&&cnt1==1) {
fen1=fen2; fen2=88; for(i=0;i<100;i++) display_1(); fen2=fen1; }
if(cnt==4&&cnt1==1) {
shi1=shi2; shi2=88;
for(i=0;i<100;i++) display_1();
34
江西理工大学2012届专科生毕业设计(论文)
shi2=shi1; }
} if(key2==0)
{
while(!key2) //防止掉显
{
if(cnt==0) {
display(); }
if(cnt==3||cnt==4) {
display_1(); }
if(cnt==1&&(cnt1==0||cnt1==2)) display_1();
if(cnt==2&&(cnt1==0||cnt1==2))
{display(); cnt=0; } if(cnt1==1&(cnt==1||cnt==2))
display();
}
cnt1++;
cnt1=cnt1%3;
if(cnt!=0&&cnt1==1) //第一次按下,停止计数
TR0=0;
if(cnt1==2) { TR0=1; //开始计数 cnt=0; //按下次数清零
} }
if(key3==0) //判断key3是否按下 {
while(!key3) //防止掉显 {
if(cnt==0)
35