单片机实验代码

合集下载

51单片机数字频率计的代码

51单片机数字频率计的代码

51单片机数字频率计的代码标题: 用51单片机实现数字频率计功能的创作导言:数字频率计是一种常见的电子测量仪器,用于测量信号的频率。

本文将介绍如何使用51单片机实现数字频率计的功能,通过编写相关代码和接线,实现对信号频率的测量和显示。

一、引言数字频率计是一种电子测量仪器,用于测量信号的频率。

它通过将输入信号与计时器进行比较,并将计数结果转换为频率值。

在本项目中,我们将使用51单片机来实现这一功能。

二、硬件设计我们需要准备的硬件有:51单片机、晶体振荡器、LCD显示屏、按键开关和一些连接线。

首先,将晶体振荡器连接到单片机的相应引脚上,以提供系统时钟。

然后将LCD显示屏连接到单片机的I/O端口上,用于显示测量结果。

最后,连接按键开关到单片机的I/O端口上,用于启动和停止测量。

三、软件设计1. 初始化我们需要初始化单片机的计时器和LCD显示屏。

通过设置计时器的工作模式和计数方式,以及LCD的显示模式和位置,来确保测量和显示的准确性。

2. 信号测量接下来,我们需要编写代码来测量输入信号的频率。

通过将输入信号与计时器进行比较,并在每个计数周期结束时进行计数,来获取信号的周期时间。

然后,通过计算周期时间的倒数,即可得到信号的频率。

3. 结果显示将测量得到的频率值转换为字符形式,并通过LCD显示屏进行显示。

可以使用LCD库函数来实现字符显示的功能,通过将频率值转换为字符数组,并逐个显示在LCD屏幕上。

四、实验结果经过测试,我们成功实现了数字频率计的功能。

当输入信号稳定时,可以准确地测量并显示信号的频率。

通过按下按键开关,可以启动和停止频率测量。

结论:通过51单片机的编程和硬件设计,我们成功实现了数字频率计的功能。

该频率计可以准确地测量输入信号的频率,并通过LCD显示屏进行显示。

这个项目不仅加深了我们对单片机的理解,还提高了我们的编程能力。

希望这个项目能对读者有所帮助,激发对电子技术的兴趣和研究。

51单片机20个实验-代码详细

51单片机20个实验-代码详细

第一章单片机系统板说明一、概述单片机实验开发系统是一种多功能、高配置、高品质的MCS-51单片机教学与开发设备。

适用于大学本科单片机教学、课程设计和毕业设计以及电子设计比赛。

该系统采用模块化设计思想,减小了系统面积,同时增加了可靠性,使得单片机实验开发系统能满足从简单的数字电路实验到复杂的数字系统设计实验,并能一直延伸到综合电子设计等创新性实验项目。

该系统采用集成稳压电源供电,使电源系统的稳定性大大提高,同时又具备完备的保护措施。

为适应市场上多种单片机器件的应用,该系统采用“单片机板+外围扩展板”结构,通过更换不同外围扩展板,可实验不同的单片机功能,适应了各院校不同的教学需求。

二、单片机板简介本实验系统因为自带了MCS-51单片机系统,因此没有配置其他单片机板,但可以根据教学需要随时配置。

以单片机板为母板,并且有I/O接口引出,可以很方便的完成所有实验。

因此构成单片机实验系统。

1、主要技术参数(1)MSC-51单片机板板上配有ATMEL公司的STC89C51芯片。

STC89C51资源:32个I/O口;封装DIP40。

STC89C51开发软件:KEIL C51。

2、MSC-51单片机结构(1)单片机板中央放置一块可插拔的DIP封装的STC89C51芯片。

(2)单片机板左上侧有一个串口,用于下载程序。

(3)单片机板的四周是所有I/O引脚的插孔,旁边标有I/0引脚的脚引。

(4)单片机板与各个模块配合使用时,可形成—个完整的实验系统。

三、母板简介主要技术参数(1)实验系统电源实验系统置了集成稳压电源,使整个电源具有短路保护、过流保护功能,提高了实验的稳定性。

主板的右上角为电源总开关,当把220V交流电源线插入主板后,打开电源开关,主板得电工作。

为适用多种需要,配置了+5V,+12V,—5V电压供主板和外设需要,通过右上角的插针排和插孔输出到外设。

此外,还设有螺旋保险插孔保护实验箱。

(2)RS232接口RS232接口通过MAX232芯片实现与计算机的串行通讯,通过接口引出信号。

单片机程序流程图及源代码

单片机程序流程图及源代码

单片机上机实验报告【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。

实验内容:1)输出实验:假定4个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。

2)输入:从P0口输入某个数据到累加器A,打开观察窗口观察数据是否进入累加器A。

实现方式:通过peripherals实现端口数据观察实验。

程序流程图:将P0到P3端口先赋值为0,调用延迟后,再赋1,然后循环执行。

源代码:ORG 0000H ;程序入口地址LJMP MAIN ;跳转到主程序ORG 0300H ;主程序地址MAIN:MOV P0,#00H;MOV P1 ,#00H;MOV P2 ,#00H;MOV P3 ,#00H ;P0~P3均赋值为0ACALL DEL;调用延迟MOV P0 ,#0FFH;MOV P1 ,#0FFH;MOV P2 ,#0FFH;MOV P3 ,#0FFH;P0~P3均设为1MOV A,P0;将P0口值赋给累加器ACALL DEL;AJMP MAIN;跳转到主程序入口ORG 0200H;延迟程序入口地址DEL:MOV R5,#04H;寄存器实现延迟,F3:MOV R6,#0FFH;若主频为12MHZ则F2:MOV R7,#0FFH;延时为256*256*4F1:DJNZ R7,F1;0.26S,人眼可分辨DJNZ R6,F2;DJNZ R5,F3;RET;从延迟程序返回END;结束3.假设P0口外接一个数码管(共阴),如图,请在数码管上轮流显示数字0~9(采用软件延时)。

程序流程图:将数码管的真值编码0~9依次赋给P0并调用延迟,然后循环运行程序即可。

源代码:ORG 0000H; 程序入口SJMP MAIN; 跳转到主程序ORG 0300H; 主程序入口地址MAIN:MOV P0,#0FCH; 将数码管0的编码赋给P0口ACALL DELAY; 调用延迟,使数码管亮0持续0.33SMOV P0,#60H; show 1ACALL DELAY;MOV P0,#0DAH; show 2ACALL DELAY;MOV P0,#0F2H; show 3ACALL DELAY;MOV P0,#66H; show 4ACALL DELAY;MOV P0,#0B6H; show 5ACALL DELAY;MOVP0,#0BEH; show 6ACALL DELAY;MOV P0,#0E0H; show 7ACALL DELAY;MOV P0,#0FEH; show 8ACALL DELAY;MOV P0,#0F6H; show 9ACALL DELAY;AJMP LOOP; 跳转到主程序入口ORG 0200H; 延迟程序入口DEL:MOV R5,#05H; 采用软件延迟,若主频为12MHz,则DEL1:MOV R6,#0FFH; 定时时间为256*256*5*1uS=0.33S,DEL2:MOV R7,#0FFH; 人眼可分辨。

单片机代码

单片机代码

