|
Atmega16電子時(shí)鐘,內(nèi)部定時(shí)器,有可調(diào)鬧鐘。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (14.83 KB, 下載次數(shù): 88)
下載附件
2019-5-14 19:05 上傳
單片機(jī)源程序如下:
- #include <iom16v.h>
- #include <macros.h>
- #define key_bz 0b00000111
- char smg_zx[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f};// 全局變量
-
- char hour=12;
- char min;
- char sec;
- char nz_hour=12;
- char nz_min=1;
- char mode=0;
- char set;
-
- void delay_ms(unsigned int k)
- {
- unsigned int i,j;
- for(i=0;i<k;i++)
- {
- for(j=0;j<570;j++);
- }
- }
- // 用定時(shí)器實(shí)現(xiàn)定時(shí)
- void T0_init(void)// 端口初始化函數(shù)
- {
- TIFR=0XFF;
- TCCR0=0X0B; //64FENPIN, CTC MODE
- TCNT0=0;
- OCR0=250;
- TIMSK=0X02;
- }
- void port_init(void)// 端口初始化函數(shù)
- {
- DDRC |= 0b11110000; // PC4 5 OUT PUT
- PORTC |= 0b00111111; //m103 output only
- PORTD = 0x00; // 上電關(guān)閉數(shù)碼管, 因?yàn)樯想婋妷翰环(wěn)
- DDRD = 0xff;
- DDRB |= 0b11100000; // PC5 6 7OUT PUT
- }
- //call this routine to initialize all peripherals
- void init_devices(void)
- {
- //stop errant interrupts until set up
- CLI(); //disable all interrupts
- port_init();//smg_zx[0]=1;
- T0_init();
- SEI(); //re-enable interrupts
- //all peripherals are now initialized
- }
- //miao=45;
- void key (void)
- {
- if(!(PINC&0X01))
- {
- delay_ms(2);
- if(!(PINC&0X01))
- {
- TIMSK=0X00;
- mode++;
- mode%=3;
- set=0;
- if(mode==0)TIMSK=0X02;
- while(!(PINC&0X01));
- }
- }
-
-
- if(!(PINC&0X02))
- {
- delay_ms(2);
- if(!(PINC&0X02))
- {
- if(mode==1)
- {
- set++;
- set%=3;
- }
- if(mode==2)
- {
- set++;
- set%=2;
- }
- while(!(PINC&0X02));
- }
- }
-
-
- if(!(PINC&0X04))
- {
- delay_ms(2);
- if(!(PINC&0X04))
- {
- if(mode==1)
- {
- if(set==0)
- {
- hour++;
- hour%=24;
- }
- if(set==1)
- {
- min++;
- min%=60;
- }
- if(set==2)
- {
- sec++;
- sec%=60;
- }
- }
- if(mode==2)
- {
- if(set==0)
- {
- nz_hour++;
- nz_hour%=24;
- }
- if(set==1)
- {
- nz_min++;
- nz_min%=60;
- }
- }
- while(!(PINC&0X04));
- }
- }
-
- }
- //主函數(shù)
- void main()
- {/// 變量聲明
-
- char zz;
- // 調(diào)用初始化哈數(shù)
- //port_init();
- init_devices();
- // 特定代碼
- while(1)
- {
-
-
- if(mode==0)
- {
-
- PORTD=~smg_zx[hour/10]; // 給5的字形編碼
- PORTB|=1<<PB6;//選中PC6
- delay_ms(2);
- PORTB&=0B00111111;//
-
-
- PORTD=~smg_zx[hour%10]; // 給5的字形編碼
- PORTB|=1<<PB7;//選中PC7
- delay_ms(2);
- PORTB&=0B00111111;//
-
-
-
- PORTD=~smg_zx[min/10]; // 給5的字形編碼
- PORTC|=1<<PC7;//選中PC7
- delay_ms(2);
- PORTC&=0B00001111;//
-
-
- PORTD=~smg_zx[min%10]; // 給5的字形編碼
- PORTC|=1<<PC6;//選中PC6
- delay_ms(2);
- PORTC&=0B00001111;//
-
- PORTD=~smg_zx[sec/10]; // 給5的字形編碼
- PORTC|=1<<PC5;//選中PC5
- delay_ms(2);
- PORTC&=0B00001111;//
-
-
- PORTD=~smg_zx[sec%10]; // 給5的字形編碼
- PORTC|=1<<PC4;//選中PC4
- delay_ms(2);
- PORTC&=0B00001111;//
- }
-
- else if(mode==1)
- {
-
- PORTD=~smg_zx[hour/10]; // 給5的字形編碼
- PORTB|=1<<PB6;//選中PC6
- delay_ms(2);
- PORTB&=0B00111111;//
-
-
- PORTD=~smg_zx[hour%10]; // 給5的字形編碼
- if(set==0) PORTD&=0x7f;//控制小數(shù)點(diǎn)亮
- PORTB|=1<<PB7;//選中PC7
- delay_ms(2);
- PORTB&=0B00111111;//
-
-
-
- PORTD=~smg_zx[min/10]; // 給5的字形編碼
- PORTC|=1<<PC7;//選中PC7
- delay_ms(2);
- PORTC&=0B00001111;//
-
-
- PORTD=~smg_zx[min%10]; // 給5的字形編碼
- if(set==1) PORTD&=0x7f;//控制小數(shù)點(diǎn)亮
- PORTC|=1<<PC6;//選中PC6
- delay_ms(2);
- PORTC&=0B00001111;//
-
- PORTD=~smg_zx[sec/10]; // 給5的字形編碼
- PORTC|=1<<PC5;//選中PC5
- delay_ms(2);
- PORTC&=0B00001111;//
-
-
- PORTD=~smg_zx[sec%10]; // 給5的字形編碼
- if(set==2) PORTD&=0x7f;//控制小數(shù)點(diǎn)亮
- PORTC|=1<<PC4;//選中PC4
- delay_ms(2);
- PORTC&=0B00001111;//
- }
- else if(mode==2)
- {
-
- PORTD=~smg_zx[nz_hour/10]; // 給5的字形編碼
- PORTB|=1<<PB6;//選中PC6
- delay_ms(2);
- PORTB&=0B00111111;//
-
-
- PORTD=~smg_zx[nz_hour%10]; // 給5的字形編碼
- if(set==0) PORTD&=0x7f;//控制小數(shù)點(diǎn)亮
- PORTB|=1<<PB7;//選中PC7
- delay_ms(2);
- PORTB&=0B00111111;//
-
-
-
- PORTD=~smg_zx[nz_min/10]; // 給5的字形編碼
- PORTC|=1<<PC7;//選中PC7
- delay_ms(2);
- PORTC&=0B00001111;//
-
-
- PORTD=~smg_zx[nz_min%10]; // 給5的字形編碼
- if(set==1) PORTD&=0x7f;//控制小數(shù)點(diǎn)亮
- PORTC|=1<<PC6;//選中PC6
- delay_ms(2);
- PORTC&=0B00001111;//
-
-
- }
-
-
- if((hour==nz_hour)&&(min==nz_min))//鬧鐘
- {
- if(zz++>20)
- {
- PORTB^=1<<PB5;//選中Pb5
- zz=0;
- }
- }
- else
- PORTB|=1<<PB5;//選中Pb5
-
-
- key ();
-
-
-
-
- }
- }
- //T0中斷服務(wù)程序 // 2ms 進(jìn)入中斷
- #pragma interrupt_handler timer0_ocf_isr:20
- void timer0_ocf_isr(void)
- {static int count=0;
- if(++count>=500)
- { count=0;
- sec++;
- if(sec>=60)
- {
- sec=0;
- min++;
- if(min>=60)
- {
- min=0;
- hour++;
- hour%=24;
- }
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
仿真測(cè)試.rar
(30.95 KB, 下載次數(shù): 119)
2019-5-14 16:33 上傳
點(diǎn)擊文件名下載附件
atmega16時(shí)鐘 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|