C语言单片机程序:按一下键1秒数加1,满30为1分依次进行数码管显示,每到30蜂鸣器响,键2清秒数停蜂鸣器
1个回答
展开全部
楼主,你没有给图,所以,我假设你的按键是独立按键并且接在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++) ;
}
由于我没有硬件,所以也没办法测试了,作为参考吧
#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;
}
这里是假设你蜂鸣器外部电路为低电平有效
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询