#include <reg51.H>#include <intrins.h>#include <absacc.h>//数据类型定义typedef unsigned long ulong;typedef unsigned char uchar;typedef unsigned int uint;/***************************************************************RC500寄存器绝对地址定义************************************///page00#define Page_Sel XBYTE[0x8000]//选择寄存器页#define Command XBYTE[0x8001] //启动和停止命令的执行#define FIFO XBYTE[0x8002] //64 字节FIFO 缓冲区输入和输出#define PrimaryStatus XBYTE[0x8003] //接收器和发送器以及FIFO 缓冲区状态标志#define FIFO_Length XBYTE[0x8004]//FIFO 中缓冲的字节数#define SecondaryStatus XBYTE[0x8005]//不同的状态标志#define InterruptEn XBYTE[0x8006]//使能和禁止中断请求通过的控制位#define Int_Req XBYTE[0x8007] //中断请求标志//page08#define Control XBYTE[0x8009] //不同的控制标志例如定时器节电#define ErrorFlag XBYTE[0x800a] //显示上次命令执行错误状态的错误标志#define CollPos XBYTE[0x800b] //RF 接口检测到的第一个冲突位的位置#define TimerValue XBYTE[0x800c] //定时器的实际值#define CRCResultLSB XBYTE[0x800d]// CRC 协处理器寄存器的最低位#define CRCResultMSB XBYTE[0x800e]//CRC 协处理器寄存器的最高位#define Bit_Frame XBYTE[0x800f]//位方式帧的调节//page10#define TxControl XBYTE[0x8011] //天线驱动脚TX1 和TX2 的逻辑状态控制#define CWConductance XBYTE[0x8012]//选择天线驱动脚TX1 和TX2 的电导率#define PreSet13 XBYTE[0x8013]//ModeConductance 该值不会改变#define PreSet14 XBYTE[0x8014]// CoderControl该值不会改变#define ModWidth XBYTE[0x8015]// 选择调整脉冲的宽度#define PreSet17 XBYTE[0x8017]//该值不会改变TypeBFraming//page18#define RxControl1 XBYTE[0x8019]//控制接收器状态#define DecodeControl XBYTE[0x801a]//控制解码器状态#define BitPhase XBYTE[0x801b]//选择发送器和接收器时钟之间的位相位#define RxThreshold XBYTE[0x801c]//选择位解码器的阀值#define PreSet1D XBYTE[0x801d]//该值不会改变#define Rxcontrol2 XBYTE[0x801e]//控制解码器状态和定义接收器的输入源#define ClockQControl XBYTE[0x801f]//控制时钟产生用于90o相移的Q 信道时钟//page20#define RxWait XBYTE[0x8021] //选择发送后接收器启动前的时间间隔#define ChannelRedundancy XBYTE[0x8022]//选择RF 信道上数据完整性检测的类型和模式#define CRCPresetLSB XBYTE[0x8023]//CRC 寄存器预设值的低字节#define CRCPresetMSB XBYTE[0x8024]//CRC 寄存器预设值的gao字节#define PreSet25 XBYTE[0x8025]//该值不会改变#define MFOUTSelect XBYTE[0x8026]//选择输出到管脚MFOUT 的内部信号//PreSet27//prge28#define FIFOLevel XBYTE[0x8029] //定义FIFO 上溢和下溢警告界限#define TimerClock XBYTE[0x802a] //选择定时器时钟的分频器#define TimerControl XBYTE[0x802b]//选择定时器的起始和停止条件#define TimerReload XBYTE[0x802c]//定义定时器的预装值#define IRQPinConfig XBYTE[0x802d]//配置IRQ 脚的输出状态//PreSet2E//PreSet2f不变#define TestAnaSelect XBYTE[0x803a] //选择模拟测试模式#define TestDigiSelect XBYTE[0x803d] //选择数字测试模式//////////////////////////////////////////////////////////////////////////////////***************************************************************RC500寄存器绝对地址定义完成************************************/#define RF_CMD_REQUEST_STD 0x26#define RF_CMD_REQUEST_ALL 0x52#define RF_CMD_ANTICOL 0x93#define RF_CMD_SELECT 0x93#define RF_CMD_AUTH_LA 0x60#define RF_CMD_AUTH_LB 0x61#define RF_CMD_READ 0x30#define RF_CMD_WRITE 0xa0#define RF_CMD_INC 0xC1#define RF_CMD_DEC 0xC0#define RF_CMD_RESTORE 0xC2#define RF_CMD_TRANSFER 0xB0#define RF_CMD_HALT 0x50#define RC500_AUTHERR 4 //验证不成功#define RC500_FRAMINGERR 20#define RC500_SELERR 9#define KEYA 0x00#define KEYB 0x04#define ReadE2 0x03 //读FM1715 EEPROM命令#define WriteE2 0x01 //写FM1715 EEPROM命令#define Authent1 0x0c //验证命令认证过程第1步#define Authent2 0x14 //验证命令认证过程第2步#define LoadKeyE2 0x0b //将密钥从EEPROM复制到KEY缓存#define LoadKey 0x19 //将密钥从FIFO缓存复制到KEY缓存#define RF_TimeOut 0xfff //发送命令延时时间#define RC500_PARITYERR 5 //卡片奇偶校验错误#define RC500_CRCERR 2 //卡片CRC校验错误#define RC500_BYTECOUNTERR 12 //从卡片接收到的字节数错误#define MI_OK 1#define RF_TimeOUT 0xfff#define RC500_NOTAUTHERR 10#define TYPEA_MODE 0 //TypeA模式#define RC500_NOTAGERR 1#define RC500_EMPTY 3 //数值溢出错误#define RC500_WRITEERR 15 //调用write函数出错#define RC500_OK 0x05#define RC500_REQERR 21 //调用req函数出错#define RC500_ANTICOLLERR 23#define RC500_SERNRERR 8 //卡片序列号错误(anti-collision 错误) #define RC500_INCRERR 16 //调用increment函数出错#define RC500_DECRERR 17 //调用decrement函数出错#define RC500_RESTERR 13 //调用restore函数出错#define RC500_TRANSERR 14 //调用transfer函数出错#define Transceive 0x1E //发送接收命令#define Transmit 0x1a //发送命令#define Req 0x01#define Sel 0x02#define TRUE 1#define FALSE 0#define STD 0x00#define ALL 0x01uchar CardStatus;#define qidongzhuangtaidizhi 0 //启动状态存储字节地址#define wangdiangaodizhi 1 //网点编号高字节#define wangdiandidizhi 2 //网点编号低字节#define xiangshijian 3 //蜂鸣器响声长度sfr AUXR=0x8e;////////////////////////////////////////////////////////////////////////////////sbit MFRST= P1^5;//33sbit NCS=P3^5; //27sbit IRQ=P3^4;sbit beep=P1^4;uchar idata readdata[16] _at_ 0x0040;//读写数据缓冲区uchar idata tagtype[2] _at_ 0x0096;//卡片标识字符uchar idata value[4] _at_ 0x0050; //增减的数值uchar idata buffer[24] _at_ 0x0060; //FM1715命令发送接收缓冲区uchar idata UID[5] _at_ 0x007a; //序列号uchar idata Secnr _at_ 0x0090; //扇区号uchar xdata Block_Adr[63] _at_ 0x00a0;uchar volatile idata key=0;///***********************************************************/**************************************************串行通信函数2011.9.13*********************************************************************** ***//***************************************************************名称: UART_init()。

51单片机50个实例代码

51单片机50个实例代码

51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的一个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED=P1^0;// 用sbit 关键字定义 LED到端口,//LED是自己任意定义且容易记忆的符号/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值LED=1; //将口赋值 1,对外输出高电平LED=0; //将口赋值 0,对外输出低电平while (1) //主循环{//主循环中添加其他需要一直工作的程序 }}2-IO输出-点亮1个LED灯方法2/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的一个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*------------------------------------------------主函数------------------------------------------------*/ void main (void){//此方法使用1个字节对单个端口赋值P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉,//ff换算成二进制是 1111 1111P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮//0xfe是16进制,0x开头表示16进制数,//fe换算成二进制是 1111 1110while (1) //主循环{//主循环中添加其他需要一直工作的程序}}3-IO输出-点亮多个LED灯方法1/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的多个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到端口,sbit LED1=P1^1;//LED是自己任意定义且容易记忆的符号sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;/*------------------------------------------------主函数------------------------------------------------*/ void main (void){//此方法使用bit位对单个端口赋值LED0=0; //将口赋值 0,对外输出低电平LED1=1;LED2=0;LED3=1;LED4=0;LED5=1;LED6=0;LED7=1;while (1) //主循环{//主循环中添加其他需要一直工作的程序 }}4-IO输出-点亮多个LED灯方法2/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的多个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*------------------------------------------------主函数------------------------------------------------*/ void main (void){//此方法使用bit位对单个端口赋值P1=0x55; //换成二进制是0101 0101while (1) //主循环{//主循环中添加其他需要一直工作的程序 }}5-闪烁1个LED/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的1个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/ #include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到端口,//LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/ void main (void){//此方法使用bit位对单个端口赋值while (1) //主循环{LED0=0; //将口赋值 0,对外输出低电平Delay(10000); //调用延时程序;更改延时数字可以更改延时长度; //用于改变闪烁频率LED0=1; //将口赋值 1,对外输出高电平Delay(10000);//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}6-不同频率闪烁1个LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的1个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到端口,//LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{for(i=0;i<10;i++) //加入 for循环,表明for循环大括号中的程序循环执行10次 {LED0=0; //将口赋值 0,对外输出低电平Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将口赋值 1,对外输出高电平Delay(5000);}for(i=0;i<10;i++){LED0=0; //将口赋值 0,对外输出低电平Delay(60000); //调用延时程序;更改延时数字可以更改延时长度; //用于改变闪烁频率LED0=1; //将口赋值 1,对外输出高电平Delay(60000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}7-不同频率闪烁多个LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的多个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到端口,LED是自己任意定义且容易记忆的符号sbit LED1=P1^1;sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{for(i=0;i<10;i++) //加入 for循环,表明for循环大括号中//的程序循环执行10次{LED0=0; //将口赋值 0,对外输出低电平LED2=1;LED4=0;Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将口赋值 1,对外输出高电平LED2=0;LED4=1;Delay(5000);}for(i=0;i<10;i++){LED0=0; //将口赋值 0,对外输出低电平LED2=1;LED4=0;Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将口赋值 1,对外输出高电平LED2=0;LED4=1;Delay(60000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}8-8位LED左移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:左移,直至LED全部点亮,左移符号 <<------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255Delay(50000);P1=0xfe; //赋初始值for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次 {Delay(50000);P1<<=1;}while (1) //主循环{//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}9-8位LED右移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:右移,直至LED全部点亮,右移符号 >>------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255Delay(50000);P1=0x7f; //赋初始值for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次 {Delay(50000);P1>>=1;}while (1) //主循环{//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}10-LED循环左移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:循环左移,始终一个led点亮,并循环执行流水动作,左移符号 << 逻辑或符号 |------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255Delay(50000);P1=0xfe; //赋初始值while (1) //主循环{for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次 {Delay(50000);P1<<=1;P1=P1|0x01; //左移后,最右端自动赋值0,所以需要该语句赋值1}P1=0xfe; //重新赋初始值//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}11-LED循环右移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:循环右移,始终一个led点亮,并循环执行流水动作,右移符号 >> 逻辑或符号 |------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255Delay(50000);P1=0x7f; //赋初始值while (1) , //主循环{for(i=0;i<8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次 {Delay(50000);P1>>=1;P1=P1|0x80; //右移后,最左端自动赋值0,所以需要该语句赋值1}P1=0x7f; //重新赋初始值//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}12-查表显示LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:通过查表获得1个字节的值然后赋值给P1端口,ROM允许情况可以设置更多表格------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------查表表格------------------------------------------------*/unsigned char code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加/*------------------------------------------------函数声明------------------------------------------------*/void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{for(i=0;i<16;i++) //加入 for循环,表明for循环大括号中的程序循环 //执行16次,表明表格中有16个元素{P1=table[i];Delay(30000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}13-双灯左移右移闪烁/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:2个led灯先左移,然后右移,然后同时闪烁------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i//取值范围 0~255unsigned char temp;//定义临时变量用于转换while (1) //主循环{temp=0xfc;P1=temp;for(i=0;i<7;i++) //加入 for循环,表明for循环大括号 //中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可//以更改延时长度;用于改变闪烁频率 temp<<=1;temp=temp|0x01; //也可以直接把temp换成P1P1=temp; //之所以加入temp做中间变量,转换 //完成后直接赋值到端口,防止直接 //操作端口造成的短暂闪烁}temp=0x3f;P1=temp;for(i=0;i<7;i++) //加入 for循环,表明for循环大括号 //中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可以 //更改延时长度;用于改变闪烁频率 temp>>=1;temp|=0x80; //等效于 temp=temp|0x80P1=temp;}for(i=0;i<3;i++) //加入 for循环,表明for循环大括号 //中的程序循环执行3次{P1=0xff;Delay(50000);P1=0x00;Delay(50000);} //主循环中添加其他需要一直工作的程序 }}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}14-花样灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:花样灯一般有两种方法实现:1、程序循环执行2、查表法这里我们两种都使用一下------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------花样表格------------------------------------------------*/unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/main(){unsigned char i; //定义一个无符号字符型//局部变量 i 取值范围 0~255 while(1){P1=0xFE; //第1个LED亮for(i=0;i<8;i++){Delay(20000);P1 <<=1;}P1=0x7F; //第8个LED亮for(i=0;i<8;i++){Delay(20000);P1 >>=1;}P1=0xFE; //第1个LED亮for(i=0;i<8;i++){Delay(20000);P1 <<=1;P1 |=0x01;}P1=0x7F; //第8个LED亮for(i=0;i<8;i++){Delay(20000);P1 >>=1;P1 |=0x80;}//下面通过查表方法获得花样参数for(i=0;i<16;i++)//查表可以简单的显示各种花样实用性更强 {Delay(20000);P1=seg[i];}}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}15-PWM调光/*-----------------------------------------------名称:PWM调光论坛:编写:shifang日期:修改:无内容:通过PWM(脉宽调制)调节LED的亮度------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义 LED到端口,LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值while (1) //主循环{LED0=1;Delay(60000); //特意加延时,可以看到熄灭的过程for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次LED0=0; //点亮LEDDelay(PWM_LOW);//延时长度,600次循环中从1加至599LED0=1; //熄灭LEDDelay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1}LED0=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //与逐渐变亮相反的过程LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}16-共阳数码管静态显示/*-----------------------------------------------名称:单个共阳数码管静态显示论坛:编写:shifang日期:修改:无内容:通过赋值给P1,让数码管显示特定的字符或者数字------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void main (void){P1=0xc0; //二进制为 1100 0000 参考数码管排列,//可以得出0对应的段点亮,1对应的段熄灭,结果显示数字"0" while(1){}}17-1个共阳数码管显示变化数字/*-----------------------------------------------名称:单个共阳数码管动态显示变化数字论坛:编写:shifang日期:修改:无内容:通过循环赋值给P1,让数码管显示特定的字符或者数字------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义unsigned char code dofly_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x77,0x7c,0x 39,0x5e,0x79,0x71,};// 显示数值表0-9void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{for(i=0;i<16;i++) //加入 for循环,表明for循环大括号中的程序循环执行10次 {P1=dofly_table[i]; //循环调用表中的数值Delay(60000); //延时,方便观看数字变化}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}18-单个数码管模拟水流/*-----------------------------------------------名称:单个共阳数码管模拟水流论坛:编写:shifang日期:修改:无内容:通过循环赋值给P1,让数码管显示特定流动样式------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255while (1) //主循环{P1=0xfe;for(i=0;i<6;i++) //加入 for循环,表明for循环大括号中的程序循环执行6次 {Delay(10000);P1<<=1;P1|=0x01;}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}19-按键控制单个数码管显示/*-----------------------------------------------名称:单个共阳数码管动态显示变化数字论坛:编写:shifang日期:修改:无内容:通过循环检测P1口按键输入值,然后用数码管输出,没有按键按下时原值不变------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义unsigned char code dofly_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};// 显示数值表0-9/*------------------------------------------------主函数------------------------------------------------*/void main (void){while (1) //主循环{switch(P3) //P3口作为独立按键输入端,检测端口电平并做如下判断 {case 0xfe:P1=dofly_table[1];break;//0xfe = 1111 1110,//说明连接在端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P1=dofly_table[2];break;//调用表中的第三个//元素 0xa4 下标 0 才表示数组中的第一个元素case 0xfb:P1=dofly_table[3];break;case 0xf7:P1=dofly_table[4];break;case 0xef:P1=dofly_table[5];break;case 0xdf:P1=dofly_table[6];break;case 0xbf:P1=dofly_table[7];break;case 0x7f:P1=dofly_table[8];break;default:break; //如果都没按下,直接跳出}//主循环中添加其他需要一直工作的程序}}20-单个数码管指示逻辑电平/*-----------------------------------------------名称:单个共阳数码管指示逻辑电平论坛:编写:shifang日期:修改:无内容:通过循环检测口电平输入值,然后用数码管输出"H" or "L",表示该端口现在连接的是高电平还是低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit IO_IN=P3^2; //定义IO 信号输入端/*------------------------------------------------主函数------------------------------------------------*/void main (void){while (1) //主循环{if(IO_IN==1)//如果端口检测到1表示高电平P1=0x89; //"H"elseP1=0xc7; //"L"//否则表示低电平,这里使用条件语句 if 。

