标题:
51单片机编写74hc59数据传输功能,钟表
[打印本页]
作者:
紫小义
时间:
2018-5-21 10:12
标题:
51单片机编写74hc59数据传输功能,钟表
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)
2018-5-21 10:11 上传
点击文件名下载附件
74hc595数据传输
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1