1
数码管
单片机作业:利用单片机的定时器设计一个0-99的秒表,按下按键S1秒表开始从零计时,按下按键S2秒表停止,并显示最终秒计时值。
接口信息
数码管断码端接单片机的P0口,位选端接单片机的P2.4、P2.5、P2.6、P2.7。数码管的千位和百位显示秒计数,十位个位显示的定时器中断计数。
2.程序代码
定时器初始化为工作模式1,定时器定时时间为20ms,也就是定时器每溢出一次的时间为20ms,则溢出50次即为1秒钟。通过查询溢出标志位的值即可。
void timer_inial()
{
TMOD = 0X01;//
TH0=0XB8;//定时0.02s
TL0=0X00;
}
定时器溢出处理函数:每次溢出之后,要手动清除溢出标志位,然后重装初始值。同时秒计数值加1,累加50次即为一秒中。
void second_cal_show()
{
if(TF0==1)
{
TF0=0;
TH0=0XB8;
TL0=0X00;
time_count++;
if(time_count>=50)//50次一秒
{
time_count=0;
time_S++;
}
}
}
主函数:主要是定时器初始化,然后循环执行按键启动、按键停止、定时器溢出处理和刷新数码管显示函数。
void main()
{
timer_inial();
while(1)
{
start();
stop();
second_cal_show();
LEDdisplay(time_S*100+time_count);
}
}
以下为作业全部代码:
#include
#include
//定义二个位变量,分别对应按键开始按键和停止复位按键
sbit key_set=P3^2;
sbit key_reset=P3^3;
unsigned char time_count=0;
unsigned int time_S=0;
#define LED_PORT P0
sbit wela_1 = P2^4;
sbit wela_2 = P2^5;
sbit wela_3 = P2^6;
sbit wela_4 = P2^7;
sbit dp=P0^7;
//LED显示字模 0-F 共阳模式
unsigned code table[]= {0Xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void timer_inial();//定时器初始化
void delay(unsigned int i);//延时函数
void start();
void stop();
void second_cal_show();
/*******************************************************************************
* 函 数 名 :Delayms
* 函数功能 :实现 ms级的延时
* 输 入 :ms
* 输 出 :无
*******************************************************************************/
void Delay_ms(unsigned int ms)
{
unsigned int i,j;
for(i=0;i
#if FOSC == 11059200L
for(j=0;j<114;j++);
#elif FOSC == 12000000L
for(j=0;j<123;j++);
#elif FOSC == 24000000L
for(j=0;j<249;j++);
#else
for(j=0;j<114;j++);
#endif
}
/*******************************************************************************
* 函 数 名 :LEDdisplay
* 函数功能 :循环显示各个位上的数据
* 输 入 :num要显示的数据
* 输 出 :无
*******************************************************************************/
void LEDdisplay(unsigned int num)
{
unsigned char qian,bai,shi,ge;
qian=num/1000;
bai=num%1000/100;
shi=num%100/10;
ge=num%10;
wela_1 = 1; //关闭所有数码管
wela_2 = 1;
wela_3 = 1;
wela_4 = 1;
wela_4=0; //显示千位
LED_PORT=table[qian];
Delay_ms(1);
LED_PORT = 0xff;
wela_4=1;
wela_3=0; //显示百位
LED_PORT=table[bai];
Delay_ms(1);
LED_PORT = 0xff;
//dp=0;
wela_3=1;
wela_3=0; //显示百位
dp=0;
Delay_ms(1);
LED_PORT = 0xff;
wela_3=1;
wela_2=0; //显示十位
LED_PORT=table[shi];
Delay_ms(1);
LED_PORT = 0xff;
wela_2=1;
wela_1=0; //显示个位
LED_PORT=table[ge];
Delay_ms(1);
LED_PORT = 0xff;
}
void main()
{
timer_inial();
while(1)
{
start();
stop();
second_cal_show();
LEDdisplay(time_S*100+time_count);
}
}
void timer_inial()
{
TMOD = 0X01;//
TH0=0XB8;//定时0.02s
TL0=0X00;
}
//延时函数
void delay(unsigned int i)
{
unsigned int k;
for(k=0;k
}
void start()
{
if(0==key_set)
{
delay(1200);//10ms消抖
if(0==key_set)//再次检测按键是否按下
{
while(!key_set);//等待按键释放
TR0=1;
time_S=0;
time_count=0;
}
}
}
void stop()
{
if(0==key_reset)
{
delay(1200);//10ms消抖
if(0==key_reset)//再次检测按键是否按下
{
while(!key_reset);//等待按键释放
TR0=0;
}
}
}
void second_cal_show()
{
if(TF0==1)
{
TF0=0;
TH0=0XB8;
TL0=0X00;
time_count++;
if(time_count>=50)//50次一秒
{
time_count=0;
time_S++;
}
}
}
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !