1、单片机设计程序用STC52编的,下面是C程序,调试已经成功,自己看程序吧#include#include #define uchar unsigned char#define uint unsigned int#define LCD_data P0sbit SDA=P35;sbit SCL=P34;/24C08控制口设置sbit LCD_RS = P33; /寄存器选择输入sbit LCD_RW = P36; /液晶读/写控制sbit LCD_EN = P37; /液晶使能控制sbit LCD_PSB = P32; /串/并方式控制sbit FM=P24;/蜂鸣器控制口sbit RS=P25;
2、sbit T_CLK = P20; /实时时钟时钟线引脚 /sbit T_IO = P21; /实时时钟数据线引脚 /sbit T_RST = P22; /实时时钟复位线引脚 /sbit ds=P23;sbit EN=P26;sbit ZZ=P27;sbit FZ=P31;sbit ACC0=ACC0;sbit ACC7=ACC7;uint temp1,s_temp; /定义整形变量float f_temp; /定义浮点型变量uchar time= : : ;uchar day= 20 / / ( ) ;uchar temp0= 温度: . 度 ;uchar num,num1,flag,cou
3、nt,a,b;uchar unlock_i;/解密标志位uchar t4;uchar t14;void delay_ms(uint z)/长延时uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void delay() /短延时,大约5us; ;void reshi()if(RS=1) unlock_i=1;elseunlock_i=0;uchar code mima=0,1,2,3,4,5,6,7,8,9,0,*;void lcd_xieping0(uchar x,uchar y,uchar date);void lcd_xieping(uchar x,ucha
4、r y,uchar *str);/*/ 开机显示/*void kjxs()uint i,j;lcd_xieping(0,0,*);lcd_xieping(1,0, 欢迎进入 );lcd_xieping(2,0, 密码锁系统! );lcd_xieping(3,0,*);delay_ms(4000);lcd_xieping(0,0, 系统初始化中 );lcd_xieping(1,0, 请稍后 );lcd_xieping(2,0,);lcd_xieping(3,0, );for(j=3;j0;j-)for(i=0;i8;i+)lcd_xieping(3,i,*);delay_ms(250);lcd_
5、xieping(3,0, );/*/ 12864显示/*void write_cmd(uchar cmd)LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;P0 = cmd;delay_ms(5);LCD_EN = 1;delay_ms(5);LCD_EN = 0;void write_dat(uchar dat)LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delay_ms(5);LCD_EN = 1;delay_ms(5);LCD_EN = 0;void lcd_xieping0(uchar x,uchar y,uchar date)s
6、witch(x)case 0: write_cmd(0x80+y); break;case 1: write_cmd(0x90+y); break;case 2: write_cmd(0x88+y); break;case 3: write_cmd(0x98+y); break;write_dat(date);void lcd_xieping(uchar x,uchar y,uchar *str)switch(x)case 0: write_cmd(0x80+y); break;case 1: write_cmd(0x90+y); break;case 2: write_cmd(0x88+y)
7、; break;case 3: write_cmd(0x98+y); break;while (*str)write_dat(*str);str+;void lcd_init()LCD_PSB = 1; /并口方式write_cmd(0x30); /基本指令操作delay_ms(5);write_cmd(0x0C); /显示开,关光标delay_ms(5);write_cmd(0x01); /清除LCD的显示内容delay_ms(5);/*/ 键盘扫描函数/*uchar keyscan1() /矩阵键盘扫描函数uchar temp;while(!num)P1=0xfe; /赋值temp=P1;
8、 /读回数据temp=temp&0xf0; /与运算if(temp!=0xf0) /判断delay_ms(2); /延时消抖temp=P1; /读回数据temp=temp&0xf0;if(temp!=0xf0)switch(temp) /多分支选择case 0x70:num=1;break; /跳出case 0xb0:num=2;break;case 0xd0:num=3;break;case 0xe0:num=4;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;/等待按键释放P1=0xfd; /赋值temp=P1; /读回数据temp=temp&0
9、xf0; /与运算if(temp!=0xf0) /判断delay_ms(2); /延时消抖temp=P1; /读回数据temp=temp&0xf0;if(temp!=0xf0)switch(temp) /多分支选择case 0x70:num=5;break; /跳出case 0xb0:num=6;break;case 0xd0:num=7;break;case 0xe0:num=8;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;/等待按键释放P1=0xfb; /赋值temp=P1; /读回数据temp=temp&0xf0; /与运算if(temp!
10、=0xf0) /判断delay_ms(2); /延时消抖temp=P1; /读回数据temp=temp&0xf0;if(temp!=0xf0)switch(temp) /多分支选择case 0x70:num=9;break; /跳出case 0xb0:num=10;break;case 0xd0:num=11;break;case 0xe0:num=12;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;/等待按键释放return(num); /返回值uchar keyscan2()uchar temp;while(!num1)P1=0xf7; /赋值
11、temp=P1; /读回数据temp=temp&0xf0; /与运算if(temp!=0xf0) /判断delay_ms(2); /延时消抖temp=P1; /读回数据temp=temp&0xf0;if(temp!=0xf0)switch(temp) /多分支选择case 0x70:num1=1;break; /跳出case 0xb0:num1=2;break;case 0xd0:num1=3;break;case 0xe0:num1=4;break;while(temp!=0xf0)temp=P1;temp=temp&0xf0;/等待按键释放return(num1);/*/ 直流电机/*vo
12、id dianjiZZ()EN=1;ZZ=1;FZ=0;void dianjiFZ()EN=1;ZZ=0;FZ=1;void dianji_stop()EN=0;/*/ EPPROM/*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)&(i250)i+;SCL=0;delay();void write
13、byte(uchar date) /写一个字节uchar i,temp;temp=date;for(i=0;i8;i+)temp=temp1;SCL=0;delay();SDA=CY;delay();SCL=1;delay();SCL=0;delay();SDA=1; /释放总线delay();uchar readbyte() /读一个字节uchar i,k;SCL=0;delay();SDA=1;for(i=0;i8;i+)SCL=1;delay();k=(k0; i-)T_IO = ACC0; /*相当于汇编中的 RRCT_CLK = 1;T_CLK = 0;ACC =ACC 1;ucha
14、r uc_RTOutputByte(void)uchar i;for(i=8; i0; i-)ACC = ACC1; /*相当于汇编中的 RRCACC7 = T_IO;T_CLK = 1;T_CLK = 0;return(ACC);void v_W1302(uchar ucAddr, uchar ucDa)T_RST = 0;T_CLK = 0;T_RST = 1;v_WTInputByte(ucAddr); /* 地址,命令 */v_WTInputByte(ucDa); /* 写1Byte数据*/T_CLK = 1;T_RST =0;uchar uc_R1302(uchar ucAddr)u
15、char ucDa;T_RST = 0;T_CLK = 0;T_RST = 1;v_WTInputByte(ucAddr); / 地址,命令 /ucDa = uc_RTOutputByte(); / 读1Byte数据 /T_CLK = 1;T_RST =0;return(ucDa);void Init1302(void)v_W1302(0x8e,0x00); /控制写入WP=0v_W1302(0x80,0x80);v_W1302(0x90,0xa9);v_W1302(0x80,0x00); /秒v_W1302(0x82,0x24); /分v_W1302(0x84,0x12); /时v_W130
16、2(0x86,0x29); /日v_W1302(0x88,0x10); /月v_W1302(0x8a,0x05); /星期v_W1302(0x8c,0x10); /年 /v_W1302(0x8e,0x80);void donetime(void)uchar d;d=uc_R1302(0x87);day10=(d&0x0f)+48;day9=(d4)&0x03)+48;d=uc_R1302(0x89);day7=(d&0x0f)+48;day6=(d4)&0x01)+48;d=uc_R1302(0x8b);day13=(d&0x07)+48;d=uc_R1302(0x8d);day4=(d&0x
17、0f)+48;day3=(d4)+48;d=uc_R1302(0x81);time15=(d&0x0f)+48;time14=(d4)+48;d=uc_R1302(0x83);time12=(d&0x0f)+48;time11=(d4)+48;d=uc_R1302(0x85);time9=(d&0x0f)+48;time8=(d4)+48;/*/ 温度检测函数/*void dsreset(void) /18B20复位,初始化函数uint i;ds=0;i=103;while(i0)i-;ds=1;i=4;while(i0)i-;bit tempreadbit(void) /读1位函数uint
18、i;bit dat;ds=0;i+; /i+ 起延时作用ds=1;i+;i+;dat=ds; /读数据i=8;while(i0)i-;return (dat);uchar tempread(void) /读1个字节uchar i,j,dat;dat=0;for(i=1;i=8;i+)j=tempreadbit();dat=(j1); /读出的数据最低位在最前面,这样刚好一个字节在DAT里return(dat);void tempwritebyte(uchar dat) /向18B20写一个字节数据uint i;uchar j;bit testb;for(j=1;j1;if(testb) /写
19、1ds=0;i+;i+;ds=1;i=8;while(i0)i-;elseds=0; /写 0i=8;while(i0)i-;ds=1;i+;i+;void tempchange(void) /DS18B20 开始获取温度并转换dsreset(); /初始化,每次对18B20的操作都首先要初始化delay_ms(1);tempwritebyte(0xcc); / 写跳过读ROM指令tempwritebyte(0x44); / 写温度转换指令void get_temp() /读取寄存器中存储的温度数据uchar a,b;dsreset(); /初始化delay_ms(1);tempwritebyte(0xcc); / 写跳过读ROM指令tempwritebyte(0xbe); /写读指令a=tempread(); /读低8位b=tempread(); /读高8位temp1=b;temp1=8; /两个字节组合为1个字temp1=temp1|a;f_temp=temp1*0.0625; /温度在寄存器中为12位 分辨率位0.0625/*/ 解密函数/*void unlock()uchar in,i;if(num=0)l
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1