求一个C语言程序 实现LED显示器倒计时功能

如题所述

第1个回答  2013-12-27
//晶振:11.0592M T1-250微秒按键P30 P31 P32 P33/*变量的定义: show_val: 显示的值0-59 init_val: 初始值 state_val: 状态值 0-计数状态;1-设置状态;2-闪烁状态 shan_val: key_val1: 四个按键的值 0-无键;1-设置键 2-增一键 3-减一键 4-确定键 T1_cnt: 定时器计数溢出数 cnt_val: 倒计时的数值 led_seg_code:数码管7段码*/#include "reg51.h" //包含文件sbit P3_0=P3^0; //设置键sbit P3_1=P3^1; //增一键sbit P3_2=P3^2; //减一键sbit P3_3=P3^3; //确定键unsigned char shan_val; //闪烁时LED的开/关状态unsigned char cnt_val; //保存倒计数的当前值unsigned int T1_cnt; //保存定时器溢出次数unsigned char key_val_new,key_val_old;//存放当前扫描的键和前一次按下的键值unsigned char state_val; //状态值unsigned char show_val; //存放需要在数码管显示的数字unsigned char init_val; //暂存倒计数的初始值char codeled_seg_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//----------延时--------------void delay(unsigned int i) //大约延时i*2个微秒{ while(--i);}//-----------按键扫描-------------unsigned char scan_key(){ unsigned char i; i=P3&0x0f; delay(100); //延时,去抖动 if(i==(P3&0x0f)) { if (P3_0==0) { while(P3_0==0); i=1; } else { if (P3_1==0) {while(P3_1==0); i=2;} else { if (P3_2==0) {while(P3_2==0); i=3;} else { if (P3_3==0) {while(P3_3==0); i=4;} } } } } else { i=0; } return i; EA=1;}//---------数码管显示--------------void led_show(unsigned char v){ unsigned char i; if(1) //动态扫描 {i=v/100; //取要显示的数的个位 P0=led_seg_code[i]; //转换为7段码 P2=0xfb; //显示个位 delay(15); //延时 i=(v%100)/10; //取十位 P0=led_seg_code[i]; //转换为7段码 P2=0xfd; //显示十位 delay(5); //延时 i=(v%100)%10; P0=led_seg_code[i]; P2=0xfe; delay(5); } else {P0=led_seg_code[0]; //处于闪烁状态 if(shan_val) {P2=0xff; } //将数码管的关闭 else {P2=0xfc; } //将数码管的打开 }}//----------定时器T1中断服务程序---------------void timer1() interrupt 3 //T1中断,250us中断一次{ T1_cnt++; switch (state_val) {case 0: if(T1_cnt>3999) //如果计数>3999, 计时1s { T1_cnt=0; if(cnt_val!=0) { cnt_val--;} else {state_val=2;} //定时计数到0时,切换状态 show_val=cnt_val; } break; case 2: if(T1_cnt>1999) //如果计数>1999, 计时0.5s { T1_cnt=0; shan_val=!shan_val; } //闪烁状态 break; }}//---------主程序----------------main(){init_val=200; //初始化各变量 cnt_val=init_val; show_val=cnt_val; state_val=0; key_val_old=0; T1_cnt=0; shan_val=0; //初始化51的寄存器TMOD=0x20; //用T1计时 8位自动装载定时模式 TH1=0x19; //250微秒溢出一次; 250=(256-x)*12/11.0592 -> x= 230.4 TL1=0x19; EA=1; //打开总中断允许 ET1=1; //开中断允许 TR1=1; //开定时器T1while(1){ key_val_new=scan_key(); //255表示无键按下 if(key_val_new!=0){ // 只有当前扫描的键值与上次扫描的不同,才判断是有键按下 //key_val_old=key_val_new; switch (key_val_new) { case 1: //设置键 state_val=1; //处于设置状态 TR1=0; //停止计时 show_val=init_val; //显示原来的倒计数初始值 break; case 2: if(state_val==1) //只有在设置状态,增1键才有用 { if (init_val>0) //更改原来的倒计数初始值 {init_val--; } else {init_val=200;} show_val=init_val;//显示更改后的倒计数初始值 } break; case 3: if(state_val==1) //只有在设置状态,减1键才有用 { if (init_val<200) //更改原来的倒计数初始值 {init_val++; } else {init_val=0;} show_val=init_val; //显示更改后的计数初始值 } break; case 4: if(state_val!=0) //如果已处于计数模式,确认键不起作用 { cnt_val=init_val; //将初始值赋给计数变量 show_val=cnt_val; //将计数变量的数字显示 TR1=1; //启动定时器T1 state_val=0; //将状态切换为计数模式 } break; } } led_show(show_val); //动态扫描}}
第2个回答  2013-12-27

这种效果吗?

第3个回答  2014-01-04
百度,,,,,,,,,,,,,,,,,,,,