单片机程序案例(全部调试通过,部分附仿真图)

合集下载

基于51单片机――Ds18B20温度采集,LCD显示汇编程序(附带proteus仿真图)

基于51单片机――Ds18B20温度采集,LCD显示汇编程序(附带proteus仿真图)

TEMP_ZH EQU 24H ;实测温度值存放单元TEMPL EQU 25H TEMPH EQU 26HTEMP_TH EQU 27H ;高温报警值存放单元TEMP_TL EQU28H ;TEMPHC EQU 29H ;TEMPLC EQU 2AHTEMPFC EQU 2BHK1 EQU P1.4K2 EQU P1.5 ;K3 EQU P1.6 ;K4 EQU P1.7 ;BEEP EQU P3.7 ;RELAY EQU P1.3 ;LCD_X EQU 2FH ;LCDLCD_RS EQU P2.0 ;LCDLCD_RW EQU P2.1 ;LCDLCD_EN EQU P2.2 ;LCDFLAG1 EQU 20H.0 ;DS18B20 KEY_UD EQU 20H.1 ;DQEQU P3.3低温报警值存放单元正、负温度值标记查询按键设置/调整键调整键确定键蜂鸣器指示灯字符显示位置寄存器选择信号读写信号允许信号是否存在标志设定按键的增、减标志数据信号;;DS18B20ORG 00HLJMP MAINORG 0030H MAIN:MOV SP,#60H MOV A,#00HMOV R0,#20H MOV R1,#10H CLEAR:MOV @R0,A INC R0DJNZ R1,CLEAR LCALL SET_LCD LCALL RE_18B20 START:LCALL RST JNB FLAG1,START1 LCALL MENU_OK信息子程序MOV TEMP_TH,#055H MOV TEMP_TL,#019H LCALL RE_18B20ALCALL WRITE_E2 ;LCALL TEMP_BJ ;JMP START2;将20H~2FH单元清零;调用18B20复位子程序;DS1820不存在;DS1820存在,调用显示正确设置TH初值85度设置TL初值25度调用暂存器操作子程序写入DS18B20显示温度标记;;;START1: LCALL MENU_ERROR;调用显示出错信息子程序LCALL TEMP_BJ ;显示温度标记SJMP $START2: LCALL RST;调用DS18B20复位子程序JNBFLAG1,START1;DS18B20不存在MOV A,#0CCHLCALL WRITEMOV A,#44HLCALL WRITELCALL RSTMOV A,#0CCHLCALL WRITEMOV A,#0BEHLCALL WRITELCALL READ子程序LCALL CONVTEMP程序LCALL DISPBCDLCALL CONVLCALL TEMP_COMP值比较子程序;跳过ROM匹配命令;温度转换命令;跳过ROM匹配;读温度命令;调用DS18B20数据读取操作;调用温度数据BCD码处理子;调用温度数据显示子程序;调用LCD显示处理子程序;调用实测温度值与设定温度LCALLPROC_KEY ;调用键扫描子程序SJMP START2;循环;***************************键*****************************PROC_KEY:JB K1,PROC_K1LCALL BEEP_BLJNB K1,$MOV DPTR,#M_ALAX1MOV A,#1LCALL LCD_PRINTLCALL LOOK_ALARMJB K3,$LCALL BEEP_BLJMP PROC_K2PROC_K1: JB K2,PROC_ENDLCALL BEEP_BLJNB K2,$MOV DPTR,#RST_A1MOV A,#1LCALL LCD_PRINTLCALL SET_ALARMLCALL RE_18B20 ;扫描子程序将设定的TH,TL值写入DS18B20 LCALL WRITE_E2PROC_K2: LCALL MENU_OKLCALL TEMP_BJPROC_END:RET;******************************************************SET_ALARM:LCALL LOOK_ALARMAS0: JB K1,AS00LCALL BEEP_BLJNB K1,$CPL 20H.1 ;UP/DOWNAS00: JB 20H.1,ASZ01 ;20H.1=1 JMP ASJ01 ;20H.1=0ASZ01: JB K2,ASZ02 ;THLCALL BEEP_BLINC TEMP_THMOV A,TEMP_THCJNE A,#120,ASZ011MOV TEMP_TH,#0ASZ011: LCALL LOOK_ALARM设定温度报警值标记,增加,减小值调整(增加)TH、TLMOV R5,#10LCALL DELAYJMP ASZ01ASZ02: JB K3,ASZ03;TL值调整(增加)LCALL BEEP_BLINC TEMP_TLMOV A,TEMP_TLCJNE A,#99,ASZ021MOV TEMP_TL,#00HASZ021: LCALL LOOK_ALARM MOV R5,#10LCALL DELAYJMP ASZ02ASZ03: JB K4,AS0LCALL BEEP_BLJNB K4,$RETASJ01: JB K2,ASJ02LCALL BEEP_BLDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,ASJ011;确定调整;TH值调整(减少)JMP ASJ022ASJ011: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP AS0ASJ02: JB K3,ASJ03;TL值调整(减少)LCALL BEEP_BLDEC TEMP_TLMOV A,TEMP_TLCJNE A,#0FFH,ASJ021JMP ASJ022ASJ021: LCALL LOOK_ALARM ;MOV R5,#10LCALL DELAYJMP AS0ASJ022: CPL 20H.1JMP ASZ01ASJ03: JMP ASZ03RETRST_A1: DB " SET ALERT CODE " ,0;***********************实测温度值与设定温度值比较子程序**********************TEMP_COMP:MOVA,TEMP_THSUBBA,TEMP_ZH;减数>被减数,则JC CHULI1;借位标志位C=1,转MOV A,TEMPFCCJNEA,#0BH,COMPSJMPCHULI2COMP:MOV A,TEMP_ZHSUBB A,TEMP_TL ;JC CHULI2 ;MOV DPTR,#BJ5LCALL TEMP_BJ3CLR RELAYRETCHULI1: MOV DPTR,#BJ3LCALL TEMP_BJ3SETB RELAY ;LCALL BEEP_BLRETCHULI2: MOV DPTR,#BJ4LCALL TEMP_BJ3SETB RELAY ;减数>被减数,则借位标志位C=1,转;点亮指示灯熄灭指示灯蜂鸣器响熄灭指示灯;LCALL BEEP_BL;蜂鸣器响RET;-----------------------------------------TEMP_BJ3: MOV A,#0CEHLCALL WCOMMOV R1,#0MOV R0,#2BBJJ3: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ3RETBJ3: DB ">H"BJ4: DB "<L"BJ5: DB " !";;**************************** ***************************TEMP_BJ:MOV A,#0CBHLCALL WCOMMOV DPTR,#BJ1显示温度标记子程序指针指到显示消息;MOV R1,#0 MOV R0,#2BBJJ1: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ1RETBJ1: DB 00H,"C";********************************显示正确信息子程序***************************MENU_OK:MOV DPTR,#M_OK1;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_OK2;指针指到显示消息MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_OK1: DB " DS18B20 OK ",0M_OK2: DB " TEMP:",0;********************************显示出错信息子程序***************************MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_ERROR2;指针指到显示消息1MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_ERROR1: DB " DS18B20 ERROR ",0M_ERROR2: DB " TEMP:---- ",0;****************************DS18B20复位子*****************************RST:SETB DQNOPCLR DQMOV R0,#6BH ;主机发出延时复位低脉冲MOV R1,#04HTSR1: DJNZ R0,$MOV R0,#6BHDJNZ R1,TSR1程序SETB DQ;拉高数据线NOPNOPNOPMOV R0,#32HTSR2: JNB DQ,TSR3;等待DS18B20回应DJNZ R0,TSR2JMP TSR4 ;延时TSR3: SETB FLAG1 ;置1标志位,表示DS1820存在JMP TSR5 TSR4: CLR FLAG1 ;清0标志位,表示DS1820不存在JMP TSR7 TSR5: MOV R0,#06BHTSR6: DJNZ R0,$ ;时序要求延时一段时间TSR7: SETB DQRET;************************DS18B20***************************RE_18B20:JB FLAG1,RE_18B20ARETRE_18B20A:暂存器操作子程序LCALL RSTMOV A,#0CCH;跳过ROM匹配LCALL WRITEWR_SCRAPD:MOV A,#4EH;写暂器LCALL WRITEMOV A,TEMP_TH;TH(报警上限)LCALL WRITEMOV A,TEMP_TL;TL(报警下限)LCALL WRITEMOV A,#7FH;12位精度LCALL WRITERET;************************复制暂存器子程序*******************************WRITE_E2:LCALL RSTMOV A,#0CCH;跳过ROM匹配LCALL WRITEMOV A,#48H;把暂存器里的温度报警值拷贝到EEROM LCALL WRITERET;***********************重读EEROM子程序********************************READ_E2:LCALL RSTMOV A,#0CCH;跳过ROM匹配LCALL WRITEMOV A,#0B8H;把EEROM里的温度报警值拷贝回暂存器LCALL WRITERET;************************将自定义字符写入LCD的CGRAM中*********************STORE_DATA:MOV A,#40HLCALL WCOMMOV R2,#08HMOV DPTR,#D_DATAMOV R3,#00HS_DATA:MOV A,R3MOVC A,@A+DPTRLCALL WDATA;写入数据INC R3DJNZ R2,S_DATAD_DATA:DB 0CH,12H,12H,0CH,00H,00H,00H,00H;***********************DS18B20数据写入操作子程序************************WRITE:MOV R2,#8 ;一共8位数据CLR CWR1: CLR DQ;开始写入DS18B20总线要处于复位(低)状态MOV R3,#07DJNZ R3,$ ;总线复位保持16微妙以上RRCA ;把一个字节DATA分成8个BIT环移给CMOV DQ,C;写入一位MOV R3,#3CHDJNZ R3,$ ;等待100微妙SETB DQ;重新释放总线NOPDJNZ R2,WR1 ;写入下一位SETB DQRET;**********************DS18B20数据读取操作子程序**************************MOV R4,#4;将温度低位、高位、TH、TL从DS18B20中读出MOV R1,#TEMPL元RE00: MOV R2,#8RE01: CLR CYSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#09DJNZ R3,$MOV C,DQMOV R3,#3CH;存入25H、26H、27H、28H单;读前总线保持为低;开始读总线释放;延时18微妙;从DS18B20总线读得一位DJNZ R3,$;等待100微妙RRC A;把读得的位值环移给ADJNZ R2,RE01;读下一位MOV @R1,ADJNZ R4,RE00RET;************************温度值BCD码处理子程序*************************CONVTEMP:MOV A,TEMPH ;判温度是否零下ANL A,#08HJZ TEMPC1 ;温度零上转CLR CMOV A,TEMPL ;二进制数求补(双字节)CPL A ;取反加1ADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,AMOV TEMPHC,#0BH;负温度标志MOV TEMPFC,#0BHSJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH;正温度标志MOV TEMPFC,#0AHTEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=分BCD MOV A,TEMPL ;ANL A,#0F0H ;SWAP AMOV TEMPL,AMOV A,TEMPH ;ANL A,#0FHSWAP AORL A,TEMPL ;乘0.0625小数部整数部分取出高四位取出低四位重新组合MOV TEMP_ZH,ALCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHC ;TEMPHCBCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI =BCD ORL A,TEMPLCMOV TEMPLC,AMOV A,R4JZ TEMPC12ANL A,#0FHSWAP AMOV R4,AMOV A,TEMPHC ;TEMPHC HI =BCD ANL A,#0FHLOW=十位数个位数百位数ORL A,R4TEMPC12: RET;************************二-十进制转换子程序*****************************HEX2BCD1: MOV B,#064HDIV ABMOV R4,AMOV A,#0AHXCH A,BDIV ABSWAP AORL A,BRETTEMPDOTTAB:DB 00H,00H,01H,01H,02H,03H,03H,04H ;小数部分码表DB 05H,05H,06H,06H,07H,08H,08H,09H;**********************查询温度报警值子程序***************************LOOK_ALARM:MOV DPTR,#M_ALAX2 ;指针指到显示信息区MOV A,#2;显示在第二行LCALL LCD_PRINTLCALL TEMP_BJ1MOV A,TEMP_TH;加载TH数据MOV LCD_X,#3LCALL SHOW_DIG2H ;MOV A,#0CEHLCALL TEMP_BJ1MOV A,TEMP_TLMOV LCD_X,#12LCALL SHOW_DIG2L ;RETM_ALAX1: DB " LOOK ALERT CODE",0 M_ALAX2: DB "TH:TL:",0TEMP_BJ1: LCALL WCOMMOV DPTR,#BJ2MOV R1,#0MOV R0,#2BBJJ2: MOV A,R1MOVC A,@A+DPTRLCALL WDATA;设置显示位置显示数据;加载TL数据;设置显示位置显示数据;指针指到显示信息区INC R1DJNZ R0,BBJJ2RETBJ2: DB 00H,"C";**************************LCD********************************** SHOW_DIG2H:MOV B,#100DIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BMOV A,#0AHXCH A,BDIV ABADD A,#30HINC LCD_XPUSH BMOV B,LCD_XLCALL LCDP2显示子程序POP B INC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RETSHOW_DIG2L:MOV B,#100DIV ABMOV A,#0AHXCH A,BDIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RET;************************显示区BCD码温度值刷新子程序**********************DISPBCD:MOV A,TEMPLCANL A,#0FHMOV 70H,A ;MOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,A ;MOV A,TEMPHCANL A,#0FHMOV 72H,A ;MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,A ;DISPBCD2: RET小数位个位十位百位;***************************LCD显示数据处理子程序*************************CONV:MOV A,73HMOV LCD_X,#6CJNE A,#1,CONV1JMP CONV2CONV1: CJNE A,#0BH,CONV11MOV A,#"-"JMP CONV111CONV11: MOV A,#" "CONV111: MOV B,LCD_XLCALL LCDP2JMP CONV3CONV2: LCALL SHOW_DIG2CONV3: INC LCD_X MOV A,72HLCALL SHOW_DIG2INC LCD_XMOV A,71HLCALL SHOW_DIG2INC LCD_XMOV A,#'.';加载百位数据;设置位置;"-"号显示;"+"号不显示;显示数据;十位;个位MOV B,LCD_XLCALL LCDP2MOV A,70H;加载小数点位INC LCD_X;设置显示位置LCALL SHOW_DIG2;显示数据RET;***************************第二行显示数字子程序*************************SHOW_DIG2:ADD A,#30HMOV B,LCD_XLCALL LCDP2RET;***************************第二行显示数字子程序*************************LCDP2: PUSH ACCMOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA;写入数据RET;***************************对LCD做初始化设置及测试*************************SET_LCD:CLR LCD_ENLCALL INIT_LCD ;初始化LCDLCALL STORE_DATA ;将自定义字符存入LCD的CGRAMRET;*****************************************************************INIT_LCD:MOV A,#38H ;2行显示,字形5*7点阵LCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#0CH ;开显示,显示光标,光标不闪烁LCALL WCOMLCD 初始化LCALL DELAY1MOV A,#01H ;清除LCD显示屏LCALL WCOMLCALL DELAY1RET;*****************************清除LCD的第一行字符**************************CLR_LINE1:MOV A,#80H ;设置LCD的第一行地址LCALL WCOMMOV R0,#24 ;设置计数值C1: MOV A,#' ' ;载入空格符至LCDLCALL WDATA ;输出字符至LCDDJNZ R0,C1 ;计数结束RET;*************************LCD的第一行或第二行显示字符**********************LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置LCD的第二行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置LCD的第二行地址LCALL WCOMFILL:CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1: LCALL WDATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;***************************清除****************************CLR_LINE:MOV R0,#24CL1: MOV A,#' 'LCALL WDATADJNZ R0,CL11行LCD的字符RETDE:MOV R7,#250DJNZ R7,$RET;****************************LCD间接控制方式命令写入*************************WCOM:MOV P0,A ;写入命令CLR LCD_RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲CLR LCD_RW SETB LCD_ENLCALL DELAY1CLR LCD_ENRET;****************************LCD间接控制方式数据写入*************************WDATA:MOV P0,A ;写入数据SETB LCD_RSCLR LCD_RWSETB LCD_ENLCALL DECLR LCD_ENLCALL DERET;**************************在LCD的第一行显示字符**************************LCDP1: PUSH ACCMOV A,B ;设置显示地址ADD A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA ;写入数据RET;******************************声光报警子程序*******************************BEEP_BL:MOV R6,#100BL2: LCALL DEX1CPL BEEPCPL RELAYDJNZ R6,BL2MOV R5,#10LCALL DELAYRETDEX1: MOV R7,#180DE2: NOPDJNZ R7,DE2RET;******************************延*******************************DELAY:MOV R6,#50DL1: MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R5,DELAYRETDELAY1: MOV R6,#25 ;延时5毫秒DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RETEND子程序时。

