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

用C语言写51单片机闹钟程序,第1张

//

//实现功能:本程序实现在P1口模拟一个流水灯程序

//

#include <reg51h>

#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 <reg51h>

#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--;

}

//按键扫描函数

//描 述:对44键盘进行扫描,程序只适合44键盘使用,

// 键盘占用一组完整的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=j4;

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);//数据无效

}

}

//两个程序加起来就可以完成你要求的功能,有说明,你认真看一下吧。

i控制外循环的次数, i从1开始到6结束,说明外循环6次。

j,m控制内循环的次数。

i=1时,j从1到5结束,输出5个空格,m从1到1结束,输出1个,然后换行。

i=2时,输出4个空格,3个,换行

i=3时,输出3个空格,5个,换行

i=4时,输出2个空格,7个,换行

i=5时,输出1个空格,9个,换行

i=6时,输出0个空格,11个,换行

最终结果为:

看来没有人回答就我来了。

#include<stdioh>

void main()

{

int i = 11,m=3,r;

for(r=11;i;i >>= 1)//第一个;号之前我想应该能看懂。第二个是

//要大于0的意思。没有写判断语句。意思是要大于0就执行。第三个是i>>=1的

//意思是i/2的意思。

{

printf("i = %d\n",i);//看这条语句的值应该很清楚

printf("r = %d\n",r);

if(i&1)//i是奇数的时候是true

r = m;

m= m;

}

printf("i = %d\n",i);//能看出来i每次是0的时候for语句结束了。

printf("%d",r);

}

以上就是关于用C语言写51单片机闹钟程序全部的内容,包括:用C语言写51单片机闹钟程序、这个程序中的for循环什么意思,什么用法(小白)、c语言for循环是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10108160.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存