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语言程序相关推荐

  1. 电子时钟单片机c语言程序,51单片机电子时钟C语言程序

    本程序基于ATM89系列单片机的电子时钟C语言程序,能显示月日时分秒,同时还能调节其值!显示方式用六个8段数码管! #include//头文件 #define uchar unsigned char/ ...

  2. 110报警声+单片机c语言,用51单片机做发声小玩意及程序

    用51单片机做发声小玩意及程序 "嘀嘀"警报 生活中我们常常到各种各样的报警声,例如"嘀.嘀-"就是常见的一种声音报警声,但对于这种报警声,嘀0.2秒钟,然后断 ...

  3. 单片机显示屏c语言程序,51单片机驱动1602液晶显示器c程序

    51单片机驱动1602液晶显示器c程序 /* 程序效果:单片机控制液晶显示器1602显示字母数字,用户自行更改io 程序版权:http://www.51hei.com */ #include //头文 ...

  4. 51单片机c语言定时器程序,51单片机定时器设置入门与程序解析

    89C51单片机有两个计数器T0和T1,每个计数器都是由两个8位的RAM 单元组成的,即每个计数器都是16 位的计数器,最大的计数容量是216=65536,记住是从0-65535. 其次.提供给定时器 ...

  5. 共阳极数码时钟c语言程序,51单片机_DS1302时钟芯片_共阴数码管_时钟实例【中为电子科技工作室】_51单片机ds1302数码管时钟...

    该文档包括原理图.源代码,系统的介绍了51单片机和DS1302的应用,显示方式为4位共阴时钟数码管,具有调时功能,原理图和源代码都已验证是可用的. E:\Demo\Keil3\IS EB51M V10 ...

  6. 如何用c语言对51单片机进行编程,C语言在51单片机编程中的应用技巧

    随着单片机硬件性能的提高,编写应用程序更着重于程序本身的效率. Franklin或KEII.C51交叉编译器是专为51系列单片机设计的一种高效的C语言编译器,用其开发的应用程序易于维护,可移植性好,是 ...

  7. 基于51单片机电子时钟

    keil工程与protues仿真电路 1 基于51单片机用LCD1602实现时-分的显示 2. 按键控制时-分的调整 3. 能实现整时报时的功能(蜂鸣器响) 4. 闹钟模式 5.按键切换模式(模式一: ...

  8. c语言钟表程序,制作一个电子时钟C语言版

    平常我们常见的电子时钟,能够显示当下的时分秒信息,并且能够随时变化递增,记录着时间的流逝.今天,我要用c语言来制作这样一款电子时钟,看时间这把杀猪刀如何"一刀一刀"溜掉.我会一步一 ...

  9. 51单片机 c语言 汇编,51单片机之时钟(C语言和汇编两种方式实现)

    1.C语言实现 #include typedef  unsigned char   uint8; typedef  unsigned int    uint16; typedef  unsigned ...

最新文章

  1. 计算MySQL的内存峰值公式
  2. Exchange bin先常用工具
  3. android中xmlns:tools属性详解
  4. NPOI 将DataGridView导出到Excel
  5. Animation Studio插件怎么用?Nitrozme Animation Studio Packages Mac(AE插件拓展包) 安装教程
  6. SpringCloud工作笔记066---断路器(Curcuit Breaker)模式
  7. PCIE 转 spi 总线
  8. backtrader概念(二)Trade
  9. [IMX6Q][Android4.4] Audio添加控制MIC左右声道接口
  10. [BZOJ1271][BeijingWc2008][二分]秦腾与教学评估
  11. Windows下LaTex转为Word
  12. 字节瞧不上老程序员?我很慌…
  13. For循环—函数初步概念
  14. python 多元线性回归_多元统计分析之多元线性回归的R语言实现
  15. 王者荣耀游戏简介-1
  16. 坚果啊!ISA-NUT协会成立:求围观
  17. 洛谷 能力提升综合题单Part1 入门阶段 P1089 津津的储蓄计划 带注释
  18. 《大数据之路:阿里巴巴大数据实践》总述-读书笔记
  19. ESSAY[000004]
  20. Squirrel 连接Hive

热门文章

  1. 用HTML/CSS制作一个美观的个人简介网页——学习周记1
  2. 贫穷限制了想象:富豪200亿房产当摆设,贫民窟1440人共用一厕所
  3. 【React】React三大属性:Props、State、Refs
  4. 电脑任务栏突然变得很宽很大
  5. 安装RabbitMQ时出现Plugin configuration unchanged,RabbitMQ服务启动几秒后自动关闭, http://127.0.0.1:15672/页面无法访问一并解答
  6. ARC 128D - Neq Neq(dp+组合数学+思维)
  7. iOS开发-舒尔特表
  8. Appium相对坐标定位元素
  9. [电脑组装]记录第一次组装电脑+win10激活
  10. 信息系统项目管理师核心考点(五十四)配置项分类、状态与版本