求c51单片机电子钟程序(c语言)

求c51单片机电子钟程序(c语言),第1张

#include <reg51h>

#define uchar unsigned char //定义unsigned int为uint

#define uint unsigned int //定义unsigned uchar为uchar

sbit LCD_RS = P2^0 ;

sbit LCD_RW = P2^1 ;

sbit LCD_EN = P2^2 ;

sbit D_SDA = P2^6; //定义74HC164数据线为P26端口

sbit D_SCL = P2^7; //定义74HC164数据线为P27端口

sbit CLK = P1^3; /实时时钟时钟线引脚 /

sbit IO = P1^4; /实时时钟数据线引脚 /

sbit RST = P1^5; /实时时钟复位线引脚 /

sbit ACC0 = ACC^0;

sbit ACC7 = ACC^7;

uchar time[8] = {0x50,0x30,0x19,0x30,0x12,0x06,0x06};

//========= 延时函数 ============

//延时时间以1ms为单位

//s决定延时时间长短

void delay_ms(uint s)

{

uint x;

for(s;s>0;s--)

{

x = 200;

while(x--);

}

}

//========= 送出一个字节给74HC164(实现串并转换) ==========

void send_out(unsigned char out)//传送一个字节8位

{

uchar i;

D_SCL = 0;

for (i=8;i>=1;i--)

{

D_SDA = out&0x80; //送数据到数据口

D_SCL = 1; //时钟线置1

D_SCL = 0; //送一时钟

out<<=1; //左移

}

}

//========= 写命令函数 ==========

void lcd_wcmd(uchar cmd)

{

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

send_out(cmd);

LCD_EN = 1;

LCD_EN = 0 ;

}

//========= 写数据函数 ==========

void lcd_wdat(uchar dat)

{

LCD_RS = 1;

LCD_RW = 0;

LCD_EN = 0;

send_out(dat);

LCD_EN = 1;

LCD_EN = 0;

}

//========= LCD初始化函数 ==========

void lcd_init()

{

lcd_wcmd(0x38);

delay_ms(1);

lcd_wcmd(0x0c); //显示开,关光标

delay_ms(1);

lcd_wcmd(0x06); //向右移动光标

delay_ms(1);

lcd_wcmd(0x01); //清除LCD显示屏

delay_ms(1);

}

//========== 往DS1302写入1Byte数据 (内部函数) =============

void w_byte(uchar dat)

{

uchar i;

for(i=8; i>0; i--)

{

IO = dat & 0x01;

CLK = 1;

CLK = 0;

dat = dat >> 1;

}

}

//======== 从DS1302读取1Byte数据 (内部函数) ===================

uchar r_byte(void)

{

uchar i;

for(i=8; i>0; i--)

{

ACC = ACC >> 1;

ACC7 = IO;

CLK = 1;

CLK = 0;

}

return(ACC);

}

//========== 指定地址往DS1302写入1Byte数据 (内部函数) =============

void write_byte(uchar addr, uchar dat)

{

RST = 0;

CLK = 0;

RST = 1;

w_byte(addr);

w_byte(dat);

CLK = 1;

RST = 0;

}

//========== 指定地址往DS1302读1Byte数据 (内部函数) =============

uchar read_byte(uchar addr)

{

uchar ucData;

RST = 0;

CLK = 0;

RST = 1;

w_byte(addr);

ucData = r_byte();

CLK = 1;

RST = 0;

return(ucData);

}

//============ 设置ds1302日期和时间 =============

void write_ds1302(uchar p)

{

uchar i;

uchar addr = 0x80;

write_byte(0x8e,0x00); // 控制命令,WP=0,写 *** 作

for(i =7; i>0; i--)

{

write_byte(addr,p); // 秒 分 时 日 月 星期 年

p++;

addr +=2;

}

write_byte(0x8e,0x80); // 控制命令,WP=1,写保护

}

//============ 读ds1302当前日期和时间 =============

void read_ds1302(uchar p)

{

uchar i;

uchar addr = 0x81;

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

{

p = read_byte(addr); //格式为: 秒 分 时 日 月 星期 年

addr += 2;

p++;

}

}

//============ 显示函数 ===================

void lcd_disp()

{

uchar addr = 4;

lcd_wcmd(0x80 + addr);

lcd_wdat(((time[2]>>4)&0x0f)+0x30); //显示小时

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat((time[2]&0x0f)+0x30);

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat(':'); //显示":"

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat(((time[1]>>4)&0x0f)+0x30); //显示分

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat((time[1]&0x0f)+0x30);

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat(':'); //显示":"

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat(((time[0]>>4)&0x0f)+0x30); //显示秒

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat((time[0]&0x0f)+0x30);

addr = 2;

lcd_wcmd(0xc0 + addr); //在第二行显示年月日和星期

lcd_wdat('2'); //显示2

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat('0'); //显示0

addr++;

lcd_wdat(((time[6]>>4)&0x0f)+0x30); //年

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat((time[6]&0x0f)+0x30);

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat(' ');

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat(((time[4]>>4)&0x0f)+0x30); //显示月

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat((time[4]&0x0f)+0x30);

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat(' ');

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat(((time[3]>>4)&0x0f)+0x30); //显示日

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat((time[3]&0x0f)+0x30);

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat(' ');

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat((time[5]&0x0f)+0x30); //显示星期

}

//=========== 主函数 ===============

void main()

{

lcd_init(); // 初始化LCD

write_ds1302(time);

while(1)

{

read_ds1302(time); //读DS1302数据

lcd_disp(); //LCD显示

delay_ms(500); //延时05秒

}

}

