在OURDEV看到一个怀表觉得不错特转来。
原文:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3734762&bbs_page_no=1&search_mode=1&search_text=怀表&bbs_id=9999
怀表的靖照
怀表的程序
演示代码: /**********************************************/ /* LED_Clock_test_1 */ /* ATmaga48V-10AU @ 1MHz */ /* 2009-11-05 */ /* h2feo4 */ /* www.ourdev.cn */ /**********************************************/ //================= include ==================// // winavr-20081124 #include <avr/io.h> #include <avr/interrupt.h> //================== define ==================// volatile unsigned char sec = 0, min = 0, hou = 12; const unsigned char oring[62] = {12, 1, 9, 11, 8, 1, 2, 10, 12, 9, 2, 3, 11, 1, 10, 3, 4, 12, 2, 11, 4, 5, 1, 3, 12, 5, 6, 2, 4, 1, 6, 7, 3, 5, 2, 7, 8, 4, 6, 3, 8, 9, 5, 7, 4, 9, 10, 6, 8, 5, 10, 11, 7, 9, 6, 11, 12, 8, 10, 7, 12, 1}; const unsigned char iring[14] = {7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}; //=================== init ===================// void t0_init(void) { TCCR0B |= (1 << CS00); } void t1_init(void) { TCCR1B |= (1 << WGM12) | (1 << CS11) | (1 << CS10); TIMSK1 |= (1 << OCIE1A); OCR1A = 15624; } void port_init(void) { PORTB &= 0xc0; PORTC &= 0xc0; DDRB &= 0xc0; DDRC &= 0xc0; } //================ interrupt =================// ISR(TIMER1_COMPA_vect) { sec++; if (sec >= 60) { sec = 0; min++; } if (min >=60) { min = 0; hou++; } if (hou >12) { hou = 1; } } //=================== sub ====================// void disp_sec(void) { DDRB &= 0xc0; DDRC &= 0xc0; PORTB &= 0xc0; PORTC &= 0xc0; if (oring[sec] <= 6) { PORTB |= (1 << (6 - oring[sec])); DDRB |= (1 << (6 - oring[sec])); } else { PORTC |= (1 << (12 - oring[sec])); DDRC |= (1 << (12 - oring[sec])); } if (oring[sec + 1] <= 6) { DDRB |= (1 << (6 - oring[sec + 1])); } else { DDRC |= (1 << (12 - oring[sec + 1])); } }
void disp_min(void) { DDRB &= 0xc0; DDRC &= 0xc0; PORTB &= 0xc0; PORTC &= 0xc0;
if (oring[min] <= 6) { DDRB |= (1 << (6 - oring[min])); } else { DDRC |= (1 << (12 - oring[min])); } if (oring[min + 1] <= 6) { PORTB |= (1 << (6 - oring[min + 1])); DDRB |= (1 << (6 - oring[min + 1])); } else { PORTC |= (1 << (12 - oring[min + 1])); DDRC |= (1 << (12 - oring[min + 1])); } }
void disp_hou(void) { DDRB &= 0xc0; DDRC &= 0xc0; PORTB &= 0xc0; PORTC &= 0xc0;
if (iring[hou] <= 6) { PORTC |= (1 << (6 - iring[hou])); DDRC |= (1 << (6 - iring[hou])); DDRB |= (1 << (6 - iring[hou])); } else { PORTB |= (1 << (12 - iring[hou])); DDRC |= (1 << (12 - iring[hou])); DDRB |= (1 << (12 - iring[hou])); } } //=================== main ===================// void main(void) { port_init(); t0_init(); t1_init(); sei ();
while(1) { disp_sec(); while(TIFR0 == 0); TIFR0 = 0xff;
disp_min(); while(TIFR0 == 0); TIFR0 = 0xff; disp_hou(); while(TIFR0 == 0); TIFR0 = 0xff; } }
元件清单: LED(0603封装)132只,包括秒针60只,分针60只,时针12只,推荐分别使用不同颜色。由于LED在焊接时有一定的死亡率,建议采购零件时数量上留出一定的余量 电容(0603封装)2只,包括 VCC-GND 1只,AREF-GND 1只(选装),推荐容量为0.1uF 电阻(0603封装)12只,LED限流电阻,推荐阻值为 100R-330R ATmega48PA(或其他x8系列的AVR)1只 32.768K晶振 1只(选装);与晶振匹配的电容 2只(选装)[此二零件在PCB上没有位置,故需要飞在外面,可使用预留的IO引出焊盘] 其余例如表盖检测、环境光检测、调整时间等功能在此版本中尚未涉及,须自行设计,可使用预留的IO引出焊盘
PDF版原理图: 点击此处下载
怀表.pdf
(63.53 KB, 下载次数: 40)
以上除特别声明外均为 h2feo4 原创 转载必须注明来自 www.ourdev.cn 及原作者 h2feo4 无机酸 所有的文档资料仅可用于学习研究,如果用于商业用途则必须征得本人同意。
[ 本帖最后由 ddllxxrr 于 2011-9-12 07:22 编辑 ]
|