赞
踩
使用定时器来实现延时,编程实现数码管静态显示秒表的倒计时。(此实验与实验三相似,只需要几处代码稍加改动就行)
进取者STC15开发板原理图
本实验采用拓展口连接数码管的八个引脚实现功能
数码管正面
数码管背面
数码管内部原理
以共阳极数码管为例,从图中可以看出,数码管由8个LED组成,共阳极他们的阳极接在了一起,只要外部给一个VCC就可以通过控制他们的阴极来控制数码管显示
共阳极代码:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
对应0 1 2 3 4 5 6 7 8 9 a b c d e f十六个符号
共阴极代码:0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
对应0 1 2 3 4 5 6 7 8 9 a b c d e f十六个符号
本次实验使用的是P0_0到P0_78个管脚,实际开发板中用杜邦线接出来(图片来源网络,侵删)
模块1个脚提供高电平,其余脚与单片机P0口连接
STC15w4k58s4与STC15W4k32s4为一个系列,只不过io口有点区别,K32s4的有62个io口,k58s4有48个io口,其余没有太多的差别,单片机所带的中断请求源如图示,有很多,所以说STC15系列芯片是很强大的,
这是中断执行的内部结构图,通过开关选择不同的模式,在此就不多说了,因为中断这些代码可以直接用相关软件生成。
本次使用到的就是T0的定时器中断,我们按照datasheet所示编写好代码就可以使用定时器中断功能了。
(摘自STC15datasheet)
#include <reg51.h>//调用reg51头文件 #define uchar unsigned char//定义uchar类型为unsigned char 储存大小1字节,值范围:0 到 255 #define uint unsigned int//定义uint类型为unsigned int 储存大小2或4个字节,值范围:0~65536 uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//一维数组表示数码管显示“0~F”共阳极 uchar i,j,k=9;//i,j开始为0.k开始为9 void display()//显示函数 { P0=tab[k];//P0等于对应的一维数组中值,从而数码管显示相应的数值,例如:k=1,P0=tab[k]=0xc0; } void InitTimer0(void)//使用定时器0 { TMOD = 0x01;//选择为定时器0模式,工作方式1,仅用TR0打开启动 TH0 = 0xFC;//给定时器赋初值,定时1ms TL0 = 0x18; EA = 1;//打开定时器0中断允许 ET0 = 1;//打开总中断 TR0 = 1; //打开定时器 } void main(void) { InitTimer0();//定时器初始化 while(1) { display(); } } void Timer0Interrupt(void) interrupt 1//定时器0中断函数 { TH0 = 0xfC;//给定时器赋初值,定时1ms TL0 = 0x18; i++;//每过1ms,i+1一次 if(i==100)//当i达到100时,及经历了0.1s,进入判断 { i=0;j++;//让i恢复初值,每次i=100时,j+1一次 if(j==10) { j=0;//让j恢复初值 k--;//k-1 if(k==0) { k=10;//让k恢复初值 } } } }
打字不易,各位少侠点个赞吧,感谢!!!
。
。
。
。
。
与实验三相比,
k--;//k-1
if(k==0)
{
k=10;//让k恢复初值
}
在这里,只是把之前实验三默认0改为十,自加改为自减就行了。
还有一种写法就是把uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
里面代码的顺序改一下,其他的和实验三一样也可以。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。