51单片机C语言实例(350例)Proteus仿真和代码都有

51单片机C语言实例(350例)Proteus仿真和代码都有

51单片机C语言实例(350例)Proteus仿真和代码都有51单片机C语言实例(400例)所有实例程序均经测试过,适合新手学习。

1-IO输出-点亮1个LED灯方法1 10-LED循环左移100-24c02记忆开机次数101-24c02存储上次使用中状态102-DS1302 时钟原理103-DS1302可调时钟104-DS1302时钟串口自动更新时间105-1602液晶显示DS1302时钟106-字库ST7920 12864液晶基础显示107-按键 12864显示108-PCF8591 1路AD数码管显示109-PCF8591 4路AD数码管显示11-LED循环右移110-PCF8591 DA输出模拟111-PCF8591 输出锯齿波112-PCF8591 1602液晶显示113-串口通讯114-串口通讯中断应用115-RS485基本通讯原理116-红外接收原理117-红外解码数码管显示118-红外解码1602液晶显示119-红外发射原理12-查表显示LED灯120-红外收发测试121-双红外发射避障原理测试122-1个18B20 温度传感器数码管显示123-1个18b20温度传感器1602液晶显示124-多个18b20温度传感器1602液晶显示125-超温报警测试126-温度可调上下限1602126-温度可调上下限1602显示127-PS2键盘输入1602液晶显示128-双色点阵1种颜色显示测试129-双色点阵2种颜色显示测试13-双灯左移右移闪烁130-双色点阵显示特定图形131-双色点阵交替图形显示132-双色点阵双色交替动态显示133-热敏电阻测试数码管显示134-光敏电阻测试数码管显示135-自动调光测试136-串转并数字芯片测试137-非门数字芯片测试138-电子琴139-实用99分钟倒计时器14-花样灯140-外部频率测试141-定时做普通时钟可调142-1602液晶显示的密码锁143-实用密码锁144-1602液晶显示的计算器145-秒表146-串口测温电脑显示147-交通灯测试148-点阵模拟电梯上行下行149-点阵流动广告模拟15-PWM调光150-综合测试程序151-12位AD_DS1621与12864液晶152-闪烁灯一153-闪烁灯二154-流水灯A155-51单片机12864大液晶屏proteus仿真156-流水灯B157-数码管显示158-12864LCD显示计算器键盘按键实验159-数码管显示(锁存器)16-共阳数码管静态显示160-数码管动态显示161-数码管滚动显示162-数码管字符显示163-独立按键164-矩阵键盘165-矩阵键盘(LCD)166-用DS1302与12864LCD设计的可调式中文电子日历167-定时器的使用(方式1)168-12864LCD图形滚动演示169-用PG12864LCD设计的指针式电子钟17-1个共阳数码管显示变化数字170-定时器的使用(方式2)171-外部中断的使用172-定时器和外部中断173-开关控制12864LCD串行模式显示174-点阵显示175-液晶1602显示176-12864带字库测试程序177-串行12864显示178-遥控键值解码-12864LCD显示179-液晶12864并行18-单个数码管模拟水流180-液晶12864并行2181-串口发送试验182-串口接收试验183-串口接收(1602)184-蜂鸣器发声185-直流电机调速186-蜂鸣器间断发声187-lcd-12864应用188-继电器控制189-直流电机调速19-按键控制单个数码管显示190-步进电机191-存储AT24C02192-PCF8591T AD实验193-PCF8591T芯片DA实验194-温度采集DS18B20195-EEPROM_24C02196-12864LCD显示24C08保存的开机画面197-红外解码198-12864LCD显示EPROM2764保存的开机画面199-时钟DS1302(LCD)2-IO输出-点亮1个LED灯方法220-单个数码管指示逻辑电平200-宏晶看门狗201-SD卡202-秒表203-普通定时器时钟204-彩屏控制205-彩屏图片显示206-12864+DS1302时钟+18B20温度计207-12864测试程序208-12864串行驱动演示209-12864生产厂程序21-8位数码管显示其中之一210-12864中文显示测试211-LCD12864212-12864M液晶显示(有字库)程序(汇编)213-超声波测距LCD12864显示214-红外遥控键值解码12864液晶显示(汇编语言)215-用DS1302与12864LCD设计的可调式中文电子日历216-中文12864217-中文12864LCD显示红外遥控解码实验218-IO端口输出219-IO端口输入22-8位数码管静态显示其中之二220-流水灯221-数码管显示223-独立按键224-独立按键去抖动225-定时器0226-定时器1227-定时器2228-外部中断0电平触发229-外部中断0边沿触发23-8位数码管动态扫描显示230-外部中断1231-矩阵键盘232-液晶LCM1602233-LCD1602动态显示234-EEPROM24c02235-开机次数记忆236-红外解码LCD1602液晶显示237-红外解码数码管显示238-喇叭239-液晶背光控制24-8位数码管动态扫描原理演示240-与电脑串口通信241-步进电机242-字库LCD12864液晶测试243-液晶数码综合显示244-99秒计时245-99倒计时246-抢答器247-PWM调光248-LED点阵249-直流电机调速250-按键计数器251-秒表252-数码管移动253-花样灯254-红绿灯255-音乐播放256-红外收发演示257-普通定时器时钟258-继电器控制259-ps2键盘LCD1602液晶显示26-9累加260-RTC实时时钟DS1302液晶显示261-单线温度传感器18b20262-串口测温263-带停机步进电机正反转264-步进电机正反转265-AD_DA_PCF8591266-液晶AD_DA_PCF8591267-秒手动记数268-功能感受269-流水登27-99累加270-点亮一个二极管271-用单片机控制一个灯闪烁272-将P1口状态送入P0、P2、P3273-P3口流水灯274-通过对P3口地址的操作流水点亮8位LED 275-用不同数据类型控制灯闪烁时间276-用P0口、P1 口分别显示加法和减法运算结果277-用P0、P1口显示乘法运算结果278-用P1、P0口显示除法运算结果279-用自增运算控制P0口8位LED流水花样28-999累加280-用P0口显示逻辑与运算结果281-用P0口显示条件运算结果282-用P0口显示按位异或运算结果283-用P0显示左移运算结果284-万能逻辑电路实验285-用右移运算流水点亮P1口8位LED286-用if语句控制P0口8位LED的流水方向287-用swtich语句的控制P0口8位LED的点亮状态288-用for语句控制蜂鸣器鸣笛次数289-包含单片机寄存器的头文件29-9999累加290-用do-while语句控制P0口8位LED流水点亮291-用字符型数组控制P0口8位LED流水点亮292-用P0口显示字符串常量293-用P0 口显示指针运算结果294-用指针数组控制P0口8位LED流水点亮295-用数组的指针控制P0 口8 位LED流水点亮296-用P0 、P1口显示整型函数返回值297-用有参函数控制P0口8位LED流水速度298-用数组作函数参数控制流水花样299-用数组作函数参数控制流水花样3-IO输出-点亮多个LED灯方法130-9累减300-用函数型指针控制P1口灯花样301-用指针数组作为函数的参数显示多个字符串302-字符函数ctype.h应用举例303-内部函数intrins.h应用举例304-标准函数stdlib.h应用举例305-字符串函数string.h应用举例306-宏定义应用举例307-文件包应用举例308-条件编译应用举例309-用定时器T0查询方式P2口8位控制LED闪烁31-99累减310-用定时器T1查询方式控制单片机发出1KHz音频311-将计数器T0计数的结果送P1口8位LED显示311-用定时器T0的中断控制1位LED闪烁312-用定时器T0的中断实现长时间定时313-用定时器T1中断控制两个LED以不同周期闪烁314-用计数器T1的中断控制蜂鸣器发出1KHz音频315-用定时器T0的中断实现渴望主题曲的播放316-输出50个矩形脉冲317-输出正脉宽为250微秒的方波318-用定时器T0控制输出高低宽度不同的矩形波319-用外中断0的中断方式进行数据采集32-999累减320-输出负脉宽为200微秒的方波321-方式0控制流水灯循环点亮322-数据发送程序323-数据接收程序324-单片机向PC发送数据325-单片机接收PC发出的数据326-用LED数码显示数字5327-用LED数码显示器循环显示数字0~9328-用数码管慢速动态扫描显示数字1234329-用LED数码显示器伪静态显示数字123433-9999累减330-用数码管显示动态检测结果331-数码秒表设计332-数码时钟设计333-用LED数码管显示计数器T0的计数值334-静态显示数字“59”335-无软件消抖的独立式键盘输入实验336-软件消抖的独立式键盘输入实验337-CPU控制的独立式键盘扫描实验338-定时器中断控制的独立式键盘扫描实验339-独立式键盘控制的4级变速流水灯34-显示小数点340-独立式键盘的按键功能扩展:以一当四341-独立式键盘调时的数码时钟实验342-独立式键盘控制步进电机实验343-矩阵式键盘按键值的数码管显示实验344-矩阵式键盘按键音345-简易电子琴346-矩阵式键盘实现的电子密码锁347-用LCD显示字符'A'348-用LCD循环右移显示Welcome to China 349-将数据0x0f写入AT24C02再读出送P1口显示35-数码管消隐350-液晶时钟设计36-数码管递加递减带消隐37-数码管左移38-数码管右移38-数码管右移139-数码管右移24-IO输出-点亮多个LED灯方法240-数码管循环左移41-数码管循环右移41-数码管循环右移142-数码管循环右移243-数码管闪烁44-数码管局部闪烁45-定时器046-定时器147-定时器248-产生1mS方波49-产生200mS方波5-闪烁1个LED50-产生多路不同频率方波51-1个独立按键控制LED52-1个独立按键控制LED状态转换53-2按键加减操作53-2按键加减操作数码管显示54-多位数按键加减(闪烁)54-多位数按键加减(闪烁)数码管显示55-多位数按键加减(不闪烁)55-多位数按键加减(不闪烁)数码管显示56-定时器扫描数码管(不闪烁)57-按键长按短按效果58-抢答器59-独立按键依次输入数据6-不同频率闪烁1个LED灯60-按键从右至左输入61-8位端口检测8独立按键62-矩阵键盘行列扫描63-矩阵键盘反转扫描64-矩阵键盘中断扫描65-矩阵键盘密码锁66-矩阵键盘简易计算器67-外部中断0电平触发68-外部中断1电平触发69-外部中断0下降沿触发7-不同频率闪烁多个LED灯70-外部中断1下降沿触发71-T0外部计数输入72-T1外部计数输入73-看门狗溢出测试74-按键喂狗75-喇叭发声原理76-警车声音77-救护车声音78-喇叭滴答声79-报警发声8-8位LED左移80-消防车警报81-音乐播放82-步进电机转动原理83-步进电机正反转84-步进电机按键控制85-步进电机转速数码管显示86-双步进电机综合控制86-步进电机调速原理87-双步进电机综合控制87-步进电机综合控制87-步进电机调速原理88-直流电机按键控制89-直流电机调速控制9-8位LED右移90-继电器控制原理91-双继电器模拟洗衣机电机控制92-1602液晶静态显示93-1602液晶动态显示94-1602液晶滚动显示95-1602液晶移动显示96-1602液晶按键输入显示97-2402存储1个数据98-24c02存储多个数据99-24c02存储花样流水灯。