这是一个电子时钟,在LCD1602上显示,时钟芯片是DS1302

淘bao 旺铺: 广州华电 单片机学习板 单片机外围学习模块/传感器模块

//44键盘检测程序,按下键后相应的代码显示在数码管上

#include<reg51h>

sbit beep=P2^3;

sbit dula=P2^6;

sbit wela=P2^7;

unsigned char i=100;

unsigned char j,k,temp,key;

void delay(unsigned char i)

{

for(j=i;j>0;j--)

for(k=125;k>0;k--);

}

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

display(unsigned char num)

{

P0=table[num];

dula=1;

dula=0;

P0=0xc0;

wela=1;

wela=0;

}

void main()

{

dula=0;

wela=0;

while(1)

{

P3=0xfe;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xee:

key=0;

break;

case 0xde:

key=1;

break;

case 0xbe:

key=2;

break;

case 0x7e:

key=3;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

beep=0;

}

beep=1;

display(key);

P1=0xfe;

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:

key=4;

break;

case 0xdd:

key=5;

break;

case 0xbd:

key=6;

break;

case 0x7d:

key=7;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

beep=0;

}

beep=1;

display(key);

}

}

P3=0xfb;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:

key=8;

break;

case 0xdb:

key=9;

break;

case 0xbb:

key=10;

break;

case 0x7b:

key=11;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

beep=0;

}

beep=1;

display(key);

}

}

P3=0xf7;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xe7:

key=12;

break;

case 0xd7:

key=13;

break;

case 0xb7:

key=14;

break;

case 0x77:

key=15;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

beep=0;

}

beep=1;

display(key);

}

}

}

}

当n==1时执行while循环结构里的语句,当n不等于1时,则跳过该循环执行循环体外的语句。

while 循环的格式:while (表达式){语句;}

while 循环的执行顺序:当表达式为真,则执行下面的语句,语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的语句,然后再判断表达式是否为真……就这样一直循环下去,直到表达式为假,跳出循环。

while 循环的执行顺序非常简单,它的格式是:

while (表达式)

{

语句;

}

当表达式为真,则执行下面的语句;语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的语句;然后再判断表达式是否为真……就这样一直循环下去,直到表达式为假,跳出循环。这个就是 while 的执行顺序。

注意,初学者编程时,if、else、for、while、do 后面的执行语句不论有多少行,就算只有一行也要加“{}”,养成良好的编程习惯尤为重要。

写一个程序实现此功能:计算 (1-1/3+1/5-1/7+1/9-1/11…)4 的值。

防抖模式仅在安装了支持图像稳定的镜头时可用。连续+动像/常时图像稳定开启。若选择了+动像,检测到移动物体时照相机将调整快门速度以减少动作模糊。拍摄+动像/仅拍摄时除仅当半按快门按钮(仅限对焦模式C)或释放快门时才执行图像稳定外,其他与上述相同。若选择了+动像,检测到移动物体时照相机将调整快门速度以减少动作模糊。关图像稳定关闭。使用三脚架时请选择该选项。+动像在感光度设为固定值时不起作用,并且还可能在某些其他设定组合下不可用。其效果可能因光线环境及物体移动速度的不同而异。

如果是windows上程序。单词按键判断ASCII码,然后变量值++,--就可以了。

#include <stdioh>

#include <conioh>

#include <windowsh>

#define KEYA 61//按键盘'+'键(非小键盘)

#define KEYM 45//按键盘'-'键(非小键盘)

int main()

{

    int key,num=0;

    while(1)

    {

        system("cls");

        printf("当前值:%d\n",num);

        key=getch();

        switch(key)

        {

            case KEYA: num++;break;

            case KEYM: num--;break;

        }

    }

    return 0;

}

如果你是要其他平台,比如单片机上运行,只要对应按钮电平对应防抖代码中对变量++,--就可以了。我之前给别人写个一个单片机的简单程序,里面就有按钮+-的,你可以参考。

以前回答记录

你这里是出了 四道题,还是一共一道题?

这些SX,是按扭式的一松手就自动d起 还是开关式的,推上去通,拨下来不通 这些会影响到程序的,如果是推上去拨下来的开关,那程序中只要检查开关的当前状态,依状态进行不同的流程,如果是按扭式的,那得在中断里轮询关做防抖处理,按下一次记一个状态

那个全灭时向左移向右移不还都是全灭的吗?这个提得不清楚,连着按几下是亮了几个灯?

3跟4明显是冲突的,不是一个题,那就是分成多题了

没意思,别人的烦恼,我干嘛要在这思考啊,近来知道上尽是些懒人来发题,就想不劳而获,替别人思考是浪费自己的生命,花费太多时间实在是不值得,如果是想要别的程序学习学习那应当不提这么多乱七八糟的需求,这么一提,明显是想让人免费为你开发,还是你自己玩吧

键码扫描的地方存在两个问题:

1如果消抖时,发现键盘抖动,函数没有指定返回值,这个不能预测。

2在扫描结束之后,没有对键盘d起做判断,d起时也需要消抖。

还有一个疑问就是不知你的数码管是动态扫描的来中静态的

代码:void main()

{

unsigned char keytemp;//定义一个新变量

p27=0;

P0=s8[16];

while(1)

{

P1=0XF0;

if(P1!=0XF0)

{

//要做防抖,和d起处理

keytemp=s8[keyscan()];}//存放变量

}

P0=keytemp;//输出显示

}

}

以上就是关于求c51单片机电子钟程序(c语言)全部的内容,包括:求c51单片机电子钟程序(c语言)、求一个单片机4X4矩阵键盘扫描程序,C语言的。、c语言while的用法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存