51 编写74hc59数据传输功能,钟表
单片机源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DAT=P1^1; //数据传送端口
- sbit CLK=P1^2; //移位寄存器端口
- sbit STR=P1^3; //储存寄存器端口
- sbit K1=P3^0; //移位按键
- sbit K2=P3^1; //数字加1
- sbit K3=P3^2; //数字减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}; //共阴极数码管段选
- uchar code Wei[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //数码管位选
- uchar num,num1,num2,num3,miao2,miao1,fen2,fen1,shi2,shi1;
- uchar i,j=0;
- /*===========
- ms级延时函数
- =============*/
- void delayms(uchar ms)
- {
- uint i,j;
- for(i=ms;i>0;i--)
- for(j=115;j>0;j--);
- }
- /*================
- 写位码数据到寄存器
- ==================*/
- void write_dat(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- CLK=0; //拉低移位寄存器
- DAT=dat & 0x80; //将数据送入数据线
- CLK=1; //拉高移位寄存器,数据寄存器的数据可以移位
- dat <<= 1; //数据左移到最高位
- }
- }
- /*================
- 写位码数据到寄存器
- ==================*/
- void write_dat1(uchar dat1)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- CLK=0;
- DAT=dat1 & 0x80;
- CLK=1;
- dat1 <<= 1;
- }
- }
- /*==========
- 输出数据函数
- ============*/
- void out_dat()
- {
- STR=0; //拉低储存寄存器
- _nop_();
- STR=1; //拉高储存寄存器
- }
- /*======
- 显示函数
- ========*/
- void display(uchar miao1,uchar miao2,uchar fen1,uchar fen2,uchar shi1,uchar shi2)
- {
-
- write_dat(Wei[0]); //写数码管位码数据第一位
- delayms(1); //等待数据稳定
- write_dat1(SMG[miao1]); //写数码管段码数据秒个位
- delayms(1); //等待数据稳定
- out_dat(); //发出数据
- write_dat(Wei[1]); //写数码管位码数据第二位
- delayms(1); //等待数据稳定
- write_dat1(SMG[miao2]); //写数码管段码数据秒十位
- delayms(1); //等待数据稳定
- out_dat(); //发出数据
- 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]); //写数码管第三位
- delayms(1);
- write_dat1(SMG[10]); //写数码管第十一个断码 即‘-’
- delayms(1);
- out_dat();
- write_dat(Wei[5]); //写数码管第六位
- delayms(1);
- write_dat1(SMG[10]); //写数码管第十一个断码 即‘-’
- delayms(1);
- out_dat();
- }
- void beepscan()
- {
- beep=0;
- delayms(100);
- beep=1;
- }
- /*=========
- 按键函数
- ===========*/
- void keyscan()
- {
- if(K1==0) //移位按键按下
- {
- delayms(10); //消抖
- if(K1==0) //再次检测
- {
- i++;
- while(!K1);
- beepscan();
- if(i==1)
- {
- TR0=0; //关闭定时器
- write_dat(Wei[0]); //写数码管位码数据第一位
- }
- if(i==2)
- {
- write_dat(Wei[1]); //写数码管位码数据第二位
- }
- if(i==3)
- {
- write_dat(Wei[3]); //写数码管位码数据第四位
- }
- if(i==4)
- {
- write_dat(Wei[4]); //写数码管位码数据第五位
- }
- if(i==5)
- {
- write_dat(Wei[6]); //写数码管位码数据第七位
- }
- if(i==6)
- {
- write_dat(Wei[7]); //写数码管位码数据第八位
- TR0=1; //打开定时器
- }
- }
- }
- 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();
- }
- }
- }
- /*==============
- 定时器初始化函数
- ================*/
- void timer_init()
- {
- TMOD=0x11; //设置定时器0和1为工作方式1
- TH0=(65536-45872)/256; //装初值50ms
- TL0=(65536-45872)%256;
- EA=1; //开总中断
- ET0=1; //开定时器0中断
- TR0=1; //启动定时器0
- }
- /*==================
- 时分秒转换函数
- 转换后送与数码管显示
- ====================*/
- void CH_time()
- {
- if(num1==20) //num1加到20,表示一秒时间已到
- {
- num1=0; //将num1清零,重新计时
- num++; //秒开始加
- if(num==60) //秒加到60
- { num=0; //将秒清零,重新计时
- num2++; //分开始加
- if(num2==60)
- {
- num2=0;
- num3++;
- if(num3==24)
- {
- num3=0;
- }
- }
- }
- }
- miao2=num/10; //计算秒个位
- miao1=num%10; //计算秒十位
- fen2=num2/10;
- fen1=num2%10;
- shi2=num3/10;
- shi1=num3%10;
- display(miao1,miao2,fen1,fen2,shi1,shi2); //显示时分秒
- }
- /*=======
- 主函数
- =========*/
- void main()
- {
- timer_init(); //初始化函数
- while(1)
- {
- CH_time(); //转换显示函数
- keyscan();
- }
- }
- /*=======
- 中断函数
- =========*/
- void T0_time() interrupt 1
- {
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- num1++;
- }
复制代码
所有资料51hei提供下载:
74hc595.zip
(41.13 KB, 下载次数: 4)
|