c/c++语言开发共享可编程作息时间控制器设计

1.基本要求 要求用DS1302设计单片机作息时间控制器,实现以下功能: 1.基本功能 ①实时显示当前时间(数码管显示小时.分钟,小数点闪烁作为秒提示); ②能修改当前时钟; ③根据作息时间按时打铃; ④可以修改作息时间。 2. 扩展功能 自行扩展功能,如秒表,音乐铃声,通讯功能等。 2 方案设计 …


1.基本要求

要求用ds1302设计单片机作息时间控制器,实现以下功能:

1.基本功能

①实时显示当前时间(数码管显示小时.分钟,小数点闪烁作为秒提示);

②能修改当前时钟

根据作息时间按时打铃;

可以修改作息时间。

2. 扩展功能

  自行扩展功能,如秒表,音乐铃声,通讯功能等

2 方案设计

2.1 系统分析

根据系统功能要求,可将系统组成结构分成四大部分:单片机控制中心、键盘接口、时钟显示和声音报时,如下图为系统的组成结构图。其中,单片机控制中心是核心。mcu根据按键输入,可切换不同的显示模式或设置不同的参数。时钟显示完成北京时间或秒表时钟的信息。声音报时可完成闹铃的提示。

 
   

 

 

2.2 器件选择

2.2.1微处理器

市场上微处理器种类很多。这里,选取微处理器从多方面考:成本低、性能高、能够满足功能要求等等。

这里,选取stc89c51芯片。因为其功能与普通51芯片相同,其价格非常低廉、程序空间大、资源较丰富、在线下载非常方便。同时,使用该芯片,编程上亦可采用所熟悉的keil软件,使课程设计非常简单。

2.2.2显示器

常见的显示器件led数码管和lcd液晶器件。

led数码管能够显示数字和部分字符,价格便宜,硬件电路、软件编程均非常简单,而且使用动态扫描技术可节省大量硬件成本。

lcd液晶显示器件,显示字迹清晰、能够显示数字、字符和汉字,但价格比led非常高,编程复杂,软硬件调试都比较花时间。

系统显示主要还是数字,根据这两种显示器件的特性,选取led数码管器件。由于系统要求显示小时和分钟,采用四位数码管显示即可。

2.2.3按键

按键是用来设置北京时间或闹钟时间或启动秒表等功能的。这里采用普通按键即可,选用原则:以最少的按键,实现尽可能多的功能。所以这里,设置三个按键:模式键、up键、down键。

2.2.4闹铃

 

选用最常见,亦最常用的声音提示方式——蜂鸣器。

3、软件设计

3.1 操作功能设计

根据系统功能描述,可以将功能大致分成三类:北京时间功能、闹铃功能、秒表功能。

系统设有四个数码管,三个按键。采用菜单式人机对话,便于操作。所以可分成多种菜单,功能键切换菜单,updown键设置时间。

菜单设计如下:

菜单1:北京显示:显示格式为:小时.分钟(如:09.50,为950分)

菜单2:修改北京时间的小时:显示格式为:00.小时(如00.14,为北京时间的小时设为14点)                                        

菜单3:修改北京时间的分钟:显示格式为:00.分钟(如00.34,为北京时间的分钟设为34分)

菜单4:修改闹铃时间的小时:显示格式为:00.小时(如00.14,为闹铃时间的小时设为14点)

菜单5:修改闹铃时间的分钟:显示格式为:00.分钟(如00.34,为闹铃时间分钟设为34分)

 

菜单6:秒表功能:显示格式为:秒百分秒(如1290为当前秒表计时到12900毫秒),在此种菜单下,up键设为用来启动/停止秒表、down键设为用来暂停秒表。

 

  程序参考清单

#include<reg52.h>

#define uchar unsigned char;

#define uint unsigned int;

//四盏灯

sbit p13 = p1^3;

sbit p35 = p3^5;

sbit p36 = p3^6;

sbit p37 = p3^7;

//beep

sbit beep = p1^1;

 

uchar position;   

uchar tt;  

static uchar second; 

static uchar minute;

static uchar hour;  

static uchar set_second; 

static uchar set_minute;

static uchar set_hour;

static uchar t_mode;

//—————–秒表————————————-

 

void xs(int xs,int xm); 

void set_miaobiao();

int n=0,m=0,s=0;

 static char d1,d2,d3,d4;

//——————————————————-

 

