㈠ 單片機題目高分尋求解答
哇靠!你哪來的這么多的題目
我考試不會有這么難的吧?
先借來練習練習
答案嘛
我不確定是否正確我就不發給你看了
㈡ 誰有現成的用單片機做的畢業設計,最好是全套的資料,論文、原理圖、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模擬》第五章有絕對值線路、電壓提升線路。