单片机实验说明<三>数码管和定时器基本使用

网友投稿 791 2022-05-29

实验三(上) 数码管动态显示设计

设计要求:

编程实现8段数码管的动态扫描显示,要求4个数码管从左到右分别显示“1”、“2”、“3”、“4”、及“A”、“b”、“C”、“d”。

电路设计:

软件代码:

/*****************************************************************************

* 头文件 *

单片机实验说明<三>数码管和定时器基本使用

*****************************************************************************/

#include "hml/hml.h"

#define LSA P1_5

#define LSB P1_6

#define LSC P1_7

unsigned char smgduan[]={0xf9,0xa4,0xb0,0x99,0x88,0x83,0xc6,0xa1};

//共阳极的显示代码表1,2,3,4,A,b,C,d

/*****************************************************************************

* 初始化和功能函数 *

*****************************************************************************/

void sys_init(void)

{

LSA = 0;

LSB = 0;

LSC = 0;

}

void LedScan(unsigned char pos,unsigned char dispcode)

{

unsigned char i;

for(i=0;i<=pos;i++)

{

switch(pos) //位选,选择点亮的数码管,

{

case(0):

LSA=1;LSB=0;LSC=0; break; //显示

case(1):

LSA=0;LSB=1;LSC=0; break; //显示第1位

case(2):

LSA=1;LSB=1;LSC=0; break; //显示第2位

case(3):

LSA=0;LSB=0;LSC=1; break; //显示第3位

}

P0=dispcode; //发送段码

}

}

/*****************************************************************************

* 主函数 *

*****************************************************************************/

void main(void)

{

sys_init();

int i=0,j=500;

while(j--)

{

for(i=0;i<4;i++)

{

LedScan(i,smgduan[3-i]);

sleep(1);

}

}

j=500;

while(j--)

{

for(i=0;i<4;i++)

{

LedScan(i,smgduan[7-i]);

sleep(1);

}

}

}

思考题:

1.何谓数码管的动态显示,其原理是什么?

2.若要实现秒表从 0.0s 秒到 9.9s 循环显示,请写出实现的思路或代码?

实验三(下) 2位倒计时设计(团队课题)

设计要求:

编写实验程序,实现59秒倒计时功能,初始状态数码管最后两位显示数字“59”,要求定时器0每10ms产生一次中断,在定时中断服务程序里进行计数,计数满一秒,数码管显示相应减1,倒计时结束时,数码管显示“00”,并以周期1秒进行闪烁;按键可以控制计数器的启动和暂停。

电路设计:

自主完成。

软件代码:

/*****************************************************************************

* 头文件 *

*****************************************************************************/

#include "hml/hml.h"

#define LSA P1_5

#define LSB P1_6

#define LSC P1_7

unsigned int cnt=0;

unsigned char T0RH = 0; //T0 重载值的高字节

unsigned char T0RL = 0; //T0 重载值的低字节

signed char sec;

signed char sec_all=19;

signed char count=0;

unsigned char smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x0f8,0x80,0x90};

//共阳极的显示代码表0~9

void EXINT0() __interrupt 0;

void Timer0() __interrupt 1;

/*****************************************************************************

* 初始化和功能函数 *

*****************************************************************************/

/* 配置T0, ms-T0定时时间 */

void ConfigTimer0(unsigned int ms)

{

unsigned long tmp; //临时变量

tmp = 11059200 / 12; //定时器计数频率

tmp = (tmp * ms) / 1000; //计算所需的计数值

tmp = 65536 - tmp; //计算定时器重载值

tmp = tmp + 18; //补偿中断响应延时造成的误差

T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节

T0RL = (unsigned char)tmp;

TMOD &= 0xF0; //清零 T0 的控制位

TMOD |= 0x01; //配置 T0 为模式 1

TH0 = T0RH; //加载 T0 重载值

TL0 = T0RL;

ET0 = 1; //使能 T0 中断

}

void EXINT0() __interrupt 0

{

count++;

}

void Timer0() __interrupt 1

{

TH0 = T0RH; //重新加载重载值

TL0 = T0RL;

cnt++; //中断次数加1

if (cnt >= 100) //中断100次=1s

{

cnt = 0;

sec--;

if (sec < 0) //当显示值到0后,闪烁

{

sec = 0;

}

}

}

void LedScan(unsigned char pos,unsigned char dispcode)

{

unsigned char i;

for(i=0;i<=pos;i++)

{

switch(pos) //位选,选择点亮的数码管,

{

case(0):

LSA=1;LSB=0;LSC=0; break; //显示

case(1):

LSA=0;LSB=1;LSC=0; break; //显示第1位

case(2):

LSA=1;LSB=1;LSC=0; break; //显示第2位

case(3):

LSA=0;LSB=0;LSC=1; break; //显示第3位

}

P0=dispcode; //发送段码

}

}

void sys_init(void)

{

LSA = 0;

LSB = 0;

LSC = 0;

cnt = 0; //中断次数计数器

sec = sec_all; //秒数初值

ConfigTimer0(10); //配置 T0 定时 10ms

EA=1; //开中断

IT0=0;

EX0=1;

// IT1=1;

// EX1=1;

// PX1=1;

TR0=1;

}

/*****************************************************************************

* 主函数 *

*****************************************************************************/

void main(void)

{

sys_init();

while(1)

{

if(count%2==0)

{

TR0 = 1;

}

else

{

TR0 = 0;

}

if((cnt>49)&&(sec==0))

{

LedScan(0,0xff); //显示个位值

LedScan(1,0xff); //显示个位值

}

else

{

LedScan(0,smgduan[sec%10]); //显示个位值

LedScan(1,smgduan[sec/10]); //显示十位值

}

}

}

思考题:

1.画出主程序和定时中断流程图;

2.加入独立键盘的两个按键(自选),其中一个按键实现复位,即按下后马上回到显示“19”;另一个按键实现暂停和启动功能,即按一下后暂停,再按一下后启动。

IDE 单片机 电商家电数码

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java-第3章 流程控制语句
下一篇:Eclipse快捷键设置
相关文章