单片机小程序

合集下载

单片机常识ffff[资料]

单片机常识ffff[资料]

单片机知识又称单片微控制器,它不是完成某一个功能的芯片,而是把一个系统集成到一个芯片上。

相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。

概括的讲:一块芯片就成了一台计算机。

它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。

同时,学习使用单片机是了解与结构的最佳选择。

原理:单片机自动完成赋予它的任务的过程,也就是单片机的过程,即一条条执行的指令的过程,所谓指令就是把要求单片机执行的各种操作用的命令的形式写下来,这是在设计人员赋予它的所决定的,一条指令对应着一种基本操作;单片机所能执行的全部指令,就是该单片机的指令系统,不同种类的单片机,其指令系统亦不同。

为使单片机能自动完成某一特定任务,必须把要解决的问题编成一系列指令(这些指令必须是选定单片机能识别和执行的指令),这一系列指令的集合就成为程序,程序需要预先存放在具有存储功能的部件——中。

存储器由许多存储单元(最小的)组成,就像大楼房有许多房间组成一样,指令就存放在这些单元里,单元里的指令取出并执行就像大楼房的每个房间的被分配到了唯一一个房间号一样,每一个存储单元也必须被分配到唯一的地址号,该地址号称为存储单元的地址,这样只要知道了存储单元的地址,就可以找到这个存储单元,其中存储的指令就可以被取出,然后再被执行。

程序通常是顺序执行的,所以程序中的指令也是一条条顺序存放的,单片机在执行程序时要能把这些指令一条条取出并加以执行,必须有一个部件能追踪指令所在的地址,这一部件就是PC(包含在CPU中),在开始执行程序时,给PC赋以程序中第一条指令所在的地址,然后取得每一条要执行的命令,PC在中的内容就会自动增加,增加量由本条决定,可能是1、2或3,以指向下一条指令的起始地址,保证指令顺序执行。

操作方法就是将各个引脚赋值为高电平或,比如P0脚全部为低电平,就是P0=0x00;全部为高电平P0=0xff;1.MCS-51单片机的运算电路包括了算术逻辑运算单元ALU 、累加器A ,B寄存器以及状态寄存器PSW和暂存寄存器等部件。

单片机课设心得模板5篇

单片机课设心得模板5篇

单片机课设心得模板5篇心得体会的文字,能让我们感受到一个人内心的真实情感和心理历程,写心得体会让我们能够深刻体会学习中的点滴进步,本店铺今天就为您带来了单片机课设心得模板5篇,相信一定会对你有所帮助。

单片机课设心得篇1两周的单片机课程设计最后顺利完成了,其中包含着快乐,也有辛酸。

我们选的设计题目是数字温度计,大家都觉得这个题目是比较简单的。

其实不然,做了之后,发现设计电路虽然简单,但我们认为它真正困难的地方是程序设计,但是在我们同心努力下最终完成了。

我们刚选该题目时,真的是一头雾水,硬件电路不知如何下手,更何谈解决程序那块,因为我们所学的都是单片机方面的理论知识,应用到实践中去还比较少。

但是,我们三人也没偷下懒,迅速分工去查阅和收集资料。

我们去了图书馆借一些参考书,上网找一些相关资料,并且请教指导老师。

透过不断努力,最后把数字温度计的思路和模型定了下来并开始分一个人去焊接硬件电路,剩下的去整理和修改程序。

透过一番整理和修改后,在电脑上进行仿真,仿真成功后准备焊接电路板。

在焊接电路板中,我们首先对硬件电路进行布局,然后确认无误后,在电路板上进行焊接,这个过程我们觉得是做得比较快的,以至于后面出现了虚焊的错误。

焊接电路板完工,细心检查后,进行通电测试。

结果液晶lcd没有显示,透过检查,原先是lcd坏了,在换了块新的后,能显示显示值。

但还有个问题是,当报警电路不会报警,在请教老师后,发现走动蜂鸣器的电压太低了,是因为串接了一个太大的电阻。

然后,我们换了一个小电阻,但这时蜂鸣器却一向在叫,停不下来,但是,在我们三人的的细心检查下,原先是在放大电路的一端虚焊了,这说明我们焊接电路的技术还不够好。

在重新焊接那端后,数字温度电路最后成功实现功能,当时我们的情绪都是无比兴奋和快乐的,因为我们两周的辛苦没有白费。

在完成单片机课程设计后,我们发现我们还有许多不足,所学到的知识还远远不够,以至于还有一些功能不能被动完成。

单片机延时问题20问

单片机延时问题20问

单片机延时问题20问延时与中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机、MSP430单片机、C51单片机、8051F的单片机、avr单片机、STC89C52、PIC单片机…..在内的各种单片机常见的延时与中断问题及解决方法,希望对单片机新手们,有所帮助!1、单片机延时程序的延时时间怎么算的?答:如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。

如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。

第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。

本程序中假设使用频率为12 MHz的晶振。

最长的延时时间可达216=65 536 μs。

若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

2、求个单片机89S51 12M晶振用定时器延时10分钟,控制1个灯就可以答:可以设50ms中断一次,定时初值,TH0=0x3c、TL0=0xb0。

中断20次为1S,10分钟的话,需中断12000次。

计12000次后,给一IO口一个低电平(如功率不够,可再加扩展),就可控制灯了。

而且还要看你用什么语言计算了,汇编延时准确,知道单片机工作周期和循环次数即可算出,但不具有可移植性,在不同种类单片机中,汇编不通用。

用c的话,由于各种软件执行效率不一样,不会太准,通常用定时器做延时或做一个不准确的延时,延时短的话,在c中使用汇编的nop做延时3、51单片机C语言for循环延时程序时间计算,设晶振12MHz,即一个机器周期是1us。

for(i=0,i<100;i++)for(j=0,j<100;j++)我觉得时间是100*100*1us=10ms,怎么会是100ms答:不可能的,是不是你的编译有错的啊我改的晶振12M,在KEIL 4.0 里面编译的,为你得出的结果最大也就是40ms,这是软件的原因,不可能出现100ms那么大的差距,是你的软件的原因。

单片机汇编延时计算小程序

