创新设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创新设计
专业班级:08电子(1)班姓名:吴剑学号:201810330126
设计简介:
本设计是一个通过51单片机来操纵路灯亮/灭。例如:晚上19:30路灯亮,到早上6:00熄灭,当时钟走到19:30时路灯点亮,同理在6:00时熄灭,实现自动操纵。为了防止偶然断电或停机后再开机致使设定值丢失,那个地点使用了AT24C02来经历设定的定时值。P1口作为操纵输出口操纵继电器从而达到操纵路灯的作用。亮、灭时刻可随时调整,提高了操纵的灵活性和准确性。
为了进行校时及定时值设定,规定了六种工作状态。状态0(status=0):正常走时;状态1(status=1):输入定时1的“分”状态;状态2(status=2):输入定时1的“时”状态;状态3(status=3):输入定时2的“分”状态;状态4(status=4):输入定时2的“时”状态;状态5(status=5):校正走时态。
状态0:从左往右六只数码管依次显示走时的时、分、秒。
状态1:从左往右的显示依次为:状态1显示(1位);无显示;定时1的“分”显示。后两位无显示。按下S6/S5进行加减。
状态2:从左往右的显示依次为:状态2显示(1位);无显示;定时1的“时”显示。后两位无显示。按下S6/S5进行加减
状态3:从左往右的显示依次为:状态3显示(1位);无显示;定时2的“分”显示。后两位无显示。按下S6/S5进行加减。
状态4:从左往右的显示依次为:状态4显示(1位);无显示;定时2的“时”显示。后两位无显示。按下S6/S5进行加减。
状态5:从左往右的显示依次为:状态5显示(1位);无显示;时钟的“分”显示。后两位无显示。按下S6/S5进行加减。
对AT24C02内部储存单元规划:80、81单元存放定时1的分、时值;90、91单元存放定时2的分、时值;100号单元存放首次写入的标志,若写入过,则100号单元置数100. 框图如下:
电路图如下:
源程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[10]={0xa0,0xbe,0x62,0x2a,0x3c,0x29,0x21,0xba,0x20,0x28}; /*共阳*/ uchar code ACT[4]={0xbf,0xdf,0xef,0x7f,0xfd,0xfe};
sbit output=P1^0;
#define INC_KEY 0xfb //S6按下
#define DEC_KEY 0xf7 //S5按下
#define OK_KEY 0xef //S4按下
#define STATUS_KEY 0xdf //S3按下
uchar status;
uchar deda,sec,min,hour;
uchar set1_dat[2],set2_dat[2];
bit set1_flag,set2_flag;
sbit SDA=P2^0;
sbit SCL=P2^1;
static uchar time_cnt;
static bit bit_flag;
void delay_icc(int n)
{int i;
for(i=1;i } void delay() {;;} void delay1ms(uint z) {uint i,j; for(i=0;i for(j=0;j<110;j++); } void start()//开始函数 {SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); } void stop()//停止函数 {SDA=0; delay(); SCL=1; delay(); SDA=1; delay(); } void respons()//应答函数 {uchar i; SCL=1; delay(); while((SDA==1)&&(i<250))i++; SCL=0; delay(); } void write_byte(uchar date)//写一字节{uchar i,temp; temp=date; for(i=0;i<8;i++) {temp=temp<<1; SCL=0; delay(); SDA=CY; delay(); SCL=1; delay(); } SCL=0; delay(); SDA=1; delay(); } uchar read_byte() {uchar i,k; SCL=0; delay(); SDA=1; delay(); for(i=0;i<8;i++) {SCL=1; delay(); k=(k<<1)|SDA; SCL=0; } return k; } void write_add(uchar address,uchar date) {start(); write_byte(0xa0); respons(); write_byte(address); respons(); write_byte(date); respons(); stop(); } uchar read_add(uchar address) {uchar date; start(); write_byte(0xa0);//芯片寻址(10100000)写respons(); write_byte(address); respons(); start(); write_byte(0xa1);//芯片寻址(1010001)读respons(); date=read_byte(); stop(); return date; } void initial() {uchar rd_value; rd_value=read_add(100);delay_icc(250); if(rd_value==88) {set1_dat[0]=read_add(80);delay_icc(250); set1_dat[1]=read_add(81);delay_icc(250); set2_dat[0]=read_add(90);delay_icc(250); set2_dat[1]=read_add(91);delay_icc(250); } TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65536-1000)/256; TL1=(65536-1000)%256; TR0=1;