北京理工大学-PIC单片机在电子系统设计中的应用-实验三-定时器中断
- 格式:doc
- 大小:817.00 KB
- 文档页数:9
实验三定时器中断实验一、实验目的1、掌握51单片机定时器基本知识;2、掌握定时器的基本编程方法;3、学会使用定时器中断。
二、实验内容1、利用定时器设计一个秒表,计数范围为0—59,并在数码管实时显示。
三、实验设备PC 机一台、单片机实验箱主要器件:AT89C52、7SEG-BCD、四、实验步骤1、使用Proteus设计仿真原理图;2、使用Keil设计程序;3、联合调试仿真。
五、实验流程图六、实验程序与结果#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit F=P2^1;void timer1_init(){TMOD=0x10;//将定时器1设置为工作方式1TH1=(65536-6000)/256;//定时器每加一时间为1/fsoc,定时时间为1/500//(1/500)s/(1/3000000)s=6000TL1=(65536-6000)%256;//fsoc=3000000,所以装入16位定时器中值为65536-6000 EA=1;ET1=1;TR1=1;}void main(){timer1_init();while(1);}void timer1() interrupt 3{TH1=(65536-6000)/256;//每次进入中断,重装初值TL1=(65536-6000)%256;F=~F;//每次进入中断P1.1口取反}#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit F=P2^1;void timer0_init(){TMOD=0x01;//将定时器0设置为工作方式1TH0=(65536-83)/256;//定时器每加一时间为1/fsoc,定时时间为2Khz,既500us//500us/6us=83.3333TL0=(65536-83)%256;//fsoc=6000000,所以装入16位定时器中值为65536-83EA=1;ET0=1;TR0=1;}void main(){timer0_init();while(1);}void timer0() interrupt 1{TH0=(65536-83)/256;//每次进入中断,重装初值TL0=(65536-83)%256;F=~F;//每次进入中断P1.1口取反,表示定时时间到}#include<reg51.h> // 包含51单片机寄存器定义的头文件#define seg_data P1#define seg_data2 P3#define uint unsigned intsbit D1=P2^0; //将D1位定义为P2.0引脚uint counter=0;unsigned int unit=0,decade=0,avs=0;//time=0;/************************************************************** 函数功能:主函数**************************************************************/ void main(void){uint time,time1,temp1,temp2,temp3;seg_data=0;seg_data2=0;TMOD=0x11; //使用定时器T0的模式2TH0=0xFC; //定时器T0的高8位赋初值 1000-500TL0=0x18; //定时器T0的低8位赋初值TH1=(65536-50000)/256; //定时器T1的高8位赋初值TL1=(65536-50000)%256; //定时器T1的低8位赋初值EA=1; //开总中断ET0=1; //定时器T0中断允许ET1=1;TR0=1; //启动定时器T0TR1=1;while(1)//无限循环等待中断{temp1=(decade&0x0F)<<4;temp2=unit&0x0F;time=temp2|temp1;seg_data=time;temp3=avs&0x0F;time1=temp3;seg_data2=time1;}}{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反TH0=0xFF; //定时器T0的高8位赋初值 1000-500TL0=0x06; //定时器T0的低8位赋初值}void Time1(void) interrupt 3{counter++;if(counter>19){unit++;counter=0;}if(unit>9){decade++;unit=0;}if(decade>5){avs++;decade=0;}if(avs>9){avs=0;}TH1=(65536-50000)/256; //定时器T1的高8位赋初值TL1=(65536-50000)%256; //定时器T1的低8位赋初值TF1=0;}七、实验心得通过本次课程设计使我感受到它是一门综合性、实践性较强的课程,使我体会到要想综合运用所学的理论知识,提高我的设计能力,必须增加实际操作的环节。
实验三单片机定时器及中断实验(1)实验要求1)由于实验学时很少,请提前预习和思考实验内容,将流程图及程序准备好,到实验室进行调试和验证。
2)由于实验室计算机C盘和D盘被保护,所以开始实验前在计算机E盘建立自己的文件夹,文件夹最好为英文名称。
实验中及时保存自己的源文件。
(2)实验内容1)使用单片机定时器资源,在P1.0口上输出一个周期为1s的方波,占空比为50%。
采用查询和中断的方式分别实现。
思考并回答以下问题:定时器工作在什么模式?定时器工作方式?定时器初值如何确定?使用T0还是T1?如何用定时器得到较长的延时时间?中断还是查询方式?两种方法在设计时有何区别?给出设计思路并画出程序流程图。
2)单片机P1口接8个LED,有一个LED点亮;P2.0接一个按键,首先采用查询的方式实现:每按一次按键,LED向左或向右移位一次。
如初始时L0亮,按一次按键,则L0熄灭,L1点亮;再按一次按键,L1熄灭,L2点亮,……给出设计思路并画出程序流程图。
3)采用单片机外部中断实现同样的功能。
思考并回答以下问题:电路应该如何连接?如何设置中断控制寄存器?中断方式选择?采用INT0还是INT1?如何中断使能?中断入口地址在哪里?中断服务程序要做哪些工作?如何中断返回?主程序结构如何?给出设计思路并画出程序流程图。
思考查询方式和中断方式实现同样功能在程序设计上有和不同?(3)实验目的1)学习单片机的定时器的使用方法;2)学习中断的使用及中断服务程序的编写;3)学习查询方式和中断方式进行信息传递的不同;(4)(5)1)仔细阅读定时器及中断控制寄存器设置部分内容,理解每一位的意义,再根据程序设计确定相关控制字。
2)中断服务程序的设计要注意现场保护以保证退出中断后程序的状态不发生变化。
3)按键连接单脉冲电路单脉冲电路由按键(PULSE)和去抖动处理组成,每按一次(PULSE)键产生一个单脉冲。
板上有单脉冲的输出信号插孔,图为“”和“”,分别为正脉冲和负脉冲。
a b c d e f g 实验三 中断、定时器实验信息学院 10通信A 柳东旭 1015231030一、实验目的1. 学习外部中断和定时器的工作原理及使用方法。
2. 学习外部中断和定时器的初始化程序、应用程序的编写和调试。
二、实验仪器和设备PC 机、W A VE 软件、仿真器+仿真头、实验板、电源等。
三、实验说明本实验1通过开关向单片机提出中断请求,单片机响应中断进行计数,并通过LED 数码管指示出计数值,从而观察中断的请求、响应的过程。
实验2通过单片机的定时器产生延时,模拟交通灯控制的方法。
通过本实验学生可以掌握单片机中断和定时器的工作原理及使用方法以及中断和定时器的初始化程序、应用程序的编写和调试。
四、实验内容1、开关S0—S1连接P3口做输入,P0输出接LED 数码管,通过S2产生外部中断请求(/INT0)信号,在中断服务程序中完成十进制递增计数,并将计数值显示在LED 数码管上,要求分别采用电平触发和边沿触发。
按上述要求完成S3产生外部中断请求。
编写初始化程序和中断服务程序。
(注意开关抖动处理)2、P1.0--P1.7作输入口接拨动开关S0--S7;P0.0--P0.7作输出口,接发光二极管L1—L8,编写程序读取开关状态,将此状态在对应的发光二极管上显示出来,要求发光二极管(LED )按亮0.5秒、暗0.5秒闪烁,LED 亮的同时,从P2.0送出1kHz 的音频信号到音频驱动电路发声(持续0.5秒),将开关编号(0—7)显示在LED 数码管上。
要求延时采用内部定时器T0,音频的产生采用内部定时器T1。
编写初始化程序和中断服务程序。
五、实验电路连线P0.0 ---- LED0P3.2(/INT0)----- S2 P0.1 ---- LED1P3.3(/INT1)----- S3 P0.2 ---- LED2P0.3 ---- LED3P0.4 ---- LED4P0.5 ---- LED5P0.6 ---- LED6P0.7 ---- LED7LED 连接 外部中断请求输入a b c d e f g h(dp)P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7LED数码管各段与I/O的连接六、程序框图1、中断实验中断实验程序ORG 0000H;SJMP START;ORG 0003H; //外部中断0程序入口地址SJMP IN0;START : SETB EA ; //开总中断SETB EX0; //外部中断0允许SETB IT0; //下降沿触发MOV IP,#01H; //最高优先MOV DPTR,#TABLE; //表格地址MOV P2,#0FFH; //清零LL1 : MOV A,#00H;MOVC A,@A+DPTR; //输入表格第一个数CJNE A,#1BH,LL2; //是否结束字符,不是则到LL2MOV DPTR,#TABLE; //是,则重新输入LJMP LL1; //跳转到LL1LL2 : MOV P2,A; //输出数据LJMP LL1;IN0 : CLR EX0; //关中断LCALL DELAY; //延时MOV A,P3;CJNE A,#0FBH,LL3; //对比是否低电平.真的有中断PUSH PSW; //入栈PUSH ACC;INC DPTR; //表格地址加一POP ACC;POP PSW; // 出栈SETB EX0; //开中断RETI; //返回LL3 :SETB EX0;RETI;DELAY : MOV R7,#01H; //延时程序DE1 : MOV R6,#50;DE2 : MOV R5,#123;DJNZ R5,$;DJNZ R6,DE2;DJNZ R7,DE1;RETTABLE : DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 1BHEND2、定时器实验框图定时器实验程序ORG 0000H;AJMP START;ORG 000BH; //定时器0入口AJMP ITT0;ORG 001BH; //定时器1入口LJMP ITT1;START : SETB EA; //开总中断MOV IP,#08H; //设置优先级MOV TMOD,#11H; //设置方式1MOV TH0,#3CH; //置定时器0初值MOV TL0,#0B0H;SETB ET0; //允许T0中断MOV TH1,#0FEH; //定时器1初值MOV TL1,#0CH;SETB ET1; //开启定时器1SETB TR1;BEEP BIT P3.7; //蜂鸣器设置SETB BEEP;MOV R0,#00H; //初始化MOV R1,#00H;MOV P2,#0FFH;MOV P0,#0FFH;MOV P1,#0FFH; //p1口初始化给ffh值L2 : MOV DPTR,#TABLE; //表地址存入DPTRMOV 50H,#0FEH; //比较初值载入地址50hL0 : MOV A,P1; //按键消抖CJNE A,#0FFH,L1;AJMP L0;L1 : LCALL DELAY ; //延时再判断MOV A,P1;CJNE A,#0FFH,LL1;AJMP L0;LL1 : CJNE A,50H,LL2; //是否与地址50h中数据相等MOV R0,A; //按键值载入R0,R3MOV R3,A;SETB TR0; //开定时器0MOV A,#00H;MOVC A,@A+DPTR;MOV P2,A; //输出表格数据到数码管LJMP L2; //返回程序开头LL2 : XCH A,50H; //交换数据RL A; //左移XCH A,50H; //再次交换,此时地址50h中数据左移一位INC DPTR; //表格数据地址加一LJMP LL1; //返回继续比较ITT0 : MOV TH0,#3CH; //定时器0中断程序重装计数值MOV TL0,#0B0H;CLR TR0; //关中断INC R1; //加一CJNE R1,#0AH,LL3; //是否为10,即中断了500ms 不是跳转到LL3MOV R1,#00H; //是,清零计数值MOV A,R0;MOV P0,A; //输出led控制值XRL A,R3; //异或求反让灯下次输出相反CPL A;MOV R0,A;LL3 : SETB TR0; //开定时中段0RETI; //返回ITT1 : CLR TR1; //定时中断1程序关中断MOV TH1,#0FEH;MOV TL1,#0CH;CJNE R0,#0FFH,LL4; //判断R0是否为0ffh 即灯是否为灭是则转移到LL4 :CPL BEEP; //蜂鸣器求反响LL4 : SETB TR1; //开定时器中断1RETI; //放回DELAY : MOV R7,#01; //延时程序DE1 : MOV R6,#40;DE2 : MOV R5,#123;DJNZ R5,$;DJNZ R6,DE2;DJNZ R7,DE1;RETTABLE : DB 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H;;//DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH; //表格数据END六、思考题1、外部中断采用电平触发和边沿触发处理方法上又何不同?答:选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。
定时器中断实验报告一、实验目的通过定时器中断实验,掌握定时器的基本原理和应用,了解中断的概念和实现,学习如何使用汇编和C语言编写中断服务程序。
二、实验原理1. 定时器的基本原理定时器是一种能够精确控制时间的功能模块,其主要功能是在一定的时间间隔内产生一次中断信号。
定时器一般由计数器和控制逻辑电路组成。
计数器向控制逻辑电路传递计数值,控制逻辑电路对计数器进行控制,当计数值达到设定值时,控制逻辑电路会产生中断信号。
2. 中断的概念和实现中断是指CPU在执行某个程序的过程中,由于某些特定事件的发生,需要立即停止正在执行的程序,转而去执行与特定事件相关的处理程序的过程。
中断信号通常是由外部设备产生的,例如定时器中断、串口中断等,也可以由软件产生。
中断的实现需要安装中断服务程序,中断服务程序是指与中断处理相关的程序段。
中断发生时,CPU会暂停当前的执行,转而执行中断服务程序。
中断服务程序完成处理后,CPU会返回到原来的执行状态。
中断服务程序通常由汇编或C语言编写,需要遵循一定的规则和约定。
三、实验材料1. STC89C52单片机板;2. 电脑、Keil μVision5软件;3. 串口调试助手软件。
四、实验过程1. 硬件连接将STC89C52单片机板上的P3口与LED灯连接,通过拨码开关设定定时器的时钟频率。
2. 编写程序在Keil μVision5软件中编写程序,在程序中设置定时器的时钟频率和中断周期。
在中断服务程序中控制LED灯的闪烁。
3. 烧录程序将编写好的程序烧录到STC89C52单片机板中。
4. 测试启动单片机板,观察LED灯是否按照预定的周期闪烁。
通过串口调试助手软件,可以实时观察定时器中断的触发情况。
五、实验结果经过测试,程序能够正常运行,LED灯按照预定的周期闪烁,定时器中断触发正常,符合预期要求。
六、实验总结通过本次实验,我掌握了定时器的基本原理和应用,了解了中断的概念和实现,学习了如何使用汇编和C语言编写中断服务程序。
实验三:中断及定时器实验一、实验目的:1、弄清中断的概念、基本原理,掌握中断技术的应用2、了解中断初始化的方法,中断向量安装和中断服务子程序的设计方法。
3、了解定时/计数器的工作原理及MCS51单片机的定时器内部结构4、掌握时间常数计算方法5、掌握定时器初始化方法和定时中断程序设计方法二、实验内容:定时器实验1、这个是一个电子钟走时程序,利用定时器T0产生50ms中断,中断计数器中断20次为1秒,利用秒信号进行电子钟计时。
先读懂下面程序段,然后编辑、编译程序,并在伟福仿真器上模拟调试该程序。
程序清单如下:COUNT EQU 7FHCOUNT1 EQU 7EHS_MEM EQU 73HM_MEM EQU 72HH_MEM EQU 71HORG 0000HLJMP MAINORG 000BHLJMP INT_T0 ;“*1”MAIN: MOV SP,#2FHMOV TMOD,#BMOV TH0,#03CH ;50毫秒中断时间常数MOV TL0,#0BHMOV IE,#B ;开放T0MOV IP,#0MOV S_MEM,#0MOV M_MEM,#0MOV H_MEM,#0MOV COUNT,#20SETB TR0;______________________________________________________ W AIT:NOPSJMP W AITINT_T0: MOV TL0,#0BHMOV TH0,#3CHDJNZ COUNT,EXT_T0MOV COUNT,#20 ;恢复中断计数器INC S_MEM ;“*2”MOV A,S_MEMCJNE A,60,EXT_T0MOV S_MEM,#0INC M_MEMMOV A,M_MEMCJNE A,#60,EXT_T0MOV M_MEM,#0INC H_MEMMOV A,H_MEMCJNE A,#13,EXT_T0MOV H_MEM,#0EXT_T0: RETI2、按下列要求修改程序或回答问题。
实验3 定时器中断实验一、 实验目的掌握MCS-51定时器的使用方法二、 实验设备AT89c51基本实验单元、计算机设备系统三、 实验原理(一) 实验说明(1) 利用定时器中断方式,做一个显示0~9的秒钟。
(2) 利用定时器中断方式,做一个显示00~99的秒钟,每一秒增加1.(二) 程序流程图(i )(ii )(三) 参考程序内容(1):只需要将内容2的代码中十位显示那一部分删除,并令D24=0即可。
内容(2):#include<reg51.h>unsigned char sum1=0,sum2=0;sbit D24=P2^4;sbit D25=P2^5;static unsigned char t;unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void delay(unsigned int);void main(){TMOD=0x10;TL1=0xf0;TH1=0xd8;EA=1;ET1=1;TR1=1;while(1){P0=0xff;D24=1;D25=0;P0=table[sum2]; //十位delay(50);P0=0xff;D24=0;D25=1;P0=table[sum1]; //个位delay(50);}}void delay(unsigned int m){unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<110;j++){;}}void timer0() interrupt 3{TL1=0xf0;TH1=0xd8;t++;if(t==100){t=0;sum1++;if(sum1>9){sum1=0;sum2++;if(sum2>9)sum2=0;}}}四、实验步骤:1.根据实验原理图编写程序,用“Keil uVision4”编译软件进行编译,如未通过,修改程序,直至通过。
实验一:定时器1. 实验目的:利用定时器0,定时器1,定时2实现4盏流水灯2. 实验内容 a,程序框图定时器0:/************************************************** 计算公式:(256-X)*K*T=25 000us,定时器延时25ms,预分频为K 为64,利用软件编程实现1s 脉冲输出,RB0作为输出 ************************************************/ #include<pic.h>__CONFIG(0x20F1); __CONFIG(0x3F71); #define T0_25MS 61 char a=0;void interrupt ISR() {if(T0IF==1)定时器1定时500MS定时器0定时50MS 、定时器1定时器2定时50MS时间到? 时间到? 时间到?a 的值加1 led 灯循环左移一位 a 的值加1a=20?a=10?a=0,led 灯循环左移一位 a=0,led 灯循环左移一位开始开始开始T0IF=0;TMR0=T0_25MS;a++;if(a==20) //输出1s脉冲{PORTD=(PORTD<<1);a=0;if(PORTD==0x10)PORTD=0x01;}}}void timer0init(){OPTION=0b10000110; //,预分频器给TMR0,TMR0预分频系数为1:64 INTCON=0b10100000; //GIE,PEIE置1}void main(){timer0init();TRISD=0;PORTD=0x01;while(1);}定时器1:/**************************************************计算公式:(65536-X)*K*T=500 000us,定时器延时500ms,预分频为8,利用软件编程实现1s脉冲输出,RB0作为输出************************************************/#include<pic.h>__CONFIG(0x20F1);__CONFIG(0x3F71);#define T1_500MS 3036void interrupt ISR(){if(TMR1IF==1){TMR1IF=0;TMR1H=T1_500MS>>8;TMR1L=T1_500MS;PORTD=(PORTD<<1);if(PORTD==0x10)PORTD=0x01;}void timer1init(){TMR1H=T1_500MS>>8;TMR1L=T1_500MS;TMR1IE=1;INTCON=0b11000000; //GIE,PEIE置1T1CON=0b00110001;; //TMR1预分频系数为1:8}void main(){timer1init();TRISD=0;PORTD=0x01;while(1);}定时器2:/**************************************************计算公式:(PR2+1)*K1*K2*T=50 000us,定时器延时50ms,预分频为K1为16,后分频器K2为15利用软件编程实现1s脉冲输出,RB0作为输出************************************************/#include<pic.h>__CONFIG(0x20F1);__CONFIG(0x3F71);#define LED RB0char a=0;void interrupt ISR(){if(TMR2IF==1){TMR2IF=0;a++;if(a==10) //1秒到了{PORTD=(PORTD<<1);a=0;if(PORTD==0x10)PORTD=0x01;}}}void timer2init()TMR2IE=1;PR2=207;INTCON=0b11000000; //GIE,PEIE置1T2CON=0B001110111; //TMR2预分频系数为1:16,后分频器为1:15 }void main(){timer2init();TRISD=0;PORTD=0x01;while(1);}实验二:RB0中断1.实验目的:a.利用外部中断RB0实现流水灯左移2.程序框图:开始RB0按下?进入中断,led灯循环左移一位程序:#include<pic.h>__CONFIG(0x20F1);__CONFIG(0x3f71);void delaynms(unsigned int n);void interrupt ISR(void);void main(){OPTION=0b00000000;ANS12=0;WPUB0=1;TRISB=0b00000001;INTCON=0b10010000;TRISD=0b00000000;PORTD=0x01;while(1);}void interrupt ISR(void){if(INTF==1){delaynms(30);INTF=0;PORTD=(PORTD<<1);if(PORTD==0x10)PORTD=0x01;}}void delaynms(unsigned int n){unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--)NOP();}实验三:AD转换1.实验目的:利用PIC内部AD转换器,AN0通道口采集模拟数据,通过LCD1602显示结果2.程序框图:程序:#include<pic.h>__CONFIG(0x3F39); __CONFIG(0x20F1); #define RS RD4 #define RW RD5 #define E RD6#define uint unsigned int char QW,BW,SW,GW;//8段共阳LED 显示代码,0位-7位分别控制a -h 段const char LED_CODE[]={0b11000000, 0b11111001,0b10100100,0b10110000,0b10011001, 0b10010010,0b10000010,0b11111000,0b10000000,0b10010000,0b01111111}; uint AD_SUB(char k);void init1602(); //1602初始化 void write_com(char com);//写指令 void write_date(char data);//写数据 void delaynms(unsigned int n); void spiinit();void SPI_WRITE(char ); void displayled(); void display1602(); void BCD(uint R1); void main() {uint y;TRISA=0b00000001;选择AD 通道启动ADGODON E=0?数据送1602显示初始化数据送数码管显示 开始ANSEL=0b11111111; //AN0~AN7为模拟输入,上电默认,可不设TRISD=0; //D口设置为输出PORTD=0;spiinit();init1602();while(1){y=AD_SUB(0); //0表示第0个通道BCD(y);displayled();display1602();delaynms(500); //此不不能忽略}}void BCD(uint R1){QW=0;BW=0;SW=0;GW=0;while(R1>=1000){R1-=1000;QW++;}while(R1>=100){R1-=100;BW++;}while(R1>=10){R1-=10;SW++;}GW=R1;}void displayled(){SPI_WRITE(GW); //先发个位SPI_WRITE(SW); //发十位SPI_WRITE(BW); //发百位SPI_WRITE(10); //发小数点SPI_WRITE(QW); //发千位}void display1602(){write_com(0x80);write_date(0x30+QW);write_date(0x2e); //小数点write_date(0x30+BW);write_date(0x30+SW);write_date(0x30+GW);write_date(0x56); //"V"}void SPI_WRITE(char b){char BUF;BUF=LED_CODE[b];SSPBUF=BUF; //发出数据while(BF==0);BUF=SSPBUF;}void spiinit(){TRISC=0b00010000;SSPEN=1;CKP=1;SSPM3=0;SSPM2=0;SSPM1=0;SSPM0=1;SMP=1;CKE=0;}uint AD_SUB(char k){char i;uint temp;float x;ADCON0=0b01000001; //TAD=8TOSC,ADFM=1; //设置成右对齐ADCON0|=(k<<4);for(i=1;i<5;i++)NOP(); //打开AD通道后延时20us左右GODONE=1; //开始AD转换while(GODONE==1); //等待转换完成ADIF=0;temp=ADRESH<<8;temp|=ADRESL;x=temp/1023.0*5.0;temp=x*1000;return(temp);}void init1602(){delaynms(20); //延时时间大于15mswrite_com(0x03);delaynms(5);write_com(0x03);delaynms(5);write_com(0x03);delaynms(5);write_com(0x02); //归HOME位,此不不可少delaynms(5);write_com(0x28); //工作方式设置,4位数据线,2行字符,5*7字体write_com(0x0c); //显示开关设置,画面开,光标消失,禁止闪烁write_com(0x06); //输入方式设置,AC为加一计数器write_com(0x01); //清屏write_com(0x80); //开始显示位置delaynms(2);}void write_com(char com){RS=0; //写指令RW=0;PORTD&=0xf0; //低四位清0E=1; //有效发送PORTD|=((com>>4)&0x0f);//先发高四位delaynms(5);E=0;PORTD&=0xf0;E=1;PORTD|=(com&0x0f);//再发低四位delaynms(5);E=0;}void write_date(char data){RS=1; //写数据RW=0;PORTD&=0xf0;E=1;PORTD|=((data>>4)&0x0f);//先发高四位delaynms(5);E=0;PORTD&=0xf0;E=1;PORTD|=(data&0x0f); //再发低四位delaynms(5);E=0;RS=0;}void delaynms(unsigned int n){unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--)NOP();}实验四:PWM1.实验目的:通过PIC单片机输出PWM不同占空比脉冲波形2.程序流程:程序:#include<pic.h>__CONFIG(0x3f3a);char a;void CSH();void interrupt ISR(void);void delaynms(unsigned int n); void main(){CSH();while(1){if(a==0)开始初始化占空比为0.1RB0是否按下进入中断,a加1a=1,则输出占空比0.1 a=2,则输出占空比0.3a=3,则输出占空比0.6a=4,则输出占空比0.9a=5,则a清0,占空比为0.1CSH();}}void CSH(){TRISC2=0;TRISD=0;PR2=249;CCPR1L=0x32;CCP1CON=0x0c;T2CON=0x05;OPTION=0b00000000;ANS12=0;WPUB0=1;TRISB=0b00000001;INTCON=0b10010000;}void interrupt ISR(void){if(INTF==1){delaynms(30);if(RB0==0){INTF=0;a++;switch(a){case 1:CCPR1L=0x19;PR2=249;CCP1CON=0x0c;T2CON=0x05;break; //占空比0.1 case 2:CCPR1L=0x4b;PR2=249;CCP1CON=0x0c;T2CON=0x05;break; //占空比0.3 case 3:CCPR1L=0x96;PR2=249;CCP1CON=0x0c;T2CON=0x05;break; //占空比0.6 case 4:CCPR1L=0xe1;PR2=249;CCP1CON=0x0c;T2CON=0x05;break;// 占空比0.9 case5:a=0;break;}}}}void delaynms(unsigned int n){unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--)NOP();}。
《单片机原理与接口技术》第3章单片机集成功能模块实验实验二中断控制实验实验三定时/计数器实验班级:学号:姓名:成绩:指导老师:日期:2017年11月6日实验二中断控制实验一、实验目的学习中断控制技术的基本原理,掌握中断程序的设计方法。
二、实验原理1、参照实验电路连线图接线,在8051的P1口上接8个发光二极管,在INT0(P3.2)接入触发脉冲电路,利用下降沿触发产生中断。
2、编制主程序,使P1口的8个发光二极管同时亮,延时一会儿在同时熄灭,延时时间自定。
外来脉冲每触发一次,主程序便中断一次,在中断服务子程序中,使P1口的8个发光二极管在某一时刻只有一个点亮,并向左循环移动。
三、仪器设备:1、PC计算机一台。
2、Dais-386PRO+实验系统一套。
四、实验内容:1、定时器中断单片机集成的定时器可以产生定时中断,利用定时器T0,编写程序,使P1.0控制的发光二极管L0每隔1秒交替点亮或熄灭。
实验步骤:1)按图3-2-1连接实验电路,参考程序:A51\3_2_1.ASM;2)编写程序,经编译、链接无语法错误后装载到实验系统;3)运行程序,观察发光二极管L0,应每隔1秒交替点亮或熄灭;4)实验完毕后,应使用暂停命令中止程序的运行。
2、外部中断L0P1.0发光二极管单片机图3-2-2 实验接线图SP单脉冲P3.2L0P1.0发光二极管单片机图3-2-1 实验接线图P3.2(INT0)连接单脉冲发生器,编写程序,每按一次脉冲产生一次中断,使P1.0控制的发光二极管L0交替点亮或熄灭。
1)按图3-2-2连接实验电路,参考程序:A51\3-2-2.ASM;2)编写程序,经编译、链接无语法错误后装载到实验系统;3)运行程序,每按动一次单脉冲按钮令发光二极管L0交替点亮或熄灭;4)实验完毕后,五、实验结果讨论:定时器中断:由于实际晶振为11.0592MHz,所以延时10ms时设置的初值为DBFFH,本程序运用了两种方法设置初值,一种是用HIGH(65536-COUNT)取高8位,一种是(65536-COUNT)/256右移8位来取高八位,然后用中断服务子程序来进行100次循环来延时1s 并且CPL指令取反来实现灯的明暗交替变换。
pic单片机实验报告PIC单片机实验报告引言:PIC单片机是一种非常常见的嵌入式系统开发工具,被广泛应用于电子产品的设计与制造过程中。
本实验报告将介绍我对PIC单片机的实验研究,并分享实验过程中的收获和心得体会。
实验一:LED灯的控制在本实验中,我使用PIC单片机来控制一组LED灯的亮灭。
通过编程,我成功实现了按键控制LED灯的开关,以及通过定时器实现LED灯的闪烁效果。
这个实验让我初步了解了PIC单片机的编程方法和基本原理。
实验二:温度传感器的应用在这个实验中,我将PIC单片机与温度传感器连接,并通过编程实现了温度的实时监测和显示。
通过这个实验,我深入了解了模拟信号的采集和数字信号的处理过程,并学会了如何使用PIC单片机进行数据的读取和处理。
实验三:蜂鸣器的控制本实验中,我使用PIC单片机控制了一个蜂鸣器的发声。
通过编程,我实现了不同频率的声音输出,并且可以通过按键控制声音的开关。
这个实验让我了解了如何通过PIC单片机来控制外部设备,并且学会了如何利用定时器来产生不同频率的方波信号。
实验四:液晶显示屏的应用在这个实验中,我将PIC单片机与液晶显示屏连接,并通过编程实现了文字和图形的显示。
通过这个实验,我学会了如何使用PIC单片机来控制液晶显示屏,并且了解了液晶显示屏的基本原理和工作方式。
实验五:无线通信模块的应用在本实验中,我将PIC单片机与无线通信模块连接,并通过编程实现了两个PIC 单片机之间的无线数据传输。
通过这个实验,我了解了无线通信模块的基本原理和工作方式,并学会了如何使用PIC单片机进行无线通信的应用。
结论:通过对PIC单片机的实验研究,我深入了解了PIC单片机的工作原理和应用方法。
通过编程和实践,我成功实现了LED灯的控制、温度传感器的应用、蜂鸣器的控制、液晶显示屏的应用以及无线通信模块的应用。
这些实验不仅让我掌握了PIC单片机的基本编程技巧和应用方法,还培养了我对嵌入式系统开发的兴趣和能力。
实验三定时器中断实验
一、实验目的:
1. 学习使用PIC定时器模块和中断功能;
2. 学习对PIC18F452的编程;
二、实验原理:
TIMER2 模块工作原理:Timer2 模块定时器有以下特性:
• 8 位定时器(TMR2 寄存器)
• 8 位周期寄存器(PR2)
• 可读写(TMR2 和PR2 寄存器均可)
• 可软件编程的预分频器(1:1、1:4 和1:16)
• 可软件编程的后分频器(1:1 到1:16)
• TMR2 与PR2 匹配时中断
Timer2 模块利用8 位定时器(TMR2 寄存器)对单片机指令周期(16MHz,4us)从0开始进行计数,当计数值与预先存在PR2 寄存器中的数值相等时,TMR2 寄存器自动归0,同时产生一个中断。
若预分频器设为1:16,后分频器设为1:10,PR2设为199,则Timer2 模块的定时时间为
4/16×16×10×200= 8 ms
三、程序设计:
1.用Timer2控制LED点亮,点亮持续时间为8mS。
将Timer2 模块设定为中断模式,每8mS 中断一次;
2.LED间隔48mS向左移7bit后再向右移7bit;
3.LED重复左、右移动(跑马灯);
四、实验步骤:
1.首先需要设置中断优先级位:RCONbits.IPEN=1;
2.Timer2设为高优先级,对应的中断向量地址地址为:0x08H IPR1bits.TMR2IP=1;
3.允许高优先级中断:INTCONbits. GIEH=1;
4.预分频器设为1:16,后分频器设为1:10,PR2设为199:
OpenTimer2 (TIMER_INT_ON &T2_PS_1_16 &T2_POST_1_10) ;
PR2=199;
五、调试:
1、选择设备
2、保存程序
3、建立工程并设置项目
4、加载源程序和链接文件
5、编译
6、用ICD2编程、调试
7、将程序烧写到单片机,观察实验现象
五、实验结果:
观察电路显示:
六、实验心得:
这次实验比较容易,在熟悉示例代码后,根据函数库以及变量说明,发现了需要完善的地方。
设置中断,设置预分频器后,最终成功运行。
这次试验熟悉了中断的使用以及分频器的设定。
经过这次的实验,我个人得到了不少的收获,一方面加深了自己对理论知识的认识,另一方面也提高了自己的实验逻辑思考能力及实验操作能力。
七、源代码如下:
#include <p18f452.h>
#include <timers.h>
#include <delays.h>
#pragma config WDT = OFF
#pragma config OSC = HS
#pragma config LVP = OFF
void isr_high(void);
volatile unsigned char Long_Count ;
volatile unsigned char Direct_LED ;
volatile unsigned char Dir_Count ;
void main(void)
{
TRISD=0x00; // Set output port for LED driver
PORTD=0b00000001; // Set b0 of LED is On
//********************************************
// Exercise
// Enable Timer2 interrupt with high Priority
//
//********************************************
//(Refer 18fxx2_cn(39564b) of Page 75-84)
RCONbits.IPEN=1; // Enable Interrupt Priority bit
IPR1bits.TMR2IP=1; // Set Timer2 for High Priority
INTCONbits. GIEH=1; // Enable High Priority Interrupt /***********************************/
/* Interrupt Time */
/*(4/16Mhz) [16*10*(199+1)] = 8mS */
/***********************************/
//(Refer MPLAB C18函数库of Page 50)
OpenTimer2 (TIMER_INT_ON &T2_PS_1_16 & T2_POST_1_10) ; // Turn On the Timer2 with Interrupt PR2=199; //(4/16Mhz) [16*10*(199+1)] = 8mS
Long_Count=0;
Direct_LED=0;
Dir_Count=0;
while(1); // Loop Here!
}
//************************************************
//* #pragma Interrupt Declarations *
//* Function: isr_high_direct *
//* Direct execution to the actual *
//* high-priority interrupt code. *
//************************************************
#pragma code isrhighcode = 0x0008
void isr_high_direct(void)
{
_asm //begin in-line assembly
goto isr_high //go to isr_high function
_endasm //end in-line assembly
}
#pragma code
//************************************************
//* Function: isr_high(void) *
//* High priority interrupt will *
//* Save the received data to buffer Rec_Data *
//************************************************
#pragma interrupt isr_high
void isr_high(void)
{
PIR1bits.TMR2IF=0; // Clear Timer2 interrupt Flag
if (Long_Count <= 6) Long_Count++; // 8mS * 6 = 48mS
else
{
Long_Count=0; // Time is 48mS, do the function
if (Direct_LED==0x00) // Right or Left shift
{
PORTD<<=1; // LED left shift
Dir_Count++;
if (Dir_Count==7) // End of LED position?
{
Dir_Count=0; // Yes, set flag of right shift
Direct_LED=0x1;
}
}
else
{
PORTD>>=1; // LED right shift
Dir_Count++;
if (Dir_Count==7)
{
Dir_Count=0;
Direct_LED=0x00;
}
}
}
}。