完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子闹钟 功能要求: 1、 实时时钟(由数码管显示时:分,中间的“:”一亮一灭表示1秒,可用小数点表示,也可以用一个LED表示); 2、 时钟的时、分可调节; 3、 闹钟时间可以设置,闹钟初值为8:00,(并保存在EEPROM中,掉电不丢失); 4、 闹钟时间到,蜂鸣器响10秒; 5、 按键使用数量不宜超过5个; 6、 整点时间,通过串行口上传一次时钟信息; 7、 自行补充新功能(选做项); 单片机型号:atmega16 流程图 proteus模拟电路图: 代码(适用于atmega16实物,如需用以上电路图模拟还需修改IO口配置) #include #include unsigned char led_buf[] = { 0x3F, 0x06, 0x5B, 0x4F,0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F }; //共阴极数码管编码表,分别表示0~f; unsigned char position[6] = { 0xfe, 0xfd, 0xef, 0xdf, 0xbf, 0x7f }; // 位选码 unsigned char show[] = "NOW IS : "; unsigned char transmit_time[10] = "0123456789"; unsigned char maohao = ':', temp[6]; unsigned char time[3], time_set[3], YuSheTime[3] = { 0, 0, 8 }; //时、分、秒计数和设置单元及定时时间8:00,确保掉电不清除 unsigned char dis_buf[10]; //显示缓冲区,存放要显示的10个字符的段码值 unsigned char timecounterofkeys, timecounter; unsigned char clock_state = 2, set_state, return_time; int time_add, point, set_on, time_1second, key_stime_ok; #define key_input PINB //按键输入口 #define key_mask 0B00001111 //按键输入屏蔽码 #define key_no 0 #define key_s1 1 //s1按键 #define key_s2 2 //s2按键 #define key_s3 3 //s3按键 #define key_s4 4 //s4按键 #define key_state_0 0 //按键状态0 1 2 #define key_state_1 1 #define key_state_2 2 void io_init(void);//I/O口初始化函数// void T0_init(void);//T/C0初始化函数/// void usart_init(unsigned int baud);//usart初始化// void usart_transmit_byte(unsigned char data);//发送一个字符// void usart_transmit_string(unsigned char* buf);//发送一个字符串// unsigned char usart_recieve_byte(void);//接收一个字符// void time_to_di***uffer(unsigned char* time);//时钟时间送显示缓冲区函数// void display(void);//时钟时间送显示缓冲区函数// void timer0_comp_isr(void);//显示输出函数/// unsigned char read_key(void);//读取按键函数// void time_dealer(void);//时间处理函数// void zhengdianhanshu(void);//整点时间函数// void main(void);//主函数 //I/O口初始化函数// void io_init(void) { DDRC = 0xFF; //LED段码输出 DDRD = 0xfe; //LED位控输出(1111 1110) PORTD = 0xFF; //输出高电平 DDRB = 0xe0; //按钮输入口(1110 0000) PORTB = 0xFF; DDRA = 0xff; //输出口 PORTA = 0xff; //输出高电平 } ///T/C0初始化函数/// void T0_init(void) { OCR0 = 0xF9; //OCR0 = 0xF9(249),(249+1)/125=2ms TCCR0 = 0x0B; //内部时钟,CTC模式,64分频,8M/64=125KHz } usart初始化// void usart_init(unsigned int baud) { UBRRH = (unsigned char)(baud >> 8); UBRRL = (unsigned char)baud; // 波特率:4800,时钟频率:8MHz (0110 0111) UCSRA = 0x20; UCSRB = (1 << TXEN) | (1 << RXEN); //发送使能|接收时能(0001 1000) UCSRC = (1 << URSEL) | (3 << UCSZ0); //异步模式,帧格式:1个起始位,8个数据位,无校验,1个停止位; } 发送一个字符// void usart_transmit_byte(unsigned char data) { while (!(UCSRA & (1 << UDRE))) { ; } UDR = data; } 计时器Timer0:比较匹配中断服务,定时:2ms #pragma interrupt_handler timer0_comp_isr: iv_TIMER0_COMP //计时器Timer0:比较匹配输出 void timer0_comp_isr(void) { display(); if (++timecounterofkeys >= 5) { timecounterofkeys = 0; key_stime_ok = 1; //10ms时,给key_stime_ok赋值为1 if (!(++timecounter % 25)) { set_on = !set_on; } if (timecounter >= 100) //判断是否达到一秒 { timecounter = 0; time_1second = 1; } } } 发送一个字符串// void usart_transmit_string(unsigned char* databuf) { while (*databuf != ' |