四位LED数码管编程.docx

上传人:b****2 文档编号:1855029 上传时间:2023-05-01 格式:DOCX 页数:16 大小:17.57KB
下载 相关 举报
四位LED数码管编程.docx_第1页
第1页 / 共16页
四位LED数码管编程.docx_第2页
第2页 / 共16页
四位LED数码管编程.docx_第3页
第3页 / 共16页
四位LED数码管编程.docx_第4页
第4页 / 共16页
四位LED数码管编程.docx_第5页
第5页 / 共16页
四位LED数码管编程.docx_第6页
第6页 / 共16页
四位LED数码管编程.docx_第7页
第7页 / 共16页
四位LED数码管编程.docx_第8页
第8页 / 共16页
四位LED数码管编程.docx_第9页
第9页 / 共16页
四位LED数码管编程.docx_第10页
第10页 / 共16页
四位LED数码管编程.docx_第11页
第11页 / 共16页
四位LED数码管编程.docx_第12页
第12页 / 共16页
四位LED数码管编程.docx_第13页
第13页 / 共16页
四位LED数码管编程.docx_第14页
第14页 / 共16页
四位LED数码管编程.docx_第15页
第15页 / 共16页
四位LED数码管编程.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

四位LED数码管编程.docx

《四位LED数码管编程.docx》由会员分享,可在线阅读,更多相关《四位LED数码管编程.docx(16页珍藏版)》请在冰点文库上搜索。

四位LED数码管编程.docx

四位LED数码管编程

设计要求:

一个基于单片机89S51的可编程定时器的程序,定时器由4个8段数码管显示,可以设置分和秒定时。

可以同时对四路控制对象进行定时控制,外部控件可以用于选择控制对象,设置定时,对定时进行暂停,重置等控制。

 

#include

//宏定义

#defineucharunsignedchar

#defineuintunsignedint

#defineulongunsignedlongint

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

*TH0和TL0是计数器0的高8位和低8位计数器,计算办法:

TL0=(65536-C)%256;*

*TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*

*工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时*

*间为1ms*65536=65.536ms*

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

#defineV_TMOD0x01//工作方式1

#defineV_TH00x3C//50ms延时常数C=50000//0XDC

#defineV_TL00xB0//50ms延时常数C=50000/0X58

//#defineV_TH10xFF//5ms延时常数C=5000//0XDC

//#defineV_TL10xFB//5ms延时常数C=5000/0X58

#defineV_TH10xDC//1ms延时常数C=1000//0XDC

#defineV_TL10x58//1ms延时常数C=1000/0X58

#defineMAXFUN6//功能切换,表示最多的功能状态,

sbitk10=P1^0;

//sbitBEEP=P3^7;//蜂鸣器驱动线----------------请修改为sbitBEEP=P0^4;

ucharbee;//蜂鸣器01开关

 

ucharkey;//键顺序吗

ucharfun=10;//功能状态,<=MAXFUN

ucharit0=0,it1;//Timer0中断计数

 

uchartext=0;//数字

//uchartext_ctrl[4]={0xFE,0xFD,0xFB,0xF7};//位选通值,11111110,11111101,11111011,11110111

uchartext_ctrl[4]={0xE,0xD,0xB,0x7};//位选通值,00001110,00001101,00001011,00000111

//uchartext_code[11]={0x28,0x7E,0xA2,0x62,0x74,0x61,0x21,0x7A,0x20,0x60,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表,高电平有效

//uchartext_code[17]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa9,0x26,0xa1,0xb1};//数码管代码

uchartext_code[11]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表,高电平有效

uchartext_index=0;//当前显示第几个

uchardis_buf[4];//显示缓存

ucharrefresh=0;//刷新否T1蜂鸣

ucharmin=0;//minutes

ucharsec=0;//scconds

ucharhour=0;//scconds

ucharonsetup=0;

ucharkeydown0=0,keydown1=0;

uchardataPWM=0xFf;//PWM值增加,则占空比减小,LED灯渐暗。

 

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

//延时子程序

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

voiddelay0(ucharx)//x*0.14MS

{

uchari;

while(x--)

for(i=0;i<13;i++){}

}

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

//T1蜂鸣

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

voidbeepT1()

{

if(refresh>0)

{

refresh++;

bee=!

bee;

if(refresh>=30)

refresh=0;

}

}

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

//文字输出

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

voidtextout()

{

//P0=0xff;//先关闭所有数码管

P2=dis_buf[text_index];//传入数字的码

bee=bee<<4;

P0=text_ctrl[text_index]|bee;//选择位

//P0=bee;//选择位

text_index++;//下一位

if(text_index>=4)

text_index=0;

}

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

//键扫描子程序

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

voidkeyscan(void)

{

uchartemp;

key=-1;//不按键

P1=0x0F;//低四位输入

delay0(12);

temp=P1;//读P1口

temp=temp&0x0F;

temp=~(temp|0xF0);

if(temp==1)

key=0;

elseif(temp==2)

key=1;

elseif(temp==4)

key=2;

elseif(temp==8)

key=3;

else

key=16;

P1=0xF0;//高四位输入

delay0(12);

temp=P1;//读P1口

temp=temp&0xF0;

temp=~((temp>>4)|0xF0);

if(temp==1)

key=key+0;

elseif(temp==2)

key=key+4;

elseif(temp==4)

key=key+8;

elseif(temp==8)

key=key+12;

else

key=16;

if(key!

=-1)

fun=key;

//key=0;

//dis_buf=text_code[key];//查表得键值

}

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

