㈠ 单片机题目高分寻求解答
哇靠!你哪来的这么多的题目
我考试不会有这么难的吧?
先借来练习练习
答案嘛
我不确定是否正确我就不发给你看了
㈡ 谁有现成的用单片机做的毕业设计,最好是全套的资料,论文、原理图、PCB图等,好的可以加分
目录
摘 要 I
Abstract II
目录 III
第一章 绪 论 - 1 -
1.1课题的背景 - 1 -
1.2课题意义 - 2 -
1.3本章小结 - 3 -
第二章 总体设计方案与论证 - 4 -
2.1 电源模块方案的选择与论证 - 4 -
2.2 时钟电路方案的选择与论证 - 4 -
2.3 显示电路方案的选择与论证 - 5 -
2.4 闹钟电路方案的选择与论证 - 5 -
2.5 键扫描电路方案的选择与论证 - 6 -
2.6 本章小结 - 6 -
第三章 系统硬件设计 - 7 -
3.1 主控芯片STC89C52的介绍 - 7 -
3.1.1 STC89C52的主要性能参数 - 7 -
3.1.2 STC89C52单片机的功能特性概述: - 8 -
3.2时钟部分功能介绍及电路设计 - 11 -
3.3显示模块功能介绍及电路设计 - 14 -
3.4闹钟电路模块介绍及电路设计 - 16 -
3.5功能按键模块介绍及电路设计 - 17 -
3.6电源模块介绍及电路设计 - 17 -
3.7 本章小结 - 18 -
第四章 系统软件设计 - 19 -
4.1日历程序设计 - 19 -
4.2 时间调整程序设计 - 20 -
4.3 闹钟设置程序设计 - 22 -
4.4 闹钟蜂鸣程序设计 - 23 -
4.5本章小结 - 23 -
第五章 系统调试 - 24 -
5.1系统的调试 - 24 -
5.2系统的调试出现的问题及解决 - 24 -
5.3本章小结 - 24 -
第六章 结 论 - 25 -
参考文献 - 26 -
致 谢 - 27 -
附录 - 28 -
附录一 :本设计电路原理图 - 28 -
附录二:数字日历钟电路设计的C程序 - 29 -
㈢ 跪求 51单片机+12864液晶+1302时钟制成的万年历c程序
顶层文件 万年历.C
#include<reg51.h>
#include "LCD1602.h"
#include "DS1302.h"
#define uchar unsigned char
#define uint unsigned int
sbit speaker=P2^4;
bit key_flag1=0,key_flag2=0;
SYSTEMTIME adjusted;
uchar sec_add=0,min_add=0,hou_add=0,day_add=0,mon_add=0,yea_add=0;
uchar data_alarm[7]={0};
/************键盘控制******************************/
int key_scan() //扫描是否有键按下
{ int i=0;
uint temp;
P1=0xf0;
temp=P1;
if(temp!=0xf0)
i=1;
else
i=0;
return i;
}
uchar key_value() //确定按键的值
{
uint m=0,n=0,temp;
uchar value;
uchar v[4][3]={'2','1','0','5','4','3','8','7','6','b','a','9'} ;
P1=0xfe; temp=P1; if(temp!=0xfe)m=0;
P1=0xfd;temp=P1 ;if(temp!=0xfd)m=1;
P1=0xfb;temp=P1 ;if(temp!=0xfb)m=2;
P1=0xf7;temp=P1 ;if(temp!=0xf7)m=3;
P1=0xef;temp=P1 ;if(temp!=0xef)n=0;
P1=0xdf;temp=P1 ;if(temp!=0xdf)n=1;
P1=0xbf;temp=P1 ;if(temp!=0xbf)n=2;
value=v[m][n];
return value;
}
/***************************设置闹铃函数*******************************/
void naoling(void)
{
uchar i=0,l=0,j;
init1602();
while(key_flag2&&i<12)
if(key_scan()){j=key_value();write_data(j);if(i%2==0)data_alarm[l]=(j-'0')*10;else {data_alarm[l]+=(j-'0');l++;}i++;delay(600);}
write_com(0x01);
}
uchar according(void)
{ uchar k;
if(data_alarm[0]==adjusted.Year&&data_alarm[1]==adjusted.Month&&data_alarm[2]==adjusted.Day&&data_alarm[3]==adjusted.Hour&&data_alarm[4]==adjusted.Minute&&data_alarm[5]==adjusted.Second)
k=1;
else k=0;
return k;
}
void speak(void)
{uint i=50;
while(i)
{speaker=0;
delay(1);
speaker=1;
delay(1);
i--;
}
}
void alarm(void)
{uint i=10;
while(i)
{
speak();
delay(10);
i--;
}
}
/**************************修改时间操作********************************/
void reset(void)
{
sec_add=0;
min_add=0;
hou_add=0;
day_add=0;
mon_add=0;
yea_add=0 ;
}
void adjust(void)
{
if(key_scan()&&key_flag1)
switch(key_value())
{case '0':sec_add++;break;
case '1':min_add++;break;
case '2':hou_add++;break;
case '3':day_add++;break;
case '4':mon_add++;break;
case '5':yea_add++;break;
case 'b':reset();break;
default: break;
}
adjusted.Second+=sec_add;
adjusted.Minute+=min_add;
adjusted.Hour+=hou_add;
adjusted.Day+=day_add;
adjusted.Month+=mon_add;
adjusted.Year+=yea_add;
if(adjusted.Second>59) adjusted.Second=adjusted.Second%60;
if(adjusted.Minute>59) adjusted.Minute=adjusted.Minute%60;
if(adjusted.Hour>23) adjusted.Hour=adjusted.Hour%24;
if(adjusted.Day>31) adjusted.Day=adjusted.Day%31;
if(adjusted.Month>12) adjusted.Month=adjusted.Month%12;
if(adjusted.Year>100) adjusted.Year=adjusted.Year%100;
}
/**************************中断处理函数*********************************/
void changing(void) interrupt 0 using 0 //需要修改时间和日期,或者停止修改
{
if(key_flag1)key_flag1=0;
else key_flag1=1;
}
void alarming(void) interrupt 3 using 0 //需要设置闹铃或者停止设置
{
if(key_flag2)key_flag2=0;
else key_flag2=1;
}
/********************************主函数***********************************/
main()
{uint i;
uchar *l;
uchar p1[]="D:",p2[]="T:";
SYSTEMTIME T;
EA=1;
EX0=1;
IT0=1;
EA=1;
EX1=1;
IT1=1;
init1602();
Initial_DS1302() ;
while(1)
{ write_com(0x80);
write_string(p1,2);
write_com(0xc0);
write_string(p2,2);
DS1302_GetTime(&T) ;
adjusted.Second=T.Second;
adjusted.Minute=T.Minute;
adjusted.Hour=T.Hour;
adjusted.Week=T.Week;
adjusted.Day=T.Day;
adjusted.Month=T.Month;
adjusted.Year=T.Year;
for(i=0;i<9;i++)
{
adjusted.DateString[i]=T.DateString[i];
adjusted.TimeString[i]=T.TimeString[i];
}
adjust();
if(key_flag2)naoling();
if(according())alarm();
DateToStr(&adjusted);
TimeToStr(&adjusted);
write_com(0x82);
write_string(adjusted.DateString,8);
write_com(0xc2);
write_string(adjusted.TimeString,8);
delay(10);
}
(二)头文件1 显示模块 LCD1602.H
#ifndef LCD_CHAR_1602_2009_5_9
#define LCD_CHAR_1602_2009_5_9
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs = P2^0;
sbit lcdrw = P2^1;
sbit lcden = P2^2;
void delay(uint z) // 延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) // 写入指令数据到 lcd
{
lcdrw=0;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) // 写入字符显示数据到 lcd
{
lcdrw=0;
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init1602() // 初始化设定
{
lcdrw=0;
lcden=0;
write_com(0x3C);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void write_string(uchar *pp,uint n)
{
int i;
for(i=0;i<n;i++)
write_data(pp[i]);
}
#endif
(三)头文件2 时钟模块 DS1302.H
#ifndef _REAL_TIMER_DS1302_2009_5_20_
#define _REAL_TIMER_DS1302_2003_5_20_
sbit DS1302_CLK = P2^6; //实时时钟时钟线引脚
sbit DS1302_IO = P2^7; //实时时钟数据线引脚
sbit DS1302_RST = P2^5; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
typedef struct SYSTEM_TIME
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[9]; //用这两个字符串来放置读取的时间
unsigned char TimeString[9];
}SYSTEMTIME; //定义的时间类型
#define AM(X) X
#define PM(X) (X+12) // 转成24小时制
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
#define DS1302_RAM(X) (0xC0+(X)*2) //用于计算 DS1302_RAM 地址的宏
/******内部指令**********/
void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0;
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1; //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;
}
}
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
/********************************/
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
}
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 读1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}
void DS1302_SetProtect(bit flag) //是否写保护
{
if(flag)
Write1302(0x8E,0x10);
else
Write1302(0x8E,0x00);
}
void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数
{
DS1302_SetProtect(0);
Write1302(Address, ((Value/10)<<4 | (Value%10))); //将十进制数转换为BCD码
} //在DS1302中的与日历、时钟相关的寄存器存放的数据必须为BCD码形式
void DS1302_GetTime(SYSTEMTIME *Time)
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将BCD码转换为十进制数
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
}
unsigned char *DataToBCD(SYSTEMTIME *Time)
{
unsigned char D[8];
D[0]=Time->Second/10<<4+Time->Second%10;
D[1]=Time->Minute/10<<4+Time->Minute%10;
D[2]=Time->Hour/10<<4+Time->Hour%10;
D[3]=Time->Day/10<<4+Time->Day%10;
D[4]=Time->Month/10<<4+Time->Month%10;
D[5]=Time->Week/10<<4+Time->Week%10;
D[6]=Time->Year/10<<4+Time->Year%10;
return D;
}
void DateToStr(SYSTEMTIME *Time)
{
//将十进制数转换为液晶显示的ASCII值
Time->DateString[0] = Time->Year/10 + '0';
Time->DateString[1] = Time->Year%10 + '0';
Time->DateString[2] = '-';
Time->DateString[3] = Time->Month/10 + '0';
Time->DateString[4] = Time->Month%10 + '0';
Time->DateString[5] = '-';
Time->DateString[6] = Time->Day/10 + '0';
Time->DateString[7] = Time->Day%10 + '0';
Time->DateString[8] = '\0';
}
void TimeToStr(SYSTEMTIME *Time)
{
//将十进制数转换为液晶显示的ASCII值
Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';
Time->TimeString[2] = ':';
Time->TimeString[3] = Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10 + '0';
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10 + '0';
Time->DateString[8] = '\0';
}
void Initial_DS1302(void)
{
unsigned char Second;
Second=Read1302(DS1302_SECOND);
if(Second&0x80) //初始化时间
DS1302_SetTime(DS1302_SECOND,0);
}
void DS1302_TimeStop(bit flag) // 是否将时钟停止
{
unsigned char Data;
Data=Read1302(DS1302_SECOND);
DS1302_SetProtect(0);
if(flag)
Write1302(DS1302_SECOND, Data|0x80);
else
Write1302(DS1302_SECOND, Data&0x7F);
}
#endif
㈣ 急求《单片机C语言程序设计实训100例——基于8051+Proteus仿真》第三部分综合设计C语言源代码
这本书一共5章节,你说第三部分指的哪里?
第五章才是综合设计部分啊,而且这部分有好多例程,也不知道你要哪部分?
第1章 8051单片机C语言程序设计概述 1
1.1 8051单片机引脚 1
1.2 数据与程序内存 5
1.3 特殊功能寄存器 6
1.4 外部中断、定时器/计数器及串口应用 8
1.5 有符号与无符号数应用、数位分解、位操作 9
1.6 变量、存储类型与存储模式 11
1.7 关于C语言运算符的优先级 13
1.8 字符编码 15
1.9 数组、字符串与指针 16
1.10 流程控制 18
1.11 可重入函数和中断函数 19
1.12 C语言在单片机系统开发中的优势 20
第2章 Proteus操作基础 21
2.1 Proteus操作界面简介 21
2.2 仿真电路原理图设计 22
2.3 元件选择 25
2.4 调试仿真 29
2.5 Proteus与Vision 3的联合调试 29
2.6 Proteus在8051单片机应用系统开发的优势 30
第3章 基础程序设计 32
3.1 闪烁的LED 32
3.2 双向来回的流水灯 34
3.3 花样流水灯 36
3.4 LED模拟交通灯 38
3.5 分立式数码管循环显示0~9 40
3.6 集成式数码管动态扫描显示 41
3.7 按键调节数码管闪烁增减显示 44
3.8 数码管显示4×4键盘矩阵按键 46
3.9 普通开关与拨码开关应用 49
3.10 继电器及双向可控硅控制照明设备 51
3.11 INT0中断计数 53
3.12 INT0及INT1中断计数 55
3.13 TIMER0控制单只LED闪烁 58
3.14 TIMER0控制数码管动态管显示 62
3.15 TIMER0控制8×8LED点阵屏显示数字 65
3.16 TIMER0控制门铃声音输出 68
3.17 定时器控制交通指示灯 70
3.18 TIMER1控制音阶演奏 72
3.19 TIMER0、TIMER1及TIMER2实现外部信号计数与显示 75
3.20 TIMER0、TIMER1及INT0控制报警器与旋转灯 77
3.21 按键控制定时器选播多段音乐 79
3.22 键控看门狗 82
3.23 双机串口双向通信 84
3.24 PC与单片机双向通信 90
3.25 单片机内置EEPROM读/写测试 95
第4章 硬件应用 99
4.1 74HC138译码器与反向缓冲器控制数码管显示 100
4.2 串入并出芯片74HC595控制数码管显示四位数字 103
4.3 用74HC164驱动多只数码管显示 106
4.4 并串转换器74HC165应用 110
4.5 用74HC148扩展中断 112
4.6 串口发送数据到2片8×8点阵屏滚动显示 115
4.7 数码管BCD解码驱动器CD4511与DM7447应用 117
4.8 62256RAM扩展内存 119
4.9 用8255实现接口扩展 121
4.10 可编程接口芯片8155应用 124
4.11 串行共阴显示驱动器控制4+2+2集成式数码管显示 129
4.12 14段与16段数码管演示 133
4.13 16键解码芯片74C922应用 136
4.14 1602字符液晶工作于8位模式直接驱动显示 139
4.15 1602液晶显示DS1302实时时钟 148
4.16 1602液晶屏工作于8位模式由74LS373控制显示 153
4.17 1602液晶屏工作于4位模式实时显示当前时间 155
4.18 1602液晶屏显示DS12887实时时钟 159
4.19 时钟日历芯片PCF8583应用 167
4.20 2×20串行字符液晶屏显示 174
4.21 LGM12864液晶屏显示程序 177
4.22 TG126410液晶屏串行模式显示 184
4.23 Nokia7110液晶屏菜单控制程序 192
4.24 T6963C液晶屏图文演示 199
4.25 ADC0832 A/D转换与LCD显示 211
4.26 用DAC0832生成锯齿波 215
4.27 ADC0808 PWM实验 217
4.28 ADC0809 A/D转换与显示 220
4.29 用DAC0808实现数字调压 221
4.30 16位A/D转换芯片LTC1864应用 223
4.31 I2C接口存储器AT24C04读/写与显示 225
4.32 I2C存储器设计的中文硬件字库应用 233
4.33 I2C接口4通道A/D与单通道D/A转换器PCF8591应用 237
4.34 I2C接口DS1621温度传感器测试 241
4.35 用兼容I2C接口的MAX6953驱动4片5×7点阵显示器 246
4.36 用I2C接口控制MAX6955驱动16段数码管显示 250
4.37 I2C接口数字电位器AD5242应用 254
4.38 SPI接口存储器AT25F1024读/写与显示 257
4.39 SPI接口温度传感器TC72应用测试 264
4.40 温度传感器LM35全量程应用测试 268
4.41 SHT75温湿度传感器测试 272
4.42 直流电机正、反转及PWM调速控制 278
4.43 正反转可控的步进电机 281
4.44 ULN2803驱动点阵屏仿电梯数字滚动显示 284
4.45 液晶显示MPX4250压力值 286
4.46 12864LCD显示24C08保存的开机画面 289
4.47 用M145026与M145027设计的无线收发系统 293
4.48 DS18B20温度传感器测试 296
4.49 1-Wire式可寻址开关DS2405应用测试 303
4.50 MMC存储卡测试 307
第5章 综合设计 316
5.1 带日历时钟及温度显示的电子万年历 316
5.2 用8051+1601LCD设计的整型计算器 321
5.3 电子秤仿真设计 328
5.4 1602液晶屏显示仿手机键盘按键字符 332
5.5 用24C04与1602液晶屏设计的简易加密电子锁 336
5.6 1-Wire总线器件ROM搜索与多点温度监测 341
5.7 高仿真数码管电子钟设计 356
5.8 用DS1302与12864LCD设计的可调式中文电子日历 360
5.9 用T6963C液晶屏设计的指针式电子钟 366
5.10 T6963C液晶屏中文显示温度与时间 370
5.11 T6963C液晶屏曲线显示ADC0832两路A/D转换结果 372
5.12 温度控制直流电机转速 374
5.13 用74LS595与74LS154设计的16×16点阵屏 377
5.14 用8255与74LS154设计的16×16点阵屏 379
5.15 红外遥控收发仿真 381
5.16 GP2D12红外测距传感器应用 388
5.17 三端可调正稳压器LM317应用测试 395
5.18 数码管显示的K型热电偶温度计 399
5.19 交流电压检测与数字显示仿真 403
5.20 用MCP3421与RTD-PT100设计的铂电阻温度计 407
5.21 可接收串口信息的带中英文硬字库的80×16 LED点阵屏 414
5.22 模拟射击训练游戏 422
5.23 GPS仿真 427
5.24 温室监控系统仿真 431
5.25 基于Modbus总线的数据采集与开关控制系统设计仿真 437
建议你到脚本之家网站去搜索一下看看有没有这本书的电子档。
㈤ 51单片机关于密码锁的毕业设计,论文
程序设计内容
(1). 密码的设定,在此程序中密码是固定在程序存储器ROM中,假设预设的密码为“12345”共5位密码。
(2). 密码的输入问题:由于采用两个按键来完成密码的输入,那么其中一个按键为功能键,另一个按键为数字键。在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;或者输入确认功能键之后,才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。
(3).按键禁止功能:初始化时,是允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态在3次密码输入不正确的情况下发生的。
C语言源程序
#includeunsignedcharcodeps[]={1,2,3,4,5};
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsignedcharpslen=9;unsignedchartemplen;
unsignedchardigit;unsignedcharfuncount;
unsignedchardigitcount;
unsignedcharpsbuf[9];
bitcmpflag;
bithibitflag;
biterrorflag;
bitrightflag;
unsignedintsecond3;
unsignedintaa;
unsignedintbb;
bitalarmflag;
bitexchangeflag;
unsignedintcc;
unsignedintdd;
bitokflag;
unsignedcharoka;
unsignedcharokb;
voidmain(void)
{
unsignedchari,j;
P2=dispcode[digitcount];
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%6;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(cmpflag==0)
{
if(P3_6==0)//functionkey
{
for(i=10;i>0;i--)
for(j=248;j>0;j--);
if(P3_6==0)
{
if(hibitflag==0)
{
funcount++;
if(funcount==pslen+2)
{
funcount=0;
cmpflag=1;
}
P1=dispcode[funcount];
}
else
{
second3=0;
}
while(P3_6==0);
}
}
if(P3_7==0)//digitkey
{
for(i=10;i>0;i--)
for(j=248;j>0;j--);
if(P3_7==0)
{
if(hibitflag==0)
{
digitcount++;
if(digitcount==10)
{
digitcount=0;
}
P2=dispcode[digitcount];
if(funcount==1)
{
pslen=digitcount;
templen=pslen;
}
elseif(funcount>1)
{
psbuf[funcount-2]=digitcount;
}
}
else
{
second3=0;
}
while(P3_7==0);
}
}
}
else
{
cmpflag=0;
for(i=0;i
{
if(ps[i]!=psbuf[i])
{
hibitflag=1;
i=pslen;
errorflag=1;
rightflag=0;
cmpflag=0;
second3=0;
gotoa;
}
}
cc=0;
errorflag=0;
rightflag=1;
hibitflag=0;
a: cmpflag=0;
}
}
}
voidt0(void)
interrupt1using0{ TH0=(65536-500)/256;
TL0=(65536-500)%6;
if((errorflag==1)&&(rightflag==0))
{
bb++;
if(bb==800)
{
bb=0;
alarmflag=~alarmflag;
}
if(alarmflag==1)
{
P0_0=~P0_0;
}
aa++;
if(aa==800)
{
aa=0;
P0_1=~P0_1;
}
second3++;
if(second3==6400)
{
second3=0;
hibitflag=0;
errorflag=0;
rightflag=0;
cmpflag=0;
P0_1=1;
alarmflag=0;
bb=0;
aa=0;
}
}
if((errorflag==0)&&(rightflag==1))
{
P0_1=0;
cc++;
if(cc<1000)
{
okflag=1;
}
elseif(cc<2000)
{
okflag=0;
}
else
{
errorflag=0;
rightflag=0;
hibitflag=0;
cmpflag=0;
P0_1=1;
cc=0;
oka=0;
okb=0;
okflag=0;
P0_0=1;
}
if(okflag==1)
{
oka++;
if(oka==2)
{
oka=0;
P0_0=~P0_0;
}
}
else
{
okb++;
if(okb==3)
{
okb=0;
P0_0=~P0_0;
}
}
}
}
㈥ 基于单片机的电子密码锁设计 毕业论文
这里有 http://www.zytxs.com/web2/mj09b33489.html
毕业论文 基于单片机的电子密码锁设计
AT89S51|矩阵键盘|电子密码锁|毕业设计
文件格式:word
毕业论文 基于单片机的电子密码锁设计
论文正文共49页。共19073个字符数(不计空格)。
如需下载,请点击页面最下方“下载地址 点击下载”。
基于单片机的电子密码锁设计
摘 要
随着人们对安全的重视和科技的发展,对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求 ,增加其安全性 ,用密码代替钥匙的密码锁应运而生。电子锁由于具有报警功能,保密性高,使用灵活性好,安全系数高,设计方法合理,简单易行,成本低,符合住宅、办公室用锁要求 , 具有推广价值。受到了广大用户的亲睐。这种应用以单片机为核心 ,通过编程来实现整体基本功能和安全性要求设计。
系统将能完成开锁、超时报警、超次锁定、管理员解密、修改用户密码基本的密码锁的功能。能用PROTEL99SE绘制电路原理图,并做出调试好基于单片机的电子密码锁的实物。
关键词:AT89S51,矩阵键盘,电子密码锁
Microcontroller-based design of electronic locks
ABSTRACT
As people focus on security and technology development, life insurance for the safety devices in increasingly high demand. To meet people’s use of the lock request to increase their safety, replace the key with a password lock came into being. Electronic lock as an alarm, high secrecy, use good flexibility, high safety factor, design reasonable, simple, low cost, consistent with residential, office lock request is worth promoting. By the user pro-gaze. This application to SCM is the core of the overall program to achieve the basic functions and design safety requirements.
System will be able to complete the unlock, alarm out, and Ultra lock, decrypt administrator, modify the basic user password lock feature. Can PROTEL99SE circuit schematic drawing and make a good debugging MCU-based electronic code lock of the kind.
Key words: AT89S51, matrix keyboards, electronic lock
目 录
第一章 绪论 1
1.1 引言 1
1.2 电子密码锁的研究现状 1
1.3 课题研究方法 2
第二章 开发环境和开发工具 3
2.1 Protel 99se简介 3
2.2 keil介绍 4
2.3 开发工具在系统中的作用 5
2.4 主要元器件介绍 5
2.4.1 主控芯片AT89S51 5
2.4.2 数码管 7
2.4.3 掉电存储模块AT24c02 8
第三章 电子密码锁设计硬件部分 9
3.1 电子密码锁总原理图 9
3.2 开锁电路设计 9
3.3 按键电路设计 9
3.4 显示电路设计 10
3.4 掉电存储电路设计 12
3.5 电源电路设计 12
第四章 电子密码锁软件部分 13
4.1主程序流程图: 13
4.2键功能流程图: 14
第五章 电子密码锁实物制作和调试过程 15
5.1 电路板制作中的问题和调试结果分析 15
5.2 制作好的实物的图片 16
第六章 总结 20
设计总结 20
参考文献 21
致 谢 22
附录一 电子密码锁的电路图 23
附录二 电子密码锁3D截图 24
附录三 电子密码锁程序清单 24
㈦ 基于C51单片机的秒表设计。要求:1.用2位数码管显示秒数。 2. 有启动、停止、清零功能 。
选 。共阳数码管 16M晶振。
STRT EQU P2.5
STP EQU P2.6
CLRR EQU P2.7
ORG 00H
AJMP MAIN
ORG 0BH
AJMP T0INT
ORG 30H
MAIN: MOV R0,#20
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV DPTR,#TABLE
SETB EA
SETB ET0
k1: LCALL DISP
JB STRT,K2
LCALL DISP
JNB STRT,$-3
AJMP START
k2: JB STP,K3
LCALL DISP
JNB STP,STOP
K3: JB CLRR,K1
LCALL DISP
JNB CLRR,CLEAR
AJMP K3
START: SETB TR0
AJMP K1
STOP: CLR TR0
AJMP K2
CLEAR: CLR TR0
MOV 40H,#0
AJMP K1
T0INT: MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R0,RTI
MOV R0,#20
MOV A,40H
CJNE A,#99,ADD1
MOV 40H,#00H
CLR TR0
AJMP RTI
ADD1: ADD A,#01H
MOV 40H,A
RTI: RETI
DISP: MOV A,40H
MOV B,#10
DIV AB ;//当前值除以10
MOV 20H,A ;//得出的商送给十位
MOV 21H,B ;//得出的余数送给个位
CLR P2.0
SETB P2.1
MOV A,20H ;//十位显示
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
CLR P2.1
SETB P2.0
MOV A,21H ; //个位显示
MOVC A,@A+DPTR
MOV P0,A
RET
DELAY: ;误差 0us
MOV R6,#01H
DL0:
MOV R5,#61H
DJNZ R5,$
DJNZ R6,DL0
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H ;//共阳极0-9显示代码
DB 92H,82H,0F8H,80H,90H
END
㈧ 用PIC单片机测220V电压,想使用输出范围0-5V的电压传感器,请问传感器输出端可以直接连接到单片机的AD口吗
这个得看你用的是什么电压传感器了!
如果这个传感器的输出还是交流的信号,还要用信号调理线路把它变成全为正的,这个可以用绝对值线路或电压提升线路,再接到AD口;
如果传感器输出的是直流电压(这个应该叫电压变送器了!!!),那就根据厂家给的数据来确定输出直流电压与输入交流电压的关系来确定了,这个信号可以直接送到单片机的AD口;
如果传感器输出的是数字信号(这个应该叫电压变送器了!!!),就要按照其接口来读取它了,这个信号就不能接到AD口了!
北航的《PIC16系列单片机C程序设计与PROTEUS仿真》第五章有绝对值线路、电压提升线路。