51单片机入门(五)

用LCD1602来显示一个二十四小时的时钟和以0.1秒计时的秒表

1.时钟代码:

//use Lcd1602 to make a clock
#include<reg52.h>
#define uchar unsigned char
sbit K1=P3^1; //select hour /minute /second
sbit K2=P3^0; //add one
sbit K3=P3^2; //into clock configuration
sbit E=P2^7;
sbit RW=P2^5;
sbit RS=P2^6;
uchar setplace;
uchar time;
//************declare function
void delayms(uchar);
void LcdInit();
void LcdWriteCom(uchar);
void LcdWriteData(uchar);
void TimerConfig();
void Int0Config();
//************main()
void main()
{
uchar hour=12,minute=0,second=0;
LcdInit();
TimerConfig();
Int0Config();

LcdWriteData(‘0‘+hour/10);
LcdWriteData(‘0‘+hour%10);
LcdWriteData(‘-‘);
LcdWriteData(‘0‘+minute/10);
LcdWriteData(‘0‘+minute%10);
LcdWriteData(‘-‘);
LcdWriteData(‘0‘+second/10);
LcdWriteData(‘0‘+second%10);
while(1)
{
if(TR0==0)
{
if(K1==0)
{
delayms(10);
if(K1==0)
{
setplace++;
if(setplace>=3) setplace=0;
}
while(~K1);
}
if(K2==0)
{
delayms(10);
if(K2==0)
{
if(setplace==0)
{
second++;
if(second>=60) second=0;
}else if(setplace==1)
{
minute++;
if(minute>=60) minute=0;
}else hour++;
if(hour>=24) hour=0;
}
while(~K2);
}
}
//timer add one
if(time==20)
{
time=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
hour=0;
}
}

}
//show time on the lcd1602
LcdWriteCom(0x80);
LcdWriteData(‘0‘+hour/10);
LcdWriteData(‘0‘+hour%10);
LcdWriteCom(0x83);
LcdWriteData(‘0‘+minute/10);
LcdWriteData(‘0‘+minute%10);
LcdWriteCom(0x86);
LcdWriteData(‘0‘+second/10);
LcdWriteData(‘0‘+second%10);

}

}
//*************delayms(uchar)
void delayms(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//************LcdInit()
void LcdInit()
{
LcdWriteCom(0x38);
LcdWriteCom(0x0c);
LcdWriteCom(0x06);
LcdWriteCom(0x01);
LcdWriteCom(0x80);
}
//****************LcdWriteCom(uchar)
void LcdWriteCom(uchar com)
{
RW=0;
RS=0;
P0=com;
delayms(1);
E=1;
delayms(5);
E=0;
}
//***************LcdWriteData(uchar)
void LcdWriteData(uchar dat)
{
RW=0;
RS=1;
P0=dat;
delayms(1);
E=1;
delayms(5);
E=0;
}
//******************TimerConfig()
void TimerConfig()
{
TMOD=0x01;
TH0=(65535-49539)/256;
TL0=(65535-49539)%256;
EA=1;
ET0=1;
TR0=1;
}
//**************Timer service
void Timer() interrupt 1
{
TH0=(65535-49539)/256;
TL0=(65535-49539)%256;
time++; //add one per 50ms
}
//****************Int0Config()
void Int0Config()
{
EA=1;
EX0=1;
IT0=1;
}
//***************Int0 service
void Int0() interrupt 0
{
delayms(10);
if(K3==0)
{
TR0=~TR0; //timer not count time
setplace=0;
}
}

效果图:

2.秒表代码:

//use timer to make a counter (add one per 0.1s)
#include<reg52.h>
#define uchar unsigned char
sbit K3=P3^2;
sbit K4=P3^3;
sbit E=P2^7;
sbit RS=P2^6;
sbit RW=P2^5;
uchar time;
uchar setplace;
//************************declare function
void delayms(uchar);
void TimerConfig();
void LcdInit();
void LcdWriteCom(uchar);
void LcdWriteData(uchar);
void Int0Config();
//********main()
void main()
{
uchar hour=0,minute=0,second=0,tenth=0;
LcdInit();
TimerConfig();
Int0Config();
LcdWriteData(‘0‘+hour/10);
LcdWriteData(‘0‘+hour%10);
LcdWriteData(‘-‘);
LcdWriteData(‘0‘+minute/10);
LcdWriteData(‘0‘+minute%10);
LcdWriteData(‘-‘);
LcdWriteData(‘0‘+second/10);
LcdWriteData(‘0‘+second%10);
LcdWriteData(‘.‘);
LcdWriteData(‘0‘+tenth);

while(1)
{
//timer add one
if(time==2)
{
time=0;
tenth++;
if(tenth==10)
{
second++;
tenth=0;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
hour++;
minute=0;
if(hour==99)
{
hour=0;
}
}
}
}
}
//show outcom on the Lcd
LcdWriteCom(0x80);
LcdWriteData(‘0‘+hour/10);
LcdWriteData(‘0‘+hour%10);
LcdWriteCom(0x83);
LcdWriteData(‘0‘+minute/10);
LcdWriteData(‘0‘+minute%10);
LcdWriteCom(0x86);
LcdWriteData(‘0‘+second/10);
LcdWriteData(‘0‘+second%10);
LcdWriteCom(0x89);
LcdWriteData(‘0‘+tenth);

}
}
//************delayms(uchar)
void delayms(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//***************TimerConfig()
void TimerConfig()
{
TMOD=0x01;
TH0=(65535-49539)/256;
TL0=(65535-49539)%256;
EA=1;
ET0=1;
TR0=1;
}
//**************Timer service
void Timer() interrupt 1
{
TH0=(65535-49539)/256;
TL0=(65535-49539)%256;
time++;
}
//********LcdInit()
void LcdInit()
{
LcdWriteCom(0x38);
LcdWriteCom(0x0c);
LcdWriteCom(0x06);
LcdWriteCom(0x01);
LcdWriteCom(0x80);
}
//*********LcdWriteCom(uchar)
void LcdWriteCom(uchar com)
{
RW=0;
RS=0;
P0=com;
delayms(1);
E=1;
delayms(5);
E=0;
}
//*************LcdWriteData(uchar)
void LcdWriteData(uchar dat)
{
RW=0;
RS=1;
P0=dat;
delayms(1);
E=1;
delayms(5);
E=0;
}
//****************Int0Config()
void Int0Config()
{
EA=1;
EX0=1;
IT0=1;
}
//***************Int0 service
void Int0() interrupt 0
{
delayms(10);
if(K3==0)
{
TR0=~TR0; //timer not count time
setplace=0;
}
}

效果图:

时间: 2024-12-17 10:32:00

51单片机入门(五)的相关文章

51单片机入门(三)

数码管显示,定时器中断:键盘检测: 1.数码管:分共阳极和共阴极数码管.我的实验板是共阴极,多位数码管的公共端叫做"位选线",连接在一起的段线叫做"段选线".位选是独立控制的,而段选是连接在一起的.段选数据由P0口发送,位选由P2口的2.3.4控制.(消影用P0=0x00) 2.中断:为使单片机具有对外部或内部随机事件发生的时间实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部时间的能力.51单片机内部共有5个中断源,外部中断0.1:定时器中断0

51单片机第五弹---外部中断

写了半天掉线了... 不写了上定义... 什么叫中断 中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去 执行相应的服务处理程序:当服务处理程序运行完毕后,CPU再返回到暂停处继续执行原来的程序. 51单片机的中断 80c51提供有5个中断源,分别为:2个外部中断,2个定时/计数器中断,1个串口发送/接收中断.并且具有2个中断优先级,可以实现2级中断服务程序嵌套. 首先要弄中断设置 ,中断原理图如下: 以 设置INT0为例:I

51单片机入门基础教程,视频、课件、源码免费下载

今天也是分享资料,不过是很大量的学习资料,足够您国庆七天在家闭关学习了,4G的51单机片开发学习视频和资料,包括每一节的视频.课件和源码!内容很大,想要更多的单机片学习.交流和实战的机会,可以上闯客网论坛,和同行并肩同行,一起学习 图一 下面就给大家分享单片机的基础知识PCB的种类1. 单面板(只在一个面走线)2. 双面板(在两个面都走线)3. 多层板(4.6.8.10......)(出两个面外还有内层)4. 柔性PCB(触摸屏等的连接) 图二 PCB的制作步骤(工业企业环境下的PCB制作步骤)

51单片机入门1--与C语言的交接

我们即将进入51单片机的编程学习,咱们今天就来讲解一下单片机中的C语言(你可以称作C51) 在说编程之前,要先说一些别的东西: 二进制,八进制,十六进制 二进制中只有数字0和1,在二进制中1+1为10,我们常说十进制逢十进一,那二进制就是逢二进一,那为什么我会在这里说二进制呢,因为我们的51单片机的io口是可以接受发送低电平和高电平的,意思就是输入输出的口只有0和1两个状态,所以如果我们理解了二进制,那么对于单片机的输入和输出就会十分明了了 八进制,学过C语言,咱们都知道,在C语言中其实是不能直

51单片机入门0--学习前的准备工作

对于什么是51,51能干什么,我不会在此进行说明,你可以自行百度 这是51的第一个文章,所以有一些东西是要说明的:如果你是真的想学51,那么,最重要的是坚持学下去,三天打鱼两天晒网是不行的,记住:坚持. 接下来就我的理解说一说学习51需要什么知识: 基本的识别电路的能力 拥有C语言基础 初学不需要什么模电数电的知识,你只需要能看懂电路,会写程序就好了 接下来就是学习之前的准备工作了: 首先是keil的安装,就像你使用C语言编译器一样,我们的单片机程序也是需要编译的,我们使用的是keil这个软件,

大虾对51单片机入门的经验总结

回想起当初学习AT89S52的日子还近在眼前:毕业后的第一年呆在亲戚公司做了10个月设备管理.乏味的工作和繁杂的琐事让我郁闷不已.思考很久后终于辞职.投奔我的同学去了,开始并不曾想到要进入工控行业,知识想找一份电子类技术职业,至于什么职业我根本没有目标可言.经过两个多月的挫折后我静下来思考,并上网查询一些前辈经验,又经过快2周的考虑我决定先自学单片机,毕竟电子信息专业的,有一点基础.于是买来了开发板(我还在这个论坛上发过小程序呢),下来了大量的资料,几乎很多是从本论坛下载的,我还是得感觉这么多的

51单片机入门(四)

用数码管实现一个二十四小时的时钟:定义三个按键K1(选择时分秒),K2(加一),K3(进入设置,再按一次则退出). 代码: //功能:用数码管二十四小时制的时钟//作者:刘建东//日期:2017.4.1#include<reg52.h>#define uchar unsigned charsbit K1=P3^1; //select hour /minute /secondsbit K2=P3^0; //add onesbit K3=P3^2; //into clock configurati

51单片机入门与keil的使用

keil软件下载 keil uvision4以及注册机 http://www.liangchan.net/soft/softdown.asp?softid=5688 单独的注册机 http://www.newasp.net/soft/77176.html 注册 keil的注册入口为File菜单的license manager项 复制cid号码到注册机中,多generate几次,输入窗口,一定要出现类似'expires 2020'字样 建立一个项目并调试,以测试是否注册成功(解除仿真的2K程序限制

[学习笔记]15个QA让你快速入门51单片机开发

一.C语言相关... 1 Q1:sbit与sfr代表是什么?有什么作用?... 1 Q2:#define OSC_FREQ  22118400L这句宏命令里的“L”是什么意思?... 1 Q3:我粘贴了别人的代码,怎么发现没有unit这个类型?... 1 Q4:为什么好多变量都是char类型?它不是字符类型吗?怎么可以用来计数?    1 Q4.1:51单片机中的char,int,long,float,double各占多少个字节,取值范围多大?    1 Q5:unsigned char dat