|
51單片機(jī)課程設(shè)計(jì)仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (13.69 KB, 下載次數(shù): 52)
下載附件
2018-11-28 00:41 上傳
單片機(jī)源程序如下:
- //電子表,針對(duì)教材設(shè)計(jì)
- //用共陽(yáng)數(shù)碼管在P0口、P2口以及74hc04芯片驅(qū)動(dòng)下,顯示24小時(shí)制電子表
- //電子表程序是利用STC8591內(nèi)部的定時(shí)∕計(jì)數(shù)器實(shí)現(xiàn)精確計(jì)數(shù)。
- //電子表共有四個(gè)按鍵key1、key2、key3、key4分別實(shí)現(xiàn)調(diào)模式、
- //增加、減少、復(fù)位功能,其中調(diào)模式按鍵key1可以分別調(diào)節(jié)小時(shí)、分鐘、秒鐘、鬧鈴
- //設(shè)計(jì):?jiǎn)纹瑱C(jī)創(chuàng)新工作室--王曙光設(shè)計(jì),2015年12月15日
- #include<reg51.h>
- #include<key.c>
- unsigned char i,j,k;
- unsigned char seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xf8,0x80,0x90};
- unsigned char flash;
- sbit SW = P3^3; //接繼電器驅(qū)動(dòng)電路,低電平繼電器吸合,控制電鈴
- void timer0_isr(void) interrupt 1
- {
- TH0 = 0xf8;
- TL0 = 0x2f;
- i++;
- if(i >= 250) //半秒時(shí)間到
- {
- flash = ~flash; //得到8位閃爍變量
- i = 0;
- j++;
- }
- if(j >= 2) //1分鐘到
- {
- sec++;
- j = 0;
- }
- if(sec >= 60) //1分鐘到
- {
- min++;
- sec = 0;
- }
- if(min >= 60) //1小時(shí)到
- {
- hour++;
- min = 0;
- }
- if(hour >= 24)
- hour = 0;
- P0 = 0xff; //Protuse軟件仿真消隱
- if(key1_flag == 0) //正常走時(shí)
- {
- switch(k)
- {
- case 0:P0 = seven_seg[sec % 10]; P2 = ~0x01;break;
- case 1:P0 = seven_seg[sec / 10]; P2 = ~0x02;break;
- case 2:P0 = seven_seg[min % 10] & (0x7f | flash); P2 = ~0x04;break; //小數(shù)點(diǎn)閃爍
- case 3:P0 = seven_seg[min / 10]; P2 = ~0x08;break;
- case 4:P0 = seven_seg[hour % 10] & (0x7f | flash); P2 = ~0x10;break; //小數(shù)點(diǎn)閃爍
- case 5:P0 = seven_seg[hour / 10]; P2 = ~0x20;break;
- }
- }
- if(key1_flag == 1) //調(diào)小時(shí),小時(shí)閃爍
- {
- j = 0;
- switch(k)
- {
- case 0: P0 = seven_seg[sec_t % 10]; P2 = ~0x01;break;
- case 1: P0 = seven_seg[sec_t / 10]; P2 = ~0x02;break;
- case 2: P0 = seven_seg[min_t % 10]; P2 = ~0x04;break;
- case 3: P0 = seven_seg[min_t / 10]; P2 = ~0x08;break;
- case 4: P0 = seven_seg[hour_t % 10] | flash; P2 = ~0x10;break; //小時(shí)閃爍
- case 5: P0 = seven_seg[hour_t / 10] | flash; P2 = ~0x20;break; //小時(shí)閃爍
- }
- }
- if(key1_flag == 2) //調(diào)分鐘
- {
- j = 0;
- switch(k)
- {
- case 0: P0 = seven_seg[sec_t % 10]; P2 = ~0x01;break;
- case 1: P0 = seven_seg[sec_t / 10]; P2 = ~0x02;break;
- case 2: P0 = seven_seg[min_t % 10]| flash; P2 = ~0x04;break; //分閃爍
- case 3: P0 = seven_seg[min_t / 10]| flash; P2 = ~0x08;break; //分閃爍
- case 4: P0 = seven_seg[hour_t % 10] ; P2 = ~0x10;break;
- case 5: P0 = seven_seg[hour_t / 10]; P2 = ~0x20;break;
- }
- }
- if(key1_flag == 3) //調(diào)秒
- {
- j = 0;
- switch(k)
- {
- case 0: P0 = seven_seg[sec_t % 10]| flash; P2 = ~0x01;break; //秒閃爍
- case 1: P0 = seven_seg[sec_t / 10]| flash; P2 = ~0x02;break; //秒閃爍
- case 2: P0 = seven_seg[min_t % 10]; P2 = ~0x04;break;
- case 3: P0 = seven_seg[min_t / 10]; P2 = ~0x08;break;
- case 4: P0 = seven_seg[hour_t % 10] ; P2 = ~0x10;break;
- case 5: P0 = seven_seg[hour_t / 10]; P2 = ~0x20;break;
- }
- }
- if(key1_flag == 4) //調(diào)定鬧小時(shí)
- {
- j = 0;
- switch(k)
- {
- case 0: P0 = seven_seg[min_r % 10]; P2 = ~0x01;break;
- case 1: P0 = seven_seg[min_r / 10]; P2 = ~0x02;break;
- case 2: P0 = seven_seg[hour_r % 10]| flash; P2 = ~0x04;break; //定鬧小時(shí)閃爍
- case 3: P0 = seven_seg[hour_r / 10]| flash; P2 = ~0x08;break; //定鬧小時(shí)閃爍
- case 4: P0 = 0xff;P2 = ~0x10;break; //不顯示
- case 5: P0 = 0x0c;P2 = ~0x20;break; //顯示字符"P"
- }
- }
- if(key1_flag == 5) //調(diào)定鬧分鐘
- {
- j = 0;
- switch(k)
- {
- case 0: P0 = seven_seg[min_r % 10]| flash; P2 = ~0x01;break; //定鬧分閃爍
- case 1: P0 = seven_seg[min_r / 10]| flash; P2 = ~0x02;break; //定鬧分閃爍
- case 2: P0 = seven_seg[hour_r % 10]; P2 = ~0x04;break;
- case 3: P0 = seven_seg[hour_r / 10]; P2 = ~0x08;break;
- case 4: P0 = 0xff;P2 = ~0x10;break; //不顯示
- case 5: P0 = 0x0c;P2 = ~0x20;break; //顯示字符"P"
- }
- }
- k++;
- if(k >= 6)k = 0;
- }
- void timer0_initi(void) //中斷初始化函數(shù)
- {
- TMOD = 0x01;
- TH0 = 0xf8;
- TL0 = 0x2f; //每次觸發(fā)中斷后從裝初值,使下次對(duì)機(jī)器脈沖計(jì)數(shù)2000個(gè)計(jì)滿溢出引發(fā)中斷 約0.2ms
- EA = 1; //開(kāi)總中斷
- TR0 = 1; //啟動(dòng)定時(shí)器T0
- ET0 = 1; //開(kāi)T0中斷
- }
- void main(void)
- {
- timer0_initi();
- while(1)
- {
- key(); //調(diào)用按鍵函數(shù)
- if(min == min_r && hour == hour_r) //當(dāng)時(shí)間等于鬧鐘
- SW = 1; //鬧鈴響起
- else
- SW = 0;
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
電子表設(shè)計(jì).rar
(55.19 KB, 下載次數(shù): 71)
2018-11-27 19:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|