制作秒表——AT24C02储存芯片与用定时器代替Delay函数
本来准备学linux的,但临时决定先把单片机的基础知识学完。
本周学习内容:
1.学到了一个很好的用定时器代替Delay函数的方法。利用多个累加变量可在一个定时器中断函数中满足多个功能的延时需求。
2.学习了AT24C02储存芯片和I2C协议。AT24C02是一个ROM,对于单片机来说相当于电脑的内存条,可以实现数据的长时间储存。其实AT24C02本身是比较简单的,但它与单片机通讯所用的I2C协议需要认真思考才能理解。
下面是利用本周学习的内容在学习板上实现秒表功能的函数
PS:因为本周要考四级,时间比较紧张,因此代码基本是照搬网上现有的,万分抱歉。
main
#include <REGX52.H>
#include "Key.h"
#include "Nixie.h"
#include "Delay.h"
#include "AT24C02.h"unsigned char KeyNum;
unsigned char Min,Sec,MiniSec;
unsigned char RunFlag;
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}void Timer0_Init(void)
{TMOD &= 0xF0; TMOD |= 0x01; TL0 = 0x18; TH0 = 0xFC; TF0 = 0; TR0 = 1; ET0=1;EA=1;PT0=0;
}void main()
{Timer0_Init();while(1){KeyNum=Key();if(KeyNum==1){RunFlag=!RunFlag;}if(KeyNum==2){Min=0;Sec=0;MiniSec=0;}if(KeyNum==3){AT24C02_WriteByte(0,Min);Delay(5);AT24C02_WriteByte(1,Sec);Delay(5);AT24C02_WriteByte(2,MiniSec);Delay(5);}if(KeyNum==4){Min=AT24C02_ReadByte(0);Sec=AT24C02_ReadByte(1);MiniSec=AT24C02_ReadByte(2);}Nixie_SetBuf(1,Min/10);Nixie_SetBuf(2,Min%10);Nixie_SetBuf(3,11);Nixie_SetBuf(4,Sec/10);Nixie_SetBuf(5,Sec%10);Nixie_SetBuf(6,11);Nixie_SetBuf(7,MiniSec/10);Nixie_SetBuf(8,MiniSec%10);}
}void Sec_Loop(void)
{if(RunFlag){MiniSec++;if(MiniSec>=100){MiniSec=0;Sec++;if(Sec>=60){Sec=0;Min++;if(Min>=60){Min=0;}}}}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count1,T0Count2,T0Count3;TL0 = 0x18; //设置定时初值TH0 = 0xFC; //设置定时初值T0Count1++;if(T0Count1>=20){T0Count1=0;Key_Loop();}T0Count2++;if(T0Count2>=2){T0Count2=0;Nixie_Loop();}T0Count3++;if(T0Count3>=10){T0Count3=0;Sec_Loop();}
}
Key.c
#include <REGX52.H>
#include "Delay.h"unsigned char Key_KeyNumber;unsigned char Key(void)
{unsigned char Temp=0;Temp=Key_KeyNumber;Key_KeyNumber=0;return Temp;
}unsigned char Key_GetState()
{unsigned char KeyNumber=0;if(P3_1==0){KeyNumber=1;}if(P3_0==0){KeyNumber=2;}if(P3_2==0){KeyNumber=3;}if(P3_3==0){KeyNumber=4;}return KeyNumber;
}void Key_Loop(void)
{static unsigned char NowState,LastState;LastState=NowState;NowState=Key_GetState();if(LastState==1 && NowState==0){Key_KeyNumber=1;}if(LastState==2 && NowState==0){Key_KeyNumber=2;}if(LastState==3 && NowState==0){Key_KeyNumber=3;}if(LastState==4 && NowState==0){Key_KeyNumber=4;}
}
.h
#ifndef __KEY_H__
#define __KEY_H__unsigned char Key(void);
void Key_Loop(void);#endif
Nixie.c
#include <REGX52.H>
#include "Delay.h"unsigned char Nixie_Buf[9]={0,10,10,10,10,10,10,10,10};unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};//0x40为横杠void Nixie_SetBuf(unsigned char Location,Number)
{Nixie_Buf[Location]=Number;
}void Nixie_Scan(unsigned char Location,Number)
{P0=0x00;switch(Location){case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number];
}void Nixie_Loop(void)
{static unsigned char i=1;Nixie_Scan(i,Nixie_Buf[i]);i++;if(i>=9){i=1;}
}
.h
#ifndef __NIXIE_H__
#define __NIXIE_H__void Nixie_SetBuf(unsigned char Location,Number);
void Nixie_Scan(unsigned char Location,Number);
void Nixie_Loop(void);#endif
AT24C02.c
#include <REGX52.H>
#include "I2C.h"#define AT24C02_ADDRESS 0xA0void AT24C02_WriteByte(unsigned char WordAddress,Data)
{I2C_Start();I2C_SendByte(AT24C02_ADDRESS);I2C_ReceiveAck();I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_SendByte(Data);I2C_ReceiveAck();I2C_Stop();
}unsigned char AT24C02_ReadByte(unsigned char WordAddress)
{unsigned char Data;I2C_Start();I2C_SendByte(AT24C02_ADDRESS);I2C_ReceiveAck();I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_Start();I2C_SendByte(AT24C02_ADDRESS|0x01);I2C_ReceiveAck();Data=I2C_ReceiveByte();I2C_SendAck(1);I2C_Stop();return Data;
}
.h
#ifndef __AT24C02_H__
#define __AT24C02_H__
void AT24C02_WriteByte(unsigned char WordAddress,Data);
unsigned char AT24C02_ReadByte(unsigned char WordAddress);
#endif
I2C.c
#include <REGX52.H>sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;void I2C_Start(void)
{I2C_SDA=1;I2C_SCL=1;I2C_SDA=0;I2C_SCL=0;
}void I2C_Stop(void)
{I2C_SDA=0;I2C_SCL=1;I2C_SDA=1;
}void I2C_SendByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){I2C_SDA=Byte&(0x80>>i);I2C_SCL=1;I2C_SCL=0;}
}unsigned char I2C_ReceiveByte(void)
{unsigned char i,Byte=0x00;I2C_SDA=1;for(i=0;i<8;i++){I2C_SCL=1;if(I2C_SDA){Byte|=(0x80>>i);}I2C_SCL=0;}return Byte;
}void I2C_SendAck(unsigned char AckBit)
{I2C_SDA=AckBit;I2C_SCL=1;I2C_SCL=0;
}unsigned char I2C_ReceiveAck(void)
{unsigned char AckBit;I2C_SDA=1;I2C_SCL=1;AckBit=I2C_SDA;I2C_SCL=0;return AckBit;
}
.h
#ifndef __I2C_H__
#define __I2C_H__void I2C_Start(void);
void I2C_Stop(void);
void I2C_SendByte(unsigned char Byte);
unsigned char I2C_ReceiveByte(void);
void I2C_SendAck(unsigned char AckBit);
unsigned char I2C_ReceiveAck(void);#endif
制作秒表——AT24C02储存芯片与用定时器代替Delay函数相关推荐
- c51单片机秒表程序c语言,利用51单片机制作秒表的详细过程
前面的话: 和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难,我同大家一样,百思不得其解,最后头都弄大了才 ...
- QT定时器之QTimer类加QTime类制作秒表
一.QTime时间类 QTime类提供时钟时间函数. QTime对象包含一个时钟时间,即从午夜开始的小时.分钟.秒和毫秒数.它可以从系统时钟中读取当前时间,并测量运行时间的跨度.它提供了比较时间和通过 ...
- python秒表游戏代码_python编程实战:制作秒表程序
现如今生活节奏的加快,再加个人们对营养的需求也是在不断加大.我们平时所食用的食物只有在它烹饪到刚刚好的时候才会把它自身的营养充分的发挥出来,可是我们一般对于它的时间方面不是很好把握,所以对于这一点,秒 ...
- 单片机秒表c语言,单片机制作秒表计时器(c语言)
利用计数器中断,外部中断(按钮)编写的机遇c语言的秒表计时器 利用单片机制作秒表计时器 (c语言) #include//包含单片机对应的头文件 int MM=0,SS=0,MS=0; int time ...
- js制作秒表计时器代码怎么写
js制作秒表计时器教程,js制作秒表计时器代码怎么写教程如下: js实现代码: var t=[0, 0, 0, 0, 0, 0, 0, 1]; var firstsplitflag = 0; var ...
- javascript基础复习之函数,定时器,erval函数
Function对象 JS中函数就是Function对象 函数名就是指向Function对象的引用 使用函数名就可以访问函数的对象 函数名()是调用函数 function 函数名 ([参数]) {函数 ...
- 【WCH】CH32F203将通用定时器作为延时函数的时间基准使用
[WCH]CH32F203将通用定时器作为延时函数的时间基准使用
- DSP开发,F28335通过SPI和定时器实现数码管计数器以及按键使用-不使用Delay函数
DSP开发,F28335通过SPI和定时器实现数码管计数器以及按键使用-不使用Delay函数 1 概述 1.1 资源概述 1.2 程序简介 2 程序源码 2.1 main主函数 2.2计时器显示程序源 ...
- c语言爱心灯制作步骤,如何使用LED和555定时器制作闪烁爱心LED灯
描述 步骤1:组件 我知道有些物品可能不在电路中,但我向你们保证,我和这条电路都是100%工作 Red Leds - 16或更多 330ohm电阻器 - 1 Wyro板(如图所示) 555定时器IC( ...
最新文章
- [算法]链表的逆序遍历节点
- 多线程和单线程 打印数字到100000 的速度对比
- Linux内核态下的文件操作
- 如何在Android Studio中获取SHA-1指纹证书以获得调试模式?
- 手机腾讯网mt2.0增量更新算法优化小记
- 百度大脑全面解析如何通过NLP、CV和ASR等技术将企业服务智能化
- 删除Windows下的Linux系统
- Project Euler problem 61
- delete postman 传参_Postman高级应用——串行传参和动态传参详解
- 冰点还原精灵V8.37.020系统还原软件
- Python 温度转换
- pcf8591c语言编程,PCF8591应用程序
- 十年感悟之 python之路
- Buy and Resell
- 凸优化基础知识笔记-凸集、凸函数、凸优化问题
- Web项目经理手册之项目经理需要铭记在心的话
- 警告:面临潜在的安全风险_HTML5网站展示:48个潜在的Flash演示
- java as关键字_Java 关键字专题
- Java专题 Map,hashMap 多种遍历方式 总结+统计字符出现次数案例
- 联发科4G方案因势利导 2016年芯片市场有望迎来大反转