单片机函数Word版
完整word版第4章单片机原理课后答案
习题1. C51特有的数据类型有哪些?答:C51特有的数据类型有位型bit、特殊位型sbit、8位特殊功能寄存器型sfr和16位特殊功能。
sfr16寄存器型2. C51中的存储器类型有几种,它们分别表示的存储器区域是什么?答:C51中的存储器类型有6种,分别表示的存储器区域是:data:直接寻址的片内RAM低128B,访问速度快bdata:片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问idata:间接寻址访问的片内RAM,允许访问全部片内RAMpdata:用Ri间接访问的片外RAM低256Bxdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAMcode:程序存储器ROM 64KB空间3. 在C51中,bit位与sbit位有什么区别?答:bit位类型符用于定义一般的位变量,定义的位变量位于片内数据存储器的位寻址区。
定义时不能指定地址,只能由编译器自动分配。
sbit位类型符用于定义位地址确定的位变量,定义的位变量可以在片内数据存储器位寻址区,也可为特殊功能寄存器中的可位寻址位。
定义时必须指明其位地址,可以是位直接地址,也可以是可位寻址的变量带位号,还可以是可位寻址的特殊功能寄存器变量带位号。
4. 在C51中,通过绝对地址来访问的存储器有几种?答:绝对地址访问形式有三种:宏定义、指针和关键字“_at_”。
5. 在C51中,中断函数与一般函数有什么不同?答:中断函数是C51的一个重要特点,C51允许用户创建中断函数。
中断函数用interruptm修饰符,m的取值为0~31,对应的中断情况如下:0——外部中断01——定时/计数器T02——外部中断13——定时/计数器T14——串行口中断5——定时/计数器T2中断函数需要注意如下几点。
(1) 中断函数不能进行参数传递(2) 中断函数没有返回值(3) 在任何情况下都不能直接调用中断函数(4) 如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器必须与中断函数相同(5) C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容(6) C51编译器从绝对地址8m+3处产生一个中断向量(7) 中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明6. 按给定的存储类型和数据类型,写出下列变量的说明形式。
(word完整版)1 C8051F单片机讲义
1 C8051F340单片机的并行接口一、综述GPIO,通用输入输出接口,是单片机与外部世界交换信息一种最简单的、最便洁、速度较快的一种接口方式,是其它接口方式的基础。
一个单片机的GPIO的数量,反映了这款单片机与外部世界交换信息的能力的大小。
有些单片机的GPIO只有几个,有些可达数十甚至数百个。
C8051F340单片机的GPIO,共有P0、P1、P2、P3、P4五组并行口,每组8个引脚,共占用40个引脚,分别称P0.0、P0。
1、P0。
2、P0。
3、P0.4、P0。
5、P0.6、P0。
7、P1.0……….P4.6、P4.7。
每一个引脚都可以做为输入口,也可以做为输出口。
如果做为输入口,有两种输入模式,分别是数字输入和模拟输入两种模式,如果做为输出口,也有两种输出模式,分别叫推挽输出、漏开输出。
C8051F340单片机,除了以上40个GPIO外,还有电源、调试、复位等8个引脚,合起来共同48个引脚.C8051F340单片机,是48脚的TQFP-48封装,表面贴的,与AT89S51/52、STC89C51/52比,管脚多,但占用的面积要小许多。
二、工作模式数字输入模式,是用来输入开关、按键等具有两个状态的量,只有0V、3。
3V两种合理的输入电压。
当然,稍有点误差,不会引起错误的读入结果。
模拟输入模式,是用来输入诸如表示电压、温度、压力等连续变化的量.输入电压的范围须在0~3。
3V之间,超出这个范围,可能引起芯片永久损坏.这部分内容将在以后的有关章节中介绍。
输出模式,也有两种,分别叫推挽输出、漏开输出。
推挽输出,是用两个MOS管,组成推挽电路,可以输出一个明确的电平.漏开输出,只用一个MOS管的漏极做输出,如果我们在漏极上用一个电阻,接上我们所需的电压,可以实现电压的灵活输出。
三、模式配置3.1 交叉开关如果使用C8051F340单片机的并行口,必须对寄存器XBR1的第六位置“1”,寄存器XBR1,叫交叉开关寄存器1,该寄存器的第六位,称XBARE,为交叉开关使能位。
(完整word版)单片机C语言程序设计实训100例
《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第 01 篇基础程序设计01 闪烁的LED/*名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h〉#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x-—){for(i=0;i〈120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include〈reg51。
h〉#include<intrins。
h>#define uchar unsigned char #define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x—-){for(i=0;i〈120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/*名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include<reg51.h>#include〈intrins.h>#define uchar unsigned char #define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x——){for(i=0;i〈120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){for(i=0;i〈7;i++){P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51。
51单片机函数总结
51单⽚机函数总结延迟0.1m秒void delay(unsigned char z){uchar a,b;for(a=0;afor(b=0;b<110;b++);}#include<12c5a.h>#include#define uchar unsigned char#define unit unsigned int //char最⼤是255定时器函数如下***************************************************************************定时器0*******************************void Time0_Init(void){TMOD=0x00; //GATE C/^T M1 M0 GATE C/^T M1 M0TH0=0xE3;TL0=0x06; //⽅式0, 13位计数器ET0=1; //允许中断EA=1; //总中断TF0=0; //中断标志位清零TR0=1; //启动}定时器函数如下void Time0_Int() interrupt 1{TH0=0xE3;TL0=0x06; //⽅式0, 1毫秒Count++;}*******************************************void Time0_Init(void){TMOD=0x01; //模式1 16位TH0=0x4C; //GATE C/^T M1 M0 GATE C/^T M1 M0TL0=0x00; //⽅式1, 1毫秒ET0=1;EA=1;TF0=0; //中断标志位清零TR0=1;}定时器函数如下void Time0_Int() interrupt 1{TH0=0x4C;TL0=0x00; //⽅式1, 1毫秒Count++;}**********************************************void Time0_Init(void){TMOD=0x02; //模式2,⾃动重装⾼8位向上装⼊TH0=0xA4;TL0=0xA4; //⽅式2, 0.1毫秒ET0=1;EA=1;TF0=0; //中断标志位清零TR0=1;}void Time0_Int() interrupt 1{//⽅式2(不⽤进⾏初始化), 0.1毫秒Count++;}**********************************************void Time0_Init(void) //⽅式3采⽤两个定时器,速度⽐较快{TMOD=0x03;TH0=0xA4;TL0=0xA4; //⽅式3, 1毫秒ET0=1;ET1=1;EA=1;TR0=1;TR1=1;}定时器函数如下}void Time1_Int() interrupt 1{TH0=0xA4;Count++;}****************************************定时器1(没有⽅式3)****************************************void Time0_Init(void){TMOD=0x10;TH1=0x4C;TL1=0x00; //⽅式1, 50毫秒ET1=1;EA=1;TR1=1;}定时器函数如下void Time0_Int() interrupt 3{TH1=0x4C;TL1=0x00; //⽅式1, 50毫秒Count++;}**************************************************************************中断控制中断0*********EA=1;IE0=0; //中断请求标志位清零IT0=O; //0:低电平触发; 1:下降沿EX0=1; //外部中断0允许位void outinter() interrupt 0{}******中断1********EA=1;IE1=0; //中断请求标志位清零IT1=O; //0:低电平触发; 1:下降沿触发EX1=1; //外部中断0允许位void outinter() interrupt 2{}**************************************************************************串⼝控制……………………SCON = 0x50;ES = 1 ; //串⼝中断允许位void interrupt_uart() interrupt 4{if(TI){TI = 0;REN = 1;}if(RI){RI = 0;REN = 0;}}******************************中断0 外部中断0 * *中断1 定时器1中断 * *中断2 外部中断1 * *中断3定时器2中断 * *中断4 串⼝中断 * *******************************中断优先级IP : 00 00 00 XX5 XX4 XX3 XX2 XX10 0 0 串⼝定1 外1 定0 外0PS PT1 PX1 PT0 PX0顺序:位1最⾼;同时出现:从右向左逐次降低***************************************************数码管显⽰低电平有效code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; ******************************⾼电平有效code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};。
单片机中断Microsoft Office Word 文档
1.中断源:发出中断请求的来源。
2.51中断源有三类:外部中断、定时中断和串行口中断。
3.80C51单片机有5个中断源(8052有六个),具有两个中断优先极,可以实现二级中断嵌套。
4.5个中断源的排列顺序由中断优先级控制寄存器IP和顺序查询逻辑电路(图6-4中的硬件查询)共同决定。
5.5个中断源对应5个固定的中断入口地址(在内部ROM),亦称矢量地址。
6.与中断系统有关的特殊功能寄存器有中断源寄存器(即专用寄存器TCON、SCON的相关位)、中断允许控制寄存器IE和中断优先级控制寄存器IP。
7.5个中断源的中断请求是否会得到响应,要受中断允许寄存器IE各位的控制,它们的优先级分别由IP各位来确定。
8.中断请求标志例如CPU开中断可由以下两条指令来实现:SETB 0AFH ;EA置1或 ORL IE,#80H ;按位“或”,EA置1CPU关中断可由以下两条指令来实现:CLR 0AFH ;EA清0或 ANL IE,#7FH ;按位“与”,EA清0又如设置外部中断源0为高优先级,外部中断源1为低优先级,可由下面指令来实现:SETB 0B8H ;PX0置1CLR 0BAH ;PXl清0或 MOV IP,#000××0×1B ;PX0置1,PXl清0例:设80C51的片外中断为高优先级,片内中断为低优先级。
试设置IP相应值。
解:(a)用字节操作指令MOV IP, #05H或 MOV 0B8H,#05H(b)用位操作指令SETB PX0SETB PX1CLR PSCLR PT0CLR PT16.3.3 中断处理过程中断处理过程可分为三个阶段,即中断响应、中断处理和中断返回。
1. 中断响应(1) 响应条件CPU响应中断的条件有:①有中断源发出中断请求。
②中断总允许位EA=1,即CPU开中断。
③申请中断的中断源的中断允许位为1,即中断没有被屏蔽。
④无同级或更高级中断正在被服务。
⑤当前的指令周期已经结束。
单片机函数
/****************************************************************************** *********************/3f4f7f6f7c7f12M11.0592M2C2C2C0f592MHzTL1 = 0xfd;ES = 1; //开串口中断TR1 = 1; //允许定时器1工作EA = 1; //开总中断}void usendchar(unsigned char dat)//串口通信发送字符//参数是电脑发过来的数{SBUF = dat; //待发送的数据写入缓冲区}while(!TI); //等待发送完成TI = 0; //清零发送标志位}void sendback(unsigned char tem)//回传电脑显示//tem全局变量{if(RI==1) // 是否有数据到来{RI = 0;tmp = SBUF; // 暂存接收到的数据P0 = tmp; // 数据传送到P0口,usendchar(tmp); // 回传接收到的数据}}/****************************************************************************** ***********************///1602相关void wait()//读状态和读数据(等待是不是忙){P0=0xff;do!{RS=0;RW=1;EN=0;EN=1;}while(BUSY==1);EN=0;}void write_dat(unsigned char dat)//1602写数据){wait();RS=1;RW=0;EN=1;P0=dat;EN=0;}void write_cmd(unsigned char cmd)//1602写命令{,wait();RS=0;RW=0;EN=1;P0=cmd;EN=0;}void lcd_l602init()//1602初始化{]EN=0;write_cmd(0x38);//设置16*2显示write_cmd(0x0c);//显示器开,光标开write_cmd(0x06);//写一个字符后地址加1write_cmd(0x01);//显示清0,DPTR清0}/****************************************************************************** ***********///12864 函数void Write1_cmd(uchar cmd)—{RS=0;RW=0;EN=0;P0=cmd;delay1ms(6);EN=1;delay1ms(6);EN=0;}\//写显示数据到LCD//RS=1;RW=L,E=1;D0-D7数据void Write1_dat(uchar dat){RS=1;RW=0;EN=0;P0=dat;delay1ms(6);EN=1;\delay1ms(6);EN=0;}//设定显示位置void lcd_pos(unsigned char x,unsigned char y)//y表示行x表示列{switch(y){case 1: write_cmd(0x80+x);break;case 2: write_cmd(0x90+x);break;…case 3: write_cmd(0x88+x);break;case 4: write_cmd(0x98+x);break;default:break;}}void lcd_12864init(){[PSB=1;write_cmd(0x30);delay1ms(5);write_cmd(0x0c);delay1ms(5);write_cmd(0x01);delay1ms(5);}void write_image(uchar *p)`{uchar i,j,k;uchar lcd_x=0x80;uchar lcd_y=0x80;Write1_cmd(0x34);for(i=0;i<2;i++) //分为上下两屏{for(j=0;j<32;j++){Write1_cmd(lcd_y+j);…Write1_cmd(lcd_x);for(k=0;k<16;k++) //写入显示数据{Write1_dat(*p++);}}lcd_x=0x88;}Write1_cmd(0x36);Write1_cmd(0x30);(}/****************************************************************************** **********************///DS1302void write_ds1302_byte(uchar k){uint i;CLK=0;for(i=0;i<8;i++),{SDa=k&0x01;CLK=1;k>>=1;CLK=0;}}unsigned char read_ds1302_byte(){;unsigned char k=0,i;for(i=0;i<8;i++){k>>=1;if(SDa==1){k=k|0x80;}CLK=1;@CLK=0;}return k;}void ds1302_rst()//复位ds1302{RST=0;CLK=0;RST=1;}~void cls_ds1302_wp(){ds1302_rst();RST=1;write_ds1302_byte(0x8e);//先写地址write_ds1302_byte(0x00);SDa=0;RST=0;}void set_ds1302_wp();{ds1302_rst();RST=1;write_ds1302_byte(0x8e);//先写地址write_ds1302_byte(0x80);SDa=0;RST=0;}void write_ds1302(unsigned char add,unsigned char dat){~ds1302_rst();cls_ds1302_wp();write_ds1302_byte(add);write_ds1302_byte(dat);set_ds1302_wp();SDa=0;RST=0;}unsigned char read_ds1302(unsigned char add){《unsigned char temp=0;set_ds1302_wp();ds1302_rst();write_ds1302_byte(add);temp=read_ds1302_byte();set_ds1302_wp();RST=0;SDa=0;return temp;}[/****************************************************************************** **********************************///DS18B20bit dsret(){{bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在sd = 1; //先将数据线拉高'for(time=0;time<2;time++) //略微延时约6微秒;sd = 0; //再将数据线从高拉低,要求保持480~960usfor(time=0;time<200;time++) //略微延时约600微秒; //以向DS18B20发出一持续480~960us的低电平复位脉冲sd = 1; //释放数据线(将数据线拉高)for(time=0;time<10;time++); //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)flag=sd; //让单片机检测是否输出了存在脉冲(sd=0表示存在)for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕$;return (flag); //返回检测成功标志}}void write_tem(unsigned char dat){unsigned char i=0;for (i=0; i<8; i++)"{sd =1; // 先将数据线拉高_nop_(); //等待一个机器周期sd=0; //将数据线从高拉低时即启动写时序sd=dat&0x01; //利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样for(time=0;time<10;time++);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样sd=1; //释放数据线for(time=0;time<1;time++)…;//延时3us,两个写时序间至少需要1us的恢复期dat>>=1; //将dat中的各二进制位数据右移1位}for(time=0;time<4;time++); //稍作延时,给硬件一点反应时间*/}uchar read_tem(){{unsigned char i=0;unsigned char dat; //储存读出的一个字节数据for (i=0;i<8;i++){sd =1; // 先将数据线拉高_nop_(); //等待一个机器周期sd = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序_nop_(); //等待一个机器周期sd = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备for(time=0;time<2;time++); //延时约6us,使主机在15us内采样dat>>=1;if(sd==1)dat|=0x80; //如果读到的数据是1,则将1存入datelsedat|=0x00;//如果读到的数据是0,则将0存入dat//将单片机检测到的电平信号sd存入r[i]for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期}return(dat); //返回读出的十六进制数据}void ReadyReadTemp(void){dsret(); //将DS18B20初始化write_tem(0xCC); // 跳过读序号列号的操作write_tem(0x44); // 启动温度转换delaynms(200); //转换一次需要延时一段时间dsret(); //将DS18B20初始化write_tem(0xCC); //跳过读序号列号的操作write_tem(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位}。
完整word版单片机汇编语言经典一百例
51单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。
实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。
实际应用中例如:波形发生器。
程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;////////////////////////////////////////////////// DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1秒报警程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。
实际应用例如:定时报警器。
程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50个0.2秒,即50*0.2=1秒MOV TMOD,#00000001B;定时器0工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒11开总中断SETB EA ;SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1微秒使用定时器1的频率为200HZ,以产生65535,最大值为0工作于方式例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。
(完整word版)51单片机函数信号发生器.doc
基于 51 单片机的函数信号发生器设计报告队员 1姓名:杨颉学号: 2专业:电子信息科学与技术队员 2姓名:王鼎鸿学号: 2专业:电子信息科学与技术基于 51 单片机的函数信号发生器摘要本系统利用单片机AT89C52采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A 转换器 DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产生10Hz—10kHz的波形。
通过键盘来控制四种波形的类型选择、拨码开关控制频率的变化,并通过液晶屏1602 显示其各自的类型以及数值,系统大致包括信号发生部分、数/ 模转换部分以及液晶显示部分三部分,其中尤其对数 / 模转换部分和波形产生和变化部分进行详细论述。
关键词:单片机 AT89S52、DAC0832、液晶 1602目录1.系统设计1.1 设计要求1.2 方案设计与论证 1.2 方案设计与论证1.2.1信号发生电路方案论证1.2.2单片机的选择论证1.2.3显示方案论证1.2.4键盘方案论证1.3总体系统设计1.4 硬件实现及单元电路设计1.4.1单片机最小系统的设计1.4.2波形产生模块设计1.4.3显示模块的设计1.4.4键盘模块的设计1.5 软件设计流程1.6 源程序2.输出波形的种类与频率的测试2.1 测试仪器及测试说明2.2 测试结果3、附录3.1参考文献3.2附图1、系统设计经过考虑,我们确定方案如下:利用AT89C52单片机采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A 转换器 DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制四种波形的类型选择、频率变化,最终输出显示其各自的类型以及数值。
1.1 、设计要求1> 、利用单片机采用软件设计方法产生四种波形2)、四种波形可通过键盘选择3)、波形频率可调4)、需显示波形的种类及其频率1.2 方案设计与论证1.2.1信号发生电路方案论证方案一:通过单片机控制D/A,输出四种波形。
(完整word版)51单片机的基本端口操作
第一章51单片机的基本端口操作主要对单片机最简系统在实际应用中的使用方法,从简单到复杂地实现单片机最简系统的基本功能.“点亮最简单的单片机系统”从单片机原理上介绍单片机的基本组成和最简单系统的典型电路,以及有关单片机C51编程方法和例程.“更加明亮的小灯”从功能上介绍如何使LED发光稳定,从原理上介绍单片机I/O口的电气特性和使用方法。
“定时亮灭的小灯”介绍如何使LED灯定时亮、灭,从单片机原理上介绍定时器的使用和编程方法。
“小灯亮灭的人工控制”从功能上介绍如何通过按键控制LED灯的亮灭,从单片机原理上介绍单片机中断的使用和编程方法。
先复习下Keil 51的操作。
1.1点亮最简单的单片机系统常用MCS-51系列单片机引脚功能说明提问:什么是单片机系统、提问:单片机中晶振有什么作用?回答:单片机访问一次存储器的时间,称之为一个及其周期,是一个时间基准。
一个机器周期包括12个时钟周期。
如果一个单片机选择了12MHz 晶振,它的时钟周期是1/12us ,它的一个机器周期是12X (1/12us ),也就是1us.若是12MHz 的晶振,当单片机中定时/计数器的数值加1时,实际经过的时间就是1us 。
提示:晶振电路,复位电路基本电路图:发光二极管导通压降通常为1。
7V—1。
9V;为什么要接电阻?电路原理及器件选择?89C51:单片机,控制发光二极管亮灭OSC:晶振,在本例中选择12MHz的立式晶振C3,C2:晶振电路的起振电容,容值为22pF L1:发光二极管R1:限流电阻,阻值为1k欧地址分配和连接?P1。
0:与发光二极管电路相连,控制LED发光二极管阴极的电平高低RESET:复位引脚X1,X2:单片机的晶振引脚程序设计:延时程序:我们先不使用单片机的定时器,而是直接采用软件的延时程序定时控制发光二极管的亮灭。
在12M晶振时,一个指令周期为1us,那么1M次就是1s。
程序代码:#include<reg51。
单片机常用延时函数
单片机常用延时函数精确的单片机常用延时函数:(c代码误差0us 12M)1、延时0.5msvoid delay0.5ms(void) //误差0us{unsigned char a,b;for(b=71;b>0;b--)for(a=2;a>0;a--);}2、延时1msvoid delay1ms(void) //误差0us{unsigned char a,b,c;for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}3、延时2msvoid delay2ms(void) //误差0us{unsigned char a,b;for(b=4;b>0;b--)for(a=248;a>0;a--);_nop_; //if Keil,require use intrins.h}4、延时3msvoid delay3ms(void) //误差0us{unsigned char a,b;for(b=111;b>0;b--)for(a=12;a>0;a--);}5、延时4msvoid delay4ms(void) //误差0us {unsigned char a,b,c;for(c=7;c>0;c--)for(b=8;b>0;b--)for(a=34;a>0;a--);}6、延时5msvoid delay5ms(void) //误差0us {unsigned char a,b;for(b=19;b>0;b--)for(a=130;a>0;a--);}7、延时10msvoid delay10ms(void) //误差0us {unsigned char a,b,c;for(c=1;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);}8、延时15msvoid delay15ms(void) //误差0us {unsigned char a,b,c;for(c=1;c>0;c--)for(b=238;b>0;b--)for(a=30;a>0;a--);}9、延时20msvoid delay20ms(void) //误差0us {unsigned char a,b;for(b=215;b>0;b--)for(a=45;a>0;a--);_nop_; //if Keil,require use intrins.h _nop_; //if Keil,require use intrins.h } 10、延时50msvoid delay50ms(void) //误差0us {unsigned char a,b;for(b=173;b>0;b--)for(a=143;a>0;a--);}11、延时100msvoid delay100ms(void) //误差0us { unsigned char a,b,c;for(c=19;c>0;c--)for(b=20;b>0;b--)for(a=130;a>0;a--);}12、延时200msvoid delay200ms(void) //误差0us { unsigned char a,b,c;for(c=4;c>0;c--)for(b=116;b>0;b--)for(a=214;a>0;a--);_nop_; //if Keil,require use intrins.h } 13、延时500msvoid delay500ms(void) //误差0us { unsigned char a,b,c;for(c=23;c>0;c--)for(b=152;b>0;b--)for(a=70;a>0;a--);}14、延时1000msvoid delay(void) //误差0us{unsigned char a,b,c;for(c=167;c>0;c--)for(b=171;b>0;b--)for(a=16;a>0;a--);_nop_; //if Keil,require use intrins.h }。
(完整word版)51单片机C语言编程100例
目录实例3:用单片机控制第一个灯亮 (5)实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (6)实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (7)实例6:使用P3口流水点亮8位LED (8)实例7:通过对P3口地址的操作流水点亮8位LED (10)实例8:用不同数据类型控制灯闪烁时间 (12)实例9:用P0口、P1 口分别显示加法和减法运算结果 (14)实例10:用P0、P1口显示乘法运算结果 (15)实例11:用P1、P0口显示除法运算结果 (16)实例12:用自增运算控制P0口8位LED流水花样 (16)实例13:用P0口显示逻辑"与"运算结果 (18)实例14:用P0口显示条件运算结果 (18)实例15:用P0口显示按位"异或"运算结果 (19)实例16:用P0显示左移运算结果 (19)实例17:"万能逻辑电路"实验 (20)实例18:用右移运算流水点亮P1口8位LED (20)实例19:用if语句控制P0口8位LED的流水方向 (22)实例20:用swtich语句的控制P0口8位LED的点亮状态 (23)实例21:用for语句控制蜂鸣器鸣笛次数 (25)实例22:用while语句控制LED (27)实例23:用do-while语句控制P0口8位LED流水点亮 (29)实例24:用字符型数组控制P0口8位LED流水点亮 (31)实例25:用P0口显示字符串常量 (32)实例26:用P0 口显示指针运算结果 (34)实例27:用指针数组控制P0口8位LED流水点亮 (34)实例28:用数组的指针控制P0 口8 位LED流水点亮 (36)实例29:用P0 、P1口显示整型函数返回值 (38)实例30:用有参函数控制P0口8位LED流水速度 (39)实例31:用数组作函数参数控制流水花样 (41)实例32:用指针作函数参数控制P0口8位LED流水点亮 (42)实例33:用函数型指针控制P1口灯花样 (45)实例34:用指针数组作为函数的参数显示多个字符串 (47)实例35:字符函数ctype.h应用举例 (49)实例36:内部函数intrins.h应用举例 (50)实例37:标准函数stdlib.h应用举例 (51)实例38:字符串函数string.h应用举例 (52)实例39:宏定义应用举例2 (53)实例40:宏定义应用举例2 (54)实例41:宏定义应用举例3 (55)实例42:用定时器T0查询方式P2口8位控制LED闪烁 (56)实例43:用定时器T1查询方式控制单片机发出1KHz音频 (57)实例44:将计数器T0计数的结果送P1口8位LED显示 (58)实例45:用定时器T0的中断控制1位LED闪烁 (60)实例46:用定时器T0的中断实现长时间定时 (61)实例47:用定时器T1中断控制两个LED以不同周期闪烁 (63)实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 (65)实例49:用定时器T0的中断实现"渴望"主题曲的播放 (66)实例50-1:输出50个矩形脉冲 (72)实例50-2:计数器T0统计外部脉冲数 (73)实例51-2:定时器T0的模式2测量正脉冲宽度 (74)实例52:用定时器T0控制输出高低宽度不同的矩形波 (76)实例53:用外中断0的中断方式进行数据采集 (78)实例54-1:输出负脉宽为200微秒的方波 (79)实例54-2:测量负脉冲宽度 (80)实例55:方式0控制流水灯循环点亮 (82)实例56-1:数据发送程序 (84)实例56-2:数据接收程序 (86)实例57-1:数据发送程序 (88)实例57-2:数据接收程序 (90)实例58:单片机向PC发送数据 (92)实例59:单片机接收PC发出的数据 (94)实例60:用LED数码显示数字5 (96)实例61:用LED数码显示器循环显示数字0~9 (96)实例62:用数码管慢速动态扫描显示数字"1234" (98)实例63:用LED数码显示器伪静态显示数字1234 (99)实例64:用数码管显示动态检测结果 (101)实例65:数码秒表设计 (105)实例66:数码时钟设计 (108)实例67:用LED数码管显示计数器T0的计数值 (115)实例68:静态显示数字“59” (118)实例69:无软件消抖的独立式键盘输入实验 (118)实例70:软件消抖的独立式键盘输入实验 (119)实例71:CPU控制的独立式键盘扫描实验 (121)实例72:定时器中断控制的独立式键盘扫描实验 (127)实例73:独立式键盘控制的4级变速流水灯 (134)实例74:独立式键盘的按键功能扩展:"以一当四" (138)实例75:独立式键盘调时的数码时钟实验 (141)实例76:独立式键盘控制步进电机实验 (149)实例77:矩阵式键盘按键值的数码管显示实验 (154)实例78:矩阵式键盘按键音 (160)实例79:简易电子琴 (163)实例80:矩阵式键盘实现的电子密码锁 (175)实例81:用LCD显示字符'A' (182)实例82:用LCD循环右移显示"Welcome to China" (188)实例83:用LCD显示适时检测结果 (195)实例84:液晶时钟设计 (203)实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (215)实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 (224)实例87:对I2C总线上挂接多个AT24C02的读写操作 (239)实例88:基于AT24C02的多机通信读取程序 (250)实例88:基于AT24C02的多机通信写入程序 (258)实例90:DS18B20温度检测及其液晶显示 (280)实例91:将数据"0xaa"写入X5045再读出送P1口显示 (298)实例92:将流水灯控制码写入X5045并读出送P1口显示 (305)实例93:对SPI总线上挂接多个X5045的读写操作 (313)实例94:基于ADC0832的数字电压表 (321)实例95:用DAC0832产生锯齿波电压 (333)实例96:用P1口显示红外遥控器的按键值 (334)实例97:用红外遥控器控制继电器 (339)实例98:基于DS1302的日历时钟 (344)实例99:单片机数据发送程序 (362)实例100:电机转速表设计 (365)模拟霍尔脉冲 (375)/*函数的使用和熟悉*///实例3:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){while(1) //无限循环P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void) //两个void意思分别为无需返回值,没有参数传递{unsigned int i; //定义无符号整数,最大取值范围65535for(i=0;i<20000;i++) //做20000次空循环; //什么也不做,等待一个机器周期}/*******************************************************函数功能:主函数(C语言规定必须有也只能有1个主函数)********************************************************/void main(void){while(1) //无限循环{P1=0xfe; //P1=1111 1110B, P1.0输出低电平delay(); //延时一段时间P1=0xff; //P1=1111 1111B, P1.0输出高电平delay(); //延时一段时间}}//实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<reg51.h> //包含单片机寄存器的头文件/*******************************************************函数功能:主函数(C语言规定必须有也只能有1个主函数)********************************************************/void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111, 熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}//实例6:使用P3口流水点亮8位LED #include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/******************************************************* 函数功能:主函数********************************************************/ void main(void)while(1){P3=0xfe; //第一个灯亮delay(); //调用延时函数P3=0xfd; //第二个灯亮delay(); //调用延时函数P3=0xfb; //第三个灯亮delay(); //调用延时函数P3=0xf7; //第四个灯亮delay(); //调用延时函数P3=0xef; //第五个灯亮delay(); //调用延时函数P3=0xdf; //第六个灯亮delay(); //调用延时函数P3=0xbf; //第七个灯亮delay(); //调用延时函数P3=0x7f; //第八个灯亮delay(); //调用延时函数 }}//实例7:通过对P3口地址的操作流水点亮8位LED#include<reg51.h> //包含单片机寄存器的头文件sfr x=0xb0; //P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++); //利用循环等待若干机器周期,从而延时一段时间 }/*****************************************函数功能:主函数******************************************/void main(void){while(1){x=0xfe; //第一个灯亮delay(); //调用延时函数x=0xfd; //第二个灯亮delay(); //调用延时函数x=0xfb; //第三个灯亮delay(); //调用延时函数x=0xf7; //第四个灯亮delay(); //调用延时函数x=0xef; //第五个灯亮delay(); //调用延时函数x=0xdf; //第六个灯亮delay(); //调用延时函数x=0xbf; //第七个灯亮delay(); //调用延时函数x=0x7f; //第八个灯亮delay(); //调用延时函数}}//实例8:用不同数据类型控制灯闪烁时间#include<reg51.h> //包含单片机寄存器的头文件/******************************************************函数功能:用整形数据延时一段时间******************************************************/void int_delay(void) //延时一段较长的时间{unsigned int m; //定义无符号整形变量,双字节数据,值域为0~65535 for(m=0;m<36000;m++); //空操作}/******************************************************函数功能:用字符型数据延时一段时间******************************************************/void char_delay(void) //延时一段较短的时间{unsigned char i,j; //定义无符号字符型变量,单字节数据,值域0~255for(i=0;i<200;i++)for(j=0;j<180;j++); //空操作}/****************************************************** 函数功能:主函数******************************************************/ void main(void){unsigned char i;while(1){for(i=0;i<3;i++){P1=0xfe; //P1.0口的灯点亮int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间}for(i=0;i<3;i++){P1=0xef; //P1.4口的灯点亮char_delay(); //延时一段较长的时间P1=0xff; //熄灭char_delay(); //延时一段较长的时间}}}//实例9:用P0口、P1口分别显示加法和减法运算结果#include<reg51.h>void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111,结果P1.3、P1.4、P1.7 口的灯被点亮 P0=n-m; //P0=17=0001 0001,结果P0.0、P0.4的灯被熄灭}//实例10:用P0、P1口显示乘法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;n=71;s=m*n; //s=64*71=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口//由于4544=17*256+192=H3*16*16*16+H2*16*16+H1*16+H0 //两边同除以256,可得17+192/256=H3*16+H2+(H1*16+H0)/256//因此,高8位16进制数H3*16+H2必然等于17,即4544除以256的商//低8位16进制数H1*16+H0必然等于192,即4544除以256的余数P1=s/256; //高8位送P1口,P1=17=11H=0001 0001B, P1.0和P1.4口灭,其余亮P0=s%256; //低8位送P0口 , P3=192=c0H=1100 0000B,P3.1,P3.6,P3.7口灭,其余亮}//实例11:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5)*10)/5; //求小数while(1); //无限循环防止程序“跑飞”}//实例12:用自增运算控制P0口8位LED流水花样#include<reg51.h> //包含单片机寄存器的头文件/******************************************************函数功能:延时一段时间******************************************************/ void delay(void){unsigned int i;for(i=0;i<20000;i++);}/****************************************************** 函数功能:主函数******************************************************/ void main(void){unsigned char i;for(i=0;i<255;i++) //注意i的值不能超过255{P0=i; //将i的值送P0口delay(); //调用延时函数}}//实例13:用P0口显示逻辑"与"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}//实例14:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}//实例15:用P0口显示按位"异或"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000Bwhile(1); //设置无限循环,防止程序“跑飞”}//实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0x3b<<2; //将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}//实例17:"万能逻辑电路"实验#include<reg51.h> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为 P1.4sbit X=P1^5; //将X位定义为 P1.5sbit Y=P1^6; //将Y位定义为 P1.6sbit Z=P1^7; //将Z位定义为 P1.7void main(void){while(1){F=((~X)&Y)|Z; //将逻辑运算结果赋给F;}}//实例18:用右移运算流水点亮P1口8位LED #include<reg51.h> //包含单片机寄存器的头文件/*****************************函数功能:延时一段时间*****************************/void delay(void)unsigned int n;for(n=0;n<30000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;while(1){P1=0xff;delay();for(i=0;i<8;i++)//设置循环次数为8{P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0 delay(); //调用延时函数}}//实例19:用if语句控制P0口8位LED的流水方向#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4sbit S2=P1^5; //将S2位定义为P1.5/*****************************函数功能:主函数*****************************/void main(void){while(1){if(S1==0) //如果按键S1按下P0=0x0f; //P0口高四位LED点亮if(S2==0) //如果按键S2按下P0=0xf0; //P0口低四位LED点亮}}//实例20:用swtich语句的控制P0口8位LED的点亮状态#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4/*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n<10000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;i=0; //将i初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=1;}switch(i) //使用多分支选择语句{case 1: P0=0xfe; //第一个LED亮break;case 2: P0=0xfd; //第二个LED亮break;case 3:P0=0xfb; //第三个LED亮break;case 4:P0=0xf7; //第四个LED亮break;case 5:P0=0xef; //第五个LED亮break;case 6:P0=0xdf; //第六个LED亮break;case 7:P0=0xbf; //第七个LED亮break;case 8:P0=0x7f; //第八个LED亮break;default: //缺省值,关闭所有LEDP0=0xff;}}}//实例21:用for语句控制蜂鸣器鸣笛次数#include<reg51.h> //包含单片机寄存器的头文件sbit sound=P3^7; //将sound位定义为P3.7/****************************************函数功能:延时形成1600Hz音频****************************************/void delay1600(void){unsigned char n;for(n=0;n<100;n++);}/**************************************** 函数功能:延时形成800Hz音频****************************************/ void delay800(void){unsigned char n;for(n=0;n<200;n++);}/**************************************** 函数功能:主函数****************************************/ void main(void){unsigned int i;while(1){for(i=0;i<830;i++){sound=0; //P3.7输出低电平delay1600();sound=1; //P3.7输出高电平delay1600();}for(i=0;i<200;i++){sound=0; //P3.7输出低电平delay800();sound=1; //P3.7输出高电平delay800();}}}//实例22:用while语句控制LED#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){unsigned char i;while(1) //无限循环{i=0; //将i初始化为0while(i<0xff) //当i小于0xff(255)时执行循环体{P0=i; //将i送P0口显示delay60ms(); //延时i++; //i自增1}}}//实例23:用do-while语句控制P0口8位LED流水点亮#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){do{P0=0xfe; //第一个LED亮delay60ms();P0=0xfd; //第二个LED亮delay60ms();P0=0xfb; //第三个LED亮delay60ms();P0=0xf7; //第四个LED亮delay60ms();P0=0xef; //第五个LED亮delay60ms();P0=0xdf; //第六个LED亮delay60ms();delay60ms();P0=0xbf; //第七个LED亮delay60ms();P0=0x7f; //第八个LED亮delay60ms();}while(1); //无限循环,使8位LED循环流水点亮}//实例24:用字符型数组控制P0口8位LED流水点亮#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){unsigned char i;unsigned char code Tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义无符号字符型数组while(1){for(i=0;i<8;i++){P0=Tab[i];//依次引用数组元素,并将其送P0口显示 delay60ms();//调用延时函数}}}//实例25:用P0口显示字符串常量#include<reg51.h> //包含单片机寄存器的头文件/*************************************************函数功能:延时约150ms (3*200*250=150 000μs=150ms*************************************************/ void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char str[]={"Now,Temperature is :"}; //将字符串赋给字符型全部元素赋值unsigned char i;while(1){i=0; //将i初始化为0,从第一个元素开始显示while(str[i]!='\0') //只要没有显示到结束标志'\0'{P0=str[i]; //将第i个字符送到P0口显示delay150ms(); //调用150ms延时函数i++; //指向下一个待显字符}}}//实例26:用P0 口显示指针运算结果#include<reg51.h>void main(void){unsigned char *p1,*p2; //定义无符号字符型指针变量p1,p2unsigned char i,j; //定义无符号字符型数据i=25; //给i赋初值25j=15;p1=&i; //使指针变量指向i ,对指针初始化p2=&j; //使指针变量指向j ,对指针初始化P0=*p1+*p2; //*p1+*p2相当于i+j,所以P0=25+15=40=0x28//则P0=0010 1000B,结果P0.3、P0.5引脚LED熄灭,其余点亮 while(1); //无限循环,防止程序“跑飞”}//实例27:用指针数组控制P0口8位LED流水点亮#include<reg51.h>/*************************************************函数功能:延时约150ms (3*200*250=150 000μs=150ms*************************************************/void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char*p[ ]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5],&Tab[6],&Tab[7]};unsigned char i; //定义无符号字符型数据while(1){for(i=0;i<8;i++){P0=*p[i];delay150ms();}}}//实例28:用数组的指针控制P0 口8 位LED流水点亮#include<reg51.h>/*************************************************函数功能:延时约150ms (3*200*250=150 000μs=150ms*************************************************/void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char i;unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81,0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB};//流水灯控制码unsigned char *p; //定义无符号字符型指针p=Tab; //将数组首地址存入指针pwhile(1){for(i=0;i<32;i++) //共32个流水灯控制码{P0=*(p+i); //*(p+i)的值等于a[i]delay150ms(); //调用150ms延时函数}}}//实例29:用P0 、P1口显示整型函数返回值#include<reg51.h>/*************************************************函数功能:计算两个无符号整数的和*************************************************/ unsigned int sum(int a,int b){unsigned int s;s=a+b;return (s);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned z;z=sum(2008,2009);P1=z/256; //取得z的高8位P0=z%256; //取得z的低8位while(1);}//实例30:用有参函数控制P0口8位LED流水速度#include<reg51.h>/*************************************************函数功能:延时一段时间*************************************************/void delay(unsigned char x){unsigned char m,n;for(m=0;m<x;m++)for(n=0;n<200;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char i;unsigned char codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3*100*200=60 000μs) }//慢速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(250); //延时约150ms, (3*250*200=150 000μs) }}}//实例31:用数组作函数参数控制流水花样#include<reg51.h>/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:流水点亮P0口8位LED*************************************************/void led_flow(unsigned char a[8]){unsigned char i;for(i=0;i<8;i++){P0=a[i];delay();}}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码led_flow(Tab);}//实例32:用指针作函数参数控制P0口8位LED流水点亮#include<reg51.h>/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:流水点亮P0口8位LED*************************************************/void led_flow(unsigned char *p) //形参为无符号字符型指针{unsigned char i;while(1){i=0; //将i置为0,指向数组第一个元素while(*(p+i)!='\0') //只要没有指向数组的结束标志{P0=*(p+i);// 取的指针所指变量(数组元素)的值,送P0口 delay(); //调用延时函数i++; //指向下一个数组元素}}}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C,0x18,0x0,0x81,0xC3,0xE7,0xFF, 0xFF,0x7E};//流水灯控制码unsigned char *pointer;pointer=Tab;led_flow(pointer);}//实例33:用函数型指针控制P1口灯花样#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码,该数组被定义为全局变量/**************************************************************函数功能:延时约150ms**************************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/**************************************************************函数功能:流水灯左移**************************************************************/ void led_flow(void){unsigned char i;for(i=0;i<8;i++) //8位控制码{P0=Tab[i];delay();}}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){void (*p)(void); //定义函数型指针,所指函数无参数,无返回值p=led_flow; //将函数的入口地址赋给函数型指针pwhile(1)(*p)(); //通过函数的指针p调用函数led_flow()}//实例34:用指针数组作为函数的参数显示多个字符串#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested by DS18B20";//C语言中,字符串是作为字符数组来处理的unsigned char code str2[ ]="Now temperature is:"; //所以,字符串的名字就是字符串的首地址unsigned char code str3[ ]="The Systerm is designed by Zhang San"; unsigned char code str4[ ]="The date is 2008-9-30";unsigned char *p[ ]={str1,str2,str3,str4}; //定义p[4]为指向4个字符串的字符型指针数组/**************************************************************函数功能:延时约150ms**************************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/**************************************************************函数功能:流水点亮P0口8位LED**************************************************************/void led_display(unsigned char *x[ ]) //形参必须为指针数组{unsigned char i,j;for(i=0;i<4;i++) //有4个字符串要显示{j=0; //指向待显字符串的第0号元素while(*(x[i]+j)!='\0') //只要第i个字符串的第j号元素不是结束标志{P0=*(x[i]+j); //取得该元素值送到P0口显示delay(); //调用延时函数j++; //指向下一个元素}}}/**************************************************************函数功能:主函数**************************************************************/void main(void)unsigned char i;while(1){for(i=0;i<4;i++)led_display(p); //将指针数组名作实际参数传递}}//实例35:字符函数ctype.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<ctype.h>void main(void){while(1){P3=isalpha('_')?0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0}}//实例36:内部函数intrins.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<intrins.h> //包含函数isalpha()声明的头文件/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){P3=0xfe; //P3=1111 1110Bwhile(1)。
单片机Word 文档
【例4-2】左右来回循环的流水灯的电路连接见图4-6,显示规律如图4-7。
实现本任务要求,可以有多种软件实现方法。
下面列出了3种,具体如下。
(1)数组的字节操作实现本方法是建立一个字符型数组,将控制8个LED显示的8位数据作为数组元素,依次送到P1口来实现。
参考程序如下:#include <reg51.h>#define uchar unsigned charuchar tab[ ]={ 0xfe , 0xfd , 0xfb , 0xf7 , 0xef , 0xdf , 0xbf , 0x7f ,0xbf , 0xdf , 0xef , 0xff7 , 0xf7 , 0xfb , 0xfe , 0xff};/*前8个数据为左移点亮数据,后8个为右移点亮数据*/ void delay( ){ uchar i,j;for(i = 0; i < 255; i++);for(j = 0; j < 255; j++);}void main( ) /*主函数*/{ uchar iwhile (1){ for(i = 0; i < 15; i++);{ P1=tab[i];delay( );}}}2)移位运算符实现本方法是使用移位运算符“>>”“<<”来把送到P1口的显示控制数据进行移位,从而实现发光二极管依次点亮。
参考程序如下:#include <reg51.h>#define uchar unsigned charvoid delay( ){ uchar i,j;for(i=0; i < 255; i++);for(j=0; j < 255; j++);}void main( ) /*主函数*/{ uchar i,temp;while (1){ temp=0x01; /*左移初值赋给temp*/for(i= 0; i < 8; i++);}P1=~temp; /* temp取反后送P1口*/delay( );temp=temp<<1; /* temp 中数据左移一位*/{ temp=0x80; /*赋右移初值给temp*/for(i=0; i < 8; i++);{ P1=~temp; /* temp取反后送P1口*/delay( );temp=temp>>1; /* temp 中数据右移一位*/}}}(3)用移位函数实现本方法是使用C51中提供的库函数,即左移n位函数和右移n位函数,实现发光二极管的依次点亮。
(完整word版)STC单片机EEPROM读写程序
ISPgoon();/*触发执行*/
ISP_IAP_disable();/*关闭ISP,IAP功能*/
}
/* ====================字节写======================== */
void byte_write(uint byte_addr, uchar original_data){
void ISP_IAP_enable(void){
EA=0;/*关中断*/
ISP_CONTR =ISP_CONTR & 0x18; /* 0001,1000*/
ISP_CONTR =ISP_CONTR | WaitTime;/*写入硬件延时*/
ISP_CONTR =ISP_CONTR | 0x80; /* ISPEN=1*/
ISPgoon();/*触发执行*/
ISP_IAP_disable();/*关闭ISP,IAP功能*/
return (ISP_DATA);/*返回读到的数据*/
}
/* ==================扇区擦除======================== */
void SectorErase(uint sector_addr){
0x0e,
0x0f,
};
uinttimerForDelay,/*专供延时用的变量*/
i,/*循环变量*/
EepromPtr;/* eeprom读写指针*/
/* ---------------命令定义--------------- */
#define RdCommand0x01/*字节读*/
#define PrgCommand0x02/*字节写*/
(完整word版)第4章单片机原理课后答案
12.设8051的P1中各位接发光二极管,分别用汇编语言和C语言编程实现逐个轮流点亮二极管,并循环显示。
参考程序:
ORG 0000H
LJMPMAIN
ORG 0100H;主程序
MAIN:MOV A,#01H
LOOP:MOV P1,A
(5)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容
(6)C51编译器从绝对地址8m+3处产生一个中断向量
(7)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明
6.按给定的存储类型和数据类型,写出下列变量的说明形式。
(1)在data区定义字符变量val1。
char data varl;
DW 5567H,87H
(2000H)=01H;(2001H)=34H;(2002H)=61H;(2003H)=43H;
(2004H)=55H;(2005H)=67H;(2006H)=00H;(2007H)=87H;
8.编程实现将片外RAM的20H~30H单元的内容,全部移到片内RAM的20H单元的开始位置,并将原位置清零。
MOVDPTR,#1000H
MOVR2,#50
MOVR7,#00
MOVR6,#00
LOOP:MOVXA,@DPTR
ADDA,R6
MOVR6,A
Mபைடு நூலகம்VA,R7
ADDCA,#0
MOVR7,A
INCDPTR
DJNZR2,LOOP
SJMP$
10.编程实现R4R3R2,结果存放于R7R6R5中。
程序:
ORG0100H
0——外部中断0
51单片机C语言教程-郭天祥-PDF转word版第二章
----------------------------------------------------------------------------------------------------------------------
以上是使用频率最多的几个按钮的功能,大家千万不要被一打开软件时呈现在眼前令人的眼花缭乱的众多按钮所吓着哟。其他一些调试时用到的按钮等我们具体用到时再做介绍。
2.2
大家是不是已经迫不及待地想编写程序了,接下来我们就用C语言编写一个点亮TX-1C实验板上第一个发光二极管的程序。由于这是本书的第一个程序,看懂了它,也就意味着你已经踏入了单片机C语言编程的第一道门槛,因此我们在这里要花些时间讲解它,大家一定要有耐心,认真地弄明白它。
在输入上述程序时,Keil会自动识别关键字,并以不同的颜色提示用户加以注意,这样会使用户少犯错误,有利于提高编程效率。若新建立的文件没有事先保存的话,Keil是不会自动识别关键字的,也不会有不同颜色出现。程序输入完毕后,如图2.2.1所示。
我们暂且不要管这几句程序表示什么意思,先学会编译及错误处理,然后我再详细介绍代码的含义。接下来我们编译此工程,看看程序代码是否有错误。先保存文件,再单击K全部编译〗快捷图标圖。建议大家每次在执行编译之前都先保存一次文件,从一开始就养成良好的习惯对你将来写程序有很大好处,因为进行编译时,Keil软件有时会导致计算机死机,使你不得不重启计算机,若你在编写一个很大的工程文件时没有及时保存,那么重启后你将找不到它的任何踪影,只得重写。虽然这种情况极少发生,但出于安全考虑,建议大家及时
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/****************************************************************************** *********************///常用的定义#define uchar unsigned char#define uint unsigned intchar tmp=0;/******************用于串口通信*/char key=0; /************************键盘扫描的返回值*/sbit RS=P2^2;sbit RW=P2^3;sbit EN=P2^4;sbit PSB=P2^5;sbit duan=P2^6;sbit wei=P2^7;sbit SDA=P2^1;sbit SCL=P2^0;sbit CLK=P1^2;sbit SDa=P1^1;sbit RST=P1^0;sbit BUSY=P0^7;sbit sd=P1^6;/****************************************************************************** ******************///常用的数组uchar digit[]={"0123456789"};unsigned char code smg_yin[]={ // 显示共阴段数码管};0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char code smg_yang[]={ // 显示共阳数码管0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};unsigned char code key_code[]={ //键盘扫描函数0xe7,0xd7,0xb7,0x77,0xeb,0xdb,0xbb,0x7b ,0xed,0xdd,0xbd,0x7d,0xee,0xde,0xbe,0x7e};unsigned char wei_xian[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // 位显示段共阴从左到右/****************************************************************************** ***************************///延时函数void delay1ms(int n)//1毫秒延时{int i,j;for(i=n;i>0;i--)for(j=120;j>0;j--);//12M 若是11.0592M则是115}/****************************************************************************** ***************************///I2C总线相关的函数void I2Cstart()//开始标志{SDA=1;SCL=1;SDA=0;delay1ms(4);SCL=0;delay1ms(4);}void I2Cstop()//结束标志{SCL=0;delay1ms(4);SDA=0;delay1ms(4);SCL=1;delay1ms(4);SDA=1;delay1ms(4);}unsigned char I2Creadack(){unsigned char i,byte;byte=0;for(i=0;i<8;i++){SCL=0;SDA=1;delay1ms(4);byte<<=1;if(SDA==1){byte|=0x01;delay1ms(4);}}SCL=0;delay1ms(4);SDA=0;delay1ms(4);SCL=1;delay1ms(4);SCL=0;return byte;}void I2Csend(unsigned char byte)//I2C写数据的过程{unsigned char mask,i;for(i=0;i<8;i++){SCL=0;if((mask&byte)==0){SDA=0;}else{SDA=1;}mask>>=1;delay1ms(4);SCL=1;//给足够时间让数据读取delay1ms(4);}SCL=0;SDA=1; //因为总线上有一个信号为低则低delay1ms(4);SCL=1;delay1ms(4);//等待应答位SCL=0;}unsigned char I2Cread(void){unsigned char i,byte;byte =0;for(i=0;i<8;i++){SCL=0;SDA=1;//读数据必须拉高delay1ms(4);SCL=1;//数据稳定delay1ms(4);byte<<=1;if(SDA==1){byte|=0x01;}delay1ms(4);}SCL=0;delay1ms(4);SDA=0;//发送的应答位delay1ms(4);SCL=1;delay1ms(4);SCL=0;return byte;}unsigned char I2Cread_eeprom(unsigned char addr)//I2C读取数据{unsigned char datebyte,datebyte2;I2Cstart();I2Csend(0xa0);//写数据I2Csend(addr);I2Cstart();I2Csend(0xa1);//读数据datebyte2=I2Creadack();datebyte=I2Cread();I2Cstop();return datebyte;}void write_eeprom(unsigned char addr,unsigned char datebyte) {I2Cstart();I2Csend(0xa0);I2Csend(addr);I2Csend(datebyte);I2Cstop();}/****************************************************************************** ********************************///键盘扫描函数unsigned char keyscan()//线反转法扫描键盘{uchar scan1,scan2,keycode,j;P3=0xf0;scan1=P3;if((scan1&0xf0)!=0xf0) //判键是否按下{delay1ms(20); //延时20msscan1=P3;if((scan1&0xf0)!=0xf0) //二次判键是否按下{P3=0x0f; //线反转法的核心scan2=P3;keycode=scan1|scan2; //组合成键编码for(j=0;j<=15;j++){if(keycode== key_code[j]) //查表得键值{key=j;return(key);}}}}}/****************************************************************************** *************************///数码管显示void smg_disp(char Wei,char Duan)//数码管显示(位,段){P0=Wei;wei=1;wei=0;P0=Duan;duan=1;duan=0;}/****************************************************************************** ************************///串口通信void uinit(void)//串口通信初始化{SCON = 0x50; //串口工作方式为1 ,串行允许接收TMOD = 0x20; //定时器1 工作在方式2TH1 = 0xfd; //波特率 9600bps fosc="11".0592MHzTL1 = 0xfd;ES = 1; //开串口中断TR1 = 1; //允许定时器1工作EA = 1; //开总中断}void usendchar(unsigned char dat)//串口通信发送字符 //参数是电脑发过来的数{SBUF = dat; //待发送的数据写入缓冲区while(!TI); //等待发送完成TI = 0; //清零发送标志位}void sendback(unsigned char tem)//回传电脑显示 //tem全局变量{if(RI==1) // 是否有数据到来{RI = 0;tmp = SBUF; // 暂存接收到的数据P0 = tmp; // 数据传送到P0口usendchar(tmp); // 回传接收到的数据}}/****************************************************************************** ***********************///1602相关void wait()//读状态和读数据(等待是不是忙){P0=0xff;do{RS=0;RW=1;EN=0;EN=1;}while(BUSY==1);EN=0;}void write_dat(unsigned char dat)//1602写数据{wait();RS=1;RW=0;EN=1;P0=dat;EN=0;}void write_cmd(unsigned char cmd)//1602写命令{wait();RS=0;RW=0;EN=1;P0=cmd;EN=0;}void lcd_l602init()//1602初始化{EN=0;write_cmd(0x38);//设置16*2显示write_cmd(0x0c);//显示器开,光标开write_cmd(0x06);//写一个字符后地址加1write_cmd(0x01);//显示清0,DPTR清0}/****************************************************************************** ***********///12864 函数void Write1_cmd(uchar cmd){RS=0;RW=0;EN=0;P0=cmd;delay1ms(6);EN=1;delay1ms(6);EN=0;}//写显示数据到LCD//RS=1;RW=L,E=1;D0-D7数据void Write1_dat(uchar dat){RS=1;RW=0;EN=0;P0=dat;delay1ms(6);EN=1;delay1ms(6);EN=0;}//设定显示位置void lcd_pos(unsigned char x,unsigned char y)//y表示行 x表示列{switch(y){case 1: write_cmd(0x80+x);break;case 2: write_cmd(0x90+x);break;case 3: write_cmd(0x88+x);break;case 4: write_cmd(0x98+x);break;default:break;}}void lcd_12864init(){PSB=1;write_cmd(0x30);delay1ms(5);write_cmd(0x0c);delay1ms(5);write_cmd(0x01);delay1ms(5);}void write_image(uchar *p){uchar i,j,k;uchar lcd_x=0x80;uchar lcd_y=0x80;Write1_cmd(0x34);for(i=0;i<2;i++) //分为上下两屏{for(j=0;j<32;j++){Write1_cmd(lcd_y+j);Write1_cmd(lcd_x);for(k=0;k<16;k++) //写入显示数据{Write1_dat(*p++);}}lcd_x=0x88;}Write1_cmd(0x36);Write1_cmd(0x30);}/****************************************************************************** **********************///DS1302void write_ds1302_byte(uchar k){uint i;CLK=0;for(i=0;i<8;i++){SDa=k&0x01;CLK=1;k>>=1;CLK=0;}}unsigned char read_ds1302_byte(){unsigned char k=0,i;for(i=0;i<8;i++){k>>=1;if(SDa==1){k=k|0x80;}CLK=1;CLK=0;}return k;}void ds1302_rst()//复位ds1302{RST=0;CLK=0;RST=1;}void cls_ds1302_wp(){ds1302_rst();RST=1;write_ds1302_byte(0x8e);//先写地址write_ds1302_byte(0x00);SDa=0;RST=0;}void set_ds1302_wp(){ds1302_rst();RST=1;write_ds1302_byte(0x8e);//先写地址write_ds1302_byte(0x80);SDa=0;RST=0;}void write_ds1302(unsigned char add,unsigned char dat) {ds1302_rst();cls_ds1302_wp();write_ds1302_byte(add);write_ds1302_byte(dat);set_ds1302_wp();SDa=0;RST=0;}unsigned char read_ds1302(unsigned char add){unsigned char temp=0;set_ds1302_wp();ds1302_rst();write_ds1302_byte(add);temp=read_ds1302_byte();set_ds1302_wp();RST=0;SDa=0;return temp;}/****************************************************************************** **********************************///DS18B20bit dsret(){{bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在sd = 1; //先将数据线拉高for(time=0;time<2;time++) //略微延时约6微秒;sd = 0; //再将数据线从高拉低,要求保持480~960usfor(time=0;time<200;time++) //略微延时约600微秒; //以向DS18B20发出一持续480~960us的低电平复位脉冲sd = 1; //释放数据线(将数据线拉高)for(time=0;time<10;time++); //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)flag=sd; //让单片机检测是否输出了存在脉冲(sd=0表示存在)for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕;return (flag); //返回检测成功标志}}void write_tem(unsigned char dat){unsigned char i=0;for (i=0; i<8; i++){sd =1; // 先将数据线拉高_nop_(); //等待一个机器周期sd=0; //将数据线从高拉低时即启动写时序sd=dat&0x01; //利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样for(time=0;time<10;time++);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样sd=1; //释放数据线for(time=0;time<1;time++);//延时3us,两个写时序间至少需要1us的恢复期dat>>=1; //将dat中的各二进制位数据右移1位}for(time=0;time<4;time++); //稍作延时,给硬件一点反应时间 */}uchar read_tem(){unsigned char i=0;unsigned char dat; //储存读出的一个字节数据for (i=0;i<8;i++){sd =1; // 先将数据线拉高_nop_(); //等待一个机器周期sd = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序_nop_(); //等待一个机器周期sd = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备for(time=0;time<2;time++); //延时约6us,使主机在15us内采样dat>>=1;if(sd==1)dat|=0x80; //如果读到的数据是1,则将1存入datelsedat|=0x00;//如果读到的数据是0,则将0存入dat//将单片机检测到的电平信号sd存入r[i]for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期}return(dat); //返回读出的十六进制数据}void ReadyReadTemp(void){dsret(); //将DS18B20初始化write_tem(0xCC); // 跳过读序号列号的操作write_tem(0x44); // 启动温度转换delaynms(200); //转换一次需要延时一段时间dsret(); //将DS18B20初始化write_tem(0xCC); //跳过读序号列号的操作write_tem(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位}(注:可编辑下载,若有不当之处,请指正,谢谢!)。