|
下面是51單片機數碼管電子鐘的proteus仿真原理圖(工程文件可到本帖附件中下載):
0.png (30.25 KB, 下載次數: 93)
下載附件
2017-5-7 21:21 上傳
單片機電子鐘源程序如下:
- //#include <reg51.h>
- //# include <absacc.h>
- # include <STC12C5A60S2.h>
- # define uchar unsigned char
- # define uint unsigned int
- # define uint32 unsigned long int
- # define sint32 signed long int
- # define vtim1 50000 //定時50ms,一幀8*50=40ms,頻率=40Hz
- # define vtim2 2500 //定時2.5ms,一幀8*2.5=20ms,頻率=50Hz
- //# define vt DBYTE[0x21^0]
- # define vt ((unsigned char volatile data *) 0)[0x21^0]
- //sbit vt=0xe8;
- //數碼管位選循環變量
- uchar wi=0;
- //共陰數碼管段碼表
- uchar code distable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X40,0x00,0x31};
- //位選碼表
- uchar code numi[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- //顯示緩存
- uchar V_ram[]={0x01,0x02,0x10,0x03,0x04,0x10,0x05,0x06};
- sbit p32=P3^2;
- sbit p33=P3^3;
- uchar i=0;
- uchar j=0,k=0,ss=0;
- uchar x=0;
- uchar key_num=0xff;
- void main()
- {
- vt=1;
- vt=0;
- vt=1;
- IT0=0;
- IT1=0;
- EA=1;
- ET0=1;
- ET1=1;
- EX0=1;
- EX1=1;
- PT0=1;
- TH1=(65536-vtim1)/256;
- TL1=(65536-vtim1)%256;
- TH0=(65536-vtim2)/256;
- TL0=(65536-vtim2)%256;
- TMOD=0X11;
- TR0=1;
- TR1=1;
- while(1);
-
- }
- void t1_rpt() interrupt 3 //50ms中斷
- {
- TH1=(65536-vtim1)/256;
- TL1=(65536-vtim1)%256;
- /////////////////按鍵去抖動////////////////
- if(~(EX1||EX0))
- {
- x++;
- if(x>=5)//按鍵按下250ms 后,全能按鍵中斷
- {
- IE0=0; //清中斷源
- IE1=0; //清中斷源
- EX1=1; //打開中斷
- EX0=1; //打開中斷
- }
- }
- ////////////////0.35秒閃爍周期///////////////
- if(key_num<8)
- {
- k++; //閃爍計時變量
- j++; //閃爍超時變量
- k=k&0x07; //0.4秒閃爍周期
- if(k<4)
- {
- ss=0; //0.2秒亮
- }
- else
- {
- ss=1; //0.2秒滅
- }
- if(j>=100) //超時5秒閃爍停止
- {
- key_num=0xff;
- k=0;
- j=0;
- ss=0;
- }
- }
- }
-
- void t0_rpt() interrupt 1
- { ///////////////////////////定時刷新數碼管代碼//////////////////////////////
- uchar dm=0,wx=0;
- TH0=(65536-vtim2)/256;
- TL0=(65536-vtim2)%256;
- dm=distable[V_ram[wi]]; //取顯示段碼
- if((wi==key_num)&&(ss==1))dm=distable[0x11]; // key_num:表示對應數碼管閃爍;ss=1表示顯示黑色
- wx=numi[wi]; //取位選碼
- P1=0x00; //關顯示
- P2=dm; //段碼賦給P0口
- P1=wx;
- wi++;
- if(wi==8)
- {
- wi=0;
- i++;
- }
- /////////////////////////計時代碼,把秒,分,時分別放入對應的顯示RAM////////////////////////
- if(i==50)
- { //秒
- i=0;
- V_ram[7]++; //秒個位++
- if(V_ram[7]>=10)
- {
- V_ram[7]=0;
- V_ram[6]++; //秒十位++
- if(V_ram[6]>=6)
- {
- V_ram[6]=0;
- V_ram[4]++; //分個位++
- if(V_ram[4]>=10)
- {
- V_ram[4]=0;
- V_ram[3]++; //分十位++
- if(V_ram[3]>=6)
- {
- V_ram[3]=0;
- V_ram[1]++; //時個位++
- if((V_ram[1]>=10)&&(V_ram[0]<2))
- {
- V_ram[1]=0;
- V_ram[0]++; //時十位++
- }
- if((V_ram[1]>=4)&&(V_ram[0]>=2))
- {
- V_ram[1]=0; //時個位清零
- V_ram[0]=0; //時十位清零
- }
- }
- }
- }
- }
- }
-
- }
- void EXTR0_rpt() interrupt 0 /////////外部中斷1,功能鍵:切換對應的數碼管并使該數碼管閃爍////////////////
- {
- x=0; //按鍵去抖動計時清零
- EX0=0; //關中斷,用于去抖動
- j=0; //長期不按鍵,閃爍停止。閃爍超時變量清零
- if(key_num==7)
- key_num=0;
- else
- key_num++;
- if(key_num==2)key_num=3; //
- if(key_num==5)key_num=6; //
- }
- void EXTR1_rpt() interrupt 2
- {
- x=0; //按鍵去抖動計時清零
- EX1=0; //關中斷,用于去抖動
- j=0; //長期不按鍵,閃爍停止。閃爍超時變量清零
- switch (key_num)
- {
- case 2:
- case 5: {
- break;
- }
- case 0: {
- if (V_ram[key_num]<2)
- {
- V_ram[key_num]=V_ram[key_num]+1; //時十位加1
- }
- else
- V_ram[key_num]=0x00;
- break;
- }
- case 1: //時個位加1
- case 4: //分個位加1
- case 7: { //秒個位加1
- if (V_ram[key_num]<9)
- V_ram[key_num]=V_ram[key_num]+1;
- else
- V_ram[key_num]=0;
- //if ((V_ram[0]==2)&&(V_ram[1]>=4))
- //{
- // V_ram[1]=3;
- //}
- break;
- }
- case 3: //分十位加1
- case 6: { //秒十位加1
- if (V_ram[key_num]<5)
- V_ram[key_num]=V_ram[key_num]+1;
- else
- V_ram[key_num]=0;
- break;
- }
- default:
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
給大家分享一些我們老師給的一些經典的單片機程序源碼, 一共有十多個.都有詳細的注釋,然大家快速的理解每一行代碼的意思。而且有proteus仿真原理圖。大家可以直接驗證程序的對錯.

本系列所有源碼打包下載地址(含proteus仿真工程文件和源程序):
http://www.zg4o1577.cn/bbs/dpj-82474-1.html
本例程下載:
電子鐘.rar
(79.12 KB, 下載次數: 82)
2017-5-7 21:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|