uchar code table[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0–9

uchar beeptimes[23][2]=

{{6,50},{7,0},{7,25},{8,20},{8,30},{9,15},{9,25},{10,10},{10,30},{11,15},{11,25},{12,10},{13,20},{13,30},{14,15},{14,25},{15,10},{16,30},{17,0},{17,50},{18,0},{21,30},{23,0}};

 

sbit smg_q = p2^4; 

sbit smg_b = p2^5;

sbit smg_s = p2^6;

sbit smg_g = p2^7;

 

sbit mode=p2^0; //按键定义

sbit up=p2^1;

sbit down=p2^2;

sbit ent=p3^2;

 

 //函数声明

void keyscan();

void setminutes() ;

void sethours();

void display(unsigned char hour,unsigned char minute);

void delay(unsigned int timer); 

void init();

void dongtaitime();

void n_clock();

void myclock();

void set_clock_m();

void set_clock_h();

void nao();

void setbeeptime();

void setclock();

 

 

/***********************************************************

主函数

***********************************************************/

void main()

{

init();

while(1)

{  

dongtaitime();

if(mode==0)  

{

delay(1);

if(mode==0)

{

t_mode++;

while(!mode);

if(t_mode>5)

t_mode=0;

}

}

switch(t_mode)

{

      case 0: tr1=0;tr0=1; dongtaitime(); display(hour,minute); n_clock();  nao(); p3=0xff; p13=1; break;             

 

  case 1: tr1=0;tr0=1;display(hour,minute);sethours();  p13=0; beep=1; break;              

 

  case 2: tr1=0;tr0=1;display(hour,minute);setminutes(); p13=1; p35=0; beep=1; break;

 

  case 3: tr1=0;tr0=1;setclock(); p13=0; p35=0;beep=1; break;

 

  case 4: tr1=0;tr0=1;set_clock_m(); display(set_hour,set_minute); p13=1; p35=1;p36=0; beep=1; break;

 

  case 5: tr0=1;xs(m,s);  set_miaobiao();  p13=0; p35=1; p36=0;beep=1; break;

}

 

delay(1);

}

 

/***********************************************************

        闹钟 

***********************************************************/

 

void n_clock()

{

static unsigned int i;

for(i=0;i<23;i++)

{

if(hour==beeptimes[i][0] && minute==beeptimes[i][1])

{

beep=0;

delay(1);  

} else {

beep=1;

}

}

}

 

 

void setclock()

{

display(set_hour,set_minute);

set_clock_h();

 

}

void nao()

{

//响

if(set_hour==hour && set_minute==minute)

{

beep=0;

}else{

beep=1;

}

}

void set_clock_m()

{

   if(up==0)  

{

tr0=0;

set_minute++;

if(set_minute==60)

set_minute=0;

delay(200);

tr0=1;

}

 

if(down==0)   

{

tr0=0;

set_minute–;

if(set_minute<0)

set_minute=59;

delay(200);

tr0=1;

}

}

void set_clock_h()

{

if(up==0)

{

tr0=0;

set_hour++;

if(set_hour==24)

set_hour=0;

delay(200);

tr0=1;

}

if(down==0)

{

tr0=0;

set_hour–;

if(set_hour<0)

set_hour=23;

delay(200);

tr0=1;

}

 

}

 

 

/***********************************************************

显示时间

***********************************************************/

void dongtaitime()

{

if(tt==20)

{tt=0;

second++;

if(second==60)

{

second=0;

minute++;

if(minute==60)

{

minute=0;

hour++;

if(hour==24)

hour=0;

}

}

}

}

 

 

/***********************************************************

调时

***********************************************************/

void sethours()

{

 

if(up==0)

{

tr0=0;

hour++;

if(hour==24)

hour=0;

delay(200);

tr0=1;

}

if(down==0)

{

tr0=0;

hour–;

if(hour<0)

hour=23;

delay(200);

tr0=1;

}

}

void setminutes()

{

if(up==0)  

{

tr0=0;

minute++;

if(minute==60)

minute=0;

delay(200);

tr0=1;

}

 

if(down==0)   

{

tr0=0;

minute–;

if(minute<0)

minute=59;

delay(200);

tr0=1;

}

}

 

/***********************************************************

初始化

***********************************************************/

void init()

{

hour= 9; minute =22; second =58; 

tt=0;

t_mode=0;

position=0; 

smg_q=1;

smg_b=1;

smg_s=1;

smg_g=1;

mode=1;

up=1;

set_second=0;

set_minute=0;

set_hour=0;

tmod=0x11;

th0=(65536-50000)/256;

tl0=(65536-50000)%256;

th1=(65536-10000)/256;

tl1=(65536-10000)%256;

ea=1;

et0=1;

et1=1;

tr0=1;

tr1=0;   //不能开启

}

 

/***********************************************************

     显示

***********************************************************/

void display(unsigned char hour,unsigned char minute)

{

p0=0xff;

 

switch(position)

{

case 0:

smg_g=1;

smg_q=0;

p0=table[hour/10];

delay(3);

smg_q=1;

break;

 

case 1:

smg_q=1;

smg_b=0;

p0=table[hour%10];

 

if(tt>=10)

p0|=0x80;//小数点以半秒的时间闪烁

delay(3);

smg_b=1;

break;

 

case 2:

smg_b=1;

smg_s=0;

p0=table[minute/10];

delay(3);

smg_s=1;

break;

case 3:

smg_s=1;

smg_g=0;

p0=table[minute%10];

delay(3);

smg_g=1;

break;

}

position++;

if(position>3)

position=0;

}

 

/***********************************************************

  延时

***********************************************************/

void delay(unsigned int time)

{

unsigned int x,y;

for(x=time;x>0;x–)

for(y=105;y>0;y–);

}

 

/***********************************************************

   定时器to中断

***********************************************************/

void t0() interrupt 1

{

th0=(65536-50000)/256;

tl0=(65536-50000)%256;

tt++;

}

/***********************************************************

   定时器t1中断

***********************************************************/

void int1() interrupt 3 //?????

 

{

 

    th1=(65536-10000)/256; tl1=(65536-10000)%256;

m++;

    if(m==100)

{

m=0;

s++; 

if(s==100)

{

s=0;

}}}

 

void xs(int  xs,int xm )//?????

 

{

 

    d1=(xs/1)%10;  d2=(xs/10)%10;  d3=(xm/1)%10;  d4=(xm/10)%10;

 

    p0=table[d1];  smg_g=0; delay(1);smg_g=1;

 

    p0=table[d2]; smg_s=0; delay(1); smg_s=1;

 

    p0=table[d3]|0x80; smg_b=0; delay(1);smg_b=1;

 

    p0=table[d4]; smg_q=0; delay(1);smg_q=1;

 

}

void set_miaobiao()

{

if(up==0)  

{

delay(1);

if(up==0)

{

tr1=~tr1;

while(!up);

}

 

}

 

if(down==0)   

{

delay(1);

if(down==0)

{

tr1=0;

m=0;s=0;

while(!down);

}

}

}

 

 

#include<reg52.h>
#define uchar unsigned char;#define uint unsigned int;//四盏灯sbit p13 = p1^3;sbit p35 = p3^5;sbit p36 = p3^6;sbit p37 = p3^7;//beepsbit beep = p1^1;
uchar position;   uchar tt;  static uchar second;  static uchar minute;static uchar hour;  static uchar set_second;  static uchar set_minute;static uchar set_hour;static uchar t_mode;//—————–秒表————————————-
void xs(int xs,int xm); void set_miaobiao();int n=0,m=0,s=0; static char d1,d2,d3,d4;//——————————————————-
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0–9uchar beeptimes[23][2]={{6,50},{7,0},{7,25},{8,20},{8,30},{9,15},{9,25},{10,10},{10,30},{11,15},{11,25},{12,10},{13,20},{13,30},{14,15},{14,25},{15,10},{16,30},{17,0},{17,50},{18,0},{21,30},{23,0}};sbit smg_q = p2^4; sbit smg_b = p2^5;sbit smg_s = p2^6;sbit smg_g = p2^7;
sbit mode=p2^0; //按键定义sbit up=p2^1;sbit down=p2^2;sbit ent=p3^2;
 //函数声明void keyscan();void setminutes() ;void sethours();void display(unsigned char hour,unsigned char minute);void delay(unsigned int timer); void init();void dongtaitime();void n_clock();void myclock();void set_clock_m();void set_clock_h();void nao();void setbeeptime();void setclock();

/***********************************************************主函数***********************************************************/void main(){init();while(1){  dongtaitime();if(mode==0)  {delay(1);if(mode==0){t_mode++;while(!mode);if(t_mode>5)t_mode=0;}}switch(t_mode){      case 0: tr1=0;tr0=1; dongtaitime(); display(hour,minute); n_clock();  nao(); p3=0xff; p13=1; break;             
  case 1: tr1=0;tr0=1;display(hour,minute);sethours();  p13=0; beep=1; break;              
  case 2: tr1=0;tr0=1;display(hour,minute);setminutes(); p13=1; p35=0; beep=1; break;
  case 3: tr1=0;tr0=1;setclock(); p13=0; p35=0;beep=1; break;
  case 4: tr1=0;tr0=1;set_clock_m(); display(set_hour,set_minute); p13=1; p35=1;p36=0; beep=1; break;
  case 5: tr0=1;xs(m,s);  set_miaobiao();  p13=0; p35=1; p36=0;beep=1; break;}delay(1);} }
/***********************************************************        闹钟 ***********************************************************/
void n_clock(){static unsigned int i;for(i=0;i<23;i++){if(hour==beeptimes[i][0] && minute==beeptimes[i][1]){ beep=0; delay(1);  } else {beep=1;}}}

void setclock(){display(set_hour,set_minute);set_clock_h();}void nao(){//响if(set_hour==hour && set_minute==minute){beep=0;}else{beep=1;}}void set_clock_m(){   if(up==0)  {tr0=0;set_minute++;if(set_minute==60)set_minute=0;delay(200);tr0=1;}
if(down==0)   {tr0=0;set_minute–;if(set_minute<0)set_minute=59;delay(200);tr0=1;}}void set_clock_h(){ if(up==0){tr0=0;set_hour++;if(set_hour==24)set_hour=0;delay(200);tr0=1;}if(down==0){tr0=0;set_hour–;if(set_hour<0)set_hour=23;delay(200);tr0=1;}
}
/***********************************************************显示时间***********************************************************/void dongtaitime(){if(tt==20){tt=0;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24)hour=0;}}}}

