本来准备学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);