编写程序、设计电路,利用IAP15W4K58S4单片机的内部SPI接口和74HCT595芯片控制7段共阴数码管,实现N进制自加秒表。系统晶振12MHz。(程序核心语句要有注释,N=35)
时间: 2023-05-28 12:02:53 浏览: 220
单片机与数码管做的秒表
4星 · 用户满意度95%
由于N为35,需要用到大于10的数字,因此我们需要使用16段数码管来表示。
电路设计:
以下是电路连接图:
程序设计:
```
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCK = P3^3;
sbit RCK = P3^4;
sbit SER = P3^5;
uchar code duan_ma[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1,0x00};//0-9,A-Z
uint shiwei, gewei;//时位和分位
uint count;//计数变量,从0开始
void delay(uint xms)//延时函数
{
uint i, j;
for(i=xms; i>0; i--)
for(j=112; j>0; j--);
}
void write_595(uchar dat)//往74HC595写入一个字节
{
uchar i;
SCK=0;//SCK置0
for(i=0;i<8;i++)
{
SER=dat>>7;//每次取最高位
dat<<=1;//次高位顶位
SCK=0;//在上升沿传输数据
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
}
void display() //在7段数码管上显示count的值
{
P2=0xff;//关闭所有数码管
shiwei=count/35; //计算时位
gewei=count%35; //计算分位
write_595(~(duan_ma[shiwei] & 0x0f));//按位取反,将共阴数码管变为共阳
write_595(duan_ma[gewei]);
RCK=0; //锁存寄存器上锁
_nop_();
_nop_();
RCK=1;
_nop_();
_nop_();
}
void main()
{
TMOD=0x01;//定时器0为模式1,16位计数器
TH0=(65536-2000)>>8;//装初始值,每500us中断一次
TL0=(65536-2000)%256;
ET0=1;//打开定时器0中断
EA=1;//打开中断总开关
TR0=1;//启动定时器0
while(1)
{
display();
}
}
void timer0() interrupt 1 //定时器0中断函数
{
TH0=(65536-2000)>>8; //重装初值
TL0=(65536-2000)%256;
count++; //计数器加1
if(count>=35*35) //最大计数值为35*35-1
count=0; //计数器清零
}
```
总结:
本次实验主要涉及到单片机的SPI通讯,以及74HCT595芯片的使用。在程序设计方面,需要实现将计数器的值转换为n进制,并在7段数码管上进行显示。实验中需要特别注意的是,LED共阴和共阳的区别,以及需要控制的位数和对应的数码管的选择。
阅读全文