单片机课程设计密码锁程序和仿真图

单片机课程设计密码锁程序和仿真图

#include<at89x51.h>#define uchar unsigned char#define uint unsigned intuint num=10; //开始让数码管什么都不显示bit set=0; //定义设置密码的位char count=-1; //开始让COUNT=-1,方便后面显示数码管sbit Beep=P1^2; //蜂鸣器uchar temp;uchar pws[6]={3,6,2,3,3,0}; //原始密码uchar pwx[6]; //按下的数字存储区bit rightflag; //密码正确标志位uchar workbuf[6];uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40 }; //段选码,共阴极uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位选码uint keyscan();void delay(uchar z) //延时,ms级{uchar y;for(;z>0;z--)for(y=120;y>0;y--);}void setpw() //设置密码函数{keyscan();}uint keyscan() //键盘扫描函数{P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5); //键盘去抖,最好ms以上,这里用了mstemp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;//按键计数加temp=P3;switch(temp){case 0xee:{num=7;if(count<6) //六位密码,所以COUNT<6{if(set==0) //设置密码键没有按下时pwx[count]=num; //存储按下的数字elsepws[count]=num; //设置密码键按下时,设置新密码workbuf[count]=tabledu[11]; //相应位的数码管显示"--",不显示相应的数字,密码是保密的}}break;case 0xde:{num=8;if(count<6) //以下扫描键盘的原理差不多同上{if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbe:{num=9;{if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}}break;case 0x7e: //设置密码键按下{set=1; //设置密码标志位置P1_3=0; //设置密码指示灯亮workbuf[0]=0x00;//数码管第一位不显示workbuf[1]=0x00;//......workbuf[2]=0x00;//......workbuf[3]=0x00;workbuf[4]=0x00;workbuf[5]=0x00;//......count=-1; //按键计数复位为-1if(count<6) //密码没有设置完,继续设置密码{setpw(); //设置密码}}break;}while(temp!=0xf0) //按键抬起检测{temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xed:{num=4;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdd:{num=5;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbd:{num=6;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xeb:{num=1;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdb:{num=2;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbb:{num=3;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xd7:{num=0;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xe7: num=20;break; //确定键按下检测case 0x77: //复位键或者输入密码全部一次删除{P1_1=0; //锁关P1_3=1; //密码设置指示灯灭set=0; //不设置密码num=10; //num复位count=-1; //COUNT复位workbuf[0]=tabledu[10]; //第一位数码管不显示workbuf[1]=tabledu[10]; //第二位数码管不显示workbuf[2]=tabledu[10];workbuf[3]=tabledu[10];workbuf[4]=tabledu[10];workbuf[5]=tabledu[10]; //......P1_0=1; //锁关}break;case 0xb7: //输入密码删除键(一位一位删除){count--;workbuf[count]=0x00; //因确定键按下时,COUNT也会加,而确定键不是密码,所以这里是COUNT,而不是COUNT+1count--; //因确定键按下时,确定键不是密码,COUNT也会加,这里COUNT再自减if(count<=-1)count=-1;}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return(num);}void init() //利用定时显示数码管{TMOD=0x01;TH0=(65536-500)/200;TL0=(65536-500)%200;ET0=1;EA=1;TR0=1;}bit compare() //密码比较函数{if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pw x[5]==pws[5]))rightflag=1;elserightflag=0;return(rightflag);}void main(){uint i,j;init();P0=0;P1_1=0; //锁关while(1){keyscan();if(num==20) //如果确定键按下(修改密码和输入密码共用的确定键){if(count==6){if(set==1) //修改密码确定{P1_3=1;workbuf[0]=0;workbuf[1]=0;workbuf[2]=0;workbuf[3]=0;workbuf[4]=0;workbuf[5]=0;}else//输入密码确定{set=0;compare();if(rightflag==1) //如果密码正确{P1_0=0; //锁开P1_1=1;workbuf[0]=tabledu[8]; //数码管第一位显示"8"workbuf[1]=tabledu[8]; //数码管第二位显示"8"workbuf[2]=tabledu[8];workbuf[3]=tabledu[8];workbuf[4]=tabledu[8];workbuf[5]=tabledu[8]; //......}else{P1_1=0; //锁仍然是关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71; //......for(i=0;i<1000;i++) //密码错误报警{for(j=0;j<80;j++);Beep=~Beep;}break;}}}else//若输入的密码位数不为位时{P1_1=0; //锁仍然关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71;for(i=0;i<1000;i++){for(j=0;j<80;j++);Beep=~Beep;}break;}}}}void timer0() interrupt 1 //显示数码管{uchar i;TH0=(65536-500)/200; TL0=(65536-500)%200; for (i=0;i<6;i++) { P0=workbuf[i]; P2=tablewe[i]; delay(5); P0=0;}}XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51234567891RP1RESPACK-812365489=7+CONABCD1243D2LED-RED锁开锁关LS1SOUNDERD3LED-BLUE设置密码指示灯R11kR21kR310KR410K+12VQ3TIP127Q4TIP127Q18050Q28050Q5TIP122Q6TIP122+88.8Amps+88.8Amps+88.8Volts。

最新单片机程序案例全部调试通过,部分附仿真图

最新单片机程序案例全部调试通过,部分附仿真图

单片机程序案例全部调试通过,部分附仿真图这是大三上学期学单片机做的所有实验题,是全部编程试验箱通过的。

总结下,记得条条大道通罗马,不要拘泥于一种方式,仅供参考呀~~~实验一单片机实验设备的使用及简单程序的运行、调试一、实验目的通过一简单的实验掌握:1. 掌握PL2303驱动的安装,掌握Keil3开发环境的安装、设置和基本使用;2. 掌握项目、文件的建立方法、程序的下载以及寄存器、存储器内容的查看方法;3. 掌握程序的执行及断点设置方法。

二、实验设备单片机实验箱一台;PC机一台;USB下载线一根。

三、实验内容通过了解P1口的开关控制电路和P0的LED电路,编写基本输入输出实验程序。

实验内容为设置P1为输入口,P0口为输出口,将P1口的开关状态发送到P0口,让灯亮灭,将P1的电平状态通过P0口的LED的亮灭表示出来。

四、实验步骤读懂电路原理图如图1-1和图1-2所示:,插上USB连接线,将电源选择拨码开关拨至“USB供电”,将示例程序进行编译、装载、下载,下载时将拨码开关S44拨至“开”状态,拨动拨码开关S31~S38的开关状态,观察实验现象,实验电路原理图图1-1 LED接口电路图1-2 拨码开关电路图五、示例程序程序清单如下:#include <reg51.h>void main(void) // 程序主函数{while(1) // 循环用于实时扫描IO状态{P0=P1; // 将P1口的数据发送给P0口}}六、实验注意事项1.在输入程序时,其中的字母、符号均须在英文方式下进行。

2.特殊功能寄存器中的字母必须要大写,如若将示例程序中的P0写成p0,程序将提示出错。

实验二流水灯实验一、实验目的1、掌握单片机实验箱的使用方法与程序调试技巧;2、学会使用51系列单片机I/O的基本输入输出功能。

二、实验设备单片机实验箱一台;PC机一台;USB下载线一根。

三、实验内容设定P1口为8位输入口,P0口为8位输出口,实验电路原理图参考实验一。

51单片机仿真实例

51单片机仿真实例

51单片机仿真实例l示例6&mdash;扫描与判断&mdash;(单端口)位扫描与字节(多端口)扫描这是一个常用程序段&mdash;子程序&mdash;标准程序,通过端口扫描而获得输入数据或控制输出数据,达到节省位或字节的目的&mdash;节约硬件资源。

关于扫描,可以从位及其取反实现流水灯着手来理解。

可以通过移位实现流水灯&mdash;扫描。

可以通过字节数据(01H,02H,04H,08H,10H,20H,40H,80H&mdash;阳极管)的端口发送实现流水灯&mdash;扫描。

可以通过数据表(DB01H,02H,04H,08H,10H,20H,40H,80H&mdash;阴极管)实现流水灯&mdash;扫描。

可以通过循环跳转实现流水灯&mdash;扫描。

扫描注意入比出查&mdash;获得输入要比较数据、发送输出要检查出口扫描获取端口字节扫描输出位移动产生动态效果(01、02、04、08、10、20、40、80),可以用字节表扫描输出字符字节,通过延时可以变换字符以便造成数字进位效果ORG 0000HSTART:dbufequ30h;置存储区首址tempequ40h;置缓冲区首址org 00hmov 30h,#2 ;存入数据mov 31h,#0mov 32h,#1mov 33h,#0mov 34h,#7mov 35h,#1mov r0,#dbufmov r1,#tempmov r2,#6;六位显示器mov dptr,#segtab ;段码表首地址dp00:mov a,@r0;取要显示的数据movc a,@a+dptr ;查表取段码mov @r1,a;段码暂存inc r1inc r0djnz r2,dp00disp0:mov r0,#temp;显示子程序mov r1,#6;扫描6次mov r2,#01h;从第一位开始dp01:mov a,@r0mov p2,a;段码输出mov a,r2 ;取位码mov p1,a;位码输出acall delay;调用延时mov a,r2rl amov r2,ainc r0djnz r1,dp01sjmp disp0segtab:db 0C0H,0F9H,0A4H,0B0H,99H,92H;共阳极管db 82H,0F8H,80H,90H,88H,88H,83Hdelay:mov r4,#29h;延时子程序aa1:mov r5,0ffhaa:djnz r5,aadjnz r4,aa1retend************************************************* ***********************还可以用其他程序形式进行扫描,像循环、递增或递减判断程序等。

单片机设计报告-带有C语言源程序和proteus仿真图

单片机设计报告-带有C语言源程序和proteus仿真图

单片机课程设计报告河南农业大学机电工程学院目录一、前言—————————————————————3二、功能简介——————————-——————————4三、应用模块————————————————————-5四、设计方框图———————————————————-5五、硬件电路—————————————————————51、键盘部分————————————————————62、LED显示电路——————————————————73、数码管程序——————————————————74、I2C总线AT24C02 ————————————————8六、总图—————————————————————8七、硬件实现图形————————————————9八、程序—————————————————————10九、心得体会———————————————————23十、参考文献———————————————————24课题名称:掉电保护密码锁一、前言:在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。

若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。

随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。

为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。

密码锁具有安全性高、成本低、功耗低、易操作等优点。

在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。

随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。

随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。

Proteus实现单片机交通灯_图+程序(调试可用)

Proteus实现单片机交通灯_图+程序(调试可用)

这是我初学单片机,并用Proreus软件自己绘制自己编写程序实现的一个交通红绿灯的系统。

这是硬件连接图和程序,以便今后复习。

左上右下中控制部分,上面一个开关按下时,南北方向绿灯,东西方向红灯黄灯闪烁3秒绿灯设置15秒,红灯设置18秒。

绿灯走完15秒后黄灯闪烁3秒变为红灯,红灯走完18秒后变成绿灯,以此循环。

