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