基于C51单片机的LCD定时闹钟设计

    技术2026-09-03  1

    学校的一个课设

    可以去“我的下载”直接打包下载

    2 LCD定时闹钟设计 1、 分别显示时钟/定时时间,格式“时时:分分:秒秒”; 2、 两屏显示区分:均分两行显示,第一行分别为“时钟”,“计时”; 3、 计时结束报警,由蜂鸣器实现; 4、 时钟/闹钟时间设置功能键如下: (1) 模式键K1,实现时钟/计时显示切换; (2) 时分秒时间设置键:K2,K3,K4,按相应键实现相应时间加一; (3) 计时开始/停止键K5,实现计时开始/停止切换

    #include "reg52.h" #include "intrins.h" #include "string.h" sbit RS = P1^0; sbit RW = P1^1; sbit E = P1^2; sbit BEEP = P1^3; char count; long second = 0; void T0_init(void) { TMOD = 0x01; TH0 = 0x3C; TL0 = 0x0B0; EA = 1; ET0 = 1; TR0 = 0; TR1 = 0; } void T1_init(void) { TMOD = 0x10; TH1 = 0x3C; TL1 = 0x0B0; EA = 1; ET1 = 1; TR1 = 0; TR0 = 0; } void delay(int x) { unsigned int i,j; for(i=x;i>0;i--) for(j=120;j>0;j--); } void write_command(char dat) { E = 0; RS = 0; _nop_(); RW = 0; P2 = dat; delay(5); E = 1; } void write_char(char dat) { E = 0; RS = 1; _nop_(); RW = 0; P2 = dat; delay(5); E = 1; } void init(void) { char i = 0; write_command(0x38); i = 0; while(P2^7 == 0&&i>5) { delay(1); i++; } write_command(0x08); i = 0; while(P2^7 == 0&&i>5) { delay(1); i++; } write_command(0x01); i = 0; while(P2^7 == 0&&i>5) { delay(1); i++; } write_command(0x06); i = 0; while(P2^7 == 0&&i>5) { delay(1); i++; } write_command(0x0c); i = 0; while(P2^7 == 0&&i>5) { delay(1); i++; } } void display(char add,char c) { write_command(0x80+add); switch(c) { case(0):write_char('0');break; case(1):write_char('1');break; case(2):write_char('2');break; case(3):write_char('3');break; case(4):write_char('4');break; case(5):write_char('5');break; case(6):write_char('6');break; case(7):write_char('7');break; case(8):write_char('8');break; case(9):write_char('9');break; } } void time_display(void) { char temp; temp = second/36000; display(0x04,temp); temp = (second/3600)%10; display(0x05,temp); write_command(0x80+0x06);write_char(':'); temp = (second%3600)/600; display(0x07,temp); temp = ((second%3600)/60)%10; display(0x08,temp); write_command(0x80+0x09);write_char(':'); temp = (second%60)/10; display(0x0a,temp); temp = (second%60)%10; display(0x0b,temp); } void count_down_display(void) { char temp; temp = second/36000; display(0x44,temp); temp = (second/3600)%10; display(0x45,temp); write_command(0x80+0x46);write_char(':'); temp = (second%3600)/600; display(0x47,temp); temp = ((second%3600)/60)%10; display(0x48,temp); write_command(0x80+0x49);write_char(':'); temp = (second%60)/10; display(0x4a,temp); temp = (second%60)%10; display(0x4b,temp); } char scan_key(void) { char key = 6,a = 0; P3 = 0x07; if(P3 != 0x07) { delay(5); if(P3 != 0x07) { switch(P3) { case(0x06):key = 1;break; case(0x05):key = 2;break; case(0x03):key = 3;break; } P3 = 0x18; switch(P3) { case(0x10):key += 0;break; case(0x08):key += 3;break; } } while((a<130)&&(P3 != 0x18)) { delay(1); a++; } } return key; } void alarm(void) { char i; for(i=0;i<8;i++) { BEEP = ~BEEP; delay(400); } } void main(void) { char k; BEEP = 0; init(); flag1: T0_init(); while(1) { k = scan_key(); if(k != 6) { switch(k) { case(1):second += 1;break; case(2):second += 60;break; case(3):second += 3600;break; case(4):TR0 = ~TR0;goto flag3;break; case(5):write_command(0x01);second = 0;goto flag2;break; } } if(second >= 86400) { second = 0; } time_display(); } flag2: T1_init(); while(1) { k = scan_key(); if(k != 6) { switch(k) { case(1):second += 1;break; case(2):second += 60;break; case(3):second += 3600;break; case(4):TR1 = ~TR1;goto flag4;break; case(5):write_command(0x01);second = 0;count = 0;goto flag1;break; } } if(second >= 86400) { second = 0; } count_down_display(); } flag3: while(1) { k = scan_key(); switch(k) { case(4):TR0 = ~TR0;break; case(5):write_command(0x01);second = 0;count = 0;goto flag2;break; } if(second >= 86400) { second = 0; } time_display(); } flag4: while(1) { k = scan_key(); switch(k) { case(4):TR0 = ~TR0;break; case(5):write_command(0x01);second = 0;count = 0;goto flag1;break; } count_down_display(); if(second < 0) { second = 0; count = 0; TR1 = 0; alarm(); goto flag2; } } } void Timer0Interrupt(void) interrupt 1 { TH0 = 0x3C; TL0 = 0x0B0; count++; if(count >= 20) { second++; count = 0; if(second>=86400) { second = 0; count = 0; } } #include <REGX51.H> } void Timer1Interrupt(void) interrupt 3 { TH1 = 0x3C; TL1 = 0x0B0; count++; if(count >= 20) { second--; count = 0; } }
    Processed: 0.011, SQL: 10