本人單片機(jī)作品之一,純?cè)瓌?chuàng)手打
一、實(shí)驗(yàn)?zāi)康?br />
自主設(shè)計(jì)電路,設(shè)計(jì)一個(gè)用于秒表及拓展功能的定時(shí)計(jì)數(shù)器。
二、實(shí)驗(yàn)內(nèi)容
設(shè)計(jì)原理圖及編寫代碼,實(shí)現(xiàn)以下功能:
采用中斷方式實(shí)現(xiàn)1分鐘的秒表定時(shí)器,從00顯示至59,再返回00開始循環(huán)。
擴(kuò)展部分:
1、為秒表增加多一位小數(shù)位;
2、每一秒閃爍一次LED,每10秒響一次蜂鳴器。
三、實(shí)驗(yàn)方法及步驟
使用四位共陰數(shù)碼管、AT89C51單片機(jī)、按鈕、蜂鳴器、三極管、LED、電阻等原件設(shè)計(jì)出以下電路:
編寫單片機(jī)代碼,仿真運(yùn)行。
#include<reg51.h>
#include<stdio.h>
sbit P20=P2^0; //四位數(shù)碼管位選
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit start=P2^4; //開始
sbit reset=P2^5; //復(fù)位
sbit redled=P1^0; //控制led亮不亮
sbit sounder=P1^1; //控制蜂鳴器響不響
unsigned char led_times,sounder_times,sounder_flag,ge,shi,bai,qian;
/*負(fù)責(zé)判斷l(xiāng)ed亮、sounder響,千位百位在小數(shù)點(diǎn)前,十位是小數(shù)點(diǎn)后一位 小數(shù)點(diǎn)后一位是100ms,十倍10ms*/
unsigned char code led[ ]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共陰段選碼
void display();
void delay_ms(unsigned int ms) //消隱用延時(shí)
{
unsigned char a;
while(ms--)
for(a=125;a>0;a--);
}
void T0_init( ) //定時(shí)器T0初始化
{
TMOD=0x01;
TH0=0xD8; //10ms定時(shí)
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){ //滿十進(jìn)位
bai=0;
qian++;
}
if(qian==6){ //一分鐘最多六十,十位滿六重新循環(huán)
qian=0;bai=0;shi=0;ge=0;
//TR0=0;
}
}
}
void display( )
{
P23=0; //位選
P0=led[0]; //反正只要求小數(shù)點(diǎn)后一位,干脆最后一位就一直是0
delay_ms(5); //消隱
P23=1; //位選
P22=0;
P0=led[shi];
delay_ms(5); //消隱
P22=1; //位選
P21=0;
P0=led[bai]|0x80;//或運(yùn)算,為的是段選碼和dp位,都置一,為了讓百位的小數(shù)點(diǎn)亮起來(lái)
delay_ms(5); //消隱
P21=1; //位選
P20=0;
P0=led[qian];
delay_ms(5); //消隱
P20=1;
}
void T0int( ) interrupt 1 //定時(shí)器T0中斷 方式1
{
TH0=0xD8; //重新給a,10ms定時(shí) 65536-55536(a)
TL0=0xF0;
ge++;
led_times++;
if(led_times==50){ //50*10ms=0.5s 一秒亮一次,一次亮0.5秒
redled=~redled; //閃爍,每0.5s改變一次狀態(tài)就是一秒閃一次
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++;
}
}
四、實(shí)驗(yàn)結(jié)果及分析 成功完成了要求的程序以及拓展程序,一秒LED閃一次,十秒蜂鳴器響一次。 在本次試驗(yàn)中,我將0xD8給TH0,0xF0給低位,初始化65536-D8F0=10000,也就是定時(shí)10ms,每中斷十次,也就是100ms,給小數(shù)點(diǎn)后的一位+1,滿十則進(jìn),以此類推。 并且加了用來(lái)記定時(shí)到了多少次的變量,滿50次(1S)則控制燈亮/滅,20次燈亮/滅(也就是10s)則控制蜂鳴器響。
原理圖及程序在附件工程文件中
|