足球赛补时牌设计:要求用6位数码管按照“mm--ss”格式动态显示补时及倒计时,并加2个按键(一个设置补时多少分钟,按一次加1,可循环设置0-19分钟,另一个按下,开始倒计时),计时到0时,驱动蜂鸣器发出响声,频率为1/100ms,持续10s。要求在KEIL中编写程序,用PROTEUS设计电路并仿真运行。(评分标准:高位没有数字时不显示:A;高位没有数字时显示0:B)
电路原理图如下:
电路图
单片机代码:
- #include <reg51.h> //51单片机头文件
- #include<intrins.h> //51库函数
- #define uchar unsigned char
- #define uint unsigned int
- sbit DX = P2^6;//段选接P2.6引脚
- sbit WX = P2^7; //位选接P2.7引脚
- sbit BUZZ = P2^0;
- char second = 0;
- char minute = 0; //计数,时间(分钟)
- /****
- 共阴级
- table[10]表示不显示
- table[11] 表示“-”
- **************/
- uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,
- 0x7d, 0x07, 0x7f, 0x6f, 0x00, 0x40};
- uchar s[8];
- uchar delay = 1;
- uchar n = 0;
- uint mm=0;
- uchar speak = 0; //标识蜂鸣器是否开始发声
- void delay_ms(uint t) //延时函数
- {
- uint i,j;
- for(i=0;i<t;i++)
- for(j=0;j<110;j++);
- }
- void init()
- {
- EA = 1; //开全局中断
- EX0 = 1;//INT0中断允许
- IT0 = 1;//触发方式为下降沿触发
- EX1 = 1;//INT0中断允许
- IT1 = 1;//触发方式为下降沿触发
- TMOD = 0x19; //T1软启动、定时器、工作方式1;T0硬启动、定时器、工作方式1
- TH0 = 0x4C; //给定初值
- TL0 = 0x00;
- TH1 = 0xff; //给定初值
- TL1 = 0x00;
- ET0 = 1; //定时器中断打开
- ET1 = 1;
- TR0 = 0; //不启动定时器中断
- TR1 = 0; //
- }
- void fun()
- {
- s[0] = table[second%10];
- s[1] = table[second/10];
- s[2] = table[11];
- s[3] = table[11];
- if(minute%10!=0)
- s[4] = table[minute%10];
- else
- s[4] = table[10];
- if(minute/10!=0)
- s[5] = table[minute/10];
- else
- s[5] = table[10];
- }
- void dispaly()
- {
- uchar i;
- uchar temp = 0xdf;
- fun();
- for(i=0;i<6;i++){
- DX = 0;
- WX = 0;
- P0 = 0x00;
- DX = 1;
- P0 = s[ i];
- DX = 0;
- P0 = 0xff;
- WX = 1;
- P0 = temp;
- WX = 0;
- temp = _cror_(temp, 1);
-
- TH1 = 0xff;
- TL1 = 0x00;
- TR1 = 1; //延时
- while(delay<1);
-
- delay = 0;
- }
- }
- void main()
- {
- init();
- while(1){
- dispaly();
- if(speak==1){
- DX = 1;
- P0 = table[10];
- DX = 0;
- P0 = 0xff;
- WX = 1;
- P0 = 0x01;
- WX = 0;
- BUZZ = 0;
- TR1 = 1;
- TL0 = 19664%256;
- TH0 = 19664/256; //给定初值
- // delay_ms(10000);
- // TR1 = 0;
- // speak=0;
- }
- }
- }
- void EX_INT0() interrupt 0
- {
- minute++;
- if(minute > 19) minute=19;
- }
- void EX_INT1() interrupt 2
- {
- TR0 = 1;
- }
- void ET_T0() interrupt 1
- {
- TL0 = 19664%256;
- TH0 = 19664/256; //给定初值
- n++;
- if(n==20){
- n = 0;
- if(minute ==0 && second==0){
- TR0 = 0;
- speak = 1;
- }
- else if(second==0){
- minute --;
- second = 59;
- }
- else{
- second--;
- }
- }
- }
- void ET_T1() interrupt 3
- {
- if(speak==1){
- mm++;
- BUZZ = ~BUZZ;
- TL0 = 19664%256;
- TH0 = 19664/256; //给定初值
- if(mm==200){
- speak=0;
- TR1 = 0;
- }
- }
- delay=1;
- }
复制代码
|