C语言单片机程序:按一下键1秒数加1,满30为1分依次进行数码管显示,每到30蜂鸣器响,键2清秒数停蜂鸣器

如题所述

楼主,你没有给图,所以,我假设你的按键是独立按键并且接在P1.0,数码管共阳,段码在P0口,位选在P2口,下面放出例子
#include <reg52.h>
sbit Button1 = P1^0;

//定义秒,初值为0,单片机注意定义数据的大小,这里只用到60,所以我定义了字符型,只占8位,不需要整形16位的。
unsigned char second = 0;
//定义分,初值为0
unsigned char minute = 0;
//定义用于显示的数组
unsigned char DisplayData[4];

//定义键盘扫描函数
void KeyboardScan();
//定义数码管显示函数
void Display();
//定义计算函数
void Calculate();
//定义延时函数
void Delay();

void main()
{
while(1)
{
//键盘扫描
KeyboardScan();
//计算
Calculate();
//数码管显示
Display();
}
}

/*
* 函数名 : 键盘扫描函数
* 返回值 : 无
*/
void KeyboardScan()
{
if(Button1 == 0)
{
//等待按键1松开
while(Button1 == 0);
//松开后执行
second++;
}
}

/*
* 函数名 : 数码管显示函数
* 返回值 : 无
*/
void Display()
{
//共阳数码管段码
unsigned char DisplayCode[8]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char i;
for(i = 0;i < 2;i++)
{
P0 = DisplayCode[DisplayData[i]];
P2 = i;
Delay();
}
}

/*
* 函数名 : 计算
* 返回值 : 无
*/
void Calculate()
{
if(Second >= 60)
{
Second = 0;
Minute++;
}
//秒个位
DisplayData[0] = Second % 10;
//秒十位
DisplayData[1] = Second / 10;
//分个位
DisplayData[2] = Minute % 10;
//分十位
DisplayData[3] = Minute / 10;
}

/*
* 函数名 : 52延时1MS
* 返回值 : 无
*/
void Delay()
{
unsigned char i;
for(i = 0;i < 125;i++) ;
}
由于我没有硬件,所以也没办法测试了,作为参考吧追问

缺少满30秒时蜂鸣器发声函数和按键2清空秒数和关闭蜂鸣器的函数,能请你完善一下吗

追答

贴部分,字数超出了,还有数组大小我开错了DisplayCode[8]改成DisplayCode[10]
#include
sbit Button1 = P1^0;
sbit Button2 = P1^1;
sbit Beep = P1^2;

void KeyboardScan()
{
if(Button1 == 0)
{
//等待按键1松开
while(Button1 == 0);
//松开后执行
second++;
}
if(Button2 == 0)
{
//等待按键2松开
while(Button2 == 0);
//松开后执行
Second = 0;
Minute = 0;
}
}

void Calculate()
{
if(Second >= 30)
{
//蜂鸣器报警
Beep = 0;
}
if(Second >= 60)
{
Second = 0;
Minute++;
}
//秒个位
DisplayData[0] = Second % 10;
//秒十位
DisplayData[1] = Second / 10;
//分个位
DisplayData[2] = Minute % 10;
//分十位
DisplayData[3] = Minute / 10;
}

这里是假设你蜂鸣器外部电路为低电平有效

追问

很不幸呢,出现3个警告消除不了,数码管连亮都不亮

追答

有按照我的接口么,还是你电路没有按照我上述的。这种问题,应该是你带着图来问我就可以很准确的给你写出来,要是你软件硬件两头都不大清楚,我也是描述不太清晰的

追问

那我直接明白告诉你吧,原题目是:
设计一用T0记数一生产流水线,每生产20个工件(中断方式),发出一包装命令,包装成一箱,并记录其箱数,光源用按键-1代替,数码管显示,到了记数值,蜂鸣器叫,灯亮,按键-2后继续。
其中数码管是4位数共阴数码管,软件是keil uvison4,用52的单片机
我也写了一个,只不过用一个按键调用两个函数时有警告,没法排除,功能实现不了

追答

阴数码管,肯定贴我的不行了,我写给你的是共阳,楼主,你真的把图贴出来就好了,按照你的硬件写给你

追问

你说的图应该是这些吧

追答

哎,比如J8,三极管控制蜂鸣器,接到最小系统的P几几口,原理图就可以了,实物图就不用了,像最下边这个数码管断码用驱动芯片在加大电流,驱动芯片的数据输入口则是接在J12,一样看不见J12接到最小系统的哪个脚上了。

温馨提示:答案为网友推荐,仅供参考
相似回答