单片机常用代码大全

单片机常用代码大全

1、位码(共阴):0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f2、断码(共阳):0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x713、独立管码(共阳):0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08,0x10,0xc0,0x62,0x84,0x60,0x704、循环函数intrins_crol_字符循环左移_cror_字符循环右移_irol_整数循环左移_iror_整数循环右移_lror_长整数循环左移_lror_长整数循环右移_nop_空操作8051 NOP 指令_testbit_测试并清零位8051 JBC 指令5、中段代码interrupt 0 外部中断0interrupt 1 定时器0中断interrupt 2 外部中断1interrupt 3 定时器1中断interrupt 4 串口中断interrupt 5 定时器2中断(52里面,51没有)6、IIC总线开始信号:void IICstart(){scl=1;delay();sda=1;delay();sda=0;delay();scl=0;}结束信号void IICstop(){scl=1;delay();sda=0;delay();sda=1;}应答信号void IICyingda(){uchar j;scl=1;delay();while((sda==1)&&j<250)j++;//sda=0;//delay();scl=0;delay();}写信号(写入一8位数据)void write_byte(uchar w){uchar i,temp;temp=w;for(i=0;i<8;i++){scl=0;delay();temp=temp<<1;sda=CY;delay();scl=1;delay();}scl=0;delay();sda=0;delay();}读信号(读出一个8位数据)uchar read_byte(void){uchar i,j,k;sda=1;for(i=0;i<8;i++){scl=1;delay();j=sda;k=(k<<1)|j;scl=0;delay();}scl=0;delay();return k;}7、时钟调试键盘扫描void keyscan(){if(k1==0){delay(5);if(k1==0){while(!k1); //k1num++;}if(k1num==1){TR0=0;write_zhiling(0x80+0x40+11);write_zhiling(0x0f);}if(k1num==2){TR0=0;write_zhiling(0x80+0x40+8);}if(k1num==3){TR0=0;write_zhiling(0x80+0x40+5);}if(k1num==4){k1num=0;write_zhiling(0x0c);TR0=1;//}}if(k1num!=0){if(k2==0){delay(5);if(k2==0){while(!k2);if(k1num==1){miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;write_jingwei(7,fen);}write_jingwei(10,miao);write_jingwei(7,fen);write_zhiling(0x80+0x40+11);}write_jingwei(10,miao);write_zhiling(0x80+0x40+11);}if(k1num==2){fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;write_jingwei(4,shi);}write_jingwei(7,fen);write_jingwei(4,shi);write_zhiling(0x80+0x40+8);}write_jingwei(7,fen);write_zhiling(0x80+0x40+8);}if(k1num==3){shi++;if(shi==24){shi=0;write_jingwei(4,shi);write_zhiling(0x80+0x40+5);}write_jingwei(4,shi);write_zhiling(0x80+0x40+5);}}}}if(k1num!=0){if(k3==0){delay(5);if(k3==0){while(!k3);if(k1num==1){miao--;if(miao==-1){miao=59;fen--;if(fen==-1){fen=59;write_jingwei(7,fen);}write_jingwei(10,miao);write_jingwei(7,fen);write_zhiling(0x80+0x40+11);}write_jingwei(10,miao);write_zhiling(0x80+0x40+11); }if(k1num==2){fen--;if(fen==-1){fen=59;shi--;if(shi==-1){shi=23;write_jingwei(4,shi);}write_jingwei(7,fen);write_jingwei(4,shi);write_zhiling(0x80+0x40+8);}write_jingwei(7,fen);write_zhiling(0x80+0x40+8); }if(k1num==3){shi--;if(shi==-1){shi=23;write_jingwei(4,shi);write_zhiling(0x80+0x40+5);}write_jingwei(4,shi);write_zhiling(0x80+0x40+5);}}}}}。

单片机程序大全

单片机程序大全

单片机程序大全(以下是一个以“单片机程序大全”为题目的文章范例,依据题目性质并非一个合同或作文的格式。

请注意,这个范例只是为了明示写作格式的变化,并非提供一个实际的单片机程序大全。

)单片机程序大全本文将为大家提供一个全面的单片机程序大全,涵盖了各种常见的单片机应用。

希望本文能够对单片机程序的学习和实践有所帮助。

一、LED灯程序LED灯是一个常见的单片机实验项目。

以下是一个基本的LED灯闪烁程序的代码,使用C语言编写:```c#include <reg51.h>#define LED P0void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {LED = 0xFF; // 所有LED灯亮delay(1000); // 延时1秒LED = 0x00; // 所有LED灯灭delay(1000); // 延时1秒}}```二、温度监测程序单片机可以用于温度监测,以下是一个简单的温度监测程序的代码示例,使用C语言编写:```c#include <reg51.h>#define TEMP P1void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {if (TEMP > 30) {P0 = 0x01; // 温度过高,亮起警示灯 } else {P0 = 0x00; // 温度正常,灭掉警示灯 }delay(100); // 延时0.1秒}}```三、电机控制程序单片机常用于电机控制,以下是一个电机正反转控制程序的代码示例,使用C语言编写:```c#include <reg51.h>#define MOTOR P2void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {MOTOR = 0x01; // 电机正转delay(1000); // 延时1秒MOTOR = 0x02; // 电机反转delay(1000); // 延时1秒}}```以上仅是三个简单的单片机程序示例,单片机的应用非常广泛,包括但不限于LED灯闪烁、温度监测、电机控制等。

单片机试验项目(键盘程序设计),附代码大全

单片机试验项目(键盘程序设计),附代码大全

单片机试验项目(键盘程序设计),附代码大全1、键盘与的连接图3键盘连接图4单片机与键盘接口图2、通过I/0口连接。

将每个按钮的一端接到单片机的I/O口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。

对于这种键各程序能采用持续查询的办法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入对应的键处理。

下面给出一个例程。

其功能很简单,四个键定义如下:P3.2:开始,按此键则灯开始流动(由上而下)P3.3:停止,按此键则停止流动,所有灯为暗P3.4:上,按此键则灯由上向下流动P3.5:下,按此键则灯由下向上流动UpDown EQU 00H ;上下行标志StartEnd EQU 01H ;起动及停止标志LAMPCODE EQU 21H ;存放流动的数据代码以下程序功能很简单,但它演示了一个单片机程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按钮反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,大家能仔细考虑一下这些问题,再想想有什么好的解决办法。

ORG 0000HAJMP MAINORG 30HMAIN:MOV SP,#5FHMOV P1,#0FFHCLR UpDown ;启动时处于向上的状态CLR StartEnd ;启动时处于停止状态MOV LAMPCODE,#0FEH ;单灯流动的代码LOOP:ACALL KEY ;调用键盘程序JNB F0,LNEXT ;如果无键按下,则继续ACALL KEYPROC ;不然调用键盘处理程序LNEXT:ACALL LAMP ;调用灯显示程序AJMP LOOP ;反复循环,主程序到此结束DELAY:MOV R7,#100D1: MOV R6,#100DJNZ R6,$DJNZ R7,D1RET;----------------------------------------延时程序,键盘处理中调用KEYPROC:MOV A,B ;从B寄存器中获取键值JB ACC.2,KeyStart ;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反)JB ACC.3,KeyOverJB ACC.4,KeyUpJB ACC.5,KeyDownAJMP KEY_RETKeyStart:SETB StartEnd ;第一个键按下后的处理AJMP KEY_RETKeyOver:CLR StartEnd ;第二个键按下后的处理AJMP KEY_RETKeyUp: SETB UpDown ;第三个键按下后的处理AJMP KEY_RETKeyDown:CLR UpDown ;第四个键按下后的处理KEY_RET:RETKEY:CLR F0 ;清F0,表示无键按下。

单片机代码

单片机代码

NAME T1_1CSEG AT 0000HLJMP STARTCSEG AT 4100HSTART: MOV A,#0FEHLOOP: RR AMOV P1,ALCALL DELAYJMP LOOPDELAY: MOV R1,#127DEL1: MOV R2,#200DEL2: DJNZ R2,DEL2DJNZ R1,DEL1RETENDNAME T1_2 ;P1口输入实验OUT_PORT EQU 0CFA0HCSEG AT 0000HLJMP STARTCSEG AT 4100HSTART: MOV P1,#0FFH ;复位P1口为输入状态MOV A,P1 ;读P1口的状态值入累加器AMOV DPTR,#OUT_PORT ;将输出口地址赋给地址指针DPTRMOVX @DPTR,A ;将累加器A的值赋给DPTR指向的地址JMP START ;继续循环监测端口P1的状态ENDNAME T2 ;P1口输实验CSEG AT 0000HLJMP STARTCSEG AT 4100HSTART: SETB P1.0SETB P1.1 ;用于输入时先置位口内锁存器MOV A,P1ANL A,#03H ;从P1口读入开关状态,取低两位MOV DPTR,#TAB ;转移表首地址送DPTRMOVC A,@A+DPTRJMP @A+DPTRTAB: DB PRG0-TABDB PRG1-TABDB PRG2-TABDB PRG3-TABPRG0: MOV P1,#0FFH ;向P1口输出0,发光二极管全灭;此时K1=0,K2=0JMP STARTPRG1: MOV P1,#0F3H ;只点亮L1、L2,表示左转弯ACALL DELAY ;此时K1=1,K2=0MOV P1,#0FFH ;再熄灭0.5秒ACALL DELAY ;延时0.5秒JMP STARTPRG2: MOV P1,#03FH ;只点亮L5、L6,表示右转弯ACALL DELAY ;此时K1=0,K2=1MOV P1,#0FFHACALL DELAYJMP STARTPRG3: MOV P1,#00H ;发光二极管全亮,此时K1=1,K2=1 JMP STARTDELAY: MOV R1,#5 ;延时0.5秒DEL1: MOV R2,#200DEL2: MOV R3,#126DEL3: DJNZ R3,DEL3DJNZ R2,DEL2DJNZ R1,DEL1RETENDNAME T3 ;I/O口扩展实验一PORT EQU 0CFA0H ;片选地址CS0CSEG AT 0000HLJMP STARTCSEG AT 4100HSTART: MOV A,#11H ;两个红灯亮,黄灯、绿灯灭ACALL DISP ;调用273显示单元(以下雷同)ACALL DE3S ;延时3秒LLL: MOV A,#12H ;东西路口绿灯亮;南北路口红灯亮ACALL DISPACALL DE10S ;延时10秒MOV A,#10H ;东西路口绿灯灭;南北路口红灯亮ACALL DISPMOV R2,#05H ;R2中的值为黄灯闪烁次数TTT: MOV A,#14H ;东西路口黄灯亮;南北路口红灯亮ACALL DISPACALL DE02S ;延时0.2秒MOV A,#10H ;东西路口黄灯灭;南北路口红灯亮ACALL DISPACALL DE02S ;延时0.2秒DJNZ R2,TTT ;返回TTT,使东西路口;黄灯闪烁五次MOV A,#11H ;两个红灯亮,黄灯、绿灯灭ACALL DISPACALL DE02S ;延时0.2秒MOV A,#21H ;东西路口红灯亮;南北路口绿灯亮ACALL DISPACALL DE10S ;延时10秒MOV A,#01H ;东西路口红灯亮;南北路口绿灯灭ACALL DISPMOV R2,#05H ;黄灯闪烁五次GGG: MOV A,#41H ;东西路口红灯亮;南北路口黄灯亮ACALL DISPACALL DE02S ;延时0.2秒MOV A,#01H ;东西路口红灯亮;南北路口黄灯灭ACALL DISPACALL DE02S ;延时0.2秒DJNZ R2,GGG ;返回GGG,使南北路口;黄灯闪烁五次MOV A,#03H ;两个红灯亮,黄灯、绿灯灭ACALL DISPACALL DE02S ;延时0.2秒JMP LLL ;转LLL循环DE10S: MOV R5,#100 ;延时10秒JMP DE1DE3S: MOV R5,#30 ;延时3秒JMP DE1DE02S: MOV R5,#02 ;延时0.2秒DE1: MOV R6,#200DE2: MOV R7,#126DE3: DJNZ R7,DE3DJNZ R6,DE2DJNZ R5,DE1RETDISP: MOV DPTR,#PORT ;273显示单元CPL AMOVX @DPTR,ARETENDNAME T4 ;I/O口扩展实验CSEG AT 0000HLJMP STARTCSEG AT 4100HINPORT EQU 0CFA8H ;74LS244端口地址OUTPORT EQU 0CFB0H ;74LS273端口地址START: MOV DPTR,#INPORTLOOP: MOVX A,@DPTR ;读开关状态MOV DPTR,#OUTPORTMOVX @DPTR,A ;显示开关状态MOV R7,#10H ;延时DEL0: MOV R6,#0FFHDEL1: DJNZ R6,DEL1DJNZ R7,DEL0JMP STARTENDNAME T5 ;中断控制实验OUTPORT EQU 0CFB0H ;端口地址SA VE EQU 55H ;save保存从端口cfa0输出的数据CSEG AT 0000HLJMP STARTCSEG AT 4003HLJMP INTCSEG AT 4100HSTART: SETB IT0SETB EX0SETB EAMOV A,#11H ;置首显示码MOV SA VE,A ;保存ACALL DISP ;显示输出ACALL DE3S ;延时3秒LLL: MOV A,#12H ;东西路口绿灯亮,南北路口红灯亮MOV SA VE,AACALL DISPACALL DE10S ;延时10秒MOV A,#10H ;东西路口绿灯灭MOV SA VE,AACALL DISPMOV R2,#05H ;东西路口黄灯闪烁5次TTT: MOV A,#14HMOV SA VE,AACALL DISPACALL DE02SMOV A,#10HMOV SA VE,AACALL DISPACALL DE02SDJNZ R2,TTTMOV A,#11H ;红灯全亮MOV SA VE,AACALL DISPACALL DE02S ;延时0.2秒MOV A,#21H ;东西路口红灯亮,南北路口绿灯亮MOV SA VE,AACALL DISPACALL DE10S ;延时10秒MOV A,#01H ;南北路口绿灯灭MOV SA VE,AACALL DISPMOV R2,#05H ;南北路口黄灯闪烁5次GGG: MOV A,#41HMOV SA VE,AACALL DISPACALL DE02SMOV A,#01HMOV SA VE,AACALL DISPACALL DE02SDJNZ R2,GGGMOV A,#11H ;红灯全亮MOV SA VE,AACALL DISPACALL DE02S ;延时0.2秒JMP LLL ;转LLL循环DE10S: MOV R5,#100 ;延时10秒JMP DE1DE3S: MOV R5,#30 ;延时3秒JMP DE1DE02S: MOV R5,#02 ;延时0.2秒DE1: MOV R6,#200DE2: MOV R7,#126DE3: DJNZ R7,DE3DJNZ R6,DE2DJNZ R5,DE1RETINT: CLR EAPUSH ACC ;中断处理PUSH PSWMOV A,R5PUSH ACCMOV A,#11H ;红灯全亮,绿、黄灯全灭ACALL DISPDEL10S: MOV R3,#100 ;延时10秒DEL1: MOV R2,#200DEL2: MOV R5,#126DEL3: DJNZ R5,DEL3DJNZ R4,DEL2DJNZ R3,DEL1MOV A,SA VE ;取SA VE中保存数据输出到cfa0端口ACALL DISPPOP ACC ;出栈MOV R5,APOP PSWPOP ACCSETB EA ;允许外部中断RETIDISP: MOV DPTR,#OUTPORTCPL AMOVX @DPTR,ARETENDNAME T6 ;定时器实验OUTPORT EQU 0CFB0HCSEG AT 0000HLJMP STARTCSEG AT 401BH ;定时器/计数器1中断程序入口地址LJMP INTCSEG AT 4100HSTART: MOV A,#01H ;首显示码MOV R1,#03H ;03是偏移量,即从基址寄存器到表首的距离MOV R0,#5H ;05是计数值MOV TMOD,#10H ;计数器置为方式1MOV TL1,#0AFH ;装入时间常数MOV TH1,#03CHORL IE,#88H ;CPU中断开放标志位和定时器;1溢出中断允许位均置位SETB TR1 ;开始计数LOOP1: CJNE R0,#00,DISPMOV R0,#5H ;R0计数计完一个周期,重置初值INC R1 ;表地址偏移量加1CJNE R1,#31H,LOOP2MOV R1,#03H ;如到表尾,则重置偏移量初值LOOP2: MOV A,R1 ;从表中取显示码入累加器MOVC A,@A+PCJMP DISPDB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0FEH,0FCHDB 0F8H,0F0H,0E0H,0C0H,80H,00H,0FFH,00H,0FEHDB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFHDB 0EFH,0F7H,0FBH,0FDH,0FEH,00H,0FFH,00HDISP: ;MOV DPTR,#OUTPORT;MOVX @DPTR,AMOV P1,A ;将取得的显示码从P1口输出显示JMP LOOP1INT: CLR TR1 ;停止计数DEC R0 ;计数值减一MOV TL1,#0AFH ;重置时间常数初值MOV TH1,#03CHSETB TR1 ;开始计数RETI ;中断返回ENDNAME T7 ;8255A实验一CSEG AT 0000HLJMP STARTCSEG AT 4100HPA EQU 0CFA0HPB EQU 0CFA1HPCTL EQU 0CFA3HSTART: MOV DPTR,#PCTL ;置8255A控制字,A、B、C口均工作;方式0,A、C口为输出,B口为输入MOV A,#082HMOVX @DPTR,ALOOP: MOV DPTR,#PB ;从B口读入开关状态值MOVX A,@DPTRMOV DPTR,#PA ;从A口将状态值输出显示MOVX @DPTR,AMOV R7,#10H ;延时DEL0: MOV R6,#0FFHDEL1: DJNZ R6,DEL1DJNZ R7,DEL0JMP LOOPENDNAME t8 ;8255键盘实验PA EQU 0CFA0HPB EQU PA+1PC0 EQU PB+1PCTL EQU PC0+1CSEG AT 4000HLJMP STARTCSEG AT 4100HSTART: MOV 42H,#0FFH ;42H中放显示的字符码,初值为0FFH STA1: MOV DPTR,#PCTL ;设置控制字,ABC口工作于方式0;AC口输出而B口用于输入MOV A,#82HMOVX @DPTR,ALINE: MOV DPTR,#PC0 ;将字符码从C口输出显示MOV A,42HCPL AMOVX @DPTR,AMOV DPTR,#PA ;从A口输出全零到键盘的列线MOVX @DPTR,AMOV DPTR,#PB ;从B口读入键盘行线值MOVX A,@DPTRMOV 40H,A ;行线值存于40H中CPL A ;取反后如为全零;表示没有键闭合,继续扫描JZ LINEMOV R7,#10H ;有键按下,延时10MS去抖动DL0: MOV R6,#0FFHDL1: DJNZ R6,DL1DJNZ R7,DL0MOV DPTR,#PCTL ;重置控制字,让A为输入,BC为输出MOV A,#90HMOVX @DPTR,AMOV A,40HMOV DPTR,#PB ;刚才读入的行线值取出从B口送出MOVX @DPTR,AMOV DPTR,#PA ;从A口读入列线值MOVX A,@DPTRMOV 41H,A ;列线值存于41H中CPL A ;取反后如为全零JZ STA1 ;表示没有键按下MOV DPTR,#TABLE ;TABLE表首地址送DPTRMOV R7,#18H ;R7中置计数值16MOV R6,#00H ;R6中放偏移量初值TT: MOVX A,@DPTR ;从表中取键码前半段字节,行线值与实CJNE A,40H,NN1 ;际输入的行线值相等吗?不等转NN1INC DPTR ;相等,指针指向后半字节,即列线值MOVX A,@DPTR ;列线值与实际输入的列线值CJNE A,41H,NN2 ;相等吗?不等转NN2MOV DPTR,#CHAR ;相等,CHAR表基址和R6中的偏移量MOV A,R6 ;取出相应的字符码MOVC A,@A+DPTRMOV 42H,A ;字符码存于42HBBB: MOV DPTR,#PCTL ;重置控制字,让AC为输出,B为输入MOV A,#82HMOVX @DPTR,AAAA: MOV A,42H ;将字符码从C口送到二极管显示MOV DPTR,#PC0CPL AMOVX @DPTR,AMOV DPTR,#PA ;判断按下的键是否释放CLR AMOVX @DPTR,AMOV DPTR,#PBMOVX A,@DPTRCPL AJNZ AAA ;没释放转AAAMOV R5,#2 ;已释放则延时0.2秒,减少总线负担DEL1: MOV R4,#200DEL2: MOV R3,#126DEL3: DJNZ R3,DEL3DJNZ R4,DEL2DJNZ R5,DEL1JMP START ;转STARTNN1: INC DPTR ;指针指向后半字节即列线值NN2: INC DPTR ;指针指向下一键码前半字节即行线值INC R6 ;CHAR表偏移量加一DJNZ R7,TT ;计数值减一,不为零则转TT继续查找JMP BBBTABLE:DW 0FE06H,0FD06H,0FB06H,0F706H;TABLE为键值表,每个键位占DW 0BF06H,07F06H,0FE05H,0FD05H; 两个字节,第一个字节为行DW 0EF05H,0DF05H,0BF05H,07F05H ;线值,第二个为列线值DW 0FB03H,0F703H,0EF03H,0DF03H;CHAR: DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H ;字符码表DB 0AH,0BH,0CH,0DH,0EH,0FH,10H,11H,12H,13HDB 14H,15H,16H,17HEND;将P1口的P1.0~P1.5与LED8~LED3相连,74LS273的SO0~SO7与A~Dp相连,片选信号CS273与CS0相连。

单片机实验报告总结

单片机实验报告总结

单片机实验报告总结单片机实验报告总结单片机实验心得体会单片机实验心得体会时间过得真快,不经意间,一个学期就到了尾声,进入到如火如荼的期末考试阶段。

在学习单片机这门课程之前,就早早的听各种任课老师和学长学姐们说过这门课程的重要性和学好这门课程的关键~~多做单片机实验。

这个学期,我们除了在课堂上学习理论知识,还在实验室做了7次实验。

将所学知识运用到实践中,在实践中发现问题,强化理论知识。

现在,单片机课程已经结束,即将开始考试了,需要来好好的反思和回顾总结下了。

第一次是借点亮LED灯来熟悉keil软件的使用和试验箱上器材。

第一次实验体现了一个人对新事物的接受能力和敏感度。

虽然之前做过许多种实验。

但依旧发现自己存在一个很大的问题,对已懂的东西没耐心听下去,容易开小差;在听老师讲解软件使用时,思路容易停滞,然后就跟不上老师的步骤了,结果需要别人再次指导;对软件的功能没有太大的热情去研究探索,把一个个图标点开,进去看看。

所以第一次试验相对失败。

鉴于此,我自己在宿舍下载了软件,然后去熟悉它的各个功能,使自己熟练掌握。

在做实验中,第二个问题应该是准备不充分吧。

一开始,由于没有课前准备的意识,每每都是到了实验室才开始编程,完成作业,导致每次时间都有些仓促。

后来在老师的批评下,认识到这是个很大的问题:老师提前把任务告诉我们,就是希望我们私下把程序编好。

于是我便在上机之前把程序编好,拷到U盘,这样上机时只需调试,解决出现的问题。

这样就会节约出时间和同学讨论,换种思路,换种方法,把问题给吃透。

发现、提出、分析、解决问题和实践能力是作为我们这个专业的基本素质。

三是我的依赖性很大,刚开始编程序时喜欢套用书上的语句,却对语句的理解不够。

于是当程序出现问题时,不知道如何修改,眼前的程序都是一块一块的被拼凑整合起来的,没法知道哪里错了。

但是编程是一件很严肃的事情,容不得半点错误。

于是便只能狠下决心,坚持自己编写,即使套用时,也把每条语句弄懂。

单片机数字频率计代码

单片机数字频率计代码

单片机数字频率计代码以下是一个基于单片机的简单数字频率计的代码示例: c.#include <reg51.h>。

sbit inputPin = P1^0; // 输入信号引脚。

sbit ledPin = P2^0; // LED指示灯引脚。

unsigned int count = 0; // 计数器。

void delay(unsigned int time) {。

unsigned int i, j;for (i = 0; i < time; i++)。

for (j = 0; j < 1275; j++);}。

void main() {。

TMOD = 0x01; // 设置定时器0为工作模式1。

TH0 = 0; // 定时器0高8位清零。

TL0 = 0; // 定时器0低8位清零。

ET0 = 1; // 允许定时器0中断。

EA = 1; // 允许总中断。

TR0 = 1; // 启动定时器0。

while (1) {。

if (inputPin == 1) {。

delay(10); // 延时10ms,防止抖动。

if (inputPin == 1) {。

while (inputPin == 1); // 等待输入信号变为低电平。

count++; // 计数器加1。

}。

}。

}。

}。

void timer0_isr() interrupt 1 {。

TH0 = 0; // 定时器0高8位清零。

TL0 = 0; // 定时器0低8位清零。

ledPin = ~ledPin; // LED指示灯翻转。

}。

这段代码使用了8051系列的单片机,通过计数输入信号的高电平时间来测量频率。

其中,输入信号连接在P1口的第0位,LED指示灯连接在P2口的第0位。

代码中的`delay`函数用于延时,防止输入信号的抖动。

`main`函数中的循环不断检测输入信号的状态,如果检测到输入信号从低电平变为高电平,就开始计数,直到输入信号再次变为低电平。

at89c51led闪烁实验汇编语言

at89c51led闪烁实验汇编语言

at89c51led闪烁实验汇编语言1. 简介at89c51是一种经典的单片机芯片,被广泛应用于各种嵌入式系统中。

其中,led闪烁实验是单片机入门的必备实验之一,通过这个实验可以初步了解单片机的基本工作原理和汇编语言的编程方法。

2. 实验原理在at89c51单片机中,led是一种常用的输出设备,可以通过控制引脚的高低电平来实现闪烁效果。

通过学习汇编语言的编程方法,我们可以编写程序控制led引脚的状态,从而实现led的闪烁操作。

3. 实验步骤第一步:搭建硬件实验评台,将at89c51单片机与led灯连接。

第二步:编写汇编语言程序,通过设置端口的高低电平来实现led的闪烁效果。

第三步:将编写好的程序下载到at89c51单片机中,进行调试和验证。

4. 实验代码下面是一个简单的at89c51led闪烁实验的汇编语言程序:```assemblyorg 0h ; 程序从位置区域0开始执行mov P1, #0FFh ; 设置P1端口为输出loop:mov P1, #00h ; 将P1端口输出低电平acall delay ; 调用延时程序mov P1, #0FFh ; 将P1端口输出高电平acall delay ; 调用延时程序sjmp loop ; 无条件跳转至loop标号处delay:mov R1, #0Ah ; 设置延时计数值delay1:mov R2, #0FFh ; 设置内部计数值delay2:djnz R2, delay2 ; 内部计数减1djnz R1, delay1 ; 延时计数减1ret ; 返回end ; 程序结束```在这个程序中,我们首先设置P1端口为输出,并在一个循环中不断地将P1端口输出高低电平,通过调用延时程序来实现led的闪烁效果。

5. 实验总结通过这个实验,我们初步了解了at89c51单片机的基本工作原理和汇编语言的编程方法。

在以后的学习中,我们可以通过不断地深入实践和学习,掌握更多单片机和汇编语言的知识,从而实现更加复杂的功能和应用。

24c02单片机实验的代码

24c02单片机实验的代码

24c02单片机实验的代码使用24c02单片机进行实验的代码是一种用于存储和读取数据的电路。

这个芯片可以存储8个页面的数据,每个页面有256个字节。

通过I2C总线协议,我们可以通过单片机与24c02进行通信。

在实验中,我们首先需要设置I2C总线的通信参数,包括时钟频率和设备地址。

然后,我们可以使用写操作将数据写入24c02中的特定地址。

写操作的过程包括发送起始信号、设备地址、数据地址和数据。

写操作完成后,我们可以使用读操作来读取存储在特定地址的数据。

读操作的过程类似于写操作,但是在发送设备地址后,我们需要发送读命令,然后从24c02中读取数据。

为了简化代码,我们可以使用现成的库函数来实现I2C通信和数据读写。

这些库函数可以提供更高层次的抽象,使得代码更加易于理解和维护。

例如,我们可以使用Wire库函数来实现I2C通信,使用write函数和read函数来实现数据的写入和读取。

下面是一个使用24c02单片机进行实验的示例代码:```c#include <Wire.h>#define DEVICE_ADDRESS 0x50void setup() {Wire.begin();Serial.begin(9600);}void loop() {byte data = 0x55;// 写入数据到地址0x00Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x00);Wire.write(data);Wire.endTransmission();delay(100);// 读取地址0x00的数据Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x00);Wire.endTransmission();Wire.requestFrom(DEVICE_ADDRESS, 1);if (Wire.available()) {byte readData = Wire.read();Serial.print("Read data: ");Serial.println(readData, HEX);}delay(1000);}```在这个示例代码中,我们首先在setup函数中初始化I2C通信和串口通信。

单片机实验教案

单片机实验教案

实验一Keil C51的使用一、实验目的1、使用C51创建工程项目文件,为工程项目选择目标器件,为工程项目设置软硬件环境。

2、创建源程序文件并输入源程序代码,保存创建源程序项目文件,并对所编写的程序进行调试、运行。

二、实验内容ORG 0000HAJMP MAINORG 0030HMAIN: MOV R4,#08MOV A,#0FEHMOV DPTR,#1000HROUNDLED:MOVX @DPTR,ARL AINC DPTRMOV R5,#50LCALL DELAYDJNZ R4,ROUNDLEDLJMP MAINDELAY:MOV R6,#50TT2:MOV R7,#100DJNZ R7,$DJNZ R6,TT2DJNZ R5,DELAYRETEND三、实验步骤及图像截屏结果1、在“我的文档”里面新建一个文件夹,命名为:LEI。

2、进入Keil C51系统的操作环境。

3、建立一个新的工程。

单击菜单命令:Project→New Project,如图1-1:图1-1 选中新工程然后选择要保存的路径,输入工程文件的名字:lei,如图1-2图1-2 给新工程取名点击“保存”按钮,会弹出一对话框,选择单片机型号为Atmel的89C51,如图1-3 :图1-3 选择单片机型号此时工程文件已经建立。

4、单击菜单命令:File→New,将实验程序编入后保存,单击菜单命令:File →Save as,注意一定要加扩展名.asm,然后单击“保存”,如图1-4:图1-4编辑程序并保存5、回到编辑界面后,单击工程窗口中“Target1”,点击“+”号展开,右键单击“Source group1”选择Add File to Group ‘source Group1’ 如图1-5:图1-5选中添加文件界面此时弹出窗口,注意选择文件类型Sam 源文件,如图所示,点击Add,如图1-6:图1-6选中要添加的文件名5、对文件进行编译、链接。

单片机代码

单片机代码

单片机代码单个发光二极管的点亮#include#define uchar unsigned char#define uint unsigned int //{ P1 =0xfe; //点亮最后一个LEDwhile(1){}}顺时针流水灯#include //头文件#define uchar unsigned char //宏定义#define uint unsigned intvoid Delay(uint del) //时延函数{ uint i,j;for(i=0; i#define uchar unsigned char#define uint unsigned intuchar table[16] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39 ,0x5e, 0x79,0x71};//下一行的数组可以显示数值外,还可以显示数码管的点uchar table_d[16] ={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9 ,0xde, 0xf9,0xf1};void main(){ uchar i = 0;P2 = 0xfe;P0 = table[5]; //显示5,大家可以修改里面的数据。

while(1){}}任务2 两位数码管动态显示#include#define uchar unsigned char#define uint unsigned intUchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void Delay(uint i){ uint x,j;for(j=0;j#define uchar unsigned char#define uint unsigned intuchar code table[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code Birth[8]={1,9,4,0,0,8,1,6};void Delay(uint i){ uchar x,j;for(j=0;j#define uchar unsigned char#define uint unsigned int//数码管的段码编码uchar table[16] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39 ,0x5e, 0x79,0x71};void Delay(uint i){ uint x,j;for(j=0;j#define uchar unsigned char#define uint unsigned int//数码管的段码编码uchar table[16] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39 ,0x5e, 0x79,0x71};void Delay(uint del){ uint i,j;for(i=0; i#define uchar unsigned char#define uint unsigned intuchar code table[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义北面的LEDsbit N_Red = P1^0;sbit N_Yellow = P1^1;sbit N_Green = P1^2;//定义东面的LEDsbit E_Red = P1^3;sbit E_Yellow = P1^4;sbit E_Green = P1^5;//定义南面的LEDsbit S_Red = P1^6;sbit S_Yellow = P1^7;sbit S_Green = P3^4;//定义西面的LEDsbit W_Red = P3^5;sbit W_Yellow = P3^6;sbit W_Green = P3^7;uchar Count = 0;uchar Sec = 0;void Delay(uint del){ uint i,j;for(i=0; i#include#define uint unsigned int#define uchar unsigned char//心形显示unsigned char code tabP0[]={0x00,0x1C,0x22,0x42,0x84,0x42,0x22,0x1C};unsigned char code tabP2[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};void Delay_1ms(uchar i)//1ms延时{ uchar x,j;for(j=0;j#define uchar unsigned char#define uint unsigned intsbit KEY1 = P3^2;uchar Count = 0;uchar code table[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void Delay(uint del){ uint i,j;for(i=0; i#define uchar unsigned char#define uint unsigned intuint Count = 0;uchar code table[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void Time0_Init() { TMOD = 0x00;TH0 = 0xE3;TL0 = 0x06;ET0 = 1;EA = 1;TR0 = 1;}void Time0_Int() interrupt 1{ TH0 = 0xE3;TL0 = 0x06;Count++; //长度加1}void main(){ uchar i = 0;Time0_Init();P2 = 0xfe;while(1){ P0 = table[i % 10]; //取 i 的个位if(Count == 1000) //当Count为 1000 时,i 自加一次,1000 * 0.1MS = 1S{ Count = 0;i++;}}}#include#define uchar unsigned char#define uint unsigned intvoid Delay(uint del) //延时函数{ uint i,j;for(i=0; i#include#define uint unsigned int#define uchar unsigned charuchar tabP2[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar tabP0[6][8]={{0x00,0xDF,0xDF,0xDB,0xDB,0xFB,0xFB,0x00},{0x00,0x1F,0x1F,0x18,0x18,0xFF,0xFF,0x00},{0x00,0xDB,0xDB,0xDB,0xDB,0xFF,0xFF,0x00},{0x00,0xFB,0xFB,0xDB,0xDB,0xDF,0xDF,0x00},{0x00,0x00,0x84,0xFF,0xFF,0x80,0x00,0x00},{0x00,0xFF,0xFF,0xC3,0xC3,0xFF,0xFF,0x00},};void Delay_1ms(uchar i)//1ms延时{ uchar x,j;for(j=0;j#define uchar unsigned char#define uint unsigned intsbit KEY1 = P3^2;sbit KEY2 = P3^3;sbit KEY3 = P3^4;sbit KEY4 = P3^5;void Delay(uint del){ uint i,j;for(i=0; i#define uchar unsigned char#define uint unsigned intsbit KEY1 = P3^2;sbit KEY2 = P3^3;sbit KEY3 = P3^4;sbit KEY4 = P3^5;uint i=88;//数码管的段码编码uchar table[16] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0 x79,0x71};//下一行的数组可以显示数值外,还可以显示数码管的点uchar table_d[16] ={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0 xf9,0xf1};uchar code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void Delay_1ms(uint i){ uint x,j;for(j=0;j#define uchar unsigned char#define uint unsigned intsbit KEY1 = P3^2;sbit KEY2 = P3^3;sbit KEY3 = P3^4;sbit KEY4 = P3^5;//数码管的段码编码uchar table[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void Delay_1ms(uint i){ uint x,j;for(j=0;j#include#define uint unsigned int#define uchar unsigned char#define ulong unsigned longuchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41,0x1f, 0x01, 0x09}; sbit E=P2^7; //1602使能引脚sbit RW=P2^6; //1602读写引脚sbit RS=P2^5; //1602数据/命令选择引脚void Delay_1ms(uint del)//1ms延时{ uint i,j;for(i=0;i#include#define uint unsigned int#define uchar unsigned charuchar code table[16] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0 x79,0x71};void Delay_1ms(uint del)//1ms延时{ uint i,j;for(i=0;i#define uchar unsigned char#define uint unsigned intsbit KEY = P3^2;uchar table[16] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0 x79,0x71};void Delay(uint del){ uint i,j;for(i=0; i#include#define uchar unsigned char#define uint unsigned intsbit E=P2^7; //1602使能引脚sbit RW=P2^6; //1602读写引脚sbit RS=P2^5; //1602数据/命令选择引脚void delay(){ _nop_();_nop_();}void Delay(uint del){ uint i,j;for(i=0;i相关文档:更多相关文档请访问:。

