以下是四位数码管可调时带秒闪烁的c51单片机电子钟程序(c语言)。
/ 本程序中,晶振为12MHz, /
/ 时间控制采用定时中断控制方式。 /
/ 模式和时间调整采用查询方式。 /
#include<reg52h>
sbit P20=P2^0; //分个位控制端
sbit P21=P2^1; //分十位控制端
sbit P22=P2^2; //时个位控制端
sbit P23=P2^3; //时十位控制端
sbit led=P2^7; //second display led
sbit key0=P3^0; //模式设置
sbit key1=P3^1; //加
sbit key2=P3^2; //减
unsigned char hour,min,sec,T50ms;
unsigned char modstate; //模式状态
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码
void init(); //初始化子程序声明
void delay500us(unsigned char X); //延时子程序声明
void display(); //显示子程序声明
void display001(); //显示子程序声明
void display002(); //显示子程序声明
void keyscan(); //按键识别子程序声明
void main()
{
init();
while(1)
{
keyscan();
}
}
void init() //初始化子程序
{
TMOD=0x01;
TH0=(65536-49990)/256;
TL0=(65536-49990)%256;
ET0=1;
EA=1;
TR0=1;
}
void delay500us(unsigned char X)
{
unsigned char i,j;
for(i=X;i>0;i--)
for(j=248;j>0;j--);
}
void timer0() interrupt 1 //timer0中断服务子程序,定时时间为50ms,本程序加了10us的时间修正量
{
TMOD=0x01;
TH0=(65536-49990)/256;
TL0=(65536-49990)%256;
T50ms++;
if(T50ms>=20)
{
T50ms=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=24)hour=0;
}
}
}
}
void display()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour/10];
P23=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour%10];
P22=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min/10];
P21=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min%10];
P20=0;
delay500us(5);
if(T50ms<=10)led=0;
if(T50ms>10)led=1;
}
void display001()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour/10];
P23=0;
delay500us(10);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour%10];
P22=0;
delay500us(10);
}
void display002()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min/10];
P21=0;
delay500us(10);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min%10];
P20=0;
delay500us(10);
}
void keyscan() //按键识别钟程序
{
while(modstate==0)
{
display();
if(key0==0)
{
display();
if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。
while(key0==0)display001(); //等待按键释放。
}
}
////
while(modstate==1)
{
display001();
if(key0==0)
{
display001();
if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。
while(key0==0)display002(); //等待按键释放。
}
if(key1==0)
{
display001();
if(key1==0)
{
hour++;
if(hour>=24)hour=0;
while(key1==0)display001();
}
}
if(key2==0)
{
display001();
if(key2==0)
{
hour--;
if(hour>=24)hour=0;
while(key2==0)display001();
}
}
}
////
while(modstate==2)
{
display002();
if(key0==0)
{
display002();
if(key0==0)modstate=0; //这两句加在一起为延时10ms软件防抖设计。
while(key0==0)display(); //等待按键释放。
}
if(key1==0)
{
display002();
if(key1==0)
{
min++;
if(min>=60)min=0;
while(key1==0)display002();
}
}
if(key2==0)
{
display002();
if(key2==0)
{
min--;
if(min>=60)min=0;
while(key2==0)display002();
}
}
}
}
你好,
我这又一个参考程序,是用郭天祥的TX-1C开发板写的,有3个按键,调节光标,时间加,时间减。引脚方便可以根据自己的开发板更改,其他程序内容不变。
希望我的回答能帮助到你。
基于c8051f020单片机最小系统的实时时钟显示程序
c8051f020 FYD12864-0402B LCD显示,按键电子时钟//
#include <c8051f020h>
#include<lcdh>
#include <intrinsh>
#define uchar unsigned char
void lcd_ini();
void DISPInitial();
void ascii_change(void);
void delay();
void wri_add(uchar com);
void wri_dat(uchar com1);
void shan(void);
void disp();
void tkey(void);
void PORT_Init (void);
sbit cs=P1^7;
sbit sid=P1^6;
sbit sclk=P1^5;
bit flag=1;
uchar dat,count,f=1;//f测试哪个单元为当前闪烁状态
uchar data clock[3]={24,00,00};
uchar code clockname[10]={"北京时间:"};
uchar data num[6];
/主程序/
void main()
{
lcd_ini();
count=10;//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒
TMOD=0x01;
TL0=0XB0;
TH0=0X3C;
EA=1;
ET0=1;
IT0=1;
EX0=1;
TR0=1;
while(1)
{
back:ascii_change();
disp();
delay();
if(flag==1)
goto back;
tkey();
shan();
delay();
}
}
/lcd初始化/
/void lcd_ini()
{
wri_add(0x30);
delay();
wri_add(0x0c);
delay();
wri_add(0x01);
delay();
wri_add(0x06);
delay();
}/
void PORT_Init (void)
{
XBR0 = 0x00; //不让他连上IO口
XBR1 = 0x14; //允许外部中断连在端口上
XBR2 = 0x40; // Enable crossbar and weak pull-ups
P0MDOUT |= 0x00; // enable TX0 as a push-pull output
// P1MDOUT |= 0x07; // enable P16 (LED) as push-pull output
P2MDOUT=0xfe; //为了驱动步进电机的控制线
//P3MDOUT = 0xFF;
P74OUT=0x00; //配置成漏极方式可以让LCD显示成功 ,我试了配置成推挽方式不能正常显示
}
/定时程序/
void timer1() interrupt 1 using 2
{
TL0=0XB0;
TH0=0X3C;
count--;
if(count==0)
{
count=10;
clock[2]++;//秒//
}
else
goto out;
if(clock[2]==60)
{
clock[2]=0;
clock[1]++;//分//
}
if(clock[1]==60)
{
clock[1]=0;
clock[0]++;
}
if(clock[0]==24)//时//
clock[0]=0;
out:_nop_();
}
/十位个位转换成ASCII码/
void ascii_change(void)
{
num[5]=clock[2]-(clock[2]/10)10+0x30;
num[4]=clock[2]/10+0x30;
num[3]=clock[1]-(clock[1]/10)10+0x30;
num[2]=clock[1]/10+0x30;
num[1]=clock[0]-(clock[0]/10)10+0x30;
num[0]=clock[0]/10+0x30;
}
/廷时程序/
void delay()
{
uchar i,j;
for (i=250;i>0;i--)
for (j=250;j>0;j--);
}
/Write address/
void wri_add(uchar com)
{
uchar i,j,k;
cs=0;
cs=1;
dat=0xf8;
for(i=1;i<=8;i++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}
dat=com;
dat=dat&0xf0;
for(j=1;j<=8;j++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}
dat=com;
dat=_cror_(dat,4);// 此为高低四位交换
dat=dat&0xf0;
for(k=1;k<=8;k++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}
}
/Write data/
void wri_dat(uchar com1)
{
uchar i,j,k;
cs=0;
cs=1;
dat=0xfa;
for(i=1;i<=8;i++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}
dat=com1;
dat=dat&0xf0;
for(j=1;j<=8;j++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}
dat=com1;
dat=_cror_(dat,4);// 此为高低四位交换
dat=dat&0xf0;
for(k=1;k<=8;k++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}
}
/display program/ //显示时间
void disp()
{
uchar i,k=0;
wri_add(0x80);
for (i=1;i<=9;i++)
wri_dat(clockname[i-1]);
wri_add(0x90);
for (i=1;i<=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
}
/闪烁程序/
void shan(void)
{
uchar i,k=0;
wri_add(0x90);
if(f==1)
{
num[0]=' ';
num[1]=' ';
}
else
goto next;
for (i=1;i<=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
goto return1;
next: if(f==2)
{
num[2]=' ';
num[3]=' ';
}
else
goto next1;
for (i=1;i<=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
goto return1;
next1: if(f==3)
{
num[4]=' ';
num[5]=' ';
}
else
goto return1;
for (i=1;i<=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
return1:_nop_();
}
/外部中断/
void intr0() interrupt 0 using 2
{
flag=~flag;//判断是否闪烁位//
TR0=~TR0; //闪关定时否则开定时
f=1;
}
/按键程序/
void tkey(void)
{
uchar judcekey;
judcekey=P1&0x0f;
if(judcekey==0x0f)
goto return2;
/移位键/
if (judcekey==0x0e)
f++;
if (f==4)
f=1;
/加一键/
if(judcekey==0x0d)
{clock[f-1]++;}
if (f==1)
{ if (clock[f-1]==24){
clock[f-1]=0;}
}
else{ if (clock[f-1]==60)
clock[f-1]=0;
}
/减一键/
if(judcekey==0x0b)
{clock[f-1]--;}
if (f==1)
{ if (clock[f-1]==0xff){
clock[f-1]=23;}
}
else
{ if (clock[f-1]==0xff)
clock[f-1]=59;
}
return2:_nop_();
}
//本程序已经调试成功并能够正确执行
这是我以前写的一段程序,希望对你能有帮助
我的程序,首先有一点,肯定是调试通过的,不像我以前找的一些网络程序,貌似可以,就是不能执行结果。
/DS1302时钟芯片显示设置
功能:显示 时间 日期 星期
引脚说明:DS1302三引脚 CLK = P1^5; IO=P1^6; RST=P1^7;
设计整理:创达科技 陈仲库
技术服务:kuzi00@163com QQ:86828048
整理时间:2007年5月26日
/
#define uchar unsigned char
#define uint unsigned int
sbit DS1302_CLK = P1^5; //实时时钟时钟线引脚
sbit DS1302_IO = P1^6; //实时时钟数据线引脚
sbit DS1302_RST = P1^7; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
typedef struct __SYSTEMTIME__
{
uchar Second;
uchar Minute;
uchar Hour;
uchar Week;
uchar Day;
uchar Month;
uchar Year;
uchar DateString[9];
uchar TimeString[9];
}SYSTEMTIME; //定义的时间类型
void DS1302_WR_Byte(uchar d) //实时时钟写入一字节(内部函数)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1;
}
}
uchar DS1302_RD_Byte(void) //实时时钟读取一字节(内部函数)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
void DS1302_Write(uchar ucAddr, uchar ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302_WR_Byte(ucAddr); // 地址,命令
DS1302_WR_Byte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
}
uchar DS1302_Read(uchar ucAddr) //读取DS1302某地址的数据
{
uchar ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302_WR_Byte(ucAddr|0x01); // 地址,命令
ucData = DS1302_RD_Byte(); // 读1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}
void DS1302_SetTime(uchar Address, uchar Value) // 设置时间函数
{
DS1302_Write(0x8E,0x00); //写保护
DS1302_Write(Address, ((Value/10)<<4 | (Value%10)));
}
void DS1302_GetTime(SYSTEMTIME Time)
{
uchar ReadValue;
ReadValue = DS1302_Read(0x80);
Time->Second = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x82);
Time->Minute = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x84);
Time->Hour = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x86);
Time->Day = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x8a);
Time->Week = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x88);
Time->Month = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x8c);
Time->Year = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
}
void DateToStr(SYSTEMTIME Time)
{
Time->DateString[0] = Time->Year/10 + '0';
Time->DateString[1] = Time->Year%10 + '0';
Time->DateString[2] = '-';
Time->DateString[3] = Time->Month/10 + '0';
Time->DateString[4] = Time->Month%10 + '0';
Time->DateString[5] = '-';
Time->DateString[6] = Time->Day/10 + '0';
Time->DateString[7] = Time->Day%10 + '0';
Time->DateString[8] = '\0';
}
void TimeToStr(SYSTEMTIME Time)
{
Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';
Time->TimeString[2] = ':';
Time->TimeString[3] = Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10 + '0';
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10 + '0';
Time->DateString[8] = '\0';
}
void DS1302_Init(void)
{
uchar Second=DS1302_Read(0x80);
if(Second&0x80) DS1302_SetTime(0x80,0);
//时间设置初始化 秒 分 时
DS1302_SetTime(0x80,30);
DS1302_SetTime(0x82,59);
DS1302_SetTime(0x84,23);
DS1302_SetTime(0x8A,6); //周
DS1302_SetTime(0x86,26); //天
DS1302_SetTime(0x88,5); //月
DS1302_SetTime(0x8C,7); //年
}
/调用说明
DS1302_Init();初始化
DS1302_GetTime(&CurrentTime);//取得当前时间
DateToStr(&CurrentTime); //取得当前日期
TimeToStr(&CurrentTime); //取得当前时间
// 数据处理 CurrentTimeDateString 格式"07-05-26"
// CurrentTimeTimeString 格式"00;00;00"
/
以上就是关于51单片机求这个时钟的c语言程序全部的内容,包括:51单片机求这个时钟的c语言程序、51单片机,1602动态显示时钟,有独立按键(3个k1,k2,k3)分别控制选择,加1,减一、用汇编语言做单片机时钟显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)