单片机汇编延时计算小程序
for(w=0;w<256;w++)
{
for(x=0;x<256;x++)
{
for(y=0;y<256;y++)
{
periodicity=delay_time/(12.0/f);
delay_period_XY=w*(x*(3+2*y)+3)+3 ;
//精度控制
if((delay_period_XY>periodicity*0.9999)&&(delay_period_XY<periodicity*1.0001))
if((mcu_type==1)&&(delay_time>(12.0/f)*(255*(3+2*255)+3)))
{
printf("您输入的延时长度为%fus,超过了该汇编程序在51单片机下的最大延时长度%fus,将改用三重循环程序来实现该延时。\n",delay_time,(12.0/f)*(255*(3+2*255)+3));
printf("#pragma endasm\n");
if((mcu_type==1)&&(delay_time>(12.0/f)*(255*(255*(3+2*255)+3)+3)))
{
printf("您输入的延时长度为%fus,超过了该汇编程序在51单片机下的最大延时长度%fus,三重循环程序也无法实现。\n",delay_time,(12.0/f)*(255*(3+2*255)+3));

2024年单片机实验心得体会_3

2024年单片机实验心得体会_3

2024年单片机实验心得体会2024年单片机实验心得体会1这是我经过我们的不断努力,我们终于实现了简单的跑马灯的运行,便是两个灯地交替闪烁。

我们感到兴奋极了。

但是我们并没有满足于当前,我们又编写了三个灯地交替闪烁,四个及多个。

当我们一步步实现我们的目的时,我得到莫大成就感和自信。

在这次实验中,我体会到了合作的重要性。

一个人也可能实现这一系列的过程,但是要花费很多精力和时间。

群策群力,分工明确,可以使我们更好、更快地完成我们的工作。

在此期间,你可以更好知道自己的不足和缺陷,来得到改正。

还可以知道自己的优势所在,把握好自己的优势。

附送:无论是作为一名业余的电子爱好者还是一名电子行业的相关从业人员,掌握单片机技术无疑可以使您如虎添翼,为您的电子小制作或者开发设计电子产品时打开方便的大门!而且现在学习单片机技术的热潮正在不断升温,时下多家电子类的报刊杂志如:《电子制作》《无线电》《电子报》《电子世界》都开设了详细的单片机学习专栏,对于想学习单片机的朋友来说帮助很大,可以说现在的单片机学习环境是最好的,经过一段时间的努力,采用单片机来开发设计电子产品已经不再是专业电子工程师的“专利”!作为一个普通的电子爱好者完全可以通过一番努力后熟练掌握!国外的电子爱好者采用单片机来设计小制作非常普及,一些智能机器人、智能自动装置内部都离不开单片机的身影~~~站长的单片机技术也是通过网络自学学会的,因为站长的专业不是电子专业,所以单片机对于我来说是完全陌生的,自从上网后才知道有个叫单片机的好东东,看了平凡的单片机上的单片机教程后开始自学51单片机技术。

平凡的单片机上有非常详细的51单片机基础知识教程,写得非常生动朴实,对我来说帮助极大,站长是先看了平凡老师的教程才对单片机有一些了解,然后购买了一些单片机的书刊,加以不断试验才初步掌握单片机的。

学习单片机技术有一定的难度,不花费一番努力是很难学会的,但是只要不断努力就一定能成功,套用一句广告歌词:努力总有回报!学习单片机最好从51系列开始,易看懂,不过确实很有用,很有嚼头,可以先大致看一遍,不消化的可以以后在试验实践中反复研究。

单片机C语言小程序

单片机C语言小程序

单片机C语言小程序#include <at89x51.h>#include <absacc.h>#define V AR XBYTE[0x00] /*V AR为外部位址0000*/#define read 0 /*93c46读取的识别码READ=0*/#define write 2 /*93c46写入的识别码WRITE=2*/#define ewen 4 /*93C46写致能的识别码EWEN=4*/#define ewds 6 /*93C46写除能的识别码EWDS=6*/#define cs INT0 /*93C46 CS接脚=8051 RD P3.2*/#define clk INT1 /*93C46 CLK接脚=8051 WR P3.3*/#define di T0 /*93C46 DI接脚=8051 T1 P3.4*/#define d0 T1 /*93C46 DO接脚=8051 T0 P3.5*/#define LOW 0x49 /*存放测试温度的下限值*/#define HIGH 0x51 /*存放测试温度的上限值*/bit FLAG0=0; /*宣告TIMER0响应旗号*///外接工业专用温度传感器时,目前设置测量温度为0-99度:static const char tab[13]={0x3a,0x53,0x6f,0x8a,0xa3, /*0度,10度,20度,30度,40度*/0xB8,0xC8,0xD5,0xDE,0xE5, /*50度,60度,70度,80度,90度*/0xEA,0xEE}; /*100度,110度*///使用板上AD590温度传感器时,目前设置测量温度为0-99度://static const char tab[13]={0x88,0x8d,0x92,0x97,0x9c, /*0度,10度,20度,30度,40度,*/// 0xa1,0xa6,0xab,0xb0,0xb5, /*50度,60度,70度,80度,90度*/// 0xba,0xc0}; /*100度,110度*/char data1[2];char C,S,k=0;char MEP[7]; /*显示器值存放阵列*///MEP[0]=数码管最低位显示值,温度指示小数点后位//MEP[1]=数码管次低位显示值,温度指示个位数//MEP[2]=数码管高位显示值,温度指示十位数//MEP[3]=数码管最低位显示值,功能显示目前定为1,2,3,4,5//MEP[4]=//MEP[5]=暂放置温度显示值,高4位为温度指示十位数值,低4位为温度指示个位数值//MEP[6]=在温度显示与电压调整副程式中,将测量值C暂存MEP[6]中unsigned char combuf[10];unsigned char ADR46,CH,CL,m,C1,C2; /*ADR46,93C46位址,CH高位元组,CL低*/ int sec,sec1;char ptr=0,ptr1=0x10,psr=0; /*ptr显示器值存放阵MEP[]指标,ptr1显示器扫描指标*/ char count=100,sb=0;void delay (unsigned int value) /*延时副程式*/{while (value!=0) value--; /*10us延时*/}void COMP(); /*宣告比较现在温度与设定温度副程式*/void SET();void disp(); /*宣告设定温度副程式*/void to9346(char c); /*宣告TO93C46副程式*/void SDT46(char c); /*宣告串入副程式*/RDT46(); /*宣告串出副程式*/void clear(void); /*宣告清除按键存放/显示器阵列MEP[]副副程式*/void xch(void); /*宣告按键存放/显示器阵列MEP[]右键滚入副程式*/void sjust(void); /*温度显示慢跳调整副程式*/void temper(); /*宣告温度显示与电压调整副程式*/void UP(); /*宣告温度上升键防抖动副程式*/void UPA(); /*宣告温度设置上升副程式*/void DOWN(); /*宣告温度下降键防抖动副程式*/void DOWNA(); /*宣告温度设置下降副程式*/void FONTION(); /*宣告模式键判断模式副程式*/void buf(); /*宣告从93C46取设定值副程式*/void SA VE(); /*宣告设置存储副程式*///********************************************************main() /*主程式*/{TMOD=0x11; /*TIMER0,TIMER1工作在MODE1*/TH0=(65535-50000)/256; /*设定TIMER0初值,50ms*/TL0=(65536-50000)%256;TH1=(65535-4000)/256; /*设定TIMER1初值,4ms*/TL1=(65536-4000)%256;IE=0x8a; /*TIMER0,TIMER1中断致能*/TR1=1; /*启动TIMER1*/P2_7=1; /*测试用,温度下限指示*/P2_6=1; /*测试用,温度在正常上下限间指示*/P2_5=1; /*测试用,温度上限指示*/buf(); /*从93C46取设定值副程式*/while(1) /*无条件循环*/{P3_1=0;MEP[3]=0xff; /*将模式位置零*/V AR=0x00; /*产生写入信号WR=0,令ADC0804开始转换*/while (P2_0==1); /*侦测ADC0804的接脚INTR=0否?是则转换完成*/S=V AR; /*读取ADC0804资料,存入C*/sjust(); /*温度显示慢跳调整副程式*/temper(); /*呼叫温度显示调整副程式*/MEP[5]=(MEP[2] < <4)|MEP[1];if(P2_4==0) SET(); /*如果模式键P2.4按下,则呼叫SET副程式,否则跳过副程式*/if(MEP[5] <combuf[5]) { P2_7=0; /*如果测试温度小于设定温度下限,等式成立时,则将低温指示打开P2_7=0*/P2_6=P2_5=1; /*关闭指示灯*/}if(MEP[5]> combuf[6]) { P2_5=0; /*如果测试温度大于设定温度上限,等式成立时,则将高温指示打开P2_5=0*/P2_7=P2_6=1; /*关闭指示灯*/}if(combuf[5] <MEP[5])if(MEP[5] <combuf[6]) { P2_6=0; /*如果测试温度介于设定温度上下限之间,则将正常指示打开P2_6=0*/ P2_7=P2_5=1;}} /*跳至while(1),无条件循环*/单片机的C语言轻松入门随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使用高级语言开发,其中主要是以C语言为主,市场上几种常见的单片机均有其C语言开发环境.这里以最为流行的80C51单片机为例来学习单片机的C语言编程技术.本书共分六章,每章一个专题,以一些待完成的任务为中心,围绕该任务介绍C语言的一些知识,每一个任务都是可以独立完成的,每完成一个任务,都能掌握一定的知识,等到所有的任务都完成后,即可以完成C语言的入门工作.第1章C语言概述及其开发环境的建立学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好.Keil软件是目前最流行开发80C51系列单片机的软件,Keil提供了包括C编译器,宏汇编,连接器,库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境( Vision)将这些部份组合在一起.在学会使用汇编语言后,学习C语言编程是一件比较容易的事,我们将通过一系列的实例介绍C语言编程的方法.图1-1所示电路图使用89S52单片机作为主芯片,这种单片机性属于80C51系列,其内部有8K的FLASH ROM,可以反复擦写,并有ISP功能,支持在线下载,非常适于做实验.89S52的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接4个按钮开关,我们的任务是让接在P1引脚上的发光二极管按要求发光.1.1 简单的C程序介绍例1-1: 让接在P1.0引脚上的LED发光./*************************************************平凡单片机工作室Copyright 2003 pingfan's mcustudioAll rights Reserved作者:周坚dddl.c单灯点亮程序*************************************************/图1-1 接有LED的单片机基本电路P1.0EA/VPPVCCXTAL2XTAL1GNDRST+5V+5V+R1E110K10UCY27P27P1KPZ1D8D189×××#include "reg51.h"sbit P1_0=P1^0;void main(){ P1_1=0;}这个程序的作用是让接在P1.0引脚上的LED点亮.下面来分析一下这个C语言程序包含了哪些信息.1)"文件包含"处理.程序的第一行是一个"文件包含"处理.所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有4行,但C编译器在处理的时候却要处理几十或几百行.这里程序中包含REG51.h 文件的目的是为了要使用P1这个符号,即通知C编译器,程序中所写的P1是指80C51单片机的P1端口而不是其它变量.这是如何做到的呢打开reg51.h可以看到这样的一些内容:/*-------------------------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*//* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99; /* BIT Register */ /* PSW */sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5; sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8; /* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8; /* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5;sbit T0 = 0xB4;sbit INT1 = 0xB3;sbit INT0 = 0xB2;sbit TXD = 0xB1;sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;熟悉80C51内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地址的对应关系.注意其中有sfr P1 = 0x90;这样的一行(上文中用黑体表示),即定义P1与地址0x90对应,P1口的地址就是0x90 (0x90是C语言中十六进制数的写法,相当于汇编语言中写90H).从这里还可以看到一个频繁出现的词:sfrsfr并标准C语言的关键字,而是Keil为能直接访问80C51中的SFR而提供了一个新的关键词,其用法是:sfrt 变量名=地址值.2)符号P1_0来表示P1.0引脚.在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0是不是就是P1.0 呢你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C 的关键字sbit来定义,sbit的用法有三种:第一种方法:sbit 位变量名=地址值第二种方法:sbit 位变量名=SFR名称^变量位地址值第三种方法:sbit 位变量名=SFR地址值^变量位地址值如定义PSW中的OV可以用以下三种方法:sbit OV=0xd2 (1)说明:0xd2是OV的位地址值sbit OV=PSW^2 (2)说明:其中PSW必须先用sfr定义好sbit OV=0xD0^2 (3)说明:0xD0就是PSW的地址值因此这里用sfr P1_0=P1^0;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以起P10一类的名字,只要下面程序中也随之更改就行了.3)main称为"主函数".每一个C语言程序有且只有一个主函数,函数后面一定有一对大括号"{}",在大括号里面书写其它程序.从上面的分析我们了解了部分C语言的特性,下面再看一个稍复杂一点的例子.例1-2 让接在P1.0引脚上的LED闪烁发光/*************************************************平凡单片机工作室Copyright 2003 pingfan's mcustudioAll rights Reserved作者:周坚ddss.c单灯闪烁程序*************************************************/#include "reg51.h"#define uchar unsigned char#define uint unsigned intsbit P10=P1^0;/*延时程序由Delay参数确定延迟时间*/void mDelay(unsigned int Delay){ unsigned int i;for(;Delay>0;Delay--){ for(i=0;iNew Project…"菜单,出现对话框,要求给将要建立的工程起一个名字,这里起名为exam2,不需要输入扩展名.点击"保存"按钮,出现第二个对话框,如图1-2所示,这个对话框要求选择目标CPU(即你所用芯片的型号),Keil支持的CPU很多,这里选择Atmel公司的89S52芯片.点击AT M E L前面的"+"号,展开该层,点击其中的89S52, 然后再点击"确定"按钮,回到主窗口,此时,在工程窗口的文件页中,出现了"Target 1",前面有"+"号,点击"+"号展开,可以看到下一层的"Source Group1",这时的工程还是一个空的工程,里面什么文件也没有,需要手动把刚才编写好的源程序加入,点击"Source Group1"使其反白显示,然后,点击鼠标右键,出现一个下拉菜单,如图1-3所示,选中其中的"Add file to Group"Source Group1",出现一个对话框,要求寻找源文件.双击exam2.c文件,将文件加入项目,注意,在文件加入项目后,该对话框并不消失,等待继续加入其它文件,但初学时常会误认为操作没有成功而再次双击同一文件,这时会出现如图1-4所示的对话框,提示你所选文件已在列表中,此时应点击"确定",返回前一对话框,然后点击"Close"即可返回主接口,返回后,点击"Source Group 1"前的加号,exam3.c文件已在其中.双击文件名,即打开该源程序.1.3 工程的详细设置工程建立好以后,还要对工程进行进一步的设置,以满足要求.首先点击左边Project窗口的Target 1,然后使用菜单"Project->Option for target 'target1'"即出现对工程设置的对话框,这个对话框共有8个页面,大部份设置项取默认值就行了. Target页图1-2 选择单片机型号图1-3 加入文件如图1-5所示,Xtal后面的数值是晶振频率值,默认值是所选目标CPU的最高可用频率值,该值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间.正确设置该数值可使显示时间与实际所用时间一致,一般将其设置成与你的硬件所用晶振频率相同,如果没必要了解程序执行的时间,也可以不设.Memory Model用于设置RAM使用情况,有三个选择项:Small: 所有变量都在单片机的内部RAM中;Compact:可以使用一页(256字节)外部扩展RAM;Larget: 可以使用全部外部的扩展RAM.Code Model用于设置ROM空间的使用,同样也有三个选择项:Small:只用低于2K的程序空间;Compact:单个函数的代码量不能超过2K,整个程序可以使用64K程序空间;Larget:可用全部64K空间;这些选择项必须根据所用硬件来决定,由于本例是单片应用,所以均不重新选择,按默认值设置.Operating:选择是否使用操作系统,可以选择Keil提供了两种操作系统:Rtx tiny和Rtx full,也可以不用操作系统(None),这里使用默认项None,即不用操作系统.图1-5 设置目标图1-4 重复加入源程序得到的提示OutPut页如图1-6所示,这里面也有多个选择项,其中Creat Hex file用于生成可执行代码文件,该文件可以用编程器写入单片机芯片,其格式为intelHEX格式,文件的扩展名为.HEX,默认情况下该项未被选中,如果要写片做硬件实验,就必须选中该项.工程设置对话框中的其它各页面与C51编译选项,A51的汇编选项,BL51连接器的连接选项等用法有关,这里均取默认值,不作任何修改.以下仅对一些有关页面中常用的选项作一个简单介绍.Listing页该页用于调整生成的列表文件选项.在汇编或编译完成后将产生(*.lst)的列表文件,在连接完成后也将产生(*.m51)的列表文件,该页用于对列表文件的内容和形式进行细致的调节,其中比较常用的选项是"C Compile Listing"下的"Assamble Code"项,选中该项可以在列表文件中生成C语言源程序所对应的汇编代码,建议会使用汇编语言的C初学者选中该项,在编译完成后多观察相应的List文件,查看C源代码与对应汇编代码,对于提高C语言编程能力大有好处.C51页该页用于对Keil的C51编译器的编译过程进行控制,其中比较常用的是"Code Optimization"组,如图1.7所示,该组中Level是优化等级,C51在对源程序进行编译时,可以对代码多至9级优化,默认使用第8级,一般不必修改,如果在编译中出现一些问题,可以降低优化级别试一试.Emphasis是选择编译优先方式,第一项是代码量优化(最终生成的代码量小);第二项是速度优先(最终生成的代码速度快);第三项是缺省.默认采用速度优先,可根据需要更改.图1-6 设置输出文件Debug页该页用于设置调试器,Keil提供了仿真器和一些硬件调试方法,如果没有相应的硬件调试器,应选择Use Simulator,其余设置一般不必更改,有关该页的详细情况将在程序调试部分再详细介绍.至此,设置完成,下面介绍如何编译,连接程序以获得目标代码,以及如何进行程序的调试工作.1.4 编译,连接下面我们通过一个例子来介绍C程序编译,连接的过程.这个例子使P1口所接LED以流水灯状态显示.将下面的源程序输入,命名为exam3.c,并建立名为exam3的工程文件,将exam3.c文件加入该工程中,设置工程,在Target页将Xtal后的值由24.0改为12.0,以便后面调试时观察延时时间是否正确,本项目中还要用到我们所提供的实验仿真板,为此需在Debug页对Dialog DLL对话框作一个设置,在进行项目设置时点击Debug,打开Debug页,可以看到Dialog DLL对话框后的Parmeter:输入框中已有默认值-pAT52,在其后键入空格后再输入-dledkey,如图1-8所示.例1-3 使P1口所接LED以流水灯状态显示/**************************************************; 平凡单片机工作室; ; Copyright 2003 pingfan's McuStudio; All rights Reserved图1-7C51编译器选项;作者:周坚;lsd.c;流水灯程序**************************************************/#include "reg51.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned int/*延时程序由Delay参数确定延迟时间*/void mDelay(unsigned int Delay){ unsigned int i;for(;Delay>0;Delay--){ for(i=0;iBuild target,对当前工程进行连接,如果当前文件已修改,将先对该文件进行编译,然后再连接以产生目标代码;如果选择Rebuild All target files将会对当前工程中的所有文件重新进行编译然后再连接,确保最终生产的目标代码是最新的,而Translate ….项则仅对当前文件进行编译,不进行连接.以上操作也可以通过工具栏按钮直接进行.图1-9是有关编译,设置的工具栏按钮,从左到右分别是:编译,编译连接,全部重建,停止编译和对工程进行设置.编译过程中的信息将出现在输出窗口中的Build页中,如果源程序中有语法错误,会有错误报告出现,双击该行,可以定位到出错的位置,对源程序修改之后再次编译,最终要得到如图1-10所示的结果,提示获得了名为exam3.hex的文件,该文件即可被编程器读入并写到芯片中,同时还可看到,该程序的代码量(code=63),内部RAM的使用量(data=9),外部RAM的使用量(xdata=0)等一些信息.除此之外,编译,连接还产生了一些其它相关的文件,可被用于Keil的仿真与调试,到了这一步后即进行调试.1.5 程序的调试在对工程成功地进行汇编,连接以后,按Ctrl+F5或者使用菜单Debug->Start/Stop Debug Session即可进入调试状态,Keil内建了一个仿真CPU用来模拟执行程序,该仿真CPU功能强大,可以在没有硬件和仿真机的情况下进行程序的调试.进入调试状态后,Debug菜单项中原来不能用的命令现在已可以使用了,多出一个用于运行和调试的工具条,如图1-11所示,Debug菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位,运行,暂停,单步,过程单步,执行完当前子程序,运行到当前行,下一状态,打开跟踪,观察跟踪,反汇编窗口,观察窗口,代码作用范围分析,1#串行窗口,内存窗口,性能分析,工具按钮等命令.点击菜单Peripherals,即会多出一项"键盘LED仿真板(K)",选中该项,即会出现如图1-9 有关编译,连接,项目设置的工具条图1-11 调试工具条图1-10 编译,连接后得到目标代码图1-12所示界面.使用菜单STEP或相应的命令按钮或使用快捷键F11可以单步执行程序,使用菜单STEP OVER或功能键F10可以以过程单步形式执行命令,所谓过程单步,是指把C语言中的一个函数作为一条语句来全速执行.按下F11键,可以看到源程序窗口的左边出现了一个黄色调试箭头,指向源程序的第一行.每按一次F11,即执行该箭头所指程序行,然后箭头指向下一行,当箭头指向"mDelay(1000);"行时,再次按下F11,会发现,箭头指向了延时子程序mDelay的第一行.不断按F11键,即可逐步执行延时子程序.如果mDelay程序有错误,可以通过单步执行来查找错误,但是如果mDelay程序已正确,每次进行程序调试都要反复执行这些程序行,会使得调试效率很低,为此可以在调试时使用F10来替代F11,在main函数中执行到mDelay(1000)时将该行作为一条语句快速执行完毕.Keil软件还提供了一些窗口,用以观察一些系统中重要的寄存器或变量的值,这也是很重要的调试方法.以下通过一个对延时程序的延迟时间的调整来对这些调试方法作一个简单的介绍.这个程序中用到了延时程序mDelay,如果使用汇编语言编程,每段程序的延迟时间可以非常精确地计算出来,而使用C语言编程,就没有办法事先计算了.为此,可以使用观察程序执行时间的方法了来解.进入调试状态后,窗口左侧是寄存器和一些重要的系统变量的窗口,其中有一项是sec,即统计从开始执行到目前为止用去的时间.按F10,以过程单步的形式执行程序,在执行到mDelay(1000)这一行之前停下,查看sec的值(把鼠标停在sec 后的数值上即可看到完整的数值),记下该数值,然后按下F10,执行完mDelay(1000)后再次观察sec值,如图1-13所示,这里前后两次观察到的值分别是:0.00040400和1.01442600, 其差值为1.014022s,如果将该值改为124可获得更接近于1s的数值,而当该值取123时所获得的延时值将小于1s,因此,最佳的取值应该是124.图1-12 51单片机实验仿真板1.6 C语言的一些特点通过上述的几个例子,可以得出一些结论:1,C程序是由函数构成的,一个C源程序至少包括一个函数,一个C源程序有且只有一个名为main()的函数,也可能包含其它函数,因此,函数是C程序的基本单位.主程序通过直接书写语句和调用其它函数来实现有关功能,这些其它函数可以是由C语言本身提供给我们的(如例3中的_crol_(…)函数),这样的函数称之为库函数,也可以是用户自己编写的(如例2,3中用的mDelay(…)函数),这样的函数称之为用户自定义函数.那么库函数和用户自定义函数有什么区别呢简单地说,任何使用Keil C语言的人,都可以直接调用C的库函数而不需要为这个函数写任何代码,只需要包含具有该函数说明的相应的头文件即可;而自定义函数则是完全个性化的,是用户根据自己需要而编写的.Keil C提供了100多个库函数供我们直接使用.2,一个函数由两部份组成:(1)函数的首部,即函数的第一行.包括函数名,函数类型,函数属性,函数参数(形参)名,参数类型.例如:void mDelay (unsigned int DelayTime)一个函数名后面必须跟一对圆括号,即便没有任何参数也是如此.(2)函数体,即函数首部下面的大括号"{}"内的部份.如果一个函数内有多个大括号,则最外层的一对"{}"为函数体的范围.函数体一般包括:声明部份:在这部份中定义所用到的变量,例1.2中unsigned char j.执行部份:由若干个语句组成.在某此情况下也可以没有声明部份,甚至即没有声明部份,也没有执行部份,如:void mDelay(){}这是一个空函数,什么也不干,但它是合法的.在编写程序时,可以利用空函数,比如主程序需要调用一个延时函数,可具体延时多少,怎么个延时法,暂时还不清楚,我们可以主程序的框架结构弄清,先编译通过,把架子搭起来再说,至于里面的细节,可以在以后慢慢地填,这时利用空函数,先写这么一个函数,这样在主程序中就可以调用它了.3,一个C语言程序,总是从main函数开始执行的,而不管物理位置上这个main()放在什么地方.例1.2中就是放在了最后,事实上这往往是最常用的一种方式.图1-13 观察sec确定延时时间4,主程序中的mDelay如果写成mdelay就会编译出错,即C语言区分大小写,这一点往往让初学者非常困惑,尤其是学过一门其它语言的人,有人喜欢,有人不喜欢,但不管怎样,你得遵守这一规定.5,C语言书写的格式自由,可以在一行写多个语句,也可以把一个语句写在多行.没有行号(但可以有标号),书写的缩进没有要求.但是建议读者自己按一定的规范来写,可以给自己带来方便.6,每个语句和资料定义的最后必须有一个分号,分号是C语句的必要组成部份.7,可以用/*…..*/的形式为C程序的任何一部份作注释,在"/*"开始后,一直到"*/"为止的中间的任何内容都被认为是注释,所以在书写特别是修改源程序时特别要注意,有时无意之中删掉一个"*/",结果,从这里开始一直要遇到下一个"*/"中的全部内容都被认为是注释了.原本好好的一个程序,编译已过通过了,稍作修改,一下出现了几十甚至上百个错误,初学C的人往往对此深感头痛,这时就要检查一下,是不是有这样的情况,如果有的话,赶紧把这个"*/"补上.特别地,Keil C也支持C++风格的注释,就是用"//"引导的后面的语句是注释,例:P1_0=!P1_0; //取反P1.0这种风格的注释,只对本行有效,所以不会出现上面的问题,而且书写比较方便,所以在只需要一行注释的时候,我们往往采用这种格式.但要注意,只有Keil C支持这种格式,早期的Franklin C以及PC机上用的TC都不支持这种格式的注释,用上这种注释,编译时通不过,会报告编译错误.第2章分支程序设计第一部分课程学习了如何建立Keil C的编程环境,并了解了一些C语言的基础知识,这一部分将通过一个键控流水灯程序的分析来学习分支程序设计.2.1 程序功能与实现硬件电路描述如下:89S52单片机的P1口接有8个LED,当某一端口输出为"0"时,相应的LED点亮,P3.2,P3.3,P3.4,P3.5分别接有四个按钮K1~K4,按下按钮时,相应引脚被接地.现要求编写可键控的流水灯程序,当K1按下时,开始流动,K2按下时停止流动,全部灯灭,K3使灯由上往下流动,K4使灯由下往上流动.下面首先给出程序,然后再进行分析.例2-1:键控流水灯的程序#include "reg51.h"#include "intrins.h"#define uchar unsigned charvoid mDelay(unsigned int DelayTime){ unsigned int j=0;for(;DelayTime>0;DelayTime--){ for(j=0;j2的结果为真,而3<2的结果为假.C语言一共提供了6种关系运算符:"<"(小于),""(大于),">=(大于等于)","=="(等于)和"!="(不等于).用关系运算符将两个表达式连接起来的式子,称为关系表达式.例:a>b,a+b>b+c,(a=3)>=(b=5)等都是合法的关系表达式.关系表达式的值只有两种可能,即"真"和"假".在C语言中,没有专门的逻辑型变量,如果运算的结果是"真",用数值"1"表示,而运算的结果是"假"则用数值"0"表示.如式子:x1=3>2的结果是x1等于1,原因是3>2的结果是"真",即其结果为1,该结果被"="号赋给了x1,这里须注意,"="不是等于之意(C语言中等于用"=="表示),而是赋值号,即将该号后面的值赋给该号前面的变量,所以最终结果是x1等于1.式子:x2=30;DelayTime--)单片机的C语言轻松入门25{ for(j=0;j<125;j++){;}}}在main函数中用mDelay(1000)的形式调用该函数时,延时时间约为1s.如果将该函数中的unsigned int j改为unsigned char j,其他任何地方都不作更改,重新编译,连接后,可以发现延迟时间变为约0.38s.int和char是C语言中的两种不同的数据类型,可见程序中仅改变数据类型就会得到不同的结果.那么int和char型的数据究竟有什么区别呢3.3.1 整型数据1.整型数据在内存中的存放形式如果定义了一个int型变量i:int i=10; /*定义i为整型变量,并将10赋给该变量*/在Keil C中规定使用二个字节表示int型数据,因此,变量i在内存中的实际占用情况如下:0000,0000,0000,1010也就是整型数据总是用2个字节存放,不足部分用0补齐.事实上,数据是以补码的形式存在的.一个正数的补码和其原码的形式是相同的.如果数值是负的,补码的形式就不一样了.求负数的补码的方法是:将该数的绝对值的二进制形式取反加1.例如,-10,第一步取-10的绝对值10,其二进制编码是1010,由于是整型数占。

单片机实训小结与体会单片机实验收获与体会

单片机实训小结与体会单片机实验收获与体会

单片机实训小结与体会单片机实验收获与体会单片机实训小结与体会单片机实验收获与体会1通过今次单片机实训,使我对单片机的认识有了更深刻的理解。

系统以51单片机为核心部件,利用汇编软件编程,通过键盘控制和数码管显示实现了基本时钟显示功能、时间调节功能,能实现本设计题目的基本要求和发挥部分。

由于时间有限和本身知识水平的限制,本系统还存在一些不够完善的地方,要作为实际应用还有一些具体细节问题需要解决。

例如:不能实现只用两个按键来控制时钟时间,还不能实现闹钟等扩展功能。

踉踉跄跄地忙碌了两周,我的时钟程序终于编译成功。

当看着自己的程序,自己成天相伴的系统能够健康的运行,真是莫大的幸福和欣慰。

我相信其中的酸甜苦辣最终都会化为甜美的甘泉。

但在这次实训中同时使我对汇编语言有了更深的认识。

当我第一次接触汇编语言就感觉很难,特别是今次实训要用到汇编语言,尽管困难重重,可我们还是克服了。

这次的实训使培养了我们严肃认真的做事作风,增强了我们之间的团队合作能力,使我们认识到了团队合作精神的重要性。

这次实训的经历也会使我终身受益,我感受到这次实训是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。

希望这次的经历能让我在以后学习中激励我继续进步。

单片机实训小结与体会单片机实验收获与体会2时间过得真快,不经意间,一个学期就到了尾声,进入到如火如荼的期末考试阶段。

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

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

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

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

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

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

贪吃蛇游戏单片机程序

贪吃蛇游戏单片机程序

贪吃蛇游戏单片机程序贪吃蛇游戏是一款经典的游戏,其简洁的规则和有趣的玩法使其成为了许多人喜爱的游戏之一。

在单片机中实现贪吃蛇游戏需要利用单片机的输入输出功能以及控制算法来完成游戏的控制和显示。

下面是一个简单的贪吃蛇游戏单片机程序的实现。

首先,我们需要定义一些常量和变量来表示游戏中的一些参数和状态。

比如,我们可以定义一个常量来表示屏幕的宽度和高度,以及一个变量来表示蛇的长度和当前的移动方向。

c#define SCREEN_WIDTH 16#define SCREEN_HEIGHT 8#define SNAKE_MAX_LENGTH 64int snake_length;int snake_direction;接着,我们需要定义一个数据结构来表示蛇的身体,可以使用一个数组来表示蛇的每一节身体的位置。

同时,我们还需要定义一个数据结构来表示食物的位置。

cstruct point {int x;int y;};struct point snake[SNAKE_MAX_LENGTH];struct point food;然后,我们可以编写一个函数来初始化游戏的状态。

在这个函数中,我们需要初始化蛇的位置和长度,以及随机生成食物的位置。

void init_game{// 初始化蛇的位置和长度snake[0].x = SCREEN_WIDTH / 2;snake[0].y = SCREEN_HEIGHT / 2;snake_length = 1;// 随机生成食物的位置food.x = rand% SCREEN_WIDTH;food.y = rand% SCREEN_HEIGHT;}接下来,我们需要编写一个函数来处理用户输入,并更新蛇的移动方向。

这个函数可以通过读取按键的状态来实现,比如可以通过一个变量来记录当前的按键状态。

cvoid handle_input{// 读取按键状态int key = read_key// 根据按键状态更新蛇的移动方向if (key == 'W' && snake_direction != 'S') {snake_direction = 'W';} else if (key == 'S' && snake_direction != 'W') {snake_direction = 'S';} else if (key == 'A' && snake_direction != 'D') {snake_direction = 'A';} else if (key == 'D' && snake_direction != 'A') {snake_direction = 'D';}然后,我们可以编写一个函数来更新蛇的位置。

bootloader如何更新

bootloader如何更新

bootloader 如何更新
1、BootLoader 就是单片机启动时候运行的一段小程序,这段程序负责单片机固件的更新,也就是单片机选择性的自己给自己下程序。

可以更
新,也可以不更新,更新的话,BootLoader 更新完程序后,跳转到新程序运行;不更新的话,BootLoader 直接跳转到原来的程序去运行。

2、BootLoader 更新完程序后并不擦除自己,下次启动后依然先运行BootLoader 程序,又可以选择性的更新或者不更新程序,所以BootLoader 就是用来管理单片机程序的更新。

3、在实际的单片机工程项目中,如果加入了BootLoader 功能,就可以给单片机日后升级程序留出一个接口,方便日后单片机程序更新。

当然,
这就需要创建两个工程项目,一个为BootLoader 工程,一个为APP 工程。

4、BootLoader 工程生成的.hex 或者.bin 文件通常下载到ROM 或Flash 中的首地址,这样可以保证上电后先运行BootLoader 程序。

而APP 工程生成的.hex 或者.bin 文件则下载到ROM 或Flash 中BootLoader 后面的地址中。

也就是说,存在ROM/Flash 中的内容是分为两部分的。

单片机中断小程序

单片机中断小程序

#include<reg51.h>#include<intrins.h>typedef unsigned char uc;typedef unsigned int ui;typedef unsigned long ul;void udisplay(uc m,uc n);void delay100us();void delay1ms();void delay100ms();sfr P4 = 0xc0;sfr P4SW = 0xbb;sbit DAT_DIS = P0^4; /* 164 595 公用数据线*/sbit CLK_164 = P0^5; /* 164时钟线*/sbit CLK_595 = P0^6; /* 595时钟线*/sbit RCLK_595 = P0^7; /* 595锁存线*/sbit FMQ = P4^5; /* 蜂鸣器*/uc code displayduan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};/* 0 1 2 3 4 5 6 7 8 9 SP - *///秒分时日月星期年uc code displaywei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0xff};uc a,b,c,d,e,f,g,h;ul sum;/*************************************************************//* 功能:在某一位数码管上显示某一个数值/* 输入:m,n/*************************************************************/void display(uc m,uc n){uc wei, duan, i;wei = 0x00;for(i=0; i<8; i++){ /* 关显示*/DAT_DIS = (bit)(wei & 0x80);wei <<= 1 ;CLK_595 = 0 ;_nop_();CLK_595 = 1 ;}RCLK_595 = 0;_nop_();RCLK_595 = 1;duan = displayduan[n]; /* 送段码*/for(i=0; i<8; i++){DAT_DIS = (bit)(duan & 0x80);duan <<= 1;CLK_164 = 1;_nop_();CLK_164 = 0;}wei = displaywei[m];for(i=0; i<8; i++){ /* 开显示*/ DAT_DIS = (bit)(wei & 0x80);wei <<= 1 ;CLK_595 = 0 ;_nop_();CLK_595 = 1 ;}RCLK_595 = 0;_nop_();RCLK_595 =1;}void udisplay(uc m,uc n){uc wei, duan, i;duan = displayduan[n]; /* 送段码*/for(i=0; i<8; i++){DAT_DIS = (bit)(duan & 0x80);duan <<= 1;CLK_164 = 1;_nop_();CLK_164 = 0;}wei = displaywei[m];for(i=0; i<8; i++){ /* 开显示*/DAT_DIS = (bit)(wei & 0x80);wei <<= 1 ;CLK_595 = 0 ;_nop_();CLK_595 = 1 ;}RCLK_595 = 0;_nop_();RCLK_595 =1;}void t0(void) interrupt 1 using 0{uc i;TH0=(65536-50000)/256;TL0=(65536-50000)%256;i++;if(i==20){i=0;sum++;{h = sum/10000000;g = sum%10000000/1000000;f = sum%1000000/100000;e = sum%100000/10000;d = sum%10000/1000;c = sum%1000/100;b = sum%100/10;a = sum%10;}}}main(){P4SW=0x70;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;while(1){display(1,b);display(0,a);display(2,c);display(3,d);display(4,e);display(5,f);display(6,g);display(7,h);/* if((c==1)&&(b==0)&&(a==0))FMQ=0;if((c==1)&&(b==0)&&(a==5))FMQ=1;*/}}void delay100us() //@11.0592MHz {uc i, j;_nop_();_nop_();i = 2;j = 15;do{while (--j);} while (--i);}void delay1ms() //@11.0592MHz {uc i, j;_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);}void delay100ms() //@11.0592MHz {unsigned char i, j, k;_nop_();_nop_();i = 5;j = 52;k = 195;do{do{while (--k);} while (--j);} while (--i);}。

单片机C语言编程实例

单片机C语言编程实例

单片机C语言编程实例前言INTEL公司的MCS-51单片机是目前在我国应用得最广泛的单片机之一.随着单片机应用技术的不断发展,许多公司纷纷以51单片机为内核,开发出与其兼容的多种芯片,从而扩充和扩展了其品种和应用领域.C语言已成为当前举世公认的高效简洁而又贴近硬件的编程语言之—。

将C语言向单片机上的移植,始于20世纪80年代的中后期。

经过十几年的努力,C语言终于成为专业化单片机上的实用高级语言。

用C语言编写的8051单片机的软件,可以大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完善的系统。

因此,不管是对于新进入这一领域的开发者来说,还是对于有多年单片机开发经验的人来说,学习单片机的C语言编程技术都是十分必要的..C语言是具有结构化.模块化编译的通用计算机语言,是国际上应用最广。

最多的计算语言之一。

C51是在通用C语言的基础上开发出的专门用于51系列单片机编程的C语言。

与汇编语言相比,C51在功能上.结构上以及可读性。

可移植性。

可维护性等方面都有非常明显的优势.目前最先进、功能最强大、国内用户最多的C51编译器是Keil Soft ware公司推出的KeilC51.第一章单片机C语言入门1。

1建立您的第一个C项目使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。

KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持PLM、汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能.因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。

以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。

KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。

51单片机教材(免费完整版)

51单片机教材(免费完整版)

单片机教程原作:进墨者目录单片机教程第一课:单片机概述 (2)单片机教程第二课:单片机的内部、外部结构(一) (2)单片机教程第三课:几个基本概念 (5)单片机教程第四课:第一个小程序 (8)单片机教程第五课:延时程序分析 (10)单片机教程第六课:单片机的内外部结构分析(四) (12)单片机教程第七课:单片机内部结构分析(五) (15)单片机教程第八课(寻址方式与指令系统) (19)单片机教程第九课:数据传递指令 (22)单片机教程第十课数据传递类指令指令 (25)单片机教程第十一课:算术运算类指令 (28)单片机教程第十二课:逻辑运算类指令: (32)单片机教程第十三课:逻辑与指令 (34)单片机教程第十四课:条件转移指令 (38)单片机教程第十五课:位及位操作指令 (41)单片机教程第十六课:计数器与定时器 (44)单片机教程第十七课:定时/计数器的方式控制字 (46)单片机教程第十八课:中断系统 (49)单片机教程第十九课:定时、中断练习一 (52)单片机教程第二十课:定时/计数器实验2 (57)单片机教程第二十一课:串行接口 (60)单片机教程第二十二课:串行口应用编程实例 (65)单片机教程第二十三课:LED数码显示器的连接与编程 (68)单片机教程第二十四课:动态扫描显示接口 (72)单片机教程第二十五课:键盘接口与编程 (78)单片机教程第二十六课:矩阵式键盘接口技术及编程 (83)单片机教程第二十七课:初学单片机几个不易掌握的概念 (87)单片机教程第二十八课:单片机音乐程序的设计与实验 (90)单片机教程第一课:单片机概述1、何谓单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。

在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。

而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。

单片机真有效值程序实现

单片机真有效值程序实现

1 前言单片微型计算机简称单片机,又称微控制器(MCU),它的出现是计算机发展史上的一个重要的里程碑,它以体积小、功能全、性价比高等诸多优点独具特色,在工业控制、尖端武器、通信设备、信息处理、家用电器等嵌入式应用领域中独占鳌头。

本次课设采用的STC89C51单片机是51系列单片机的一种代表,目前51系列单片机是国内目前应用最广泛的一种单片机之一。

单片机以其系统硬件构架完整、价格低廉、学生能动手等特点,成为工科学生硬件设计的基础课。

2 单片机系统板的介绍本次课设所使用的单片机最小系统板包括以下器件:电源端子(DC +5V),可以USB供电,也可独立电源供电。

通用异步串口,采用MAX232做电平转换。

STC89C51单片机,支持串口下载和单步调试 ZLG7 290管理芯片,是IIC总线通信的键盘扫描和数码管显示芯片,自带8M晶振,最多可扫描64个键盘和8个数码管。

各种颜色的LED发光二极管共9个,其中8个接于P1口做LED显示,还有一个做电源灯显示。

TLC549,8位串行AD。

TLC5615,10位串行DA。

还有其他电阻电容若干,系统板一个,大按键开关两个,用于中断控制和通信开关。

利用STC51系列特有的ISP在线编程,方便我们初学者的二次开发,省去大量芯片烧写时间。

USB电源线供电和外接供电并存,方便学生在寝室使用。

电源保护电路,有效防止电源接反对CPU造成的损害。

增加专门的键盘扫描和数码管显示芯片,只占用2个I/O口和一个外部中断就能完成8个数码管显示和最多64个键盘扫描。

增加了I/O口键盘扫描,2种扫描方式可通过跳线由用户自己选择。

所有I/O口均用引脚引出,方便用户扩展。

外部中断0和外部脉冲记数按键复用,通过跳线,用户即可以进行外部中断实验,也可以进行外部T0记数实验。

增加了串行的AD和DA芯片,可直接在开发板上进行AD和DA的实验。

3 有效值测量程序流程图本次课设的任务是利用自己亲手做的单片机最小系统,通过编程和调试,实现正弦波的有效值测量,并用数码管将测量的有效值显示出来。

《单片机简单程序》PPT课件

《单片机简单程序》PPT课件
汇编控制指令,仅提供汇编信息,没有指令代码。
精选PPT
4
一. 汇编语言指令类型
3. 宏指令:
宏汇编功能:将需要多次反复执行的程序段定义成一 个宏指令名(宏定义),编程时,可在程序中使用 宏指令名来替代一段程序(宏调用)。 宏定义过程:
宏指令名 MACRO 形式参数

;定义程序段
ENDM 宏调用过程:
主 … 程 序 子 程 … 序 S C A … L L S … C A L L S …
… R E T
精选PPT
23
4-6-4 子程序的类型
按子程序与主程序之间传递参数的方式分类。 入口参数:调用子程序之前,需要传给子程序的参数。 出口参数:子程序送回调用程序的结果参数。
设计子程序应满足通用性的要求,不针对具体数据编程。
选用不同的参数传递方式。 1.寄存器传送参数 2.存储器传送参数 3.堆栈传送参数
精选PPT
24
4-7 算术运算程序
如:分支号=0,程序转移到ADDR0处;当分支号=1,
程序转移到ADDR1处;… 。
(1)用地址表法。设分支号已存入A。
A=?
MTJS:MOV DPTR,#TAB ;取表首地址 0 1
n
CLR C RLC A
;分支号×2
处处 理理
处 理

一二
MOV R2,A
MOVC A,@A+DPTR;取分支地址低位
R2,A ;循环计数器←n
A
;结果单元清0
R3,A ;进位数据存R3
R0
;修改数据指针
A,@R0 ;累加
NEXT ;无进位转NEXT
片 内 R A M … …
X n … …

简易密码锁(C语言程序)

简易密码锁(C语言程序)
9 RST
29 30 31
PSEN ALE EA
1 2 3 4 5 6 7 8
P1.0/T2 P1.1/T2EX P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
AT89C52
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
10 11 12 13 14 15 16 17
P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7
R17
510
R18
10k
D1
P2.2 LED
D4
P2.3 LED
D5
P2.4 LED
} else P0 = table[9];
index++; }break;
case 2: { rece[index]=2; if(rece[index]==mima[index]) { P0 = table[6]; nn ++; }
else P0 = table[9];
index++;
} break;
P0 = table[6]; nn ++; } else P0 = table[9];
index++;
} break;
case 0: break;
}
if (key5==0) {
for(x=200;x>0;x--); if (key5==0)//防抖动 {
9
if(index == 4) { index = 0;//index 清零,密码从第一个开始 if(nn==4)//四个密码均正确 { P0=table[10]; test_cror (); } else P0=table[11]; nn=0;//nn 清零,下次正确再记录 }

单片机常见程序

单片机常见程序

单片机常见程序单片机(Microcontroller)作为一种嵌入式系统的核心元件,其程序设计是嵌入式系统开发中至关重要的一环。

在单片机常见程序中,包括了很多不同的程序类型,如控制程序、通信程序、驱动程序等。

这些程序以其独特的功能和特点,为嵌入式系统的正常运行提供了必要的支持。

一、控制程序控制程序是单片机常见程序中最基本的类型之一。

它主要用于控制各种外部设备或传感器的运行状态,实现对嵌入式系统行为的控制。

例如,单片机可以通过控制程序来控制电机的启停、风扇的转速、灯光的亮度等。

控制程序通常采用循环结构实现,通过检测外部输入信号,并根据输入信号的变化进行相应的操作和控制。

二、通信程序通信程序是单片机应用中另一个常见的程序类型。

在现代嵌入式系统中,单片机往往需要与其他设备或者系统进行数据交互和通信。

通信程序可以通过串口、CAN总线、以太网等方式来实现数据的传输和通信。

单片机通过通信程序可以与电脑、手机、传感器等设备进行数据交换,实现信息的输入输出、远程监控、智能控制等功能。

三、驱动程序驱动程序是单片机常见程序中的另一个重要类型。

在嵌入式系统中,单片机需要通过驱动程序来控制各类外设的工作。

驱动程序可以包括对按键、LED灯、LCD显示屏、温度传感器等各类设备的初始化、配置和控制操作。

通过合理编写驱动程序,可以使得单片机能够与各类外设无缝衔接,实现功能的完整性和稳定性。

四、中断程序中断程序是单片机常见程序中一种特殊的类型。

在嵌入式系统中,中断程序的作用是及时处理外部设备的中断请求,以提高系统的响应速度和实时性。

中断程序通常用于处理按键中断、定时器中断、串口中断等。

当外部设备发生中断事件时,单片机会立即跳转到相应的中断程序中执行特定的操作,然后再返回到原来的程序中继续执行。

中断程序的编写需要特殊的注意和设计,以确保系统的稳定性和可靠性。

五、算法实现程序除了以上几种常见的程序类型之外,单片机的应用还需要根据实际需求编写各类算法实现程序。

51单片机DIY做PLC编程

51单片机DIY做PLC编程

51单片机DIY做PLC编程有朋友想定制一个净水机控制器,有一些独特的功能要增加,但是商品控制板没有这样的功能,问我能否做一个,我觉得单片机完全能满足这种简单的控制需要,上手开始编程序时候突然感到,用PLC逻辑编这种功能是非常简单轻松的,而如果用汇编或C编却感觉有点棘手,编程效率不高,所以想为何不在单片机上实现PLC的逻辑呢?上网搜索尝试看能否找到合适的程序下载来稍微改改就能用的呢?方案几年前就有了,实际上是利用三菱的低档PLC编程软件编辑好梯形图,存盘后用专用的格式转换工具转换成HEX单片机烧写文件烧进去,尝试下载三菱PLC工具软件,但是在我的WIN7-64位系统上不能正常工作,好容易换了系统装好开发工具,但是初次上手这款开发工具,界面挺复杂的,懒得研究各个按钮的使用,由于是单片机的硬件,对于程序的编制和转换有很多限制条件,否则是转换不成功的,嫌麻烦,放弃!某宝倒是有百元PLC板出售,但是为了这么个简单的东西专门买个全功能板子有点浪费,而且其编程软件仍然是三菱的盗版软件,算了,再想办法把。

由于工作中经常接触PLC程序,对其工作原理也略知一二,网上也有相关的说明介绍,其实就是三个主要步骤,第一步扫描IO输入,第二步执行逻辑,第三步输出逻辑到IO,很简单的,最早PLC也是用单片机实现的,我为何不用汇编在51上搭建一个架构,简单的逻辑编制进去就能运转呢?其中逻辑执行步骤还是有点意思的,需要把PLC逻辑翻译成单片机的汇编语言执行,这块开始也没有把握,后来搜索到一篇百度文章,介绍了一下三菱PLC逻辑是如何翻译成汇编的,我看了下估计其实是利用反汇编工具把HEX反编译成的ASM代码,并不清晰明了,而且还带着反汇编时候的行号,仅供参考了。

搜索结果中也有几篇论文,涉及到在51单片机上实现PLC逻辑的内容,但是那些论文都是充数的,仅仅几个IO逻辑,没有什么定时器,计数器功能的体现,哎!仅供参考!看来这个PLC系统还是需要自己写了!OK!既然决定自己重写,那就开工吧!利用春节休假时间,编制了如下ASM51汇编PLC代码:代码主要架构如下:1、IO定义部分:根据所使用的单片机IO口数量,任意指定多少个I多少个O,那几个脚是I,哪几个是O都可以任意指定,在这个51系统里面设计了最大32个I,32个O,占用64个位寻址区域,其实用不到那么多,也可以分配给其它需要的标志位用,因为51系统总可位寻址地址只有128位,需要仔细分配.2、位寻址变量定义(包括各类标志位,临时变量寄存器等等)目前设计了8个计时器的Timer DN, Timer EN,共16位,8个计数器的counter reset 和counter DN 标志位共16个,专用于上升沿下降沿检测的标志位4对,占用8个,剩余用于临时变量,这些地址分配在这块变量定义区域可以根据需要任意调整3、内存规划,包括堆栈区的设置,定时器,计数器的累加值和预设值地址等等,目前初步定义8个计数器的当前计数值和预设值,8个计时器的当前计数值和预设值,共占用32个内存地址,也可根据需要调整,51单片机片内总的用户可用内存地址包括堆栈区只有128个,实际去除位寻址区和堆栈区可用的估计只有80个左右,不过对于小程序应该够用的。

介绍几款非常实用的单片机小工具

介绍几款非常实用的单片机小工具

介绍几款非常实用的单片机小工具
作为一个电子工程师,在大众的眼里,你们似乎拥有麒麟臂,上能九天揽月,下可五洋捉鳖,抄板、焊板、画板、仿真、编程、调试、创意什么的通通不在话下。

今天,电子发烧友小编要给各位大佬介绍几款非常实用的单片机小工具,涉及调试、计算、设计、自动代码生成等。

第1款:555定时器自动计算工具,想要什么频率,想要什么占空比,输入要求,点一下开始计算,然后结果就出来了!!!
第2款:串口调试助手,单片机和电脑串口通信必备的工具!
第3款:色环电阻计算器,输入色环电阻的颜色,然后阻值和精度就会自动计算出来!
第4款:51单片机定时器初值计算工具,想用哪个定时器,哪个定时方式,多大的晶体,多长的延时,输入你的要求,自动计算出来!
第5款:51单片机波特率计算工具,功能虽然不算多,但完全足够了,输入波特率或者晶振频率再点击计算按钮马上就会显示结果!
第6款:单片机代码自动生成器,不管是51单片机还是A VR单片机,只要输入你的要求,哪一组IO口高低电平,哪一个定时器延时多少,SPI口如何配置。

点一下代码生成,自动输出代码!
第7款:LED代码查询,可快速查询并直接显示LED代码,根本不用自己记,此外还可以查询任意自定义接法的代码!
第8款:LCD汉字取模软件,配合lcmsim排版仿真软件一起使用,可以大大提高单片机。

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

单片机最小系统播放欢乐颂及最炫民族风片段学习单片机,制作单片机最小系统是每个单片机爱好者的都经历过的阶段,单片机最小系统制作好有什么用呢?为提高单片机爱好者学习制作单片机最小系统兴趣,这里介绍一个有趣的单片机小程序,就是用单片机最小系统播放欢乐颂及最炫民族风片段。

在按下图制作好单片机最小系统后,再增加三只元件:1个电阻、1个S9012三极管,1个8欧的小喇叭后,即可完成这个单片机最小系统播放欢乐颂及最炫民族风片段的小试验,单片机爱好者通过这个小试验后,一定会大大增强对单片机学习的兴趣。

这个单片机最小系统播放欢乐颂及最炫民族风片段的小试验,由于电路比较简单,所以这里就不画出原理图了,直接给出试验的PCB图,感兴趣的爱好者可以按图进行焊接制作,制作好后向单片机内烧写程序后安装上去就可以工作,感受一下单片机的无穷勉力。

焊好的单片机最小系统播放欢乐颂及最炫民族风片段试验板的实物照片播放板的单片机最小系统PCB图焊好的单片机最小系统播放试验板未装单片机的照片焊好的单片机最小系统播放欢乐颂及最炫民族风片段试验板的实物反面照片/****************************************************************************** //**程序名称:单片机播放欢乐颂与最炫民族风片段/**其他:用于时钟周期为12MHz的STC89C52单片机/**由电子乐屋整理制作,更详细的制作资料请到电子乐屋下载/mifklrxdjqbadoq/****************************************************************************** /#include<reg52.h>sbit BUZZER = P3^2;#define uchar unsigned char#define uint unsigned int#define REST 36 //休止符#define A 0 //低音1#define AB 1 //低音1.5#define B 2 //低音2#define BC 3 //低音2.5#define C 4 //低音3#define D 5 //低音4#define DE 6 //低音4.5#define E 7 //低音5#define EF 8 //低音5.5#define F 9 //低音6#define FG 10 //低音6.5#define G 11 //低音7#define L 12 //中音1#define LM 13 //中音1.5#define M 14 //中音2#define MN 15 //中音2.5#define N 16 //中音3#define O 17 //中音4#define OP 18 //中音4.5#define P 19 //中音5#define PQ 20 //中音5.5#define Q 21 //中音6#define QR 22 //中音6.5#define R 23 //中音7#define S 24 //高音1#define SU 25 //高音1.5#define U 26 //高音2#define UV 27 //高音2.5#define V 28 //高音3#define W 29 //高音4#define WX 30 //高音4.5#define X 31 //高音5#define XY 32 //高音5.5#define Y 33 //高音6#define YZ 34 //高音6.5#define Z 35 //高音7//音阶uchar code m_note[][2] = {{248,136},{248,243},{249,88},{249,184},{250,18},{250,103},{250,184},{251,3},{251,75}, {251,143},{251,206},{252,11},{252,67},{252,121},{252,172},{252,219},{253,9},{253,51}, {253,91},{253,129},{253,165},{253,199},{253,231},{254,5},{254,33},{254,60},{254,85}, {254,109},{254,132},{254,153},{254,173},{254,192},{254,210},{254,227},{254,243},{255,2}, {0,0},};//音符(1对应三十二分音符,32对应全音符)uchar code display[][2] = {//欢乐颂{N,8},{N,8},{O,8},{P,8},{P,8},{O,8},{N,8},{M,8},{L,8},{L,8},{M,8},{N,8},{N,12},{M,4},{M,8},{0xff,8}, {N,8},{N,8},{O,8},{P,8},{P,8},{O,8},{N,8},{M,8},{L,8},{L,8},{M,8},{N,8},{M,12},{L,4},{L,8},{0xff,8}, {M,8},{M,8},{N,8},{L,8},{M,8},{N,4},{O,4},{N,8},{L,8},{M,8},{N,4},{O,4},{N,8},{M,8},{L,8},{M,8},{E,8}, {N,8},{N,8},{O,8},{P,8},{P,8},{O,8},{N,8},{M,8},{L,8},{L,8},{M,8},{N,8},{M,12},{L,4},{L,8},{0xff,8}, {M,8},{M,8},{N,8},{L,8},{M,8},{N,4},{O,4},{N,8},{L,8},{M,8},{N,4},{O,4},{N,8},{M,8},{L,8},{M,8},{E,8}, {N,8},{N,8},{O,8},{P,8},{P,8},{O,8},{N,8},{M,8},{L,8},{L,8},{M,8},{N,8},{M,12},{L,4},{L,8},{0xff,8},//乐谱(最炫民族风){N,8},{F,4},{F,4},{L,8},{N,8},{M,4},{M,2},{N,2},{M,4},{L,4},{M,4},{L,4},{F,8},{N,8},{F,4},{F,4},{L,8},{N,8},{P,4},{M,2},{N,2},{M,4},{L,4},{M,4},{L,4},{G,4},{E,4},{N,8},{F,4},{F,4},{L,8},{N,8},{M,4},{M,2},{N,2},{M,4},{L,4},{M,4},{L,4},{F,4},{E,4},{N,8},{F,4},{F,4},{L,8},{N,8},{P,4},{N,4},{0xff,24},//前奏{F,8},{F,4},{E,4},{F,8},{F,4},{L,4},{L,8},{M,4},{L,4},{F,8},{0xff,8},{L,8},{L,4},{E,4},{L,4},{M,4},{N,4},{P,4},{P,4},{N,4},{M,8},{N,8},{0xff,8},{Q,4},{Q,4},{Q,4},{P,4},{N,4},{N,8},{L,4},{F,4},{F,4},{F,4},{N,4},{M,8},{0xff,8},{N,4},{N,4},{P,4},{N,4},{M,4},{N,4},{M,4},{L,4},{F,8},{E,8},{F,8},{0xff,8},{F,8},{F,4},{E,4},{F,8},{F,4},{L,4},{L,8},{M,4},{L,4},{F,8},{0xff,8},{L,8},{L,4},{E,4},{L,4},{M,4},{N,4},{P,4},{P,4},{N,4},{M,8},{N,8},{0xff,8},{Q,4},{Q,4},{Q,4},{P,4},{N,4},{N,8},{L,4},{F,4},{F,4},{F,4},{N,4},{M,8},{0xff,8},{N,4},{N,4},{P,4},{N,4},{M,4},{N,4},{M,4},{L,4},{F,8},{E,8},{F,8},{0xff,8},{N,4},{N,4},{P,4},{N,4},{N,4},{P,4},{P,4},{Q,4},{S,4},{Q,4},{P,8},{Q,8},{0xff,8}, //此处有变调{F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,8},{0xff,8},{F,4},{L,4},{M,4},{N,4},{M,4},{L,4},{E,4},{C,4},{F,8},{0xff,8},{0xff,16},{F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,12},{L,4},{F,4},{L,4},{M,4},{N,4},{P,4},{N,4},{N,4},{P,4},{Q,8},{0xff,8},{0xff,8},{Q,6}, {Q,2},{Q,4},{Q,4},{Q,6},{P,2},{N,4},{M,4},{M,6},{M,2},{N,6},{P,2},{N,6},{M,2},{L,6},{F,2},{F,8},{F,4},{E,4},{F,8},{F,4},{L,4}, {M,4},{N,2},{M,2}, {L,4},{M,4},{N,8},{0xff,8},{Q,4},{P,4},{N,4},{M,4},{P,4},{N,4},{M,4},{L,4},{L,8},{0xff,8},{F,2}, {A,2},{B,2},{C,2},{B,2},{A,2}, {F,2},{A,2},{N,4},{N,4},{P,4},{N,4},{N,4},{P,4},{P,4},{Q,4},{S,4},{Q,4},{P,8},{Q,8},{0xff,8}, //此处有变调{F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,8},{0xff,8},{F,4},{L,4},{M,4},{N,4},{M,4},{L,4},{E,4},{C,4},{F,8},{0xff,8},{0xff,16}, {F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,12},{L,4},{F,4},{L,4},{M,4},{N,4},{P,4},{N,4},{N,4},{P,4},{Q,8},{0xff,8},{0xff,8},{0,0xff},};uchar time_h,time_l;void Delay(uchar x);void main(){uchar j;uint i;TMOD = 0x01;ET0 = 1;EA = 1;TR0 = 1;i = 0;j = 0;while(1){while(display[i][1] != 0xff){if(display[i][0] == 0xff){TR0 = 0;Delay(display[i][1]);BUZZER = 1;}else{time_h = m_note[display[i][0]][0];time_l = m_note[display[i][0]][1];TH0 = time_h;TL0 = time_l;ET0 = 1;TR0 = 1;Delay(display[i][1]);TR0 = 0;ET0 = 0;BUZZER = 1;}i++;}i = 0;}}void Timer0() interrupt 1{TR0 = 0;TH0 = time_h;TL0 = time_l;BUZZER = ~BUZZER;TR0 = 1;}void Delay(uchar x){uint i,j;for(i = 0;i < x;i++)for(j = 0;j < 12000;j++);}。

相关文档
最新文档