c51数字钟c语言程序,51单片机电子时钟C语言程序
51最基础简单易懂的单片机,差不多一个月的时间,断断续续地学习,终于算是学完了,下个目标是飞思卡尔s12x和k60 也就是ARM crotex-M4架构. 51最核心的部分,我觉得是中断的使用,一个项目离不开中断,还有就是串口的理解,还有就是IIC通信。
以 电子时钟 为结尾篇,附上代码。代码有些不怎么完美。但终究是差不多写出来了。结合了IIC通信,中断定时器的使用,键盘使用,还有液晶的显示。
#include
sbit RS = P2^7;
sbit RW = P2^6;
sbit E = P2^5;
sbit Sda = P2^0;
sbit Scl = P2^1;
sbit keyleft = P1^0;
sbit keyup = P1^1;
sbit keydown = P1^2;
sbit keyright = P1^3;
unsigned char sec=0,min=0,hour=0;
unsigned char Year[20]=" 2012.10.1 ";
unsigned char i;
unsigned int times = 0;
unsigned char countleft = 0,countright = 0;
unsigned char busycheck();
static void Start(void)
{
Sda = 1;
Scl = 1;
Sda = 0;
}
static void Stop(void)
{
Sda = 0;
Scl = 1;
Sda = 1;
}
static unsigned char Respons(void)
{
unsigned char OverTime = 0; //超时
unsigned char TempFlag = 0;
OverTime = 0;
Sda = 1; //释放数据线
Scl = 1;
while(1)
{
if(Sda) //应答信号没来
{
if(OverTime++ > 200)
{
TempFlag = 0; //应答信号长时间没有来,认为无应答
break;
}
}
else
{
TempFlag = 1; ///检测到应答信号
break;
}
}
Scl = 0;
return TempFlag;
}
static void NoRespons(void) //非应答
{
Sda = 1; //释放数据线
Scl = 1;
Scl = 0;
}
static void WriteByte(unsigned char temp)
{
unsigned char i;
Scl = 0;
for(i = 0;i < 8;i++)
{
Sda = temp & 0x80;
temp <<= 1;
Scl = 1; //scl拉高,准备写数据
Scl = 0; //scl拉低,写数据完成
}
}
static unsigned char ReadByte(void)
{
unsigned char i;
unsigned char x = 0;
for(i = 0;i < 8;i++)
{
Scl = 1;
x <<= 1;
x |= (unsigned char)Sda;
Scl = 0;
}
return x;
}
void WriteIIC(unsigned char device,unsigned char parameter,unsigned char temp)
{
Start();
WriteByte(device);
if(Respons())
{
WriteByte(parameter);
if(Respons())
{
WriteByte(temp);
if(Respons())
{
Stop();
}
else
{
Stop();
}
}
else
{
Stop();
}
}
else
{
Stop();
}
}
unsigned char ReadIIC(unsigned char device,unsigned char parameter)
{
unsigned char x;
Start();
WriteByte(device);
if(Respons())
{
WriteByte(parameter);
if(Respons())
{
Start();
WriteByte(device | 0x01);
if(Respons())
{
x = ReadByte();
NoRespons();
Stop();
}
else
{
Stop();
}
}
else
{
Stop();
}
}
else
{
Stop();
}
return x;
}
void writecmd(unsigned char cmd)
{
while(busycheck());
RS = 0;
RW = 0;
E = 1;
P0 = cmd;
E = 0;
}
void writedata(unsigned char dat)
{
while(busycheck());
RS = 1;
RW = 0;
E = 1;
P0 = dat;
E = 0;
}
unsigned char busycheck()
{
P0 = 0xff;
RS = 0;
RW = 1;
E = 0;
E = 1;
return(P0 & 0x80);
}
void writedate(unsigned char add,unsigned char date)
{
unsigned char shi,ge;
shi = date/10;
ge = date%10;
writecmd(0x80+0x40+add);
writedata(0x30+shi);
writedata(0x30+ge);
}
void Init()
{
writecmd(0x38);//显示模式
writecmd(0x08);//关屏
writecmd(0x01);//清屏
writecmd(0x06);//设置光标右移
writecmd(0x0c);//显示,无标 闪烁
writecmd(0x80);
for(i = 0;i < 20;i++)
writedata(Year[i]);
writecmd(0x80+0x40+6);
writedata(':');
writecmd(0x80+0x40+9);
writedata(':');
sec = ReadIIC(0xa0,0);
min = ReadIIC(0xa0,2);
hour = ReadIIC(0xa0,4);
writedate(10,sec);
writedate(7,min);
writedate(4,hour);
TMOD = 0x02;
TH0 = 6;
TL0 = 6;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void delay()
{
unsigned char x = 2000;
while(x--);
}
void keyscan()
{
if(!keyleft)
{
delay();
if(!keyleft)
{
TR0 = 0;
if(countleft == 0)
{
countleft++;
writecmd(0x80+0x40+10);
writecmd(0x0f);
}
else
if(countleft == 1)
{
countleft++;
writecmd(0x80+0x40+7);
}
else
if(countleft == 2)
{
countleft++;
writecmd(0x80+0x40+4);
}
else
if(countleft == 3)
{
TR0 = 1;
writecmd(0x0c);
countleft = 0;
}
else
{
}
}
else
{
}
}
else
{
}
if(!keydown)
{
delay();
if(!keydown)
{
if(countleft == 1)
{
sec--;
if(sec == 60)
sec = 0;
writedate(10,sec);
WriteIIC(0xa0,1,sec);
writecmd(0x80+0x40+10);
}
else
if(countleft == 2)
{
min--;
if(min == 60)
min = 0;
writedate(7,min);
WriteIIC(0xa0,2,min);
writecmd(0x80+0x40+7);
}
else
if(countleft == 2)
{
hour--;
if(hour == 24)
hour = 0;
writedate(4,hour);
WriteIIC(0xa0,3,hour);
writecmd(0x80+0x40+4);
}
else
{
}
}
else
{
}
}
else
{
}
if(!keyright)
{
delay();
if(!keyright)
{
if(countleft == 1)
{
sec++;
if(sec == 60)
sec = 0;
writedate(10,sec);
writecmd(0x80+0x40+10);
}
else
if(countleft == 2)
{
min++;
if(min == 60)
min = 0;
writedate(7,min);
writecmd(0x80+0x40+7);
}
else
if(countleft == 2)
{
hour++;
if(hour == 24)
hour = 0;
writedate(4,hour);
writecmd(0x80+0x40+4);
}
else
{
}
}
else
{
}
}
else
{
}
}
void main()
{
Init();
while(1)
{
keyscan();
}
}
void Time0(void) interrupt 1
{
times++;
if(times == 3686)
{
times = 0;
sec++;
if(sec == 60)
{
sec = 0;
min++;
if(min == 60)
{
min = 0;
hour++;
if(hour == 24)
{
hour = 0;
}
writedate(4,hour);
WriteIIC(0xa0,3,hour);
}
writedate(7,min);
WriteIIC(0xa0,2,min);
}
writedate(10,sec);
WriteIIC(0xa0,1,sec);
}
}
c51数字钟c语言程序,51单片机电子时钟C语言程序相关推荐
- 电子时钟单片机c语言程序,51单片机电子时钟C语言程序
本程序基于ATM89系列单片机的电子时钟C语言程序,能显示月日时分秒,同时还能调节其值!显示方式用六个8段数码管! #include//头文件 #define uchar unsigned char/ ...
- 110报警声+单片机c语言,用51单片机做发声小玩意及程序
用51单片机做发声小玩意及程序 "嘀嘀"警报 生活中我们常常到各种各样的报警声,例如"嘀.嘀-"就是常见的一种声音报警声,但对于这种报警声,嘀0.2秒钟,然后断 ...
- 单片机显示屏c语言程序,51单片机驱动1602液晶显示器c程序
51单片机驱动1602液晶显示器c程序 /* 程序效果:单片机控制液晶显示器1602显示字母数字,用户自行更改io 程序版权:http://www.51hei.com */ #include //头文 ...
- 51单片机c语言定时器程序,51单片机定时器设置入门与程序解析
89C51单片机有两个计数器T0和T1,每个计数器都是由两个8位的RAM 单元组成的,即每个计数器都是16 位的计数器,最大的计数容量是216=65536,记住是从0-65535. 其次.提供给定时器 ...
- 共阳极数码时钟c语言程序,51单片机_DS1302时钟芯片_共阴数码管_时钟实例【中为电子科技工作室】_51单片机ds1302数码管时钟...
该文档包括原理图.源代码,系统的介绍了51单片机和DS1302的应用,显示方式为4位共阴时钟数码管,具有调时功能,原理图和源代码都已验证是可用的. E:\Demo\Keil3\IS EB51M V10 ...
- 如何用c语言对51单片机进行编程,C语言在51单片机编程中的应用技巧
随着单片机硬件性能的提高,编写应用程序更着重于程序本身的效率. Franklin或KEII.C51交叉编译器是专为51系列单片机设计的一种高效的C语言编译器,用其开发的应用程序易于维护,可移植性好,是 ...
- 基于51单片机电子时钟
keil工程与protues仿真电路 1 基于51单片机用LCD1602实现时-分的显示 2. 按键控制时-分的调整 3. 能实现整时报时的功能(蜂鸣器响) 4. 闹钟模式 5.按键切换模式(模式一: ...
- c语言钟表程序,制作一个电子时钟C语言版
平常我们常见的电子时钟,能够显示当下的时分秒信息,并且能够随时变化递增,记录着时间的流逝.今天,我要用c语言来制作这样一款电子时钟,看时间这把杀猪刀如何"一刀一刀"溜掉.我会一步一 ...
- 51单片机 c语言 汇编,51单片机之时钟(C语言和汇编两种方式实现)
1.C语言实现 #include typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned ...
最新文章
- 计算MySQL的内存峰值公式
- Exchange bin先常用工具
- android中xmlns:tools属性详解
- NPOI 将DataGridView导出到Excel
- Animation Studio插件怎么用?Nitrozme Animation Studio Packages Mac(AE插件拓展包) 安装教程
- SpringCloud工作笔记066---断路器(Curcuit Breaker)模式
- PCIE 转 spi 总线
- backtrader概念(二)Trade
- [IMX6Q][Android4.4] Audio添加控制MIC左右声道接口
- [BZOJ1271][BeijingWc2008][二分]秦腾与教学评估
- Windows下LaTex转为Word
- 字节瞧不上老程序员?我很慌…
- For循环—函数初步概念
- python 多元线性回归_多元统计分析之多元线性回归的R语言实现
- 王者荣耀游戏简介-1
- 坚果啊!ISA-NUT协会成立:求围观
- 洛谷 能力提升综合题单Part1 入门阶段 P1089 津津的储蓄计划 带注释
- 《大数据之路:阿里巴巴大数据实践》总述-读书笔记
- ESSAY[000004]
- Squirrel 连接Hive
热门文章
- 用HTML/CSS制作一个美观的个人简介网页——学习周记1
- 贫穷限制了想象:富豪200亿房产当摆设,贫民窟1440人共用一厕所
- 【React】React三大属性:Props、State、Refs
- 电脑任务栏突然变得很宽很大
- 安装RabbitMQ时出现Plugin configuration unchanged,RabbitMQ服务启动几秒后自动关闭, http://127.0.0.1:15672/页面无法访问一并解答
- ARC 128D - Neq Neq(dp+组合数学+思维)
- iOS开发-舒尔特表
- Appium相对坐标定位元素
- [电脑组装]记录第一次组装电脑+win10激活
- 信息系统项目管理师核心考点(五十四)配置项分类、状态与版本