用C语言写51单片机闹钟程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言写51单片机闹钟程序相关的知识,希望对你有一定的参考价值。

我是初学者!!!!我要能看懂!用4个按钮控制!第一个设置键,第二,三个加减键!第四个设置闹钟!用LED代替铃声!在线等!很急!
会的麻烦写下!谢谢!老师布置任务!但是一点头绪都没有!

//*********************************************************
//实现功能:本程序实现在P1口模拟一个流水灯程序
//*********************************************************
#include <reg51.h>
#define p_out P1 //宏定义输出的i/o口为P1
//******************时间延迟函数**********************
//描 述:用指令实现延时一段时间
//入口参数:int i,为时间延迟参数
//****************************************************
void delay_time(int i)

while(i)
i--;

//******************主函数***************************
//描 述:实现在P1口模拟一个流水灯程序
//****************************************************
void main(void)
unsigned char i=0; //初始化一个局部变量为0
p_out=0xff; //初始化将要输出的i/o口,输出高电平,熄灭所有灯
while(1)

for(i=0;i<8;i++)

p_out=~(1<<i);//点亮一个灯,
delay_time(50000); //延迟一段时间
p_out=0xff;//熄灭所有灯



//**************************************
//****************************************************
//实现功能:把键盘输入的键盘码,用led显示出来
//****************************************************
#include <reg51.h>
#define p_key P1
#define led_date P0
#define choose_p P2
unsigned char change(unsigned char i);
unsigned int display_num=0;
//******************时间延迟函数**********************
//描 述:用指令实现延时一段时间
//入口参数:int i,为时间延迟参数
//****************************************************
void delay_time(int i)

while(i)
i--;

//******************按键扫描函数**********************
//描 述:对4*4键盘进行扫描,程序只适合4*4键盘使用,
// 键盘占用一组完整的i/o口,在使用这个程序前
// 要宏定义p_key为用户实际连接键盘的i/o口
// #define p_key Pn;//(n=0、1、2、3)
//返回参数:若有检测到按键就返回按键的编号,否则返回0xff
//****************************************************
unsigned char read_key(void)

unsigned char j,key,key_buf=0;
p_key=0xff;
//检测是否有建按下//
p_key=0xf0;
key=p_key;
if(key==0xf0)

return(0xff);//没按键按下,返回0xff

//有按下,延时去抖//
delay_time(5000);
//确认是否有建按下//
p_key=0xf0;
key=p_key;
if(key==0xf0)

return(0xff);//没按键按下,返回0xff

//真的有按键按下,扫描是哪一行有按键按下//
for(j=0;j<4;j++)
key=p_key&(0x10<<j);
if (key)

key=p_key;

else

key_buf=j*4;
p_key=~(0x10<<j);//第j行的按键按下了,第j行输出0,其他的i/o口输出1
//扫描是第j行的哪个按键按下//
for(j=0;j<4;j++)

key=p_key&(1<<j);
if (key)

key=p_key;

else

key_buf+=j;
return(key_buf);//扫描到按键的确定位置,返回按键的编号




//没扫描到按键,//
return(0xff);

//***************七段数码管显示函数*******************
//描 述:对四位的扫描型七段数码管进行扫描显示,在使用
// 前要定义一个全局变量display_num
// unsigned int display_num;
//入口参数:unsigned int num,要显示的数字(0-9999)
//****************************************************
void display(unsigned int num)

if(num<10000)

display_num=num;

choose_p|=3;//先关显示
led_date=change(display_num/1000);//得到千位的数字,并转换成七段码型
choose_p&=0xfe;//选通千位
delay_time(50);//延时一段时间
choose_p|=1;//关显示
display_num=display_num%1000;
led_date=change(display_num/100);//得到百位的数字,并转换成七段码型
choose_p&=0xfd;//选通百位
delay_time(50);//延时一段时间
choose_p|=2;//关显示
display_num=display_num%100;
led_date=change(display_num/10);//得到十位的数字,并转换成七段码型
choose_p&=0xfb;//选通十位
delay_time(50);//延时一段时间
choose_p|=4;//关显示
led_date=change(display_num%10);//得到个位的数字,并转换成七段码型
choose_p&=0xf7;//选通十位
delay_time(50);//延时一段时间
choose_p|=8;//关显示

//****************数字-码型转换函数*******************
//描 述:把数字转换成七段码型,此程序仅配合共阳的七
// 段数码管使用
//入口参数:unsigned char i,要转换的数字(0-9),
//返回参数:转换后的七段码型,0xff表示转换失败
//****************************************************

unsigned char change(unsigned char i)

switch(i)