8位数值比较器单片机代码

8位数值比较器单片机代码

8位数值比较器单片机代码8位数值比较器是一种常见的电子元件,用于比较两个8位二进制数的大小。

在单片机中,我们可以使用编程语言来实现一个8位数值比较器的功能。

下面是一个使用C语言编写的8位数值比较器单片机代码的详细解释。

## 代码结构```c#include <stdio.h>int compare(unsigned char num1, unsigned char num2);int main(){unsigned char num1 = 0b10101010; // 第一个8位二进制数 unsigned char num2 = 0b01010101; // 第二个8位二进制数int result = compare(num1, num2); // 调用比较函数if(result == 1){printf("num1大于num2\n");}else if(result == -1)printf("num1小于num2\n");}else{printf("num1等于num2\n");}return 0;}int compare(unsigned char num1, unsigned char num2) {for(int i=7; i>=0; i--){if((num1 >> i) & 0x01 > (num2 >> i) & 0x01){return 1;}else if((num1 >> i) & 0x01 < (num2 >> i) & 0x01) {return -1;}}return 0;}```## 解释### 头文件引入```c#include <stdio.h>```我们首先引入了`stdio.h`头文件,这个头文件包含了一些输入输出的函数,比如`printf`函数。

单片机实验代码

单片机实验代码

