本人单片机作品之一,纯原创手打
一、实验目的
自主设计电路,设计一个用于秒表及拓展功能的定时计数器。
二、实验内容
设计原理图及编写代码,实现以下功能:
采用中断方式实现1分钟的秒表定时器,从00显示至59,再返回00开始循环。
扩展部分:
1、为秒表增加多一位小数位;
2、每一秒闪烁一次LED,每10秒响一次蜂鸣器。
三、实验方法及步骤
使用四位共阴数码管、AT89C51单片机、按钮、蜂鸣器、三极管、LED、电阻等原件设计出以下电路:
编写单片机代码,仿真运行。
#include<reg51.h>
#include<stdio.h>
sbit P20=P2^0; //四位数码管位选
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit start=P2^4; //开始
sbit reset=P2^5; //复位
sbit redled=P1^0; //控制led亮不亮
sbit sounder=P1^1; //控制蜂鸣器响不响
unsigned char led_times,sounder_times,sounder_flag,ge,shi,bai,qian;
/*负责判断led亮、sounder响,千位百位在小数点前,十位是小数点后一位 小数点后一位是100ms,十倍10ms*/
unsigned char code led[ ]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴段选码
void display();
void delay_ms(unsigned int ms) //消隐用延时
{
unsigned char a;
while(ms--)
for(a=125;a>0;a--);
}
void T0_init( ) //定时器T0初始化
{
TMOD=0x01;
TH0=0xD8; //10ms定时
TL0=0xF0;
EA=1;
ET0=1;
redled=0;//初始led不亮
sounder=0;//初始不响
}
void main()
{
T0_init( );
while(1){
display( );
while(!start)//开始/暂停键
{
display( );
if(start)
TR0=!TR0;
}
while(!reset) //清零键
{
display( );
if(reset)
TR0=0;
qian=0;
bai=0;
shi=0;
ge=0;
}
if(bai==10){ //满十进位
bai=0;
qian++;
}
if(qian==6){ //一分钟最多六十,十位满六重新循环
qian=0;bai=0;shi=0;ge=0;
//TR0=0;
}
}
}
void display( )
{
P23=0; //位选
P0=led[0]; //反正只要求小数点后一位,干脆最后一位就一直是0
delay_ms(5); //消隐
P23=1; //位选
P22=0;
P0=led[shi];
delay_ms(5); //消隐
P22=1; //位选
P21=0;
P0=led[bai]|0x80;//或运算,为的是段选码和dp位,都置一,为了让百位的小数点亮起来
delay_ms(5); //消隐
P21=1; //位选
P20=0;
P0=led[qian];
delay_ms(5); //消隐
P20=1;
}
void T0int( ) interrupt 1 //定时器T0中断 方式1
{
TH0=0xD8; //重新给a,10ms定时 65536-55536(a)
TL0=0xF0;
ge++;
led_times++;
if(led_times==50){ //50*10ms=0.5s 一秒亮一次,一次亮0.5秒
redled=~redled; //闪烁,每0.5s改变一次状态就是一秒闪一次
led_times=0;
sounder_times++;
sounder=0;
}
if(sounder_times==20){//1000*10ms=10s 蜂鸣器响一次
sounder=1;
sounder_times=0;
}
if(ge==10){
ge=0;
shi++;
}
if(shi==10){
shi=0;
bai++;
}
}
四、实验结果及分析 成功完成了要求的程序以及拓展程序,一秒LED闪一次,十秒蜂鸣器响一次。 在本次试验中,我将0xD8给TH0,0xF0给低位,初始化65536-D8F0=10000,也就是定时10ms,每中断十次,也就是100ms,给小数点后的一位+1,满十则进,以此类推。 并且加了用来记定时到了多少次的变量,满50次(1S)则控制灯亮/灭,20次灯亮/灭(也就是10s)则控制蜂鸣器响。
原理图及程序在附件工程文件中
|