“非易失存储器”设计说明
1 相关资料下载:
2 程序设计框架说明
本案例程序设计主要分为:24C02、按键、数码管显示三个模块。
2.1宏定义
#define FOSC 11059200L //晶振频率
#define T_ms 0.1 //定时时间为0.1ms=100us
#define NMAX_KEY 10 //计数消抖限定值
2.2引脚定义
/********24C02*******/
sbitDAT=P4^0; //I2C总线的数据线
sbitCLK=P5^5; //I2C总线的时钟线
/********数码管显示******/
sbitled =P2^3; //数码管与LED灯切换引脚
sbitKey1=P3^2; //按下key1,向存储器写入数据并读取该地址的数据,显 示在数码管上。
sbitKey2=P3^3; //按下key2,要写入的数据加1
sbitKey3=P1^7; //按下key3,要写入的地址加1
2.3变量定义
uchar duan[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段选,显示0-f
ucharwei[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //数码管位选
uchar flag1; //数码管循环扫描变量
uchar write_addr; //写入地址
uchar write_date; //写入数据
uchar read_date; //读出数据
/********按键计数消抖变量******/
uchar G_count; //定时器0中断计数值
uint Key1_count; //KEY1键在1ms内达到低电平的次数
uint Key2_count; //KEY2键在1ms内达到低电平的次数
uint Key3_count; //KEY3键在1ms内达到低电平的次数
uint Key_count; //由100递减到0的变量
bit flg_1ms; //表示1ms时间到
bit Key1_C; /*key1当前的状态*/
bit Key1_P; /*key1前一个状态*/
bit Key2_C; /*key2当前的状态*/
bit Key2_P; /*key2前一个状态*/
bit Key3_C; /*key3当前的状态*/
bit Key3_P; /*key3前一个状态*/
3 程序函数说明
3.1 延时程序
void delay() //延时4us
void delay(unsigned int xms) //延时xms
3.2 24C02读写函数
void start(); //主机发送的启动信号
void respons(); //从机应答信号
void stop(); //停止信号
void writebyte(uchar da); //对24C16写一个字节数据
uchar readbyte(); //从24C16中读一个字节数据
void write_add(uchar addr,uchar date); //对24C16的地址addr写入一个数据da
uchar read_add(uchar addr); //从24C16的addr地址,读一个字节数据
3.3 数码管显示函数
void SMG1 (uchar date1,uchar date2,uchar date3);
3.4 定时器0中断函数
void Timer_T0() interrupt 1; //在定时器中短中调用数码管显示函数
3.5 系统初始化
void IIC_init(); //IIC总线初始化
void Timer0_Init(); //定时器0初始化
void KEY_init(); //按键消抖模块初始化
4 程序设计框架及关键技巧说明
4.1 I/O引脚及相关寄存器配置
4.1.1 I/O引脚:
(1)数码管位选引脚
整个设置P2口的值;
(2)数码管使能引脚
sbit led = P2^3 ;
(3)DS1302引脚
sbit DAT=P4^0; //I2C总线的数据线
sbit CLK=P5^5; //I2C总线的时钟线
(4)按键引脚
sbit key1 = P3^2 ; //写入数据并读取数据显示在数码管上
sbit key2 =P3^3; //写入的数据加1
sbit key3 =P1^7; //写入的数据的地址加1
4.2 定时器0寄存器设置
TMOD=0x00; //计时器0工作方式0,16位自动重装计数
AUXR=0x80; //1T模式,T0x12=1,
EA=1; //开总中断
ET0=1; //开定时器0中断
TH0=(65536-T_ms*FOSC/1000)/256;//给定时器赋初值
TL0=(65536-T_ms*FOSC/1000);
TR0=1; //启动定时器
4.3程序流程图


