ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:19.11KB ,
资源ID:27594528      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27594528.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机设计程序.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单片机设计程序.docx

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