|
//根据实验现象,对每行程序的功能进行注释!
#include <reg52.h>
sbit P27 = P2^7;// SER 串行数据输入引脚
sbit P25 = P2^5;// RCLK 储存寄存器时钟
sbit P26 = P2^6; // SRCLK 输入数据移位时钟
void Send_595(unsigned char dat);//74hc595发送数据函数声明
void BufToSeg();//数码管显示函数声明
void NumToNuf();//数据转换函数声明
void Delay(unsigned int n);// 延时函数声明
unsigned char code Segcode[]=
{0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F}; //共阴极数码管段码0~9
unsigned char code Bitcode[]=
{0x01,0x02};//第一和第二个共阳极数码管位选码
unsigned char DisBuf[2];
unsigned char Count;
/*************主程序*********************************/
void main()
{
unsigned char m; //定义一个无符号字符型变量m
while(1) //大循环
{
if(++m==220)
{
m=0;
if(++Count==60)
Count=0;
} //延时 1s
NumToNuf(); //取余取整函数
BufToSeg(); //显示函数
}
}
/*****************************************************/
/***************595发送字节程序***********************/
void Send_595(unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++) //循环是为了将8位数据送入595中
{
if(dat & 0x80) //判断最高位数据 是否为“1”
P27 = 1; //若为“1”,就把1通过 P26发送给74hc595
else
P27 = 0; //若为“0”,就把0通过 P26发送给74hc595
P26 = 0;
P26 = 1; //P26出现上升沿,单片机通过 P26向74hc595发送数据
dat = dat << 1; //左移一位
}
}
/*****************毫秒级延时子程序*****************************/
void Delay(unsigned int n)
{
unsigned char i;//定义一个无符号字符型变量i
while(n--)
{
for(i=0;i<123;i++);
}
}
/**************两位数取整取余子程序***************************/
void NumToNuf()
{
DisBuf[0]=Count/10; //取整
DisBuf[1]=Count%10; //取余
}
/**************数码管显示子程序***************************/
void BufToSeg()
{
unsigned char k;
for(k=0;k<2;k++)
{
Send_595(~Bitcode[k]);//发送位选信号,取反后为共阴极数码管,位选第一二个数码管
Send_595(Segcode[DisBuf[k]]);//发送段选信号 ,在前两个数码管上显示DisBuf[]的值
P25 = 0;
P25 = 1; // P25出现上升沿,
Delay(1); //延时1s
}
}
|
|