大连东软信息学院单片机三级项目电子时钟设计_东软三级项目信息
大连东软信息学院单片机三级项目电子时钟设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“东软三级项目信息”。
《单片机原理与应用》项目报告
项目编号:_三级项目1__________ 项目列别:三级项目____________ 项目名称:电子时钟设计
班级:______________ 学号:___________ 姓名:________ _____________
时间:_______________
分值:_____________
电子时钟设计
【项目目的】
掌握矩阵键盘的扫描与识别控制 掌握七段数码管的显示控制 【项目内容】
使用51单片机的内部定时器资源设计一个电子时钟,该项目所需实现的内容包括:
(1)系统启动时,在6个LED上分别显示“—”,等待用户输入初始时间(2)通过矩阵键盘输入初始时间,要求必须有容错处理,不能输入非法的时间参数
(3)当初始时间输入完毕后,通过确认键确认,该电子时钟便开始运行(4)通过修改键可重新设置初始时间(5)可设置闹铃时间
(6)当闹铃时间到后,可通过蜂鸣器提示,然后通过按键取消蜂鸣器蜂鸣(7)当前时间信息可通过串口传送给PC机(8)可自行添加功能 【硬件连线】
(1)使51单片机的P0口与JP18相连,使用P2口连接JP19扭接,使用P1口连接JP19,控制LED的位选端。(2)短接J8(3)连接P3^0 P3^1与L0 L1相连
(4)JP1^1-JP1^3与JP16^0-JP16^2相连(5)P1^6-P1^7与JP16^6-JP16^7相连 【控制原理分析】
【代码流程分析】
【项目代码】
#include #include
#include #define uint unsigned int #define uchar unsigned char sbit k=P1^6;//蜂鸣
sbit KEY1=P1^1;
//切换键
sbit KEY2=P1^2;//minute ,hour调整加1定义
sbit KEY3=P1^3;//minute ,hour调整减1定义
sbit bear=P3^1;//闪烁灯
sbit keyalarm=P3^0;//闹铃开关指示灯 sbit kled=P1^7;//闹铃开关 code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//段码控制
char code weikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};uchar ms[6]={10,10,10,10,10,10};uchar StrTab[6];
uchar minute=59,hour=12,second=0;
//正常时钟 秒,分,时 定义 uchar minute1=00,hour1=00;second1=00;//闹钟时钟 秒,分,时 定义
uchar flag=0, flag1=0;
//切换标志
uchar num=0;uint count=0;
//定时器计数,定时50ms,count满20,秒加1
/***********子函数声明*******************************************/ void xianshishuzu();
//显示数组子程序
void alarm();
//闹钟子程序
void alarmbeer();void beng();
/********************** 延时子程序*****************************/
void delay(uint z){
uint x,y;
for(x=0;x
for(y=0;y
/**********************显示时钟子函数***************************/
void dispaly(uchar w[6]){
unsigned int i,j,aa;
aa=0x7f;
//位选初值0111 1111
for(i=0;i
//依次将数组w中六个数取出,并显示
{
P2=aa;
//位选
j=w[i];
//取出要显示的数码
P0=tab[j];
//取出段选编码
aa=_cror_(aa,1);
//位选信号向右移一位
delay(1);
//显示延时
P0=0xff;
//消影
}
} void alarmbeer(){ uchar i;
if(keyalarm==0)
{
if((hour==hour1)&&(minute==minute1)&&((second>=second1)&&(second
for(i=0;i
{
beng();
} } }
/***********************显示时钟数组子程序***********************/ void xianshishuzu()
{
StrTab[4]=second/10;
StrTab[5]=second%10;
StrTab[2]=minute/10;
StrTab[3]=minute%10;
StrTab[0]=hour/10;
StrTab[1]=hour%10;
}
/**********************键盘扫描子程序*************************/ void keycan()
{
if(KEY1==0)
//按一次,正常显示,按第二次,时调整,按第三次,分调这整,{
delay(10);
//按键1去抖以及动作
if(KEY1==0)
//确认按键是否按下
{
flag++;
//切换标志
}
while(!KEY1);
//释放按键
}
if(flag==1)
{
if(KEY2==0)
{
delay(10);
if(KEY2==0)
{
hour++;
//正常时间 小时 加1
if(hour==24)hour=0;
}
while(!KEY2)
//释放按键
{
dispaly(StrTab);
}
}
if(KEY3==0)
{
delay(10);
if(KEY3==0)
{
hour--;
//正常时间小时
减1
if(hour==-1)
hour=23;
dispaly(StrTab);
}
while(!KEY3)
{
dispaly(StrTab);
}
}
}
if(flag==2)
{
if(KEY2==0)
{
delay(10);
if(KEY2==0)
{
minute++;
if(minute==60)
minute=0;
}
while(!KEY2)
{
dispaly(StrTab);
}
}
if(KEY3==0)
{
delay(10);
if(KEY3==0)
{
minute--;
if(minute==-1)
minute=59;
}
while(!KEY3)
{
//按键去抖以及动作 //正常时间 分 加1
//释放按键
//正常时间分
减1
dispaly(StrTab);
}
}
}
if(flag==2)
{
if(KEY2==0)
//按键去抖以及动作
{
delay(10);
if(KEY2==0)
{
minute++;
//分加1
if(minute==60)
minute=0;
}
while(!KEY2)
{
dispaly(StrTab);
}
}
}
if(flag==3)
//闹钟对时
{
if(KEY2==0)
{
delay(10);
if(KEY2==0)
{
hour1++;
if(hour1==24)
hour1=0;
//闹钟时间 小时 加1
}
while(!KEY2)
{
alarm();
}
}
if(KEY3==0)
{
delay(10);
if(KEY3==0)
{
hour1--;
if(hour1==-1)
hour1=23;
//闹钟时间 小时 减
}
while(!KEY3)
{
alarm();
}
}
}
if(flag==4)
{
if(KEY2==0)
//按键去抖以及动作
{
delay(10);
if(KEY2==0)
{
minute1++;
if(minute1==60)minute1=0;
//闹钟分加1
}
while(!KEY2)
{
alarm();
}
}
if(KEY3==0)
//按键去抖以及动作
{
delay(10);
if(KEY3==0)
{
minute1--;
if(minute1==-1)
minute1=59;
//闹钟分减1
}
}
while(!KEY3)
{
alarm();
}
} } /*******************蜂鸣器子程序****************************/ void beng(){
bear=0;
k=0;
delay(100);
bear=1;
k=1;
delay(100);}
/*****************整点报警子程序***************************/
void zhengdian(void)
{
uchar i=0;
if((second==0)&(minute==0))
//整点报时
{
for(i=0;i
{
TR0=1;
beng();
dispaly(ms);
}
}
}
/********************************定时闹*******************************/
void alarm()
{
StrTab[4]=second1/10;
StrTab[5]=second1%10;
StrTab[2]=minute1/10;
StrTab[3]=minute1%10;
StrTab[0]=hour1/10;
StrTab[1]=hour1%10;
TR0=0;
dispaly(StrTab);
xianshishuzu();}
/**************************中断子程*********************************/ void time_()interrupt 1
//中断程序
{
count++;
TH0=(65536-921600/20)/256;
//0.5ms重新送初值
TL0=(65536-921600/20)%256;
if(count==20)
//定时器计数,定时50ms,count满20,秒加1
{
second++;
钟
序
count=0;
if(second==60)
//秒值等于60,秒清零,分加1
{
second=0;
minute++;
if(minute==60)
//分值等于60,分清零,时加1
{
minute=0;
hour++;
if(hour==24)
//时值等于24,时清零,返回,全部归零
{
hour=0;
}
}
}
}
xianshishuzu();}
/***********************数字电子钟主函数***************************/
void main(){
P1=0XFF;
TL0=(65536-921600/20)%256;
EA=1;
//总中断开
TMOD=0x01;
TH0=(65536-921600/20)/256;//预置计数初值,50ms
ET0=1;
//允许定时器0中断
TR0=1;
//开启定时器0
while(1)
//主循环
{
keyalarm=kled;
if(flag==0)
{
TR0=0;
dispaly(ms);//上电初始化就显示------
}
if(P1!=0XFF)
{
keycan();
//按键提前扫描
}
if(flag>0)
{
if(flag==1||flag==2)
{
TR0=1;
dispaly(StrTab);
}
if(flag==3||flag==4)
{
TR0=0;
alarm();
}
if(flag==5)
{
TR0=1;
dispaly(StrTab);
zhengdian();
alarmbeer();
}
if(flag==6)
{
TR0=0;
flag=0;
dispaly(ms);
}
//按KEY1第六次定时器关闭,切换标志请零,显示------
}
} }
【结论与收获】
2020年大连东软信息学院计算机科学与技术专业学费28000/年;大连东软信息学院软件工程专业学费28000/年;大连东软信息学院网络工程专业学费28000/年。一般情况下,艺术类专业学费......
刀豆文库小编为你整合推荐3篇大连东软信息学院学费,也许这些就是您需要的文章,但愿刀豆文库能带给您一些学习、工作上的帮助。......
·数据库简答题1.数据库经历阶段及特点A人工管理阶段 1数据不保存在计算机内2只有程序概念无文件概念3数据面向程序4数据不具有独立性B文件系统阶段1数据可长期保存2简单的......
千磨万击还坚劲 春泥护花爱无声 ——大连东软信息学院辅导员王滨事迹材料一、个人简历王滨,女,汉族,中共党员, 1973年4月生。2003年8月起从事辅导员工作,2010年担任大连东软信息......
·金融学案例题1.【基金】给定一个基金的基本资料,问这个管理公司是哪一家,托管人是谁,对于这个托管人来讲,属于表内业务还是表外业务?说出几个其他的表内/表外业务。如果按投资......
