|
|
51 編寫(xiě)74hc59數(shù)據(jù)傳輸功能,鐘表
單片機(jī)源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DAT=P1^1; //數(shù)據(jù)傳送端口
- sbit CLK=P1^2; //移位寄存器端口
- sbit STR=P1^3; //儲(chǔ)存寄存器端口
- sbit K1=P3^0; //移位按鍵
- sbit K2=P3^1; //數(shù)字加1
- sbit K3=P3^2; //數(shù)字減1
- sbit beep=P2^3; //蜂鳴器
- void beepscan(void);
- //0 1 2 3 4 5 6 7 8 9 -
- uchar code SMG[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共陰極數(shù)碼管段選
- uchar code Wei[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //數(shù)碼管位選
- uchar num,num1,num2,num3,miao2,miao1,fen2,fen1,shi2,shi1;
- uchar i,j=0;
- /*===========
- ms級(jí)延時(shí)函數(shù)
- =============*/
- void delayms(uchar ms)
- {
- uint i,j;
- for(i=ms;i>0;i--)
- for(j=115;j>0;j--);
- }
- /*================
- 寫(xiě)位碼數(shù)據(jù)到寄存器
- ==================*/
- void write_dat(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- CLK=0; //拉低移位寄存器
- DAT=dat & 0x80; //將數(shù)據(jù)送入數(shù)據(jù)線
- CLK=1; //拉高移位寄存器,數(shù)據(jù)寄存器的數(shù)據(jù)可以移位
- dat <<= 1; //數(shù)據(jù)左移到最高位
- }
- }
- /*================
- 寫(xiě)位碼數(shù)據(jù)到寄存器
- ==================*/
- void write_dat1(uchar dat1)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- CLK=0;
- DAT=dat1 & 0x80;
- CLK=1;
- dat1 <<= 1;
- }
- }
- /*==========
- 輸出數(shù)據(jù)函數(shù)
- ============*/
- void out_dat()
- {
- STR=0; //拉低儲(chǔ)存寄存器
- _nop_();
- STR=1; //拉高儲(chǔ)存寄存器
- }
- /*======
- 顯示函數(shù)
- ========*/
- void display(uchar miao1,uchar miao2,uchar fen1,uchar fen2,uchar shi1,uchar shi2)
- {
-
- write_dat(Wei[0]); //寫(xiě)數(shù)碼管位碼數(shù)據(jù)第一位
- delayms(1); //等待數(shù)據(jù)穩(wěn)定
- write_dat1(SMG[miao1]); //寫(xiě)數(shù)碼管段碼數(shù)據(jù)秒個(gè)位
- delayms(1); //等待數(shù)據(jù)穩(wěn)定
- out_dat(); //發(fā)出數(shù)據(jù)
- write_dat(Wei[1]); //寫(xiě)數(shù)碼管位碼數(shù)據(jù)第二位
- delayms(1); //等待數(shù)據(jù)穩(wěn)定
- write_dat1(SMG[miao2]); //寫(xiě)數(shù)碼管段碼數(shù)據(jù)秒十位
- delayms(1); //等待數(shù)據(jù)穩(wěn)定
- out_dat(); //發(fā)出數(shù)據(jù)
- write_dat(Wei[3]);
- delayms(1);
- write_dat1(SMG[fen1]);
- delayms(1);
- out_dat();
- write_dat(Wei[4]);
- delayms(1);
- write_dat1(SMG[fen2]);
- delayms(1);
- out_dat();
- write_dat(Wei[6]);
- delayms(1);
- write_dat1(SMG[shi1]);
- delayms(1);
- out_dat();
- write_dat(Wei[7]);
- delayms(1);
- write_dat1(SMG[shi2]);
- delayms(1);
- out_dat();
- write_dat(Wei[2]); //寫(xiě)數(shù)碼管第三位
- delayms(1);
- write_dat1(SMG[10]); //寫(xiě)數(shù)碼管第十一個(gè)斷碼 即‘-’
- delayms(1);
- out_dat();
- write_dat(Wei[5]); //寫(xiě)數(shù)碼管第六位
- delayms(1);
- write_dat1(SMG[10]); //寫(xiě)數(shù)碼管第十一個(gè)斷碼 即‘-’
- delayms(1);
- out_dat();
- }
- void beepscan()
- {
- beep=0;
- delayms(100);
- beep=1;
- }
- /*=========
- 按鍵函數(shù)
- ===========*/
- void keyscan()
- {
- if(K1==0) //移位按鍵按下
- {
- delayms(10); //消抖
- if(K1==0) //再次檢測(cè)
- {
- i++;
- while(!K1);
- beepscan();
- if(i==1)
- {
- TR0=0; //關(guān)閉定時(shí)器
- write_dat(Wei[0]); //寫(xiě)數(shù)碼管位碼數(shù)據(jù)第一位
- }
- if(i==2)
- {
- write_dat(Wei[1]); //寫(xiě)數(shù)碼管位碼數(shù)據(jù)第二位
- }
- if(i==3)
- {
- write_dat(Wei[3]); //寫(xiě)數(shù)碼管位碼數(shù)據(jù)第四位
- }
- if(i==4)
- {
- write_dat(Wei[4]); //寫(xiě)數(shù)碼管位碼數(shù)據(jù)第五位
- }
- if(i==5)
- {
- write_dat(Wei[6]); //寫(xiě)數(shù)碼管位碼數(shù)據(jù)第七位
- }
- if(i==6)
- {
- write_dat(Wei[7]); //寫(xiě)數(shù)碼管位碼數(shù)據(jù)第八位
- TR0=1; //打開(kāi)定時(shí)器
- }
- }
- }
- if(i!=0)
- {
- if(K2==0)
- {delayms(10);
- if(K2==0)
- {
- beepscan();
- j++;
- if(j==9)
- j=0;
- write_dat1(SMG[j]);
- delayms(1);
- out_dat();
- }
- }
- if(K3==0)
- delayms(10);
- if(K3==0)
- {
- beepscan();
- j--;
- if(j==0)
- j=9;
- write_dat1(SMG[j]);
- delayms(1);
- out_dat();
- }
- }
- }
- /*==============
- 定時(shí)器初始化函數(shù)
- ================*/
- void timer_init()
- {
- TMOD=0x11; //設(shè)置定時(shí)器0和1為工作方式1
- TH0=(65536-45872)/256; //裝初值50ms
- TL0=(65536-45872)%256;
- EA=1; //開(kāi)總中斷
- ET0=1; //開(kāi)定時(shí)器0中斷
- TR0=1; //啟動(dòng)定時(shí)器0
- }
- /*==================
- 時(shí)分秒轉(zhuǎn)換函數(shù)
- 轉(zhuǎn)換后送與數(shù)碼管顯示
- ====================*/
- void CH_time()
- {
- if(num1==20) //num1加到20,表示一秒時(shí)間已到
- {
- num1=0; //將num1清零,重新計(jì)時(shí)
- num++; //秒開(kāi)始加
- if(num==60) //秒加到60
- { num=0; //將秒清零,重新計(jì)時(shí)
- num2++; //分開(kāi)始加
- if(num2==60)
- {
- num2=0;
- num3++;
- if(num3==24)
- {
- num3=0;
- }
- }
- }
- }
- miao2=num/10; //計(jì)算秒個(gè)位
- miao1=num%10; //計(jì)算秒十位
- fen2=num2/10;
- fen1=num2%10;
- shi2=num3/10;
- shi1=num3%10;
- display(miao1,miao2,fen1,fen2,shi1,shi2); //顯示時(shí)分秒
- }
- /*=======
- 主函數(shù)
- =========*/
- void main()
- {
- timer_init(); //初始化函數(shù)
- while(1)
- {
- CH_time(); //轉(zhuǎn)換顯示函數(shù)
- keyscan();
- }
- }
- /*=======
- 中斷函數(shù)
- =========*/
- void T0_time() interrupt 1
- {
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- num1++;
- }
復(fù)制代碼
所有資料51hei提供下載:
74hc595.zip
(41.13 KB, 下載次數(shù): 4)
2018-5-21 10:11 上傳
點(diǎn)擊文件名下載附件
74hc595數(shù)據(jù)傳輸
|
|