//判断键是否按下

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

intkeydown(void)

{

P1=0xF0;

if(P1!

=0xF0)

{

keyscan();

//delay0(250);

return1;

//

//beep();

//while(P1!

=0xF0);//等待键释放

}

return0;

}

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

//设置显示缓存

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

voidsettext(uchartext0,uchartext1,uchartext2,uchartext3)

{

dis_buf[0]=text_code[text0];

dis_buf[1]=text_code[text1];

dis_buf[2]=text_code[text2];

dis_buf[3]=text_code[text3];

}

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

//fun10

//秒表mm:

ss

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

voidfun10()

{

it0++;

if(it0==20)//1s

{

it0=0;

sec++;

if(sec==60)

{

sec=0;

min++;

if(min==60)

{

min=0;

}

}

refresh=1;

dis_buf[1]=text_code[min%10];

dis_buf[0]=text_code[min/10];

dis_buf[3]=text_code[sec%10];

dis_buf[2]=text_code[sec/10];

}

}

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

//fun11

//时钟hh:

mm

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

voidfun11()

{

it0++;

if(it0==20)//1s

{

it0=0;

sec++;

if(sec==60)

{

sec=0;

min++;

if(min==60)

{

min=0;

hour++;

if(hour==12)

{

hour=0;

}

//dis_buf[1]=text_code[hour%10];

//dis_buf[0]=text_code[hour/10];

}

refresh=1;

}dis_buf[1]=text_code[hour%10];

dis_buf[0]=text_code[hour/10];

dis_buf[3]=text_code[min%10];

dis_buf[2]=text_code[min/10];

}

}

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

//fun12

//倒计时

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

voidfun12()

{

it0++;

if(it0==20)//0.1s

{

it0=0;

sec--;//secmust>=1

if(sec==0)

{

sec=60;

min--;

//dis_buf[1]=text_code[min%10];

//dis_buf[0]=text_code[min/10];

if(min==0)

{

min=60;

}

}

refresh=1;

dis_buf[1]=text_code[min%10];

dis_buf[0]=text_code[min/10];

dis_buf[3]=text_code[sec%10];

dis_buf[2]=text_code[sec/10];

}

}

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

//fun13

//设置时间:

hh:

mm

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

voidfun13()

{

onsetup=1;

sec=0;

min=0;

hour=0;

dis_buf[1]=text_code[min%10];

dis_buf[0]=text_code[min/10];

dis_buf[3]=text_code[sec%10];

dis_buf[2]=text_code[sec/10];

}

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

//fun3

//设置时间:

hh:

mm

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

voidfun130()

{

if(keydown1!

=keydown0)

{

keydown0=keydown1;

if(keydown1==0)return;//按键弹起

if(onsetup==1)

hour=key*10;

elseif(onsetup==2)

hour+=key;

elseif(onsetup==3)

min=key*10;

elseif(onsetup==4)

min+=key;

onsetup++;

dis_buf[1]=text_code[hour%10];

dis_buf[0]=text_code[hour/10];

dis_buf[3]=text_code[min%10];

dis_buf[2]=text_code[min/10];

}

}

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

//fun14

//设置

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

voidfun14()

{

sec=0;

min=0;

hour=0;

}

 

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

//定时器0中断服务程序,用于数码管的动态扫描

//T0定时器,50ms激发一次,间隔1秒执行一次输出(需要20次)

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

voidtimer0()interrupt1

{

//TR1=0;

TH0=V_TH0;//1ms延时常数

TL0=V_TL0;//频率调节

//TH1=PWM;

//TR1=1;

keydown1=keydown();

//if(keydown1!

=keydown0)

{

if(fun<=9)

fun130();

else

switch(fun)

{

case10:

fun10();break;

case11:

fun11();break;

case12:

fun12();break;

case13:

fun13();break;

case14:

fun14();break;

default:

break;

}

}

 

}

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

//定时器1中断服务程序,用于数码管的动态扫描

//T1定时器,5ms激发一次,间隔5ms执行一次输出

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

voidtimer1()interrupt3

{

//TR1=0;

//TH1=PWM;

//处理一行

TH1=V_TH1;

TL1=V_TL1;

it1++;

//if(it1==200)

{

it1=0;

beepT1();

textout();

}

}

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

//系统初始化

//函数功能:

对系统进行初始化,包括定时器初始化和变量初始化*/

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

voidinit(void)

{

//变量初始化

bee=1;

P0=0xFF;

P2=0xFF;

text_index=0;

dis_buf[0]=text_code[0];

dis_buf[1]=text_code[0];

dis_buf[2]=text_code[0];

dis_buf[3]=text_code[0];

//定时器初始化/

TMOD=V_TMOD;

TH0=V_TH0;//延时常数

TL0=V_TL0;//延时常数

TH1=PWM;//脉宽调节

TL1=0;

IE=0x82;

ET0=1;//定时/计数器T0中断允许

ET1=1;//定时/计数器T1中断允许

TR0=1;//T0启动

TR1=1;//T1启动*/

}

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

//主程序

//处理按键时加上了按键消抖

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

voidmain(void)

{

init();//系统初始化

while

(1);

//连run()都没了

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2