单片机实验代码文件排版存档编号:[UYTR-OUPT28-KBNTL98-UYNN208]单片机实验代码实验一ORG 0000hAJMP HA1SORG 0030HHA1S: MOV A,#00HHA1S1: JB P3.3,HA1S1MOV R2,#20HLCALL DELAYJB P3.3,HA1S1HA1S2: JNB P3.3,HA1S2MOV R2,#20HLCALL DELAYJNB P3.3,HA1S2INC APUSH ACCMOV P1,APOP ACCAJMP HA1S1DELAY: PUSH 02HDELAY1: PUSH 02HDELAY2: PUSH 02HDELAY3: DJNZ R2,DELAY3POP 02HDJNZ R2,DELAY2POP 02HDJNZ R2,DELAY1POP 02HDJNZ R2,DELAYRETEND实验二ORG 0000HAJMP 0030HORG 0013HLJMP HA2S3ORG 0030HHA2S: MOV P1,#0fFH ORL P3,#00HHA2S1: JB P3.4,HA2S1 ORL IE,#84HORL IP,#04HMOV PSW,#00HMOV SP,#53HHA2S2: MOV P1,#081H ACALL HA2S7MOV P1,#082HACALL HA2S7MOV P1,#084HACALL HA2S7MOV P1,#088HACALL HA2S7MOV P1,#090HACALL HA2S7MOV P1,#0A0HACALL HA2S7MOV P1,#0C0HACALL HA2S7SJMP HA2S2HA2S3: MOV B,R2HA2S5: SETB P1.7ACALL HA2S6CLR P1.7ACALL HA2S6JNB P3.3,HA2S5MOV R2,BRETIHA2S6: MOV R2,#06H ACALL DELAYRETHA2S7: MOV R2,#30HACALL DELAYRETDELAY: PUSH 02H DELAY1: PUSH 02H DELAY2: PUSH 02H DELAY3: DJNZ R2,DELAY3 POP 02HDJNZ R2,DELAY2POP 02HDJNZ R2,DELAY1POP 02HDJNZ R2,DELAYRETEND实验10org 0000hSjmp MAINorg 000bhmov th0,r1mov tl0,r0cpl p1.0RETIMAIN:MOV TMOD,#01H MOV IE,#82HMOV DPTR,#TABLOOP: CLR AMOVC A,@A+DPTRMOV R1,AINC DPTRCLR AMOVC A,@A+DPTRMOV R0,AORL A,R1JZ NEXT0MOV A,R0ANL A,R1CJNE A,#0FFH,NEXTSJMP MAINNEXT : MOV TH0,R1MOV TL0,R0SETB TR0SJMP NEXT1NEXT0:CLR TR0NEXT1: CLR AINC DPTRMOVC A,@A+DPTRMOV R2,ALOOP1: ACALL D200CDJNZ R2,LOOP1INC DPTRAJMP LOOPD200C:MOV R3,#81HD200B:MOV A,#0FFHD200A:DEC AJNZ D200ADEC R3CJNE R3,#00H,D200BRETTAB: DB 0FEH,25H,04H,0FEH,25H,02H ;11 1 5 DB 0FEH,25H,02H,0FDH,80H,04HDB 0FEH,84H,02H,0FEH,84H,02H;33 3 1DB 0FEH,84H,04H,0FEH,25H,04HDB 0FEH,25H,02H,0FEH,84H,02H;13 5 5DB 0FEH,0C0H,04H,0FEH,84H,02HDB 0FEH,98H,02H,0FEH,84H,02H;43 2 -DB 0FEH,57H,08H,00H,00H,04HDB 0FFH,0FFHEND;1=131 262 523 1047;2=147 294 587 1175;3=165 330 659 1319;4=175 349 698 1397;5=196 392 784 1568;6=220 440 880 1760;7=247 494 988 1976实验十一ORG 0000HAJMP STARTORG 0030HSTART: SETB P1.0 LCALL DELAYCLR P1.0LCALL DELAYSJMP STARTDELAY: MOV R7,#0FFH DELAY1: MOV R6,#0FFH DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1RETEND实验六ORG 0000HAJMP HA6SORG 0030HHA6S: MOV SP,#53HHA6S1: MOV R6,#00HHA6S2: MOV DPTR,#8000H MOV A,R6MOVX @DPTR,AMOV R2,#30HLCALL DELAY;INC R6;CJNE R6,#0FFH,HA6S2 HA6S3: MOV R6,#0FFH MOV DPTR,#8000H; DEC R6MOV A,R6MOVX @DPTR,AMOV R2,#30HLCALL DELAY;CJNE R6,#00H,HA6S3 SJMP HA6S1DELAY: PUSH 02HDELAY1: PUSH 02H DELAY2: PUSH 02H DELAY3: DJNZ R2,DELAY3 POP 02HDJNZ R2,DELAY2POP 02HDJNZ R2,DELAY1POP 02HDJNZ R2,DELAYRETEND实验29TIMER EQU 01Horg 0000hajmp STARTORG 000BHAJMP INT_T0ORG 070HSTART: MOV SP,#53H MOV TMOD,#01HMOV TL0,#00HMOV TH0,#4BHMOV R0,#0HMOV TIMER,#20MOV SCON,#00HCLR TICLR RISETB TR0SETB ET0SETB EASJMP $INT_T0: PUSH ACCPUSH PSWCLR EACLR TR0MOV TL0,#0HMOV TH0,#4BHSETB TR0DJNZ TIMER,EXITMOV TIMER,#20MOV DPTR,#CDATAMOV A,R0MOVC A,@A+DPTRCLR TICPL AMOV SBUF,AINC R0CJNE R0,#0AH,EXITMOV R0,#0HEXIT: SETB EAPOP PSWPOP ACCRETICDATA: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H END相关文档:更多相关文档请访问:。

