|
很適初學(xué)者做的例程,兩組數(shù)碼管沒有用74H595而是用N個IO直接控制,感覺這是我數(shù)碼管時代最后一個作品,51單片機,一般工業(yè)用的也只是簡單的控制,關(guān)鍵一點就是他是我們通向科技頂峰的天梯,一路走來感悟很多………致我們走過的青春。推薦個文本編輯器920,用手機上51黑更方便,只要有人貼個源代碼,復(fù)制就OK,發(fā)貼也快(題外話)
制作出來的實物圖如下:
20181208_205334.jpg (317.99 KB, 下載次數(shù): 52)
下載附件
2018-12-8 21:46 上傳
20181208_205302.jpg (291.16 KB, 下載次數(shù): 63)
下載附件
2018-12-8 21:46 上傳
Screenshot_2018-12-08-21-09-43.png (1.1 MB, 下載次數(shù): 67)
下載附件
2018-12-8 21:46 上傳
單片機源程序如下:
- #include<reg51.h>
- #include <intrins.h>
- #define uchar unsigned char//只有256
- #define uint unsigned int//有16位但占內(nèi)存。
- uchar count;//中斷計數(shù)
- uint sec;//秒顯示
- uint su;//秒顯示
- sbit wei0=P1^2;//位
- sbit wei1=P1^1;//位
- sbit wei2=P1^0;//位
- sbit wei00=P2^4;//位
- sbit wei01=P2^3;//位
- sbit wei02=P2^2;//位
- sbit k2=P1^4;//按鍵
- sbit k1=P1^5;//按鍵
- sbit k3=P1^6;//按鍵
- sbit k4=P1^7;//按鍵
- sbit led=P2^7;//按鍵
- bit write_secbf=0;//定時溢出標(biāo)志位,用來寫24C02
- sbit scl_24=P2^1;//24c02時鐘線
- sbit sda_24=P2^0;//24c02數(shù)據(jù)線
- bit k;//位變量取值只有0、1、黙認(rèn)為0*/
- void delay (int a)//毫秒級延時
- {
- int x,y;
- for(x=a;x>0;x--)
- for(y=110;y>0;y--);
- }
- void usdelay()
- {
- _nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();
- }
- uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陰表(wei=0;開反之關(guān))加顯示位(P0=table[shi]+0x80;(+或|))顯小數(shù)點
- /*uchar code table1[16] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
- 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共陽表(wei=1;開反之關(guān))加顯示位(P0=table[shi]&0x7f;)顯小數(shù)點*/
- uint qian,bai,shi,ge;
- void display(int dat)//4位顯示子函數(shù)
- {
- qian=dat/1000;
- bai=dat%1000/100;
- shi=dat%100/10;
- ge=dat%10;
- //wei3=0;
- //P0=table[qian];
- //delay(2);
- //wei3=1;
- wei2=1;
- P0=table[bai];
- delay(3);
- wei2=0;
- wei1=1;
- P0=table[shi];//|0x80;
- delay(3);
- wei1=0;
- wei0=1;
- P0=table[ge];
- delay(3);
- wei0=0;
- }
- uint qian1,bai1,shi1,ge1;
- void display1(int dat)//4位顯示子函數(shù)
- {
- qian1=dat/1000;
- bai1=dat%1000/100;
- shi1=dat%100/10;
- ge1=dat%10;
- //wei3=0;
- //P0=table[qian1];
- //delay(2);
- //wei3=1;
- wei02=1;
- P3=table[bai1];
- delay(3);
- wei02=0;
- wei01=1;
- P3=table[shi1];//|0x80;
- delay(3);
- wei01=0;
- wei00=1;
- P3=table[ge1];
- delay(3);
- wei00=0;
- }
- /***************以下開始為24CXX用子程序**********************/
- void star24() //開始信號
- {//時鐘線在高電平時,數(shù)據(jù)線由高變低即為開始信號 由高變低即為開始信號
- sda_24=1;
- usdelay();
- scl_24=1;
- usdelay();
- sda_24=0;//數(shù)據(jù)線由高變低即為開始信號
- usdelay();
- scl_24=0;
- }
- void stop24() //結(jié)束信號
- {//時鐘線在高電平時,數(shù)據(jù)線由低變高即為結(jié)束信號
- sda_24=0;
- usdelay();
- scl_24=1;
- usdelay();
- sda_24=1;
- usdelay();
- sda_24=0; //這句可有可無
- scl_24=0; //這句可有可無
- }
- void Ack24()//應(yīng)答
- { uchar i;
- scl_24=1;
- usdelay();
- while((sda_24==1)&&(i<200))i++;
- scl_24=0;
- usdelay();
- }
- /*
- void NoAck24() //不應(yīng)答
- {
- sda_24=1; //時鐘線高電平時,數(shù)據(jù)線高,即為不應(yīng)答
- usdelay();
- scl_24=1;
- usdelay();
- scl_24=0;
- usdelay();
- } */
- /**********24c0初始化***************************/
- void init_24()
- {
- sda_24=1;
- usdelay();
- scl_24=1;
- usdelay();
- }
- /**********讀數(shù)據(jù)24c02***************************/
- void write_byte(uchar dat)
- {
- uchar i,temp;
- temp=dat;
- //scl_24=0;//低電平可以變數(shù)據(jù),為高時是讀,且不能變
- for(i=0;i<8;i++)
- {
- temp=temp<<1;
- scl_24=0;
- usdelay();
- sda_24=CY;//CY是PSW寄存器中的CY位,再把CY賦給SDA,再由SCL控制發(fā)出去
- //sda_24=(bit)(temp&0x80);//用這句也可以換掉上一句(bit)是強制轉(zhuǎn)換命令,把數(shù)據(jù)轉(zhuǎn)成非0即1
- usdelay();
- scl_24=1;
- usdelay();
- }
- scl_24=0;
- usdelay();
- sda_24=1;//釋放總線
- usdelay();
- }
- /**********讀數(shù)據(jù)24c02***************************/
- uchar read_byte()
- {
- uchar i,k;
- scl_24=0; //這句可有可無
- usdelay(); //這句可有可無
- sda_24=1; //釋放總線
- usdelay();
- for(i=0;i<8;i++)
- {
- scl_24=1;
- usdelay();
- k=(k<<1)|sda_24;//判斷8次,移位7次
- scl_24=0;
- usdelay();
- }
- return k;
- }
- /**********寫24c02指定地址的數(shù)據(jù)***************************/
- void write_add(uchar add,uchar dat)
- {
- star24();
- write_byte(0xa0);//呼叫器件,高四位為定了的1010,即A,低四位三個接了地,所以為000,最后一個0是寫標(biāo)志
- Ack24();//寫了后要馬上應(yīng)答
- write_byte(add);//寫要往哪個地址寫數(shù)據(jù)00-1023
- Ack24();//每寫一次要給一個應(yīng)答位
- write_byte(dat);//把數(shù)據(jù)寫入
- Ack24();
- stop24();//給一個停止位,結(jié)束寫數(shù)據(jù)
- }
- /**********讀數(shù)據(jù)24c02指定地址的數(shù)據(jù)***************************/
- uchar read_add(uchar add)
- {
- uchar dat;
- star24();
- write_byte(0xa0);//呼叫器件,高四位為定了的1010,即A,低四位三個接了地,所以為000,最后一個0是寫標(biāo)志
- Ack24();//寫了后要馬上應(yīng)答
- write_byte(add);//寫入要往哪個地址讀數(shù)據(jù)00-1023
- Ack24();//每寫一次要給一個應(yīng)答位
- star24();
- write_byte(0xa1);//呼叫器件,高四位為定了的1010,即A,低四位三個接了地,所以為000,最后一個1是讀標(biāo)志
- Ack24();//寫了后要馬上應(yīng)答
- dat=read_byte();
- stop24();//給一個停止位,結(jié)束讀數(shù)據(jù)
- return dat;//返回一個DAT(數(shù)據(jù))
- }
- void keyscan()
- { if(k3==0&&su>0)//按K1時停TR0=0;
- {
- delay(3);
- if(k3==0&&su>0) //與上sec>0條件
- while(!k3);
- //TR1=1;
- TR1=~TR1;//取反定時器TR0,按一次開0,再按關(guān)1;
- }
-
- if(k2==0)
- {
- delay(3);
- if(k2==0)
- while(!k2);
- TR1=0;
- su++;
- if(su>255) su=0;
- sec=su;
- write_add(0,sec);//在地址2 寫入min
- delay(1);
- }
- if(k1==0)
- {
- delay(3);
- if(k1==0)
- while(!k1);
- TR1=0;
- su--;
- if(su==0) su=255;
- sec=su;
- write_add(0,sec);//在地址2 寫入min
- delay(1);
- }
- }
- void main()
- { init_24();//24c02初始化
- TMOD=0X11;//定時器1 TMOD=0X11;方式1.
- TH1=(65536-50000)/256;//裝初值
- TL1=(65536-50000)%256;//裝初值
- EA=1;
- ET1=1;
- TR1=0;//定時器先關(guān)。等開關(guān)鍵啟動
- led=0;//反相器0為關(guān)。
- sec=read_add(0);//從地址( )中讀出以前保存的數(shù)據(jù)
- delay(2);
- su=sec;
- while(1)
- {
- keyscan();
- if(count==2*1)//50000個20=1秒。
- {
- count=0;
- sec--;
- if(sec==0)//如果秒>100秒清0并執(zhí)行后面、
- {
- TR1=1;//定時器先關(guān)。等開關(guān)鍵啟動
- sec=su;
- led=~led;
- //delay(10);
- //led=0;
- }
- }
- display(sec); //實時數(shù)據(jù)
- display1(su);//設(shè)置數(shù)據(jù)
- }
- }
- void timer0() interrupt 3 //定時器0的中斷子函數(shù)(外部0為0、定時0為1、外部1為2、定時1為3、串口4、)
- {
- TH1=(65536-50000)/256;//裝初值
- TL1=(65536-50000)%256;//裝初值
- count++;//中斷發(fā)生后中斷計數(shù)加1
- }
-
復(fù)制代碼
所有資料51hei提供下載:
IIC定時雙數(shù)碼管OK.zip
(37.59 KB, 下載次數(shù): 32)
2018-12-8 21:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|