/***********************************************************调时***********************************************************/void sethours(){if(up==0){tr0=0;hour++;if(hour==24)hour=0;delay(200);tr0=1;}if(down==0){tr0=0;hour–;if(hour<0)hour=23;delay(200);tr0=1;}}void setminutes(){if(up==0)  {tr0=0;minute++;if(minute==60)minute=0;delay(200);tr0=1;}
if(down==0)   {tr0=0;minute–;if(minute<0)minute=59;delay(200);tr0=1;}}
/*********************************************************** 初始化***********************************************************/void init(){hour= 9; minute =22; second =58; tt=0;t_mode=0;position=0; smg_q=1;smg_b=1;smg_s=1;smg_g=1;mode=1;up=1;set_second=0;set_minute=0;set_hour=0;tmod=0x11;th0=(65536-50000)/256;tl0=(65536-50000)%256;th1=(65536-10000)/256;tl1=(65536-10000)%256;ea=1;et0=1;et1=1;tr0=1;tr1=0;   //不能开启}
/***********************************************************     显示***********************************************************/void display(unsigned char hour,unsigned char minute){p0=0xff;switch(position){case 0:smg_g=1;smg_q=0;p0=table[hour/10];delay(3);smg_q=1;break;
case 1:smg_q=1;smg_b=0;p0=table[hour%10];if(tt>=10)p0|=0x80;//小数点以半秒的时间闪烁delay(3);smg_b=1;break;
case 2:smg_b=1;smg_s=0;p0=table[minute/10];delay(3);smg_s=1;break;case 3:smg_s=1;smg_g=0;p0=table[minute%10];delay(3);smg_g=1;break;}position++;if(position>3)position=0;}
/***********************************************************  延时***********************************************************/void delay(unsigned int time){unsigned int x,y;for(x=time;x>0;x–)for(y=105;y>0;y–);}
/***********************************************************   定时器to中断***********************************************************/void t0() interrupt 1{th0=(65536-50000)/256;tl0=(65536-50000)%256;tt++;}/***********************************************************   定时器t1中断***********************************************************/void int1() interrupt 3 //?????
{
    th1=(65536-10000)/256; tl1=(65536-10000)%256;m++;    if(m==100){m=0;s++; if(s==100){s=0;}}}
void xs(int  xs,int xm )//?????
{
    d1=(xs/1)%10;  d2=(xs/10)%10;  d3=(xm/1)%10;  d4=(xm/10)%10;
    p0=table[d1];  smg_g=0; delay(1);smg_g=1;
    p0=table[d2]; smg_s=0; delay(1); smg_s=1;
    p0=table[d3]|0x80; smg_b=0; delay(1);smg_b=1;
    p0=table[d4]; smg_q=0; delay(1);smg_q=1;
}void set_miaobiao(){if(up==0)  {delay(1);if(up==0){tr1=~tr1;while(!up);}}
if(down==0)   {delay(1);if(down==0){tr1=0;m=0;s=0;while(!down);}}}

 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/605859.html

(0)
上一篇 2021年5月13日
下一篇 2021年5月13日

精彩推荐