单片机原理及应用实验代码 -回复

单片机原理及应用实验代码 -回复

单片机原理及应用实验代码-回复什么是单片机?单片机(Microcontroller,简称MCU)是一种集成了处理器、存储器和输入输出设备的微型计算机系统。

它具有体积小、功耗低、可编程性强等特点,被广泛应用于嵌入式系统和电子产品中。

单片机的基本原理单片机系统由CPU、存储器和输入输出设备等部分组成。

CPU是单片机的核心,它负责处理数据和控制系统的运行。

存储器包括程序存储器(ROM)和数据存储器(RAM),分别用于存储程序和数据。

输入输出设备用于与外部环境进行通信。

单片机主要靠程序来控制其内部运行。

程序是通过编程语言编写的一系列指令,通过存储器加载到单片机中。

单片机按照程序中的指令逐条执行,完成各种任务。

应用实验代码下面,我将为你介绍一些基本的单片机应用实验,并给出相应的代码示例:1. 点亮LED实验这是最基础的单片机应用实验之一。

通过编写程序控制单片机输出电平,从而点亮LED。

代码示例:include <reg52.h>sbit LED = P1^0; 定义LED连接的IO口void main(){LED = 0; 将LED引脚置低,点亮LEDwhile(1){无限循环,保持LED亮}}2. 数码管显示实验数码管是一种常见的输出设备,可用于显示数字和字符。