case 0:
return(0xc0);//0的七段码型
case 1:
return(0xf9);//1的七段码型
case 2:
return(0xa4);//2的七段码型
case 3:
return(0xb0);//3的七段码型
case 4:
return(0x99);//4的七段码型
case 5:
return(0x92);//5的七段码型
case 6:
return(0x82);//6的七段码型
case 7:
return(0xf8);//7的七段码型
case 8:
return(0x80);//8的七段码型
case 9:
return(0x90);//9的七段码型
default:
return(0xff);//转换失败


//*********************主函数*************************
//描 述:把键盘输入的键盘码,用led显示出来
//****************************************************
int main(void)
unsigned char i;
while(1)

i=read_key();//扫描键盘
if(i<16)
display((unsigned int)i);//有效的键盘值
else
display(0xffff);//数据无效


//两个程序加起来就可以完成你要求的功能,有说明,你认真看一下吧。
参考技术A #include"reg51.h"
char tab1[10]=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;
unsigned char j,sfm,sfm2,s=0,m=0,h=0,sh=0,sl=0,mh=0,ml=0,hh=1,hl=1;
char ah1=0; unsigned long a;
void mDelay(unsigned int Delay)
unsigned int i;
for(;Delay>0;Delay--)
for(i=0;i<124;i++)
;


void led();
main()

P1=0x00;
ET0=1;
EA=1;
TR0=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
TMOD=0x10;
a=-0.1*6000000/12;
TH1=-50000/256;
TL1=-50000%256;
while(1)
led();

P2=0xfe;
P0=tab1[sl];
mDelay(50);

P2=0xfd;
P0=tab1[sh];
mDelay(60);

P2=0xfb;
P0=0xbf;

P2=0xf7;
P0=tab1[ml];
mDelay(60);

P2=0xef;
P0=tab1[mh];
mDelay(60);

P2=0xdf;
P0=0xbf;

P2=0xbf;
P0=tab1[hl];
mDelay(60);

P2=0x7f;
P0=tab1[hh];
mDelay(60);



void t0() interrupt 1 using 1

TH0=-50000/256;
TL0=-50000%256;
ah1++;
if(ah1==100)
ah1=0;sl++;
if(sl==10)
sl=0;sh++;
if(sh==6)
sh=0;ml++;
if(ml==10)
ml=0;mh++;
if(mh==6)
mh=0;hl++;
if(hl==10)
hl=0;hh++;
if(hh==2&&hl==4)
hl=hh=0;


void int0() interrupt 0 using 2
sfm++;
TR0=0;
sfm2++;
if(sfm==4)TR0=1;sfm=0;sfm2=0;


void int1() interrupt 2 using 1
sfm2=sfm2%3;
switch(sfm2)
case 1:
sl++;
if(sl==10)
sl=0;sh++;

if(sh==6)
sl=sh=0;
break;

case 2:
ml++;
if(ml==10)
ml=0;mh++;
if(mh==6)
mh=ml=0;
break;

case 0:
hl++;
if(hl==10)
hh++;hl=0;
if(hh==2&&hl==4)
hh=hl=0;
break;


void led()
if (sh==3&&sl==5&&mh==0&&ml==2&&hh==1&&hl==1)

for(j=0;j<3.;j++)

P1=0xff;
mDelay(3000);
P1=0x00;
mDelay(3000);




这是我们现在做的设计闹钟本回答被提问者采纳
参考技术B 晕,初学者如果是学习的话还是建议从易到难。
你这个题目高手都不一定能很快设计很快搞定的。
而且你的分数也不会吸引人。
参考技术C 汇编做的可以不.有秒表.有闹钟. 参考技术D 你想干嘛?找人帮忙设计还是要请教问题?

怎么用易语言做一个闹钟,就是怎么实现到了某个时间,程序播放设定铃声的

在你的软件上放个时钟控件,时钟周期设置为1000即1秒的意思。时钟事件下写:
如果真(取时间(取现行时间())=到时间(“此处文本型设定的时间”))
时钟.时钟周期=0
播放mp3(“铃声文件地址”)追问

试过,代码一模一样,可木有用

追答

周期缩短,时间先存变量在对比

参考技术A

参考技术B 17.11.46.83.8追问

我要这个干嘛

追答

QQ

追问

你会?

以上是关于用C语言写51单片机闹钟程序的主要内容,如果未能解决你的问题,请参考以下文章

基于51单片机的LCD1602电子钟闹钟proteus仿真设计(源码+仿真+原理图+器件清单)

51单片机访问片内数据存储器某单元的内容用c语言怎么写???

求51单片机中,用C语言写的五个中断源的中断函数的书写规则,就是进入中断函数时的那个函数名,并说明...

Keil C51用C写单片机程序能不能像汇编那样跳转到任意地方?

51单片机汇编中的寄存器R0、R1、R2如果用c语言写的话怎么表示

51单片机c语言sbit的作用是啥