有仿真有程序,需要的可以点击下载哦
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- #include <reg52.h> //调用单片机头文件
- #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
- #define uint unsigned int //无符号整型 宏定义 变量范围0~65535
- #include "eeprom52.h"
- #include "nongli.h"
- #include "intrins.h"
- #include "keyscan.h"
- #include "ds1302.h"
- #include "lcd1602.h"
- #include "stop_watch.h"
- uchar flag_nl; //农历 阳历显示标志位
- uchar key_time,flag_value; //用做连加的中间变量
- bit key_500ms ;
- /*************时钟显示***************/
- void init_1602_ds1302()
- {
- if(dis_mode == 0)
- {
- write_sfm2_ds1302(1,2,shi); //显示时
- write_sfm2_ds1302(1,5,fen); //显示分
- write_sfm2_ds1302(1,8,miao); //显示秒
- write_week(2,12,week);
- //write_sfm1(1,14,week); //显示星期
- if(flag_nl == 0) //显示阳历
- {
- write_sfm2_ds1302(2,2,nian); //显示年
- write_sfm2_ds1302(2,5,yue); //显示月
- write_sfm2_ds1302(2,8,ri); //显示日
- }
- else //显示农历
- {
- write_sfm2_ds1302(2,2,n_nian); //显示年
- write_sfm2_ds1302(2,5,n_yue); //显示月
- write_sfm2_ds1302(2,8,n_ri); //显示日
-
- }
- }
- if(dis_mode == 1) //显示秒表
- {
- Stopwatch();
- }
- }
- /*****************主函数********************/
- void main()
- {
- delay_1ms(150);
- P0 = P1 = P2 = P3 = 0xff; //单片机IO口初始化为1
- init_time0(); //初始化定时器
- init_ds1302(); //ds1302初始化
- init_1602(); //lcd1602初始化
- init_1602_dis_csf(); //lcd1602初始化显示
- while(1)
- {
- key(); //按键程序
- if(key_can < 10)
- {
- if(menu_1 == 0)
- {
- if(key_can == 4) //减键
- {
- if(dis_mode == 0)
- {
- flag_nl = ~flag_nl; //切换农历和阳历的显示标志位
- if(flag_nl == 0)
- write_string(2,0,"2019");
- else
- write_string(2,0,"N ");
- }
- }
- }
- }
- if(dis_mode == 0)
- {
- if(flag_200ms == 1)
- {
- flag_200ms = 0;
- if(menu_1 == 0)
- {
- read_time(); //读时间
- init_1602_ds1302(); //显示时钟
- }
- }
- delay_1ms(1);
- }
- if(dis_mode == 1)
- {
- init_1602_ds1302(); //显示秒表
- if(menu_1 == 0)
- {
- if(key_can == 3) //加键
- {
- TR1 = ~TR1;
- }
- }
- }
- }
- }
- /**************定时器0中断程序*****************/
- void time0() interrupt 1
- {
- static uchar value;
- TH0 = 0X3C;
- TL0 = 0XB0; //50ms
- value ++;
- if((value % 2) == 0) //100ms
- flag_100ms = 1;
- if(value >= 6) //200ms
- {
- value = 0;
- flag_200ms = 1;
- }
- }
- /**************切换显示控制中断函数*****************/
- void xianshimoshi()interrupt 0
- {
- clear_1602();
- dis_mode++;
- if(dis_mode != 1)init_1602_dis_csf();
- if(dis_mode > 1)
- dis_mode = 0;
- }
复制代码
所有资料51hei提供下载:
版本1.rar
(388.45 KB, 下载次数: 74)
|