通过编写程序控制单片机输出电平,实现数码管上数字的显示。

代码示例:include <reg52.h>sbit SDA = P1^0; 定义SDA引脚sbit SCL = P1^1; 定义SCL引脚void delay(unsigned int x){unsigned int i, j;for(i = 0; i < x; i++){for(j = 0; j < 500; j++){空循环延时,具体时间根据单片机时钟频率确定}}}void IIC_Start(){SDA = 1;SCL = 1;SDA = 0;delay(5);SCL = 0;}void IIC_Stop(){SDA = 0;SCL = 1;SDA = 1;delay(5);}void IIC_Send_Byte(unsigned char dat){unsigned char i;for(i = 0; i < 8; i++){SDA = (dat & 0x80) >> 7;dat <<= 1;SCL = 1;SCL = 0;}}void main(){IIC_Start(); 发送起始信号IIC_Send_Byte(0x76); 发送数据,例如0x76用于控制数码管上显示的数字IIC_Stop(); 发送停止信号while(1){无限循环,保持数字的显示}}这里只是展示了两个简单的单片机实验示例,实际应用中单片机可以实现更复杂的功能,如控制电机、传感器数据处理等。

单片机键盘实验代码

单片机键盘实验代码
void Delay(uchar x);
void main()
{
/*------------让数码管先显示0-----------*/
P1=0x01; //数码管位码输出 P0=0x00;源自/关显示 //dula=1;
//P0=table[0];
//dula=0;
/*-----------按键的获取与显示----------*/
dula=0; //关闭锁存
Delay(10); //延时2ms
}
/*--------------------换取按键------------------*/
void getkey()
{
uchar col,i=0;
P2=0xf0; //行线输出全低
/*--------------------换取按键------------------*/
void getkey();
/*--------------------显示按键值---------------*/
void Display();
/*-------------------- 延时 --------------------*/
0XBE,//6
0XE0,//7
0XFE,//8
0XF6,//9
0xee,//a
0x3e,//b
0x9c,//c
0x7a,//d
0x9e,//e
0x8e //f
};//数码管的编码
uchar keyval=0;//按键值
uchar code scan[]={ 0xf7,0xfb,0xfd,0xfe }; //键盘行扫描码

simulide 单片机代码

simulide 单片机代码

simulide 单片机代码SimulIDE 是一款免费的单片机和电路仿真软件,它可以模拟模拟电路、LCD 显示器、步进电机等。

要使用SimulIDE 进行单片机代码的仿真,您需要先安装并配置好软件,然后创建一个项目,将您的单片机代码导入到项目中。

以下是一个简单的单片机代码示例,用于点亮一个LED 灯。

假设您使用的单片机型号为AT89C51,代码如下:```c#include <reg51.h>#define LED P1^0void main() {while (1) {LED = 1; // 点亮LEDdelay(1000); // 延时1000 毫秒LED = 0; // 熄灭LEDdelay(1000); // 延时1000 毫秒}}```以下是使用SimulIDE 进行单片机代码仿真的步骤:1. 打开SimulIDE 软件,点击"File" -> "New" 创建一个新项目。

2. 在"Project" 窗口中,双击"Microcontroller" 选项,选择您使用的单片机型号(如AT89C51)。

3. 双击"Main" 选项,进入主函数。

4. 将上述代码复制到主函数中,并保存。

5. 在"Project" 窗口中,找到"Simulation" 选项,点击"Start" 按钮启动仿真。

6. 观察"Debug" 窗口,可以看到LED 灯的闪烁情况。

以上就是一个简单的单片机代码仿真示例。

您可以根据需要修改代码,并在SimulIDE 中进行仿真实验。

软件支持多种单片机型号,同时还可以模拟电路、LCD 显示器、步进电机等。

