一、详细功能设计
1、基于51单片机倒计时秒表,最大值为9999秒,计时单位为0.1秒;
2、计时的初始值为组员学号后4位,键盘启动/停止计时;
3、设计多个按键,使用键盘选择不同成员的学号作为初始值。
二、8031最小系统设计
1、最小系统设计原理图如图1.0所示:
2、8031最小系统概述;
8031最小系统包含晶振电路与复位电路。 晶振选择12MHZ晶振,晶振电容使用30pf电容瓷片电容。复位电路选择上电复位。
三、硬件设计
1、数码管电路
在本设计中,使用7段共阴极数码管,选择数码管的型号为7SEG-MPX6-CC;
2、数码管片选电路;
由于本设计需要显示五位数字,同时为了驱动数码管,使用了74HC154芯片。与此同时,使用74HC154芯片还可以扩展数码管显示数字的个数。
三、软件设计
1、程序流程图如图3.0所示:
图3.0 程序流程图
2、程序流程说明
数码管显示和扫描键盘子函数放在0.1秒的定时器中断里,而主函数的while(1)函数向数码管显示数据变量送数据。数码管显示函数接受键盘状态,根据状态执行开始计时、暂停、选择学号等功能。
四、调试说明
1、仿真调试如图4.0所示:
2、按下以组员的名字命名的按键时,可以选择相应同学的学号的后四位为倒计时的初始值,如不设置初始值为0336,若按下“张洪荣”按键,初始值为0337;按下“开始”按键时开始倒计时;按下“暂停”按键时,计时停止;
附录:源代码下载:http://www.51hei.com/f/szgg.rar
1,程序源码;
#include
#include
#include
int num =03; //我们学号的班别 03
int stu_num0 =36; //学号后两位
int stu_num1 =37;
int stu_num2 =42;
int stu_num3 =11;
int stu_num4 =22
int num_count = 36; //将学号吼两位选择的值赋给 num_count,初始值为36
sbit start = P1^0; //开始按键
sbit stop = P1^1; //停止按键
sbit key0 = P1^2; //选择同学
sbit key1 = P1^3; //选择同学
sbit key2 = P1^4; //选择同
sbit key3 = P1^5; //选择同学
sbit key4 = P1^6; //选择同学
sbit key5 = P1^7;
unsigned int T1msc;
unsigned char Ledc;
unsigned char Leds[]={8,6,0x13,5,1,2,3,4};
bit isStart;
int temp=9; //0.1秒存储变量 初始值 9
code char LEDTAB[]=
{
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x00,
};[page]
void Delayms(int ms)
{
while(ms)
{
unsigned char i;
ms--;
for (i=0; i<240; i++);
}
}
void display()
{
char v,c;
P3=0x11;
v=Leds[Ledc];
c=LEDTAB[v & 0x0f];
if (v&0x10) c|=0x80;
P2=c;
P3=Ledc;
Ledc++;
if (Ledc>=8) Ledc=0;
}
void readkey() //读按键
{
if(start==0) isStart = 1; //真为开始
if(stop==0) isStart = 0; //假为停止
if(key0 == 0) num_count = stu_num0; //选择曾路荣
if(key1 == 0) num_count = stu_num1;//选择张洪荣
if(key2 == 0) num_count = stu_num2;
if(key3 == 0) num_count = stu_num3;
if(key4 == 0) num_count = stu_num4;
if(key5 == 0) num_count = stu_num5;
}
void t0int() interrupt 1 //1ms定时器中断服务函数
{
TH0=(-1000)>>8;
TL0=-1000;
display();
readkey();
T1msc++;
if (isStart) //开始倒计时
{
if ((T1msc%100)==0) //满 0.1秒
{
temp--;
if(temp==-1)
{
num_count--;
temp = 10; //0.1秒恢复9
}
}
if(num_count == -1) //
{
num_count = 99;
num--;
if(num == -1) num = 99;
}
}
if (T1msc>=1000)
{
T1msc=0;
}
}
void NumToLeds()
{
Leds[1]=num/10%10;
Leds[2]=num%10;
Leds[3]=num_count/10%10;
Leds[4]=num_count%10+0x10;
Leds[5]=temp; //0.1秒显示
}
void main()
{
Delayms(10);
TMOD=0x01;
TR0=1;
ET0=1;
EA=1;
while(1)
{
NumToLeds(); //送数据
}
}
上一篇:单片机闪烁灯流水灯汇编代码大全
下一篇:单片机串口通信源码
推荐阅读最新更新时间:2024-03-16 14:24
- 热门资源推荐
- 热门放大器推荐