单片机控制系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
alm_num=0;
}
if(alm_num==0)//闹钟1
if(Key1==0)//小时加
delay();
if(Key1==0)
{
Ala_time[0].hours++;
if(Ala_time[0].hours==24)
Ala_time[0].hours=0;
}
if(Key2==0)//分钟加
delay();
void main()
{
TMOD=2;
TH0=156;
TL0=156;
EA=1;
ET0=1;
T=10000;
TR0=1;
while(1)
{
SwitchMode();
Alt_NorTime();
Alt_Alarm();
Alarm();
display_time();
}
}
五.仿真结果
1)用Protel画出电路原理图;
2、子系统描述:
1)按键电路设计:
本系统采用独立按键的方式接了5个按键在P1端,分别实现小时,分钟加减,闹钟模式,12/24小时制式转换,闹钟开关等功能;
2)6位数码管显示电路:
采用了6位共阴极数码管,动态扫描的方式进行时间的显示,由于P0口开漏输出,所以加了上拉电阻;
3)发光二极管:
两个发光二极管接实现上下午的显示:
2)系统带有5个按键在P1端,分别实现小时,分钟加减,闹钟模式,12/24小时制式转换,闹钟开关等功能。
3)三个闹钟,每个可单独设立是否有效。闹响时间到,由蜂鸣器响三分钟后自动停止或按5键停止。无论什么状态下,闹响时间到均会自动退出正常状态,并响铃。
二、元件清单:
Part TypeDesignatorFootprint
void SwitchMode()
{
if(Key3==0)//时钟与闹钟切换
delay();
if(Key3==0)
if(mode==0)
mode=1;//闹钟
else mode=0;//时钟
if(Key4==0)//是否闹响
delay();
if(Key4==0)
if(alm==0)
alm=1;//闹响
内容:51单片机课程设计-数字闹钟
院系:
班级:
姓名:
学号:
一.设计目的
1、功能:、
1)数字闹钟显示能够进行12小时/24小时计时切换;
2)6位LED数码管显示:时、分、秒,两个发光二极管显示上/下午;
3)每天可设三个闹响时间;
4)可以对时、分时间进行设定。
2、效果:
1)前两位LED显示小时,可以为24小时制或者12小时制;中间两位显示分钟;后两位显示秒钟;另外两个发光二极管分别显示上/下午;
四.附件
1、源代码跟解析
#include <reg52.h>
#define OFF 1
#define ON 0
sbit Key1= P1^0;//hours+
sbit Key2=P1^1;//minute+
sbit Key3= P1^2;//mode
sbit Key4= P1^3;//alm
sbit Key5= P1^4; //12/24hours_type
Beep=ON;
}
//函数名称:time0(void) interrupt 1函数功能:定时器中断服务程序说明:24小时计时
void time0(void) interrupt 1
{
T--;
if(T==0)
{
T=10000;
Nor_time.second++;
if( Nor_time.second==60)
4)蜂鸣器电路:
蜂鸣器电路有一个PNP三极管与一个蜂鸣器组成,当P3.2脚为低电平是,三极管导通,蜂鸣器报响,为高电平时截至,蜂鸣器不响。
5)电源,复位,振荡电路:
将电路初始化到原状态,根据51单片机特性设计如下:
四.软件系统
1软件结构图:
2软件流程图;
3.子模块描述
1)模式切换函数:
功能:通过按键进行时间显示模式以及闹钟模式的转换,包括显示中的24小时制跟12小时制的转换;
sbit LED_AM= P3^0;
sbit LED_PM =P3^1;
sbit Beep =P3^2;
code unsigned char ledmap[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
{ unsigned int hours;
unsigned int minute;
unsigned int second;
}Nor_time,Ala_time[3];
void time0();//函数定义
void Alt_Alarm();
void Alt_NorTime();
void display_time();
void Alt_NorTime()
{
if(Key1==0)//小时加
delay();
if(Key1==0)
{
Nor_time.hours++;
if(Nor_time.hours==24)
Nor_time.hours=0;
}
if(Key2==0)//分钟加
delay();
if(Key2==0)
{
Nor_time.minute++;
1KR1
1KR2
1KRESPACK
6SEGS7SEG
12.000MHZY1
22uC3
30pC2
30pC1
MCS-51U1DIP40
470R4
470R3
AMD1
BEEPU2
PMD2
PNPQ1
PowerJ2
SW-PBKEY2
SW-PBKEY1
KEY5
三、硬件系统:
1、硬件总电路图:
1)硬件总体框图:
2)硬件电路分布图
}
}
}
//函数名称:Alt_Alarm())函数功能:调整闹钟入口参数:无出口参数:无
void Alt_Alarm()
{
while(Key5==1)
{
if(mode==0)
if(Key1==0)//3个闹钟切换加
delay();
if(Key1==0)
{
alm_num++;
if(alm_num==3)
ledbuf[3]=ledmap[minute%10];
ledbuf[4]=ledmap[hours/10];
ledbuf[5]=ledmap[hours%10];
for(i=0;i<6;i++)
{P0=ledbuf[i];
P2=disp[i];
delay();
}
}
//函数名称:display_time()函数功能:显示时间入口参数:无出口参数:无
void SwitchMode();
//函数名称:delay()
函数功能:延时函数
入口参数:无
出口参数:无
void delay()
{ unsigned char i;
for(i=1000;i>0;i--);
}
//函数名称:displayled(unsigned int hours,unsigned int minute,unsigned int second)函数功能:数码管动态扫描函数入口参数:hours ,minute,second显示的小时,分钟,秒出口参数:无
说明:根据全局变量判断是那种制式
void display_time()
{
if(Hoursytpe==0)
{
displayled(Nor_time.hours,Nor_time.minute,Nor_time.second);//显示24小时时钟
LED_AM = OFF;
LED_PM = OFF;
}
else
{
displayled(Nor_time.hours-12,Nor_time.minute,Nor_time.second);//显12小时时钟
if(Nor_time.hours-12<12)
{
LED_AM = ON;
LED_PM = OFF;
}
else
{
LED_AM = OFF;
LED_PM = ON;
else
{alm=0;//非闹响
Beep=OFF;
};
if(Key5==0)//12/24小时显示
delay();
if(Key5==0)
if(Hoursytpe==0)
Hoursytpe=1;//24小时显示
else
{Hoursytpe=0;//12小时显示
}Fra Baidu bibliotek
}
//函数名称:main()函数功能:主函数
void displayled(unsigned int hours,unsigned int minute,unsigned int second)
{ unsigned char i;
ledbuf[0]=ledmap[second/10];
ledbuf[1]=ledmap[second%10];
ledbuf[2]=ledmap[minute/10];
if(Nor_time.minute==24)
Nor_time.minute=0;
}
}
//函数名称:Alarm(void)函数功能:判断是否到时闹响
void Alarm(void)
{
unsigned char i;
if(alm==0)
for(i=0;i<3;i++)
if(Ala_time[i].hours==Nor_time.hours && Ala_time[i].minute==Nor_time.minute)
};
code unsigned char disp[]={0xfe,0xfd,0xfb,0x07,0xef,0xdf};
unsigned char ledbuf[6];
unsigned char mode=0,alm=0,alm_num=0,Hoursytpe=0;
unsigned int T;
struct time//定义时间结构体
{ Nor_time.minute++;
Nor_time.second=0;
}
if(Nor_time.minute==60)
{Nor_time.hours++;
Nor_time.minute=0;
}
if(Nor_time.hours==24)
Nor_time.hours=0;
}
}
//函数名称:void SwitchMode()函数功能:切换闹响,小时制式
if(Key1==0)//小时加
delay();
if(Key1==0)
{
Ala_time[2].hours++;
if(Ala_time[2].hours==24)
Ala_time[2].hours=0;
}
if(Key2==0)//分钟加
delay();
if(Key2==0)
{
Ala_time[2].minute++;
{
Ala_time[1].minute++;
if(Ala_time[1].minute==24)
Ala_time[1].minute=0;
}
displayled(Ala_time[1].hours,Ala_time[1].minute,Ala_time[1].second);//显示时钟2
if(alm_num==2)//闹钟3
启动前:
启动后:
六、结论分析:
我对这个系统经过多次修改和整理,可以完成基本的要求,但因为学习程度不够深入、知识有限,此电路中也存在不少的问题,包括电路跟编程的问题。
通过这些天的学习,我知道每一门科目的内容是可以无限加深的,而我们在课堂上学习的东西是非常有限的。另外真正的知识也不是在抱抱佛脚,埋头几天就能够出来的,是需要不断的学习和实践的。之前我对单片的其实还没有什么概念的,但在这次课程设计的压力下,我逼着自己去学,去看。慢慢发现自己这一门非常有趣的科目,非常有意思。
if(Ala_time[2].minute==24)
Ala_time[2].minute=0;
}
displayled(Ala_time[2].hours,Ala_time[2].minute,Ala_time[2].second);//显示时钟3
}
}
//函数名称:Alt_NorTime()函数功能:调整时间入口参数:无出口参数:无
2)改时间函数:
功能:通过按键对时间显示就行调整,可以通过按键1加小时数,按键2加分钟数;
3)改闹钟时间函数:
功能:对响铃时间进行调整,通过按键1和2可以分别对闹铃1、2、3的响铃时间调整,
4)闹钟判断函数:
对时间就行响铃识别,若时间与预设的响铃时间一致,就发生响铃。
5)时间显示函数:
功能:时间显示及上下午灯的识别
if(Key2==0)
{
Ala_time[0].minute++;
if(Ala_time[0].minute==24)
Ala_time[0].minute=0;
}
displayled(Ala_time[0].hours,Ala_time[0].minute,Ala_time[0].second);//显示时钟1
if(alm_num==0)//闹钟2
if(Key1==0)//小时加
delay();
if(Key1==0)
{
Ala_time[1].hours++;
if(Ala_time[1].hours==24)
Ala_time[1].hours=0;
}
if(Key2==0)//分钟加
delay();
if(Key2==0)
}
if(alm_num==0)//闹钟1
if(Key1==0)//小时加
delay();
if(Key1==0)
{
Ala_time[0].hours++;
if(Ala_time[0].hours==24)
Ala_time[0].hours=0;
}
if(Key2==0)//分钟加
delay();
void main()
{
TMOD=2;
TH0=156;
TL0=156;
EA=1;
ET0=1;
T=10000;
TR0=1;
while(1)
{
SwitchMode();
Alt_NorTime();
Alt_Alarm();
Alarm();
display_time();
}
}
五.仿真结果
1)用Protel画出电路原理图;
2、子系统描述:
1)按键电路设计:
本系统采用独立按键的方式接了5个按键在P1端,分别实现小时,分钟加减,闹钟模式,12/24小时制式转换,闹钟开关等功能;
2)6位数码管显示电路:
采用了6位共阴极数码管,动态扫描的方式进行时间的显示,由于P0口开漏输出,所以加了上拉电阻;
3)发光二极管:
两个发光二极管接实现上下午的显示:
2)系统带有5个按键在P1端,分别实现小时,分钟加减,闹钟模式,12/24小时制式转换,闹钟开关等功能。
3)三个闹钟,每个可单独设立是否有效。闹响时间到,由蜂鸣器响三分钟后自动停止或按5键停止。无论什么状态下,闹响时间到均会自动退出正常状态,并响铃。
二、元件清单:
Part TypeDesignatorFootprint
void SwitchMode()
{
if(Key3==0)//时钟与闹钟切换
delay();
if(Key3==0)
if(mode==0)
mode=1;//闹钟
else mode=0;//时钟
if(Key4==0)//是否闹响
delay();
if(Key4==0)
if(alm==0)
alm=1;//闹响
内容:51单片机课程设计-数字闹钟
院系:
班级:
姓名:
学号:
一.设计目的
1、功能:、
1)数字闹钟显示能够进行12小时/24小时计时切换;
2)6位LED数码管显示:时、分、秒,两个发光二极管显示上/下午;
3)每天可设三个闹响时间;
4)可以对时、分时间进行设定。
2、效果:
1)前两位LED显示小时,可以为24小时制或者12小时制;中间两位显示分钟;后两位显示秒钟;另外两个发光二极管分别显示上/下午;
四.附件
1、源代码跟解析
#include <reg52.h>
#define OFF 1
#define ON 0
sbit Key1= P1^0;//hours+
sbit Key2=P1^1;//minute+
sbit Key3= P1^2;//mode
sbit Key4= P1^3;//alm
sbit Key5= P1^4; //12/24hours_type
Beep=ON;
}
//函数名称:time0(void) interrupt 1函数功能:定时器中断服务程序说明:24小时计时
void time0(void) interrupt 1
{
T--;
if(T==0)
{
T=10000;
Nor_time.second++;
if( Nor_time.second==60)
4)蜂鸣器电路:
蜂鸣器电路有一个PNP三极管与一个蜂鸣器组成,当P3.2脚为低电平是,三极管导通,蜂鸣器报响,为高电平时截至,蜂鸣器不响。
5)电源,复位,振荡电路:
将电路初始化到原状态,根据51单片机特性设计如下:
四.软件系统
1软件结构图:
2软件流程图;
3.子模块描述
1)模式切换函数:
功能:通过按键进行时间显示模式以及闹钟模式的转换,包括显示中的24小时制跟12小时制的转换;
sbit LED_AM= P3^0;
sbit LED_PM =P3^1;
sbit Beep =P3^2;
code unsigned char ledmap[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
{ unsigned int hours;
unsigned int minute;
unsigned int second;
}Nor_time,Ala_time[3];
void time0();//函数定义
void Alt_Alarm();
void Alt_NorTime();
void display_time();
void Alt_NorTime()
{
if(Key1==0)//小时加
delay();
if(Key1==0)
{
Nor_time.hours++;
if(Nor_time.hours==24)
Nor_time.hours=0;
}
if(Key2==0)//分钟加
delay();
if(Key2==0)
{
Nor_time.minute++;
1KR1
1KR2
1KRESPACK
6SEGS7SEG
12.000MHZY1
22uC3
30pC2
30pC1
MCS-51U1DIP40
470R4
470R3
AMD1
BEEPU2
PMD2
PNPQ1
PowerJ2
SW-PBKEY2
SW-PBKEY1
KEY5
三、硬件系统:
1、硬件总电路图:
1)硬件总体框图:
2)硬件电路分布图
}
}
}
//函数名称:Alt_Alarm())函数功能:调整闹钟入口参数:无出口参数:无
void Alt_Alarm()
{
while(Key5==1)
{
if(mode==0)
if(Key1==0)//3个闹钟切换加
delay();
if(Key1==0)
{
alm_num++;
if(alm_num==3)
ledbuf[3]=ledmap[minute%10];
ledbuf[4]=ledmap[hours/10];
ledbuf[5]=ledmap[hours%10];
for(i=0;i<6;i++)
{P0=ledbuf[i];
P2=disp[i];
delay();
}
}
//函数名称:display_time()函数功能:显示时间入口参数:无出口参数:无
void SwitchMode();
//函数名称:delay()
函数功能:延时函数
入口参数:无
出口参数:无
void delay()
{ unsigned char i;
for(i=1000;i>0;i--);
}
//函数名称:displayled(unsigned int hours,unsigned int minute,unsigned int second)函数功能:数码管动态扫描函数入口参数:hours ,minute,second显示的小时,分钟,秒出口参数:无
说明:根据全局变量判断是那种制式
void display_time()
{
if(Hoursytpe==0)
{
displayled(Nor_time.hours,Nor_time.minute,Nor_time.second);//显示24小时时钟
LED_AM = OFF;
LED_PM = OFF;
}
else
{
displayled(Nor_time.hours-12,Nor_time.minute,Nor_time.second);//显12小时时钟
if(Nor_time.hours-12<12)
{
LED_AM = ON;
LED_PM = OFF;
}
else
{
LED_AM = OFF;
LED_PM = ON;
else
{alm=0;//非闹响
Beep=OFF;
};
if(Key5==0)//12/24小时显示
delay();
if(Key5==0)
if(Hoursytpe==0)
Hoursytpe=1;//24小时显示
else
{Hoursytpe=0;//12小时显示
}Fra Baidu bibliotek
}
//函数名称:main()函数功能:主函数
void displayled(unsigned int hours,unsigned int minute,unsigned int second)
{ unsigned char i;
ledbuf[0]=ledmap[second/10];
ledbuf[1]=ledmap[second%10];
ledbuf[2]=ledmap[minute/10];
if(Nor_time.minute==24)
Nor_time.minute=0;
}
}
//函数名称:Alarm(void)函数功能:判断是否到时闹响
void Alarm(void)
{
unsigned char i;
if(alm==0)
for(i=0;i<3;i++)
if(Ala_time[i].hours==Nor_time.hours && Ala_time[i].minute==Nor_time.minute)
};
code unsigned char disp[]={0xfe,0xfd,0xfb,0x07,0xef,0xdf};
unsigned char ledbuf[6];
unsigned char mode=0,alm=0,alm_num=0,Hoursytpe=0;
unsigned int T;
struct time//定义时间结构体
{ Nor_time.minute++;
Nor_time.second=0;
}
if(Nor_time.minute==60)
{Nor_time.hours++;
Nor_time.minute=0;
}
if(Nor_time.hours==24)
Nor_time.hours=0;
}
}
//函数名称:void SwitchMode()函数功能:切换闹响,小时制式
if(Key1==0)//小时加
delay();
if(Key1==0)
{
Ala_time[2].hours++;
if(Ala_time[2].hours==24)
Ala_time[2].hours=0;
}
if(Key2==0)//分钟加
delay();
if(Key2==0)
{
Ala_time[2].minute++;
{
Ala_time[1].minute++;
if(Ala_time[1].minute==24)
Ala_time[1].minute=0;
}
displayled(Ala_time[1].hours,Ala_time[1].minute,Ala_time[1].second);//显示时钟2
if(alm_num==2)//闹钟3
启动前:
启动后:
六、结论分析:
我对这个系统经过多次修改和整理,可以完成基本的要求,但因为学习程度不够深入、知识有限,此电路中也存在不少的问题,包括电路跟编程的问题。
通过这些天的学习,我知道每一门科目的内容是可以无限加深的,而我们在课堂上学习的东西是非常有限的。另外真正的知识也不是在抱抱佛脚,埋头几天就能够出来的,是需要不断的学习和实践的。之前我对单片的其实还没有什么概念的,但在这次课程设计的压力下,我逼着自己去学,去看。慢慢发现自己这一门非常有趣的科目,非常有意思。
if(Ala_time[2].minute==24)
Ala_time[2].minute=0;
}
displayled(Ala_time[2].hours,Ala_time[2].minute,Ala_time[2].second);//显示时钟3
}
}
//函数名称:Alt_NorTime()函数功能:调整时间入口参数:无出口参数:无
2)改时间函数:
功能:通过按键对时间显示就行调整,可以通过按键1加小时数,按键2加分钟数;
3)改闹钟时间函数:
功能:对响铃时间进行调整,通过按键1和2可以分别对闹铃1、2、3的响铃时间调整,
4)闹钟判断函数:
对时间就行响铃识别,若时间与预设的响铃时间一致,就发生响铃。
5)时间显示函数:
功能:时间显示及上下午灯的识别
if(Key2==0)
{
Ala_time[0].minute++;
if(Ala_time[0].minute==24)
Ala_time[0].minute=0;
}
displayled(Ala_time[0].hours,Ala_time[0].minute,Ala_time[0].second);//显示时钟1
if(alm_num==0)//闹钟2
if(Key1==0)//小时加
delay();
if(Key1==0)
{
Ala_time[1].hours++;
if(Ala_time[1].hours==24)
Ala_time[1].hours=0;
}
if(Key2==0)//分钟加
delay();
if(Key2==0)