源程序:COUNT EQU30H;T0中断计数SNLEDDATA EQU31H;存储南北数码管显示的数据SNCOLORFLAG EQU32H;=1时南北绿灯亮,=2时南北黄灯亮,=3时南北红灯亮SNLEDDATAINIT EQU33H;存储南北各颜色灯的初始时间EWLEDDATA EQU34H;存储东西数码管显示的数据EWCOLORFLAG EQU35H;=1时东西红灯亮,=2时东西绿灯亮,=3时东西黄灯亮EWLEDDATAINIT EQU36H;存储东西各颜色灯的初始时间org0000hlJMP MAINorg0003hljmp exint0ORG000BHlJMP INTT0org0013hljmp exint1org0100h;主函数**************************************MAIN:CALL INITSTART:MOV A,COUNTCJNE A,#200,NOT1S;没到1秒跳转MOV COUNT,#00;1秒时间到DEC SNLEDDATAMOV A,SNLEDDATAJNZ checkewleddataMOV SNLEDDATA,SNLEDDATAINITINC SNCOLORFLAGMOV A,SNCOLORFLAGCJNE A,#04,checkewleddataMOV SNCOLORFLAG,#01checkewleddata:DEC EWLEDDATAMOV A,EWLEDDATAJNZ timenotoverMOV EWLEDDATA,EWLEDDATAINITINC EWCOLORFLAGMOV A,EWCOLORFLAGCJNE A,#04,timenotoverMOV EWCOLORFLAG,#01TIMENOTOVER:NOT1S:call ewcolorcheckCALL snCOLORCHECKCALL DISPLAYJMP START;*********************************************;初始化函数***********************************INIT:MOV SP,#60HMOV TMOD,#01HMOV TH0,#0eCHMOV TL0,#078HMOV COUNT,#00HMOV SNLEDDATAINIT,#15MOV EWLEDDATAINIT,#18MOV SNLEDDATA,SNLEDDATAINITMOV EWLEDDATA,EWLEDDATAINITSETB TR0;开定时器0SETB ET0;允许定时器0中断setb ex0;允许外部0中断setb ex1;允许外部1中断setb it0;外部中断0下降沿触发setb it1;外部中断1下降沿触发SETB EA;开总中断MOV P2,#0feHMOV SNCOLORFLAG,#01RET;*****************************************;外部中断0*********************************** exint0:push accpush pswmov a,p0push accmov a,p1push accmov a,p2push accclr ex1clr p2.0clr p2.1clr p2.2clr p2.3setb p1.4clr p1.1clr p1.2setb p1.5clr p1.3clr p1.4jnb p3.2,$setb ex1pop accmov p2,apop accmov p1,apop accmov p0,apop pswpop acc;外部中断1*********************************** exint1:push accpush pswmov a,p0push accmov a,p1push accmov a,p2push accclr ex0clr p2.0clr p2.1clr p2.2clr p2.3setb p1.4setb p1.2clr p1.1clr p1.0setb p1.3clr p1.5clr p1.4jnb p3.3,$setb ex0pop accmov p2,apop accmov p1,apop accmov p0,apop pswpop acc;T0中断函数*******************************INTT0:PUSH ACCPUSH PSWMOV TH0,#0ecH;#0echMOV TL0,#078H;#078hMOV A,P2RL ACJNE A,#11101111B,NOT5MOV A,#0feH;p2.0=0,南北数码管十位亮,p2.1=0,南北数码管个位亮NOT5:MOV P2,A;p2.2=0,东西数码管十位亮,p2.3=0,东西数码管个位亮INC COUNTPOP PSWPOP ACCRETI;****************************************;南北红绿黄灯控制**************************snCOLORCHECK:PUSH ACCPUSH BPUSH PSWsngreen:MOV A,SNCOLORFLAGCJNE A,#01,snYELLOWMOV SNLEDDATAINIT,#03;设置南北黄灯闪烁时间CLR P1.2CLR P1.1SETB P1.0;南北绿灯亮JMP snCOLORCHECKOUTsnYELLOW:;MOV A,SNCOLORFLAGCJNE A,#02,snredMOV SNLEDDATAINIT,#18;设置南北红灯亮时间MOV A,COUNTDIV ABMOV A,BCJNE A,#00H,snNOTFLASHCPL P1.1;南北黄灯闪烁CLR P1.0CLR P1.2snNOTFLASH:JMP snCOLORCHECKOUTsnred:MOV SNLEDDATAINIT,#15;设置南北绿灯亮时间CLR P1.0CLR P1.1SETB P1.2;南北红灯亮snCOLORCHECKOUT:POP PSWPOP BPOP ACCRET;******************************************************;东西红绿黄灯控制**************************************ewCOLORCHECK:PUSH ACCPUSH BPUSH PSWewred:MOV A,ewCOLORFLAGCJNE A,#01,ewyellowMOV ewLEDDATAINIT,#15;设置东西绿灯亮时间CLR P1.3CLR P1.4SETB P1.5;东西红灯亮JMP ewCOLORCHECKOUT;MOV A,ewCOLORFLAGCJNE A,#03,ewgreenMOV ewLEDDATAINIT,#18;设置东西红灯亮时间MOV A,COUNTMOV B,#100DIV ABMOV A,BCJNE A,#00H,ewNOTFLASHCPL P1.4;东西黄灯闪烁CLR P1.3CLR P1.5ewNOTFLASH:JMP ewCOLORCHECKOUTewgreen:MOV ewLEDDATAINIT,#03;设置东西黄灯闪烁时间CLR P1.4CLR P1.5SETB P1.3;东西绿灯亮ewCOLORCHECKOUT:POP PSWPOP BPOP ACCRET;************************************************************;数码管显示**************************************************DISPLAY:PUSH ACCPUSH PSWPUSH BMOV A,SNLEDDATAMOV B,#10DIV ABMOV A,EWLEDDATAMOV B,#10DIV ABMOV R2,BMOV R3,AMOV DPTR,#TABLEMOV A,P2 DISPSNH:CJNE A,#0feH,DISPSNLMOV A,R1MOVC A,@A+DPTRMOV P0,AJMP DISPOUT DISPSNL:CJNE A,#0fdH,DISPEWHMOV A,R0MOVC A,@A+DPTRMOV P0,AJMP DISPOUT DISPEWH:CJNE A,#0fbH,DISPEWLMOV A,R3MOVC A,@A+DPTRMOV P0,AJMP DISPOUT DISPEWL:CJNE A,#0f7H,DISPOUTMOV A,R2MOVC A,@A+DPTRMOV P0,A DISPOUT:POP BRET;************************************************** TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0123456789END。

34个单片机实例(包括框图和程序)1

34个单片机实例(包括框图和程序)1

1.闪烁灯1.实验任务如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。

2.电路原理图图4.1.13.系统板上硬件连线把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOV R6,#20 2个 2D1: MOV R7,#248 2个 2 2+2×248=498 20×DJNZ R7,$ 2个2×248 (498DJNZ R6,D1 2个2×20=4010002因此,上面的延时程序时间为10.002ms。

由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。

如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。

5.程序框图如图4.1.2所示图4.1.26.汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void) {while(1){L1=0;delay02s();L1=1;delay02s();}2.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。

基于单片机控制的智能定时闹钟设计(含完整程序仿真图)

基于单片机控制的智能定时闹钟设计(含完整程序仿真图)

摘要本设计是定时闹钟的设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。

电子钟设计可采用数字电路实现,也可以采用单片机来完成。

数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。

若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。

若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT89C51,它是低功耗、高性能的CMOS型8位单片机。

片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。

另外, AT89C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。

AT89C51单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进—步可以扩充控制电器的启停。

设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。

采用四个开关来控制定时闹钟的工作状态,分别为:K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。

课设准备中我根据具体的要求,查找资料,然后按要求根据已学过的时钟程序编写定时闹钟的程序,依据程序利用proteus软件进行了仿真试验,对出现的问题进行分析和反复修改源程序,最终得到正确并符合要求的结果。

设计完成的定时闹钟达到课程设计的要求,在到达定时的时间便立即发出蜂鸣声音,持续一分钟。

显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。

at89c51单片机-交通灯控制系统(含源码及仿真图)大全

at89c51单片机-交通灯控制系统(含源码及仿真图)大全

交通信号灯控制系统目录一、项目名称...................................................... 错误!未定义书签。

二、选题背景...................................................... 错误!未定义书签。

课题背景.................................................... 错误!未定义书签。

交通灯的历史................................................ 错误!未定义书签。

三、单片机简介.................................................... 错误!未定义书签。

单片机的发展历程............................................ 错误!未定义书签。

单片机的特点:.............................................. 错误!未定义书签。

AT89C51单片机简介........................................... 错误!未定义书签。

四、设计基本要求和步骤 ............................................ 错误!未定义书签。

基本要求.................................................... 错误!未定义书签。

设计步骤.................................................... 错误!未定义书签。

五、硬件和软件设计 ................................................ 错误!未定义书签。

硬件电路图.................................................. 错误!未定义书签。

8051单片机Proteus仿真实例3(原理图+C程序)

8051单片机Proteus仿真实例3(原理图+C程序)
while(key==0);
}
}
}
void timer_0() interrupt 1
{
doorbell=~doorbell;
p++;
if(p<400)
{
TH0=(8192-700)/32;
case 1: transmit('B');break;
case 2: transmit('C');break;
}
delay(10);
}
}
void serial() interrupt 4
{
if(RI==1)
{
RI=0;
if(SBUF>=0&&SBUF<=9)
P0=led_code[SBUF];
else P0=0x00;
ET0 = 1;
TR0 = 1;
P2=0x01;
while(1);
}
void timer_0() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
count++;
if(count==10)
{
P2=_crol_(P2,1);
count=0;
}
}
6.继电器
原理图:
程序:
#include <reg51.h>
1.单片机之间通过串口进行通信
原理图:
程序:
#include <reg51.h>
sbit key=P1^0;
unsigned char code led_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