希望对您有所帮助。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计1——警笛声报警器#include<reg51.h>sbit P14=P1^4;void delay(unsigned char i){unsigned char j,k;for (k=0;k<i;k++)for(j=0;j<255;j++);}void main(){unsigned char i,a,j;TMOD=0x10;while(1){for(i=0;i<5;i++){ P2=a;a=0x87;delay(150);P2=a;a=0xff;delay(150);P14=0;delay(140);P14=1;delay(130);P14=0;delay(120);P14=1;delay(110);P14=0;delay(100);P14=1;delay(50);P14=0;delay(60);P14=0;delay(70);P14=1;delay(80);P14=0;delay(90);P14=1;delay(100);P14=0;delay(110);P14=1;delay(120);P14=0;delay(130);}for(j=0;j<5;j++){ a=0xf7;for(i=0;i<4;i++){ P2=a;a<<=1;delay(36);P14=0;delay(100);P14=1;delay(50);P14=0;delay(40);P14=1;delay(50);P14=0;delay(5);P14=1;delay(50);P14=0;delay(1);}}}}设计2——计数器设计#include<reg51.h>sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit P20=P2^0;sbit P21=P2^1;sbit P22=P2^2;unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(){TH1=0xd8;TL1=0xf0;TR1=1;while(!TF1);TF1=0;}void main(){unsigned char i,a=0;TMOD=0x10;for(i=1;i<1000;i++){if(P20==0){delay();delay();delay();delay();delay();}if(P20==0)a++;P11=0;P0=led[a/100];delay();P11=1;P12=0;P0=led[a%100/10];delay();P12=1;P13=0;P0=led[a%10];delay();P13=1;if(P21==0){delay();delay();delay();delay();delay();}if(P21==0){a--;P11=0;P0=led[a/100];delay();P11=1;P12=0;P0=led[a%100/10];delay();P12=1;P13=0;P0=led[a%10];delay();P13=1;}if(P22==0){a=0;P11=0;P0=led[a/100];delay();P11=1;P12=0;P0=led[a%100/10];delay();P12=1;P13=0;P0=led[a%10];delay();P13=1;}}}设计3——秒表#include<reg51.h>sbit P10=P1^0;sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit P20=P2^0;sbit P21=P2^1;sbit P22=P2^2;sbit P32=P3^2;unsigned char code led[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; main(void){TMOD=0x11;TH0=0xee;TL0=0x00;TR0=1;ET0=1;EA=1;while(1);}void timer0() interrupt 1{static unsigned char Bit=0,i=0,a=0;static unsigned int num=0;TH0=0xee;TL0=0x00;if(P20==0){i++;if(i>1){i=0;num++;if(num==6000){num=0;}}}else if(P21==0) a=1;else if(P22==0) {a=0;i=0; }else if(P32==0) {a=0;i=0;num=0;}if(a==1){i++;if(i>1){i=0;num++;if(num==6000){num=0;}}}if(Bit>3){Bit=0;}Bit++;P1|=0xff;switch(Bit-1){case(0):P0=led[num%10];P13=0;break;case(1):P0=led[num%100/10];P12=0;break;case(2):P0=(led[num%1000/100])|0x80;P11=0;break;case(3):P0=led[num/1000];P10=0;break;}}设计4——交通灯控制器#include<reg51.h>sbit P10=P1^0;sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit P20=P2^0;sbit P21=P2^1;sbit P22=P2^2;sbit P23=P2^3;sbit P24=P2^4;sbit P25=P2^5;sbit P32=P3^2;unsigned int a1=0,a2=0,a3=0,time1=20,time2=3,flag=0;unsigned char code led[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};main(void){TMOD=0x11;TH0=0xee;TL0=0x00;TR0=1;ET0=1;EA=1;a1=time1;while(1);}void timer0() interrupt 1{static unsigned char Bit=0,i=0,huan=0,deng=0,m=0,n=0,l=0,k=1;TH0=0xee;TL0=0x00;if(flag==0||flag==3)if(a1>0 && a2==0 && a3==0){ i++;if(i%200==0){i=0;a1--;} P25=0;if(a1==0){a3=time2;P25=1; }}else if (a2>0 && a1==0 && a3==0) { i++;if(i%200==0){i=0;a2--;} P23=0;if(a2==0){a3=time2;P23=1; }}else if (a3>0 && a1==0 && a2==0) { i++;if(i%200==0){i=0;a3--;} P24=0;flag=3;if(a3==0)switch(huan){case(0):flag=0;huan=1;a2=time1;P24=1;break;case(1):flag=0;huan=0;a1=time1;P24=1;break;}}if(P20==1){m=1;}if(P20==0&&m==1){ flag++;m=0;a1=time1;a2=0;a3=0;P23=1;P24=1;P25=0;if(flag>=3)fla g=0; }if(P21==1){n=1;}if(P21==0&&n==1){n=0;switch(flag){case(1):if(time1<10000)time1++;break;case(2):if(time2<10000)time2++;break;}}if(P22==1){l=1;}if(P22==0&&l==1){l=0;switch(flag){case(1):if(time1>0)time1--;break;case(2):if(time2>0)time2--;break;}}if(P32==1){k=1;}if(P32==0&&k==1){k=0;switch(deng){case(0):deng=1;a2=a1;a1=0;;a3=0;P23=0;P24=1;P25=1;break;case(1):deng=0;a1=a2;a2=0;;a3=0;P23=1;P24=1;P25=0;break;}}if(Bit>3){Bit=0;}Bit++;P1|=0xff;switch(flag){case(0):switch(Bit-1){case(0):P0=led[a1%10]; P13=0;break;case(1):P0=led[a1/10]; P12=0;break;case(2):P0=(led[a2%10])|0x80; P11=0;break;case(3):P0=led[a2/10]; P10=0;break;}break;case(1):switch(Bit-1){case(0):P0=led[time1%10]; P13=0;break;case(1):P0=led[time1%100/10]; P12=0;break;case(2):P0=led[time1%1000/100];P11=0;break;case(3):P0=led[time1/1000]; P10=0;break;}break;case(2):switch(Bit-1){case(0):P0=led[time2%10]; P13=0;break;case(1):P0=led[time2%100/10]; P12=0;break;case(2):P0=led[time2%1000/100];P11=0;break;case(3):P0=led[time2/1000]; P10=0;break;}break;case(3):switch(Bit-1){case(0):P0=led[a3%10]; P13=0;break;case(1):P0=led[a3%100/10]; P12=0;break;case(2):P0=led[a3%1000/100];P11=0;break;case(3):P0=led[a3/1000]; P10=0;break;}break;}}设计5——多功能电脑时钟#include<reg51.h>sbit P10=P1^0;sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit P20=P2^0;sbit P21=P2^1;sbit P22=P2^2;sbit P23=P2^3;sbit P24=P2^4;sbit P25=P2^5;sbit P26=P2^6;sbit P32=P3^2;unsigned int year=2011,month=5,diary=16,hour=12,minute=0,flag=0;unsigned char code led[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; main(void){TMOD=0x11;TR0=1;ET0=1;EA=1;while(1);}void timer0() interrupt 1{static unsigned char Bit=0,huan=0,m=0,n=0,l=0,k=0,a=0;static unsigned int i=0,z=0,num=0;TH0=0xee;TL0=0x00;if(flag==0){P23=1;P24=1;P25=1;P26=1;z++;if(z==200)z=0;if(++i%12000==0){i=0;if(++minute==60){minute=0;if(++hour==24){hour=0;if(++diary==31){diary=1;if(++month==13){month=1;year++;} } } }} }if(P20==1){m=1;}if(P20==0&&m==1){flag++;m=0;i=0;huan=0;num=0;P23=1;P24=1;P25=0;P26=0;if(flag>4)flag =0;}if(P21==1){n=1;}if(P21==0&&n==1){n=0;switch(flag){case(1):switch(huan){case(0):if(year<10000) year++; break;case(1):if(year<10000) year+=100; break; }break;case(2):switch(huan){case(0):if(diary<31) diary++; break;case(1):if(month<13) month++; break; }break;case(3):switch(huan){case(0):if(minute<60) minute++;break;case(1):if(hour<24) hour++; break; }break;} }if(P22==1){l=1;}if(P22==0&&l==1){l=0;switch(flag){case(1):switch(huan){case(0):if(year>0) year--; break;case(1):if(year>100) year-=100;break; }break;case(2):switch(huan){case(0):if(diary>1) diary--; break;case(1):if(month>1) month--; break; }break;case(3):switch(huan){case(0):if(minute>0) minute--; break;case(1):if(hour>0) hour--; break; }break;} }if(P32==1){k=1;}if(P32==0&&k==1){k=0;if(flag==4&&a==0)a=1;if(flag==4&&a==1)a=0;if(flag!=4)switch(huan){case(0):huan=1;P23=0;P24=0;P25=1;P26=1;break;case(1):huan=0;P23=1;P24=1;P25=0;P26=0;break; } }if(a==1) {i++;if(i>1){i=0;num++;if(num==9999){num=0;}}}if(Bit>3){Bit=0;}Bit++;P1|=0xff;switch(flag){case(0):if(z<100)switch(Bit-1){case(0):P0=led[minute%10]; P13=0;break;case(1):P0=led[minute/10]; P12=0;break;case(2):P0=(led[hour%10])|0x80;P11=0;break;case(3):P0=led[hour/10]; P10=0;break;}elseswitch(Bit-1){case(0):P0=led[minute%10]; P13=0;break;case(1):P0=led[minute/10]; P12=0;break;case(2):P0=(led[hour%10]); P11=0;break;case(3):P0=led[hour/10]; P10=0;break;}break;case(1):switch(Bit-1){case(0):P0=led[year%10]; P13=0;break;case(1):P0=led[year%100/10]; P12=0;break;case(2):P0=led[year%1000/100]; P11=0;break;case(3):P0=led[year/1000]; P10=0;break;}break;case(2):switch(Bit-1){case(0):P0=led[diary%10]; P13=0;break;case(1):P0=led[diary/10]; P12=0;break;case(2):P0=led[month%10]|0x80; P11=0;break;case(3):P0=led[month/10]; P10=0;break;}break;case(3):switch(Bit-1){case(0):P0=led[minute%10]; P13=0;break;case(1):P0=led[minute/10]; P12=0;break;case(2):P0=led[hour%10]|0x80; P11=0;break;case(3):P0=led[hour/10]; P10=0;break;}break;case(4):switch(Bit-1){case(0):P0=led[num%10]; P13=0;break;case(1):P0=led[num%100/10]; P12=0;break;case(2):P0=(led[num%1000/100])|0x80;P11=0;break;case(3):P0=led[num/1000]; P10=0;break;}break;}}。

相关文档
最新文档