C51单片机实例温控程序(各模块详解附图

C51单片机实例温控程序(各模块详解附图

*
*
实际温度超过你设定的温度,蜂鸣器报警。
*
*
*
*
包括各个模块及详细的注释
*
*
方便 C51 单片机入门级别者阅读
*
*--------------------------------------------------------------------------------------*/
#include<stc12c5a.h> typedef unsigned char uchar ; typedef unsigned int uint; sbit heat= P1^3; uchar makesure; uchar tp=0; uchar num=0; uchar ad=0; uchar s60,s61,s62,s63,temp;
/*--------------------------------------------------------------------------------------------------------------------------------------------
*
*
*
该程序为一个完整的温度控制器程序
0x3e,0x3d,0x3d,0x3c,0x3b,0x3b,0x3a,0x39,0x38,0x38,0x37,0x36,0x36,0x36,0x35,0x35,
0x34,0x33,0x33,0x32,0x32,0x31,0x31,0x30,0x30,0x2f,0x2f,0x2e,0x2e,0x2d,0x2d,0x2c,
0x10,0x0f,0x0f,0x0e,0x0e,0x0e,0x0d,0x0d,0x0c,0x0c,0x0b,0x0b,0x0b,0x0a,0x0a,0x09,

基于单片机的心形花样灯完整程序+仿真图

基于单片机的心形花样灯完整程序+仿真图

MOV P1,A MOV A,R0 MOV DPTR,#TAB14 MOVC A,@A+DPTR MOV P2,A MOV A,R0 MOV DPTR,#TAB15 MOVC A,@A+DPTR MOV P3,A LCALL DELAY INC R0 CJNE R0,#226,MAIN3 MOV R0,#00H LJMP MAIN DELAY: ;误差 0us MOV R7,#07H DL1: MOV R6,#0A8H DL0: MOV R5,#18H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL1 RET
FH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,07FH,03FH,01FH,00FH,007H,003H,001H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,0 00H,000H,000H,000H,000H,000H,080H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH DB 0FFH,0FEH,0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,080H,000H,000H,000H,000H,000H,000H,000H,000H,000 H DB 000H,000H,000H,000H,000H,000H,000H,000H,080H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH,0FFH TAB3:DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH DB 07FH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH DB 07EH,0FCH,0F9H,0F3H,0E7H,0CFH,09FH,03FH DB 07EH,0FCH,0F9H,0F3H,0E7H,0CFH,09FH,03FH DB 03EH,07CH,0F8H,0F1H,0E3H,0C7H,08FH,01FH DB 03EH,07CH,0F8H,0F1H,0E3H,0C7H,08FH,01FH DB 08FH,0C7H,0E3H,0F1H,0F8H,07CH,03EH DB 08FH,0C7H,0E3H,0F1H,0F8H,07CH,03EH DB 03FH,09FH,0CFH,0E7H,0F3H,0F9H,0FCH,07EH DB 03FH,09FH,0CFH,0E7H,0F3H,0F9H,0FCH,07EH DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,07FH,03 FH,09FH,0CFH,067H,033H,099H,0CCH,066H,033H,099H,0CCH,066H DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,07FH,03 FH,01FH,00FH,007H,003H,001H,000H,000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,080H,0C0H, 0E0H,0F0H,0F8H,0FCH,0FEH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

单片机设计方案密码锁程序和仿真图

单片机设计方案密码锁程序和仿真图

#include<at89x51.h>#define uchar unsigned char#define uint unsigned intuint num=10; //开始让数码管什么都不显示bit set=0; //定义设置密码的位char count=-1; //开始让COUNT=-1,方便后面显示数码管sbit Beep=P1^2; //蜂鸣器uchar temp;uchar pws[6]={3,6,2,3,3,0}; //原始密码uchar pwx[6]; //按下的数字存储区bit rightflag; //密码正确标志位uchar workbuf[6];uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40 }; //段选码,共阴极uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位选码uint keyscan();void delay(uchar z) //延时,ms级{uchar y;for(;z>0;z--)for(y=120;y>0;y--);}void setpw() //设置密码函数{keyscan();}uint keyscan() //键盘扫描函数{P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5); //键盘去抖,最好ms以上,这里用了mstemp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;//按键计数加temp=P3;switch(temp){case 0xee:{num=7;if(count<6) //六位密码,所以COUNT<6{if(set==0) //设置密码键没有按下时pwx[count]=num; //存储按下的数字elsepws[count]=num; //设置密码键按下时,设置新密码workbuf[count]=tabledu[11]; //相应位的数码管显示"--",不显示相应的数字,密码是保密的}}break;case 0xde:{num=8;if(count<6) //以下扫描键盘的原理差不多同上{if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbe:{num=9;{if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}}break;case 0x7e: //设置密码键按下{set=1; //设置密码标志位置P1_3=0; //设置密码指示灯亮workbuf[0]=0x00;//数码管第一位不显示workbuf[1]=0x00;//......workbuf[2]=0x00;//......workbuf[3]=0x00;workbuf[4]=0x00;workbuf[5]=0x00;//......count=-1; //按键计数复位为-1if(count<6) //密码没有设置完,继续设置密码{setpw(); //设置密码}}break;}while(temp!=0xf0) //按键抬起检测{temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xed:{num=4;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdd:{num=5;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbd:{num=6;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xeb:{num=1;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdb:{num=2;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbb:{num=3;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xd7:{num=0;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xe7: num=20;break; //确定键按下检测case 0x77: //复位键或者输入密码全部一次删除{P1_1=0; //锁关P1_3=1; //密码设置指示灯灭set=0; //不设置密码num=10; //num复位count=-1; //COUNT复位workbuf[0]=tabledu[10]; //第一位数码管不显示workbuf[1]=tabledu[10]; //第二位数码管不显示workbuf[2]=tabledu[10];workbuf[3]=tabledu[10];workbuf[4]=tabledu[10];workbuf[5]=tabledu[10]; //......P1_0=1; //锁关}break;case 0xb7: //输入密码删除键(一位一位删除){count--;workbuf[count]=0x00; //因确定键按下时,COUNT也会加,而确定键不是密码,所以这里是COUNT,而不是COUNT+1count--; //因确定键按下时,确定键不是密码,COUNT也会加,这里COUNT再自减if(count<=-1)count=-1;}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return(num);}void init() //利用定时显示数码管{TMOD=0x01;TH0=(65536-500)/200;TL0=(65536-500)%200;ET0=1;EA=1;TR0=1;}bit compare() //密码比较函数{if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pw x[5]==pws[5]))rightflag=1;elserightflag=0;return(rightflag);}void main(){uint i,j;init();P0=0;P1_1=0; //锁关while(1){keyscan();if(num==20) //如果确定键按下(修改密码和输入密码共用的确定键){if(count==6){if(set==1) //修改密码确定{P1_3=1;workbuf[0]=0;workbuf[1]=0;workbuf[2]=0;workbuf[3]=0;workbuf[4]=0;workbuf[5]=0;}else//输入密码确定{set=0;compare();if(rightflag==1) //如果密码正确{P1_0=0; //锁开P1_1=1;workbuf[0]=tabledu[8]; //数码管第一位显示"8"workbuf[1]=tabledu[8]; //数码管第二位显示"8"workbuf[2]=tabledu[8];workbuf[3]=tabledu[8];workbuf[4]=tabledu[8];workbuf[5]=tabledu[8]; //......}else{P1_1=0; //锁仍然是关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71; //......for(i=0;i<1000;i++) //密码错误报警{for(j=0;j<80;j++);Beep=~Beep;}break;}}}else//若输入的密码位数不为位时{P1_1=0; //锁仍然关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71;for(i=0;i<1000;i++){for(j=0;j<80;j++);Beep=~Beep;}break;}}}}void timer0() interrupt 1 //显示数码管{uchar i;TH0=(65536-500)/200; TL0=(65536-500)%200; for (i=0;i<6;i++) { P0=workbuf[i]; P2=tablewe[i]; delay(5); P0=0;}}XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51234567891RP1RESPACK-812365489=7+CONABCD1243D2LED-RED锁开锁关LS1SOUNDERD3LED-BLUE设置密码指示灯R11kR21kR310KR410K+12VQ3TIP127Q4TIP127Q18050Q28050Q5TIP122Q6TIP122+88.8Amps+88.8Amps+88.8Volts。

8051单片机Proteus仿真实例2(原理图+C程序)

8051单片机Proteus仿真实例2(原理图+C程序)

1. INT0,INT1中断计数原理图:程序:#include <reg51.h>sbit k3=P3^4;sbit k4=P3^5;unsigned char code led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; unsigned char code seg_code[]={0x20,0x10,0x08,0x04,0x02,0x01};unsigned char led_buffer[]={0,0,0,0,0,0};unsigned int count_a=0,count_b=0;void delay(unsigned int x){unsigned char t;while(x--)for(t=0;t<120;t++);}void display(){unsigned char i;led_buffer[2]=count_a/100;led_buffer[1]=count_a%100/10;led_buffer[0]=count_a%10;if(led_buffer[2]==0){led_buffer[2]=10;if(led_buffer[1]==0)led_buffer[1]=10;}led_buffer[5]=count_b/100;led_buffer[4]=count_b%100/10; led_buffer[3]=count_b%10;if(led_buffer[5]==0){led_buffer[5]=10;if(led_buffer[4]==0)led_buffer[4]=10;}for(i=0;i<6;i++){P2=seg_code[i];P1=led_code[led_buffer[i]];delay(1);}}void main(){IT0=1;IT1=1;PX0=1;IE=0x85;while(1){k3=1;k4=1;if(k3==0) count_a=0;if(k4==0) count_b=0;display();}}void int0() interrupt 0{count_a++;}void int1() interrupt 2{count_b++;}2. INT0中断计数原理图:程序:#include <reg51.h>unsigned char code led_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; unsigned char led_buffer[]={0,0,0};unsigned count=0;sbit key=P3^6;void display(){led_buffer[2]=count/100;led_buffer[1]=count%100/10;led_buffer[0]=count%10;if(led_buffer[2]==0){led_buffer[2]=10;if(led_buffer[1]==0)led_buffer[1]=10;}P0=led_code[led_buffer[0]];P1=led_code[led_buffer[1]];P2=led_code[led_buffer[2]];}void main(){IE=0x81;IT0=1;while(1){key=1;if(key==0)count=0;display();}}void int0() interrupt 0 {count++;}3.LED点阵原理图:程序:#include <reg51.h>sbit led1=P0^0;sbit led2=P0^1;void delay(long dly){while(dly--);}void main(){SCON=0x50;TMOD=0x20;TH1=0xfd;TL1=0xfd;PCON=0x00;TR1=1;RI=0;while(1){if(RI==1){RI=0;switch(SBUF){case 'A':led1=~led1;led2=1;break;case 'B':led1=1;led2=~led2;break;case 'C':led1=~led1;led2=~led2;break;}}else led1=led2=1;delay(1000);}}4.串行通信(MAX232芯片)原理图:程序:#include <reg51.h> sbit led1=P0^0;sbit led2=P0^1;void delay(long dly) {while(dly--);}void main(){SCON=0x50;TMOD=0x20;TH1=0xfd;TL1=0xfd;PCON=0x00;TR1=1;RI=0;while(1){if(RI==1){RI=0;switch(SBUF){case 'A':led1=~led1;led2=1;break;case 'B':led1=1;led2=~led2;break;case 'C':led1=~led1;led2=~led2;break;}}else led1=led2=1;delay(1000);}}5.MAX7221芯片原理图:程序:#include <reg51.h>#include <intrins.h>sbit DIN=P2^0;sbit CSB=P2^1;sbit CLK=P2^2;unsigned char code buffer[]={2,0,1,5,10,5,10,9};void delay(long dly){while(dly--);}void write(unsigned char addr,unsigned char dat){unsigned char i;CSB=0;for(i=0;i<8;i++){CLK=0;addr<<=1;DIN=CY;CLK=1;_nop_();_nop_();CLK=0;}for(i=0;i<8;i++) {CLK=0;dat<<=1;DIN=CY;CLK=1;_nop_();_nop_();CLK=0;}CSB=1;}void initialise(){write(0x09,0xff); write(0x0a,0x07); write(0x0b,0x07); write(0x0c,0x01);}void main(){unsigned char i; initialise();delay(10);for(i=0;i<8;i++)write(i+1,buffer[i]); while(1);}6. T0控制LED实现二进制计数原理图:程序:#include <reg51.h>void main(){TMOD=0x05;TR0=1;TH0=0x00;TL0=0x00;while(1){P1=TH0;P2=TL0;}}8. 按键控制LED循环原理图:程序:#include <reg51.h>#include <intrins.h>void delay(unsigned int x){while(x--);}void move_led(){if((P1&0x10)==0) P0=_cror_(P0,1);else if((P1&0x20)==0) P0=_crol_(P0,1);else if((P1&0x40)==0) P2=_cror_(P2,1);else if((P1&0x80)==0) P2=_crol_(P2,1);}void main(){unsigned char key;P0=0xfe;P2=0xfe;P1=0xff;key=0xff;while(1){if(key!=P1){key=P1;move_led();delay(15000); }}}9.按键控制数码管显示原理图:程序:#include <reg51.h>unsigned char code led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; unsigned char code led_seg[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};unsigned char led_buffer[]={0,10,10,10,10,10,10,10};void delay(unsigned int x){unsigned char t;while(x--) for(t=0;t<120;t++);}void led_display(){unsigned char i;for(i=0;i<8;i++){P2=led_seg[i];P0=led_code[led_buffer[i]];delay(2);}}void main(){unsigned char i,key_val,key_count=0;P0=0xff;P1=0xff;P2=0x00;while(1){led_display();key_val=P1;switch(key_val){case 0xfe:key_count++;if(key_count>8) key_count=8;led_buffer[key_count-1]=key_count;break;case 0xfd:if(key_count>0) led_buffer[--key_count]=10;if(key_count==0) led_buffer[0]=0;break;case 0xfb:led_buffer[0]=0;for(i=1;i<8;i++)led_buffer[i]=10;key_count=0;}while(P1!=0xff)led_display();}}10.报警器原理图:程序:#include <reg51.h>sbit SOUNDER=P1^0;sbit BUTTON=P1^7;void delay(unsigned int x){while(x--);}void alarm(unsigned char t){unsigned char i,j;for(i=0;i<200;i++){SOUNDER=!SOUNDER;for(j=0;j<t;j++);delay(15);}}void main(){SOUNDER=0;while(1){BUTTON=1;if(BUTTON==1){alarm(90);alarm(120);}}}。

基于单片机的光控路灯设计含程序和仿真图

基于单片机的光控路灯设计含程序和仿真图

摘要随着社会文明的不断发展,城市照明已经不仅仅局限于街道的照明,而更是发展成为了城市景观等装饰性照明的综合市政工程。

本系统采用51单片机和相关的光电检测设备来设计智能光控路灯控制器,利用单片机可编程控制八位逻辑I/O端口实现路灯的智能化,达到节能、自动控制的目的,避免了传统电路对能源的浪费,且路灯的自动控制更方便了工作人员的管理。

而且所用的路灯采用LED灯,众所周知,LED是目前最为节能的发光元件,通过采用LED发光可以节省大量的电能,因此,智能光控节能路灯必将在未来得到广泛的应用。

本设计方案采用光线强度、时间以及道路车流量的三重模式控制,在很大程度上做到了“随需而控”,同时符合了当今社会所倡导的节约型、可持续性发展的标准,因而拥有良好的可行性和具有很大的实用价值。

本设计是以光敏电阻对于外界光线强弱的感应能力为基础进行的路灯自动化控制系统设计。

当光线强度弱到一定程度的时候,路灯就会自动灭掉;当光线强到一定程度的时候,路灯就会自动开启。

本设计以当外界光线强度弱到使光敏电阻阻值大于等于200欧的时候,LED灯会自动开启;小于200欧的时候,自动关闭。

关键字:单片机,光敏电阻,LED,路灯照明目录摘要 (1)绪论 (3)一、目标及任务 (4)二、硬件设计2.1 主要模块构成 (4)2.2电路设计 (9)2.3 系统流程 (11)三、系统的软件设计3.1详细步骤 (11)3.2 具体程序设计 (12)3.3 系统软件执行流程 (12)四、结论与设计调试4.1结论 (14)4.2课程设计过程中遇到的主要问题以及解决办法 (14)五、心得体会 (15)六、参考文献 (16)七、附录(仿真图、源程序) (17)绪论随着社会的发展,路灯已经成为一个城市的照明系统中不可分割的一部分,在城市照明中发挥着举足轻重的作用,而其所依靠的就是路灯自动化控制系统。

但当前大多采用的是定时的路灯自动化控制系统。

其通常都是采用全夜式开启路灯的自动化控制系统。

基于STC89C52单片机毕业设计完整版附原理图pcb图源程序仿真图

基于STC89C52单片机毕业设计完整版附原理图pcb图源程序仿真图

基于STC89C52单⽚机毕业设计完整版附原理图pcb图源程序仿真图基于STC89C52单⽚机的电⼦密码锁学⽣姓名: xx学⽣学号: xxxxx院(系):电⽓信息⼯程学院年级专业: 2010级电⼦信息⼯程2班指导教师:陶⽂英⼆〇⼀三年六⽉摘要随着⼈们⽣活⽔平的提⾼,如何实现家庭防盗这⼀问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事情屡见不鲜,电⼦密码锁具有安全性能⾼,成本低,功耗低,操作简单等优点使其作为防盗卫⼠的⾓⾊越来越重要。

从经济实⽤⾓度出发,采⽤51系列单⽚机,设计⼀款可更改密码,LCD1602显⽰,具有报警功能,该电⼦密码锁体积⼩,易于开发,成本较低,安全性⾼,能将其存储的现场历史数据及时上报给上位机系统,实现⽹络实时监控,⽅便管理⼈员及时分析和处理数据。

其性能和安全性已⼤⼤超过了机械锁,特点有保密性好,编码量多,远远⼤于弹⼦锁,随机开锁成功率⼏乎为零;密码可变,⽤户可以经常更改密码,防⽌密码被盗,同时也可以避免因⼈员的更替⽽使锁的密级下降;误码输⼊保护。

当输⼊密码多次错误时,报警系统⾃动启动;电⼦密码锁操作简单易⾏,受到⼴⼤⽤户的亲睐。

关键词单⽚机, 密码锁, 更改密码, LCD1602⽬录错误!未定义书签。

1 绪论1.1电⼦密码锁简介 (1)1.2 电⼦密码锁的发展趋势 (1)2 设计⽅案 (3)3 主要元器件 (4)3.1 主控芯⽚STC89C52 (4)3.2 晶体振荡器 (8)3.3 LCD显⽰密码模块的设计 (9)3.3.1 LCD1602简介 (9)3.3.2 LCD1602液晶显⽰模块与单⽚机连接电路 (11)4 硬件系统设计 (12)4.1 设计原理 (12)4.2 电源输⼊电路 (12)4.3 矩阵键盘 (13)4.4 复位电路 (14)4.5 晶振电路 (14)4.6 报警电路 (15)4.7 显⽰电路 (15)4.8 开锁电路 (16)4.9 电路总体构成 (16)5 软件程序设计 (18)5.1 主程序流程介绍 (18)5.2 键盘模块流程图 (19)5.3 显⽰模块流程图 (21)5.4 修改密码流程图 (22)5.5 开锁和报警模块流程图 (23)6 电⼦密码锁的系统调试及仿真 (25)6.1硬件电路调试及结果分析 (25)6.2软件调试及功能分析 (25)6.2.1调试过程 (25)6.2.2 仿真结果分 (26)7 结论 (29)参考⽂献 (30)附录: (31)1 绪论1.1电⼦密码锁简介电⼦密码锁是⼀种通过密码输⼊来控制电路或是芯⽚⼯作,从⽽控制机械开关的闭合,完成开锁、闭锁任务的电⼦产品。

单片机C语言程序实施方案代码和仿真图

单片机C语言程序实施方案代码和仿真图

《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第01 篇基础程序设计01 闪烁地LED/* 名称:闪烁地LED说明:LED按设定地时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右地流水灯/* 名称:从左到右地流水灯说明:接在P0口地8个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0地值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/* 名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动地效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){for(i=0;i<7;i++){P2=_crol_(P2,1); //P2地值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2地值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设地多种花样变换显示*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复.*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit RED_A=P0^0; //东西向灯sbit YELLOW_A=P0^1;sbit GREEN_A=P0^2;sbit RED_B=P0^3; //南北向灯sbit YELLOW_B=P0^4;sbit GREEN_B=P0^5;uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//交通灯切换void Traffic_Light(){switch(Operation_Type){case 1: //东西向绿灯与南北向红灯亮RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;DelayMS(2000);Operation_Type=2;break;case 2: //东西向黄灯闪烁,绿灯关闭DelayMS(300);YELLOW_A=~YELLOW_A;GREEN_A=1;if(++Flash_Count!=10) return; //闪烁5次Flash_Count=0;Operation_Type=3;break;case 3: //东西向红灯,南北向绿灯亮RED_A=0;YELLOW_A=1;GREEN_A=1;RED_B=1;YELLOW_B=1;GREEN_B=0;DelayMS(2000);Operation_Type=4;break;case 4: //南北向黄灯闪烁5次DelayMS(300);YELLOW_B=~YELLOW_B;GREEN_B=1;if(++Flash_Count!=10) return;Flash_Count=0;Operation_Type=1;}}//主程序void main(){while(1) Traffic_Light();}06 单只数码管循环显示0~9/* 名称:单只数码管循环显示0~9说明:主程序中地循环语句反复将0~9地段码送至P0口,使数字0~9循环显示*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i=0;P0=0x00;while(1){ /*for(;i<11;i++){P0=~DSY_CODE[i];DelayMS(300);} //注:另一方案*/P0=~DSY_CODE[i];i=(i+1)%10;DelayMS(300);}}07 8只数码管滚动显示单个数字/* 名称:8只数码管滚动显示单个数字说明:数码管从左到右依次滚动显示0~7,程序通过每次仅循环选通一只数码管*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main()uchar i,wei=0x80;while(1){for(i=0;i<8;i++){P2=0xff; //关闭显示wei=_crol_(wei,1);P0=DSY_CODE[i]; //发送数字段码P2=wei; //发送位码DelayMS(300);}}}08 8只数码管动态显示多个不同字符电路如上图/* 名称:8只数码管动态显示多个不同字符说明:数码管动态扫描显示0~7.*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i,wei=0x80;while(1){for(i=0;i<8;i++){P2=0xff;P0=DSY_CODE[i]; //发送段码wei=_crol_(wei,1);P2=wei; //发送位码DelayMS(2);}}09 8只数码管闪烁显示数字串电路如上图/* 名称:8只数码管闪烁显示数字串说明:数码管闪烁显示由0~7构成地一串数字本例用动态刷新法显示一串数字,在停止刷新时所有数字显示消失. */#include<reg51.h>#define uchar unsigned char#define uint unsigned int//段码表uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //位码表uchar code DSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i,j;while(1){for(i=0;i<30;i++){for(j=0;j<8;j++){P0=0xff;P0=DSY_CODE[j]; //发送段码P2=DSY_IDX[j]; //发送位码DelayMS(2);}}P2=0x00; //关闭所有数码管并延时DelayMS(1000);}}10 8只数码管滚动显示数字串电路如上图/* 名称:8只数码管滚动显示数字串说明:数码管向左滚动显示3个字符构成地数字串#include<intrins.h>#define uchar unsigned char#define uint unsigned int//段码表uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //下面数组看作环形队列,显示从某个数开始地8个数(10表示黑屏)uchar Num[]={10,10,10,10,10,10,10,10,2,9,8};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i,j,k=0,m=0x80;while(1){ //刷新若干次,保持一段时间地稳定显示for(i=0;i<15;i++){for(j=0;j<8;j++){ //发送段码,采用环形取法,从第k个开始取第j个P0=0xff;P0=DSY_CODE[Num[(k+j)%11]];m=_crol_(m,1);P2=m; //发送位码DelayMS(2);}}k=(k+1)%11; //环形队列首支针k递增,Num下标范围0~10,故对11取余}}11 K1-K4 控制LED移位/* 名称:K1-K4 控制LED移位说明:按下K1时,P0口LED上移一位;按下K2时,P0口LED下移一位;按下K3时,P2口LED上移一位;按下K4时,P2口LED下移一位;#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--)for(i=0;i<120;i++);}//根据P1口地按键移动LEDvoid Move_LED(){if ((P1&0x10)==0) P0=_cror_(P0,1); //K1else if((P1&0x20)==0) P0=_crol_(P0,1); //K2else if((P1&0x40)==0) P2=_cror_(P2,1); //K3else if((P1&0x80)==0) P2=_crol_(P2,1); //K4}//主程序void main(){uchar Recent_Key; //最近按键P0=0xfe;P2=0xfe;P1=0xff;Recent_Key=0xff;while(1){if(Recent_Key!=P1){Recent_Key=P1; //保存最近按键Move_LED();DelayMS(10);}}}12 K1-K4 按键状态显示/* 名称:K1-K4 按键状态显示说明:K1、K2按下时LED点亮,松开时熄灭,K3、K4按下并释放时LED点亮,再次按下并释放时熄灭;#define uchar unsigned char#define uint unsigned intsbit LED1=P0^0;sbit LED2=P0^1;sbit LED3=P0^2;sbit LED4=P0^3;sbit K1=P1^0;sbit K2=P1^1;sbit K3=P1^2;sbit K4=P1^3;//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//主程序void main(){P0=0xff;P1=0xff;while(1){LED1=K1;LED2=K2;if(K3==0){while(K3==0);LED3=~LED3;}if(K4==0){while(K4==0);LED4=~LED4;}DelayMS(10);}}13 K1-K4 分组控制LED/* 名称:K1-K4 分组控制LED说明:每次按下K1时递增点亮一只LED,全亮时再次按下则再次循环开始,K2按下后点亮上面4只LED,K3按下后点亮下面4只LED,K4按下后关闭所有LED#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//主程序void main(){uchar k,t,Key_State;P0=0xff;P1=0xff;while(1){t=P1;if(t!=0xff){DelayMS(10);if(t!=P1) continue;//取得4位按键值,由模式XXXX1111(X中有一位为0,其他均为1)//变为模式0000XXXX(X中有一位为1,其他均为0)Key_State=~t>>4;k=0;//检查1所在位置,累加获取按键号kwhile(Key_State!=0){k++;Key_State>>=1;}//根据按键号k进行4种处理switch(k){case 1: if(P0==0x00) P0=0xff;P0<<=1;DelayMS(200);break;case 2: P0=0xf0;break;case 3: P0=0x0f;break;case 4: P0=0xff;}}}14 K1-K4 控制数码管移位显示/* 名称:K1-K4 控制数码管移位显示说明:按下K1时加1计数并增加显示位,按下K2时减1计数并减少显示位,按下K3时清零.*/#include<reg51.h>#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //位码uchar code DSY_Index[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//待显示到各数码管地数字缓冲(开始仅在0位显示0,其他黑屏)uchar Display_Buffer[]={0,10,10,10,10,10,10,10};//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}void Show_Count_ON_DSY(){uchar i;for(i=0;i<8;i++){P0=0xff;P0=DSY_CODE[Display_Buffer[i]];P2=DSY_Index[i];DelayMS(2);}}//主程序void main(){uchar i,Key_NO,Key_Counts=0;P0=0xff;P1=0xff;P2=0x00;while(1){Show_Count_ON_DSY();P1=0xff;Key_NO=P1;//P1口按键状态分别为K1-0xfe,K2-0xfd,K3-0xfbswitch(Key_NO){case 0xfe: Key_Counts++;if(Key_Counts>8) Key_Counts=8;Display_Buffer[Key_Counts-1]=Key_Counts;break;case 0xfd: if(Key_Counts>0)Display_Buffer[--Key_Counts]=10;break;case 0xfb: Display_Buffer[0]=0;for(i=1;i<8;i++) Display_Buffer[i]=10;Key_Counts=0;}//若键未释放则仅刷新显示,不进行键扫描while(P1!=0xff) Show_Count_ON_DSY();}}15 K1-K4 控制数码管加减演示/* 名称:K1-K4 控制数码管加减演示说明:按下K1后加1计数,按下K2后减1计数,按下K3后清零.*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //待显示地3位缓冲uchar Num_Buffer[]={0,0,0};//按键代码,按键计数uchar Key_Code,Key_Counts=0;//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//显示函数void Show_Counts_ON_DSY(){uchar i,j=0x01;Num_Buffer[2]=Key_Counts/100;Num_Buffer[1]=Key_Counts/10%10;Num_Buffer[0]=Key_Counts%10;for(i=0;i<3;i++){j=_cror_(j,1);P0=0xff;P0=DSY_CODE[Num_Buffer[i]];P2=j;DelayMS(1);}}//主程序void main(){uchar i;P0=0xff;P1=0xff;P2=0x00;Key_Code=0xff;while(1){Show_Counts_ON_DSY();P1=0xff;Key_Code=P1;//有键按下时,数码管刷新显示30次,该行代码同时起到延时作用if(Key_Code!=0xff)for(i=0;i<30;i++) Show_Counts_ON_DSY();switch(Key_Code){case 0xfe: if(Key_Counts<255) Key_Counts++;break;case 0xfd: if(Key_Counts>0) Key_Counts--;break;case 0xfb: Key_Counts=0;}Key_Code=0xff;}}16 4X4矩阵键盘控制条形LED显示/* 名称:4X4矩阵键盘控制条形LED显示说明:运行本例时,按下地按键值越大点亮地LED越多.*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//矩阵键盘按键特征码表uchar code KeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//键盘扫描uchar Keys_Scan(){uchar sCode,kCode,i,k;//低4位置0,放入4行P1=0xf0;//若高4位出现0,则有键按下if((P1&0xf0)!=0xf0){DelayMS(2);if((P1&0xf0)!=0xf0){sCode=0xfe; //行扫描码初值for(k=0;k<4;k++) //对4行分别进行扫描{P1=sCode;if((P1&0xf0)!=0xf0){kCode=~P1;for(i=0;i<16;i++) //查表得到按键序号并返回if(kCode==KeyCodeTable[i])return(i);}elsesCode=_crol_(sCode,1);}}}return(-1);}//主程序void main(){uchar i,P2_LED,P3_LED;uchar KeyNo=-1; //按键序号,-1表示无按键while(1){KeyNo=Keys_Scan(); //扫描键盘获取按键序号KeyNoif(KeyNo!=-1){P2_LED=0xff;P3_LED=0xff;for(i=0;i<=KeyNo;i++) //键值越大,点亮地LED越多{if(i<8)P3_LED>>=1;elseP2_LED>>=1;}P3=P3_LED; //点亮条形LEDP2=P2_LED;}}}17 数码管显示4X4矩阵键盘按键号/* 名称:数码管显示4X4矩阵键盘按键号说明:按下任意键时,数码管都会显示其键地序号,扫描程序首先判断按键发生在哪一列,然后根据所发生地行附加不同地值,从而得到按键地序号.*/#include<reg51.h>#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};sbit BEEP=P3^7;//上次按键和当前按键地序号,该矩阵中序号范围0~15,16表示无按键uchar Pre_KeyNo=16,KeyNo=16;//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//矩阵键盘扫描void Keys_Scan(){uchar Tmp;P1=0x0f; //高4位置0,放入4行DelayMS(1);Tmp=P1^0x0f;//按键后0f变成0000XXXX,X中一个为0,3个仍为1,通过异或把3个1变为0,唯一地0变为1switch(Tmp) //判断按键发生于0~3列地哪一列{case 1: KeyNo=0;break;case 2: KeyNo=1;break;case 4: KeyNo=2;break;case 8: KeyNo=3;break;default:KeyNo=16; //无键按下}P1=0xf0; //低4位置0,放入4列DelayMS(1);Tmp=P1>>4^0x0f;//按键后f0变成XXXX0000,X中有1个为0,三个仍为1;高4位转移到低4位并异或得到改变地值switch(Tmp) //对0~3行分别附加起始值0,4,8,12{case 1: KeyNo+=0;break;case 2: KeyNo+=4;break;case 4: KeyNo+=8;break;case 8: KeyNo+=12;}}//蜂鸣器void Beep(){uchar i;for(i=0;i<100;i++){DelayMS(1);BEEP=~BEEP;}BEEP=0;}//主程序void main(){P0=0x00;BEEP=0;while(1){P1=0xf0;if(P1!=0xf0) Keys_Scan(); //获取键序号if(Pre_KeyNo!=KeyNo){P0=~DSY_CODE[KeyNo];Beep();Pre_KeyNo=KeyNo;}DelayMS(100);}}18 开关控制LED/* 名称:开关控制LED说明:开关S1和S2分别控制LED1和LED2.*/#include<reg51.h>sbit S1=P1^0;sbit S2=P1^1;sbit LED1=P0^0;sbit LED2=P0^1;//主程序void main(){while(1){LED1=S1;LED2=S2;}}19 继电器控制照明设备/* 名称:继电器控制照明设备说明:按下K1灯点亮,再次按下时灯熄灭*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit K1=P1^0;sbit RELAY=P2^4;//延时void DelayMS(uint ms){uchar t;while(ms--)for(t=0;t<120;t++);}//主程序void main(){P1=0xff;RELAY=1;while(1){if(K1==0){while(K1==0);RELAY=~RELAY;DelayMS(20);}}}20 数码管显示拨码开关编码/* 名称:数码管显示拨码开关编码说明:系统显示拨码开关所设置地编码000~255*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//各数字地数码管段码(共阴)uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示缓冲uchar DSY_Buffer[3]={0,0,0};//延时void DelayMS(uint ms){uchar t;while(ms--)for(t=0;t<120;t++);}//主程序void main(){uchar i,m,Num;P0=0xff;P2=0xff;while(1){m=0xfe;Num=P1; //读取拨码开关地值DSY_Buffer[0]=Num/100;DSY_Buffer[1]=Num/10%10;DSY_Buffer[2]=Num%10;for(i=0;i<3;i++) //刷新显示在数码管上{m=_crol_(m,1);P2=m;P0=DSY_CODE[DSY_Buffer[i]];DelayMS(10);}}}21 开关控制报警器/* 名称:开关控制报警器说明:用K1开关控制报警器,程序控制P1.0输出两种不同频率地声音,模拟很逼真地报警效果*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit SPK=P1^0;sbit K1=P1^7;//发声函数void Alarm(uchar t){uchar i,j;for(i=0;i<200;i++){SPK=~SPK;for(j=0;j<t;j++);//由参数t行成不同地频率}}void main(){SPK=0;while(1)if(K1==1){Alarm(90);Alarm(120);}}}22 按键发音/* 名称:按键发音说明:按下不同地按键会是SOUNDER发出不同频率地声音.本例使用延时函数实现不同频率地声音输出,以后也可使用定时器*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit BEEP=P3^7;sbit K1=P1^4;sbit K2=P1^5;sbit K3=P1^6;sbit K4=P1^7;//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//按周期t发音void Play(uchar t){uchar i;for(i=0;i<100;i++){BEEP=~BEEP;DelayMS(t);}BEEP=0;}void main(){P1=0xff;BEEP=0;while(1){if(K2==0) Play(2);if(K3==0) Play(3);if(K4==0) Play(4);}}23 播放音乐/* 名称:播放音乐说明:程序运行时播放生日快乐歌,未使用定时器中断,所有频率完全用延时实现*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit BEEP=P3^7;//生日快乐歌地音符频率表,不同频率由不同地延时来决定uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0};//生日快乐歌节拍表,节拍决定每个音符地演奏长短uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//播放函数void PlayMusic(){uint i=0,j,k;while(SONG_LONG[i]!=0||SONG_TONE[i]!=0){ //播放各个音符,SONG_LONG为拍子长度for(j=0;j<SONG_LONG[i]*20;j++){BEEP=~BEEP;//SONG_TONE延时表决定了每个音符地频率for(k=0;k<SONG_TONE[i]/3;k++);}DelayMS(10);i++;}}void main(){{PlayMusic(); //播放生日快乐DelayMS(500); //播放完后暂停一段时间}}24 INT0中断计数/* 名称:INT0中断计数说明:每次按下计数键时触发INT0中断,中断程序累加计数,计数值显示在3只数码管上,按下清零键时数码管清零*/#include<reg51.h>#define uchar unsigned char#define uint unsigned int//0~9地段码uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //计数值分解后各个待显示地数位uchar DSY_Buffer[]={0,0,0};uchar Count=0;sbit Clear_Key=P3^6;//数码管上显示计数值void Show_Count_ON_DSY(){DSY_Buffer[2]=Count/100; //获取3个数DSY_Buffer[1]=Count%100/10;DSY_Buffer[0]=Count%10;if(DSY_Buffer[2]==0) //高位为0时不显示{DSY_Buffer[2]=0x0a;if(DSY_Buffer[1]==0) //高位为0,若第二位为0同样不显示DSY_Buffer[1]=0x0a;}P0=DSY_CODE[DSY_Buffer[0]];P1=DSY_CODE[DSY_Buffer[1]];P2=DSY_CODE[DSY_Buffer[2]];}//主程序void main(){P0=0x00;IE=0x81; //允许INT0中断IT0=1; //下降沿触发while(1){if(Clear_Key==0) Count=0; //清0Show_Count_ON_DSY();}}//INT0中断函数void EX_INT0() interrupt 0{Count++; //计数值递增}25 外部INT0中断控制LED/* 名称:外部INT0中断控制LED 说明:每次按键都会触发INT0中断,中断发生时将LED状态取反,产生LED状态由按键控制地效果*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P0^0;//主程序void main(){LED=1;EA=1;EX0=1;IT0=1;while(1);}//INT0中断函数void EX_INT0() interrupt 0{LED=~LED; //控制LED亮灭}26 INT0及INT1中断计数/* 名称:INT0及INT1中断计数说明:每次按下第1个计数键时,码管上,每次按下第2个计数键时,第2组计数值累加并显示在左边3只数码管上,后两个按键分别清零.*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit K3=P3^4; //2个清零键sbit K4=P3^5;//数码管段码与位码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};uchar code DSY_Scan_Bits[]={0x20,0x10,0x08,0x04,0x02,0x01};//2组计数地显示缓冲,前3位一组,后3位一组uchar data Buffer_Counts[]={0,0,0,0,0,0};uint Count_A,Count_B=0;//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//数据显示void Show_Counts(){uchar i;Buffer_Counts[2]=Count_A/100;Buffer_Counts[1]=Count_A%100/10;Buffer_Counts[0]=Count_A%10;if( Buffer_Counts[2]==0){Buffer_Counts[2]=0x0a;if( Buffer_Counts[1]==0)Buffer_Counts[1]=0x0a;}Buffer_Counts[5]=Count_B/100;Buffer_Counts[4]=Count_B%100/10;Buffer_Counts[3]=Count_B%10;if( Buffer_Counts[5]==0){Buffer_Counts[5]=0x0a;if( Buffer_Counts[4]==0)Buffer_Counts[4]=0x0a;}for(i=0;i<6;i++){P2=DSY_Scan_Bits[i];DelayMS(1);}}//主程序void main(){IE=0x85;PX0=1; //中断优先IT0=1;IT1=1;while(1){if(K3==0) Count_A=0;if(K4==0) Count_B=0;Show_Counts();}}//INT0中断函数void EX_INT0() interrupt 0{Count_A++;}//INT1中断函数void EX_INT1() interrupt 2{Count_B++;}27 定时器控制单只LED/* 名称:定时器控制单只LED说明:LED在定时器地中断例程控制下不断闪烁. */#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P0^0;uchar T_Count=0;//主程序void main(){TMOD=0x00; //定时器0工作方式0TH0=(8192-5000)/32; //5ms定时TL0=(8192-5000)%32;IE=0x82; //允许T0中断while(1);}//T0中断函数void LED_Flash() interrupt 1{TH0=(8192-5000)/32; //恢复初值TL0=(8192-5000)%32;if(++T_Count==100) //0.5s开关一次LED{LED=~LED;T_Count=0;}}28 TIMER0控制流水灯/* 名称:TIMER0控制流水灯说明:定时器控制P0、P2口地LED滚动显示,本例未使用中断函数.*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//主程序void main(){uchar T_Count=0;P0=0xfe;P2=0xfe;TMOD=0x01; //定时器0工作方式1 TH0=(65536-40000)/256; //40ms定时TL0=(65536-40000)%256;TR0=1; //启动定时器while(1){if(TF0==1){TF0=0;TH0=(65536-40000)/256; //恢复初值TL0=(65536-40000)%256;if(++T_Count==5){P0=_crol_(P0,1);T_Count=0;}}}}29 定时器控制4个LED滚动闪烁/* 名称:定时器控制4个LED滚动闪烁说明:4只LED在定时器控制下滚动闪烁.*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit B1=P0^0;sbit G1=P0^1;sbit R1=P0^2;sbit Y1=P0^3;uint i,j,k;//主程序void main(){i=j=k=0;P0=0xff;TMOD=0x02; //定时器0工作方式2TH0=256-200; //200us定时TL0=256-200;IE=0x82;TR0=1; //启动定时器while(1);}//T0中断函数void LED_Flash_and_Scroll() interrupt 1{if(++k<35) return; //定时中断若干次后执行闪烁k=0;switch(i){case 0: B1=~B1;break;case 1: G1=~G1;break;case 2: R1=~R1;break;case 3: Y1=~Y1;break;default:i=0;}if(++j<300) return; //每次闪烁持续一段时间P0=0xff; //关闭显示i++; //切换到下一个LED}30 T0控制LED实现二进制计数/* 名称:T0控制LED实现二进制计数说明:本例对按键地计数没有使用查询法,没有使用外部中断函数,没有使用定时或计数中断函数.而是启用了计数器,连接在T0引脚地按键每次按下时,会使计数寄存器地值递增,其值通过LED以二进制形式显示*/#include<reg51.h>//主程序void main(){TMOD=0x05; //定时器0为计数器,工作方式1,最大计数值65535 TH0=0; //初值为0TL0=0;TR0=1; //启动定时器while(1){P1=TH0;P2=TL0;}}31 TIMER0与TIMER1控制条形LED/* 名称:TIMER0与TIMER1控制条形LED说明:定时器T0定时控制上一组条形LED,滚动速度较快定时器T1定时控制下一组条形LED,滚动速度较慢*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar tc0=0,tc1=0;//主程序void main(){P0=0xfe;P2=0xfe;1均工作于方式1TH0=(65536-15000)/256; //定时器0:15msTL0=(65536-15000)%256;TH1=(65536-50000)/256; //定时器1:50msTL1=(65536-50000)%256;IE=0x8a;TR0=1; //启动定时器TR1=1;while(1);}//T0中断函数void Time0() interrupt 1{TH0=(65536-15000)/256; //恢复定时器0初值TL0=(65536-15000)%256;if(++tc0==10) //150ms转换状态{tc0=0;P0=_crol_(P0,1);}}//T1中断函数void Time1() interrupt 3{TH0=(65536-50000)/256; //恢复定时器1初值TL0=(65536-50000)%256;if(++tc1==10) //500ms转换状态{tc1=0;P2=_crol_(P2,1);}}32 10s地秒表/* 名称:10s地秒表说明:首次按键计时开始,再次按键暂停,第三次按键清零.*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit K1=P3^7;uchari,Second_Counts,Key_Flag_Idx;bit Key_State;ucharDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延时void DelayMS(uint ms){uchar t;while(ms--) for(t=0;t<120;t++);}//处理按键事件void Key_Event_Handle(){if(Key_State==0){Key_Flag_Idx=(Key_Flag_Idx+1)%3;switch(Key_Flag_Idx){case 1: EA=1;ET0=1;TR0=1;break;case 2: EA=0;ET0=0;TR0=0;break;case 0: P0=0x3f;P2=0x3f;i=0;Second_Counts=0;}}}//主程序void main(){P0=0x3f; //显示00P2=0x3f;i=0;Second_Counts=0;Key_Flag_Idx=0; //按键次数(取值0,1,2,3)Key_State=1; //按键状态TMOD=0x01; //定时器0方式1TH0=(65536-50000)/256; //定时器0:15msTL0=(65536-50000)%256;while(1){if(Key_State!=K1){DelayMS(10);Key_State=K1;Key_Event_Handle();}}}//T0中断函数void DSY_Refresh() interrupt 1{TH0=(65536-50000)/256; //恢复定时器0初值TL0=(65536-50000)%256;if(++i==2) //50ms*2=0.1s转换状态{i=0;Second_Counts++;P0=DSY_CODE[Second_Counts/10];P2=DSY_CODE[Second_Counts%10];if(Second_Counts==100) Second_Counts=0; //满100(10s)后显示00 }}33 用计数器中断实现100以内地按键计数/* 名称:用计数器中断实现100以内地按键计数说明:本例用T0计数器中断实现按键技术,由于计数寄存器初值为1,因此P3.4引脚地每次负跳变都会触发T0中断,实现计数值累加.计数器地清零用外部中断0控制.*/#include<reg51.h>#define uchar unsigned char#define uint unsigned int//段码uchar codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar Count=0;//主程序void main(){P0=0x00;P2=0x00;TMOD=0x06; //计数器T0方式2TH0=TL0=256-1; //计数值为1ET0=1; //允许T0中断EX0=1; //允许INT0中断EA=1; //允许CPU中断IP=0x02; //设置优先级,T0高于INT0IT0=1; //INT0中断触发方式为下降沿触发TR0=1; //启动T0while(1){P0=DSY_CODE[Count/10];P2=DSY_CODE[Count%10];}}//T0计数器中断函数void Key_Counter() interrupt 1{Count=(Count+1)%100; //因为只有两位数码管,计数控制在100以内(00~99)}//INT0中断函数void Clear_Counter() interrupt 0{Count=0;}34 100 000s以内地计时程序/* 名称:100 000s以内地计时程序说明:在6只数码管上完成0~99 999.9s.*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//段码uchar codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//6只数码管上显示地数字uchar Digits_of_6DSY[]={0,0,0,0,0,0};uchar Count;sbit Dot=P0^7;//延时void DelayMS(uint ms){uchar t;while(ms--) for(t=0;t<120;t++);}//主程序void main(){uchar i,j;P0=0x00;P3=0xff;Count=0;TMOD=0x01; //计数器T0方式1TH0=(65536-50000)/256; //50ms定时TL0=(65536-50000)%256;IE=0x82;TR0=1; //启动T0while(1){j=0x7f;//显示Digits_of_6DSY[5]~Digits_of_6DSY[0]地内容//前面高位,后面低位,循环中i!=-1亦可写成i!=0xfffor(i=5;i!=-1;i--){j=_crol_(j,1);P3=j;P0=DSY_CODE[Digits_of_6DSY[i]];if(i==1) Dot=1; //加小数点DelayMS(2);}}}//T0中断函数void Timer0() interrupt 1{uchar i;TH0=(65536-50000)/256; //恢复初值TL0=(65536-50000)%256;if(++Count!=2) return;Count=0;Digits_of_6DSY[0]++; //0.1s位累加for(i=0;i<=5;i++) //进位处理{if(Digits_of_6DSY[i]==10){Digits_of_6DSY[i]=0;if(i!=5) Digits_of_6DSY[i+1]++; //如果0~4位则分别向高一位进位}else break; //若某低位没有进位,怎循环提前结束}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
1、学习并掌握74HC573锁存器的使用方法;
2、学会使用8段共阴极数码管的动态显示方法。
二、实验设备
单片机实验箱一台;PC机一台;USB下载线一根。
三、实验内容
通过编程,实现8段数码管的动态扫描显示,要求8个数码管从左到右分别显示“1”、“2”、“3”、“4”、“A”、“b”、“C”、“d”。
数码管接口电路如图5-1所示:
图5-1数码管接口电路原理图
四、思考题
1.何谓数码管的动态显示,其原理是什么?
2.简述锁存器的工作原理,在本实验中具有什么作用?
程序代码:
#include<reg51.h>
sbit wela=P3^7;
sbit dula=P3^6;
char code t[8]={0x06,0x5b,0x4f,0x66,0x77,0x7c,0x39,0x5e};
一、实验目的
1、学习外部中断技术的基本使用方法
2、中断处理的编程方法。
二、实验设备
单片机实验箱一台;PC机一台;USB下载线一根。
三、实验内容
单片机外部中断0(P3.2)已与独立式键盘中S27连接,外部中断1(P3.3)已与S28连接,要求在无外部中断时最右一位发光二极管(D26)点亮。请编程实现:当S27按下,外部中断0请求中断,控制发光二极管左移;当S28按下,外部中断1请求中断,控制发光二极管闪烁。(要求外部中断1优先级高于外部中断0)。单片机与发光二极管的连续见实验一原理图,独立式键盘原理图如图4-1所示。
本实验也可不使用移位寄存器,改用数组char code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}用for循环,把值依次;赋值给P0口,进行流水灯显示。
思考题1代码:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
void delay()
{
int a,b;
for(a=120;a>0;a--)
{
for(b=110;b>0;b--);
}
}
void main()
{
IT0=0;
IT1=0;
EX0=1;
EX1=1;
EA=1;
PX0=0;
PX1=1;
while(1)
{
D26=0;
}
}
void int1(void) interrupt 2 using 1
实验程序代码:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define d1 255
sbit S31=P1^0;
sbit S32=P1^1;
sbit D19=P0^0;
void delay(uchar d)
{
uchar b;
五、思考题
1.简述你在本次实验中遇到过哪些问题?这些问题是怎样解决的?有何收获和体会?
2. 本实验的硬件通过编程可以演奏出悦耳的乐曲、可以实现报警声、门铃声音。现要求单片机产生“嘀、嘀、…”报警声从P1.0端口输出,产生频率为1KHz。当1KHZ方波从P1.0输出0.2秒,接着0.2秒从P1.0输出电平信号,如此循环下去时,就形成所需的报警声了。请有兴趣的同学编程调试。
四、实验步骤
1.自行编写程序,将实验箱电源开关拨至USB供电,并将拨码开关总开关S44拨至“开”状态。
2.下载程序并运行程序,改变开关状态,观察发光二极管显示结果。
五、思考题
1.拨动8个输入开关(S31~S38),把8位数据送到P1口,CPU从P1口读入8个开关(S31~S38)的状态数据,任意使用其中的两个开关控制P0口发光二极管(D19~D26)自左至右、自右至左、自中间至两边、自两边至中间不断循环点亮。请编写程序并调试。
2.8个拨码开关(S31~S38)实现对P0口发光二极管的亮度控制。依次拨上开关S31、S32…S38,发光二极管由暗变亮;依次拨下开关S38、S37…S31,发光二极管由亮变暗。
分析:本题存在一定的矛盾与歧义,首先是“一定的速度自左至右循环点亮8次”,8次是一个灯亮算一次还是led灯走一个流程算一次?再者,当两个灯都为高电平时,一个自右向左一个自左向右具有不可协调性。为了方便实验展示,我们设置了两个标志位flag1和flag2。<intrins.h>是移位寄存器,其中包含_crol_,_cror_,_irol__,irol_等移位函数,_crol_指char型数左移(left),以此类推。
3.掌握程序的执行及断点设置方法。
二、实验设备
单片机实验箱一台;PC机一台;USB下载线一根。
三、实验内容
通过了解P1口的开关控制电路和P0的LED电路,编写基本输入输出实验程序。实验内容为设置P1为输入口,P0口为输出口,将P1口的开关状态发送到P0口,让灯亮灭,将P1的电平状态通过P0口的LED的亮灭表示出来。
{
BUZZ=~BUZZ;
delay();
}
FLAG=~FLAG;
}
}
}
}
思考题2代码:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit S38=P1^7;
sbit BUZZ=P1^0;
void delay()
{
uchar b;
这是大三上学期学单片机做的所有实验题,是全部编程试验箱通过的。总结下,记得条条大道通罗马,不要拘泥于一种方式,仅供参考呀~~~
实验一单片机实验设备的使用及简单程序的运行、调试
一、实验目的
通过一简单的实验掌握:
1.掌握PL2303驱动的安装,掌握Keil3开发环境的安装、设置和基本使用;
2.掌握项目、文件的建立方法、程序的下载以及寄存器、存储器内容的查看方法;
switch(temp)
{
case 0xff://左移
{
sel=0xfe;
for(i=0;i<8;i++)
{
P0=sel;
delay(d1);
sel=_crol_(sel,1);
}
break;
}
case 0xfe://右移
{
sel=0xfe;
for(i=0;i<8;i++)
{
P0=sel;
delay(d1);
程序清单如下:
#include <reg51.h>
void main(void)//程序主函数
{
while(1)//循环用于实时扫描IO状态
{
P0=P1; //将P1口的数据发送给P0口
}
}
六、实验注意事项
1.在输入程序时,其中的字母、符号均须在英文方式下进行。
2.特殊功能寄存器中的字母必须要大写,如若将示例程序中的P0写成p0,程序将提示出错。
#define d1 255 //宏定义
void delay(uchar d)
{
uchar b;
while(--d)
{
for(b=255;b>0;b--)
{
_nop_(); //空操作
}
}
}
void main()
{
uchar temp,sel;
while(1)
{
temp=p1&0xff; //检测按键
P0=0xdb;
delay(d1);
P0=0xbd;
delay(d1);
P0=0x7e;
delay(d1);
break;
}
default:
break;
}
}
}
实验三报警产生器
一、实验目的
1、掌握单片机实验箱的使用方法与程序调试技巧;
2、学会使用51系列单片机I/O的基本输入输出功能及相应的驱动模块的设计。
for(b=63;b>0;b--)
{
_nop_();
}
}
void main()
{
while(1)
{
uchar i;
while(S38==1)
{
for(i=0;i<200;i++)
{
BUZZ=~BUZZ;
delay();
}
for(i=400;i>0;i--)//延时0.2s
{
delay();
}
}
}
}
实验四 外部中断实验
四、实验步骤
读懂电路原理图如图1-1和图1-2所示:,插上USB连接线,将电源选择拨码开关拨至“USB供电”,将示例程序进行编译、装载、下载,下载时将拨码开关S44拨至“开”状态,拨动拨码开关S31~S38的开关状态,观察实验现象,实验电路原理图
图1-1LED接口电路
图1-2拨码开关电路图
五、示例程序
}
}
void main()
{
while(1)
{
uint FLAG=1,i;
while(S38==1)//按键按下
{
if(FLAG)
{
for(i=0;i<200;i++)//500hz
{
BUZZ=~BUZZ;
delay();
delay();
}
FLAG=~FLAG;
}
else
{
for(i=0;i<200;i++)//1000hz
相关文档
最新文档