单片机实验 蜂鸣器和流水灯

合集下载

MSP430流水灯蜂鸣器实验报告

MSP430流水灯蜂鸣器实验报告

MSP430实验报告水位报警器姓名:丁宇昊学号:021210508一、实验目的:掌握msp430单片机的程序编写和运行过程。

掌握IAR Embedded Workbench程序的编译和运行。

二、实验内容:用继电器代替传感器输入模拟电压,用IED灯显示水位高度,当超过预定值时,蜂鸣器响,实现报警。

三、使用串口:P1口,P2口四、电路实现:把继电器作为的AD的输入,通过AD转换,把电压分成16小分,每一份信号控制1个led,通过改变led两端电平高低,控制led亮灭。

当到达预定值时,把蜂鸣器的接口设置为高电平。

实验代码:#include <msp430.h>void delay(int j){do j--;while (j != 0);}int main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabledADC10CTL1 = INCH_1+SREF0; // input A1ADC10AE0 |= BIT7; // PA.1 ADC option selectP1DIR |= BIT0; // Set P1.0 to output directionP1DIR|=BIT4;P1DIR|=BIT5;P2DIR|= 0xff;P2OUT|=0xff;P2SEL&=0x00;for (;;){ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exitif (ADC10MEM > 960){P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT =0xFE;}else if(ADC10MEM >900) { P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT = 0xfc;}else if(ADC10MEM >840) { P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT=0xf8;}else if(ADC10MEM >780) { P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT= 0xf0;}else if(ADC10MEM >660) { P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT= 0xe0;}else if(ADC10MEM >600) { P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT= 0xc0;}else if(ADC10MEM >540) { P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT= 0x80;}else if(ADC10MEM >480) { P1OUT |=BIT4;P1OUT &= ~BIT5;P2OUT= 0x00;}else if(ADC10MEM >420) { P1OUT&=~BIT5;P2OUT=0x00;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xfe;P1OUT|=BIT5;P2OUT=0xfe;}else if(ADC10MEM >360) { P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xfc;P1OUT|=BIT5;P2OUT=0xfc;}else if(ADC10MEM >300) {P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xf8;P1OUT|=BIT5;P2OUT=0xf8;}else if(ADC10MEM >240) { P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xf0;P1OUT|=BIT5;P2OUT=0xf0;}else if(ADC10MEM >180) { P1OUT&=~BIT5;P2OUT=0x00;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xe0;P1OUT|=BIT5;P2OUT=0xe0;}else if(ADC10MEM >120) { P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0xc0;P1OUT|=BIT5;P2OUT=0xc0;P1DIR |=BIT6; P1OUT ^=BIT6;delay(100);}else if(ADC10MEM >60) { P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0x80;P1OUT|=BIT5;P2OUT=0x80;P1DIR |=BIT6;P1OUT ^=BIT6;delay(100);}else{ P1OUT&=~BIT5;P2OUT=0x00;P1OUT|=BIT4;P2OUT=0x00;delay(20);P1OUT&=~BIT4;P2OUT=0x00;P2OUT=0x00;P1DIR |=BIT6;P1OUT ^=BIT6;delay(100);}}}// ADC10 interrupt service routine#pragma vector=ADC10_VECTOR__interrupt void ADC10_ISR(void){__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR) }六、总结。

51单片机流水灯实验报告

51单片机流水灯实验报告

51单片机流水灯实验报告51单片机流水灯实验报告引言:51单片机是一种常用的微控制器,广泛应用于各种电子设备中。

流水灯实验是学习单片机编程的基础实验之一,通过控制多个LED灯的亮灭顺序,可以了解单片机的基本原理和编程方法。

一、实验目的本实验旨在通过使用51单片机,设计并实现一个简单的流水灯电路,加深对单片机原理的理解,掌握基本的单片机编程方法。

二、实验原理51单片机是一种8位微控制器,具有强大的功能和广泛的应用。

流水灯实验中,我们需要控制多个LED灯的亮灭顺序,通过编写程序,将指令发送给单片机,控制LED灯的亮灭。

三、实验器材1. 51单片机开发板2. LED灯若干3. 面包板4. 连接线四、实验步骤1. 将51单片机开发板连接到电脑上,打开开发板的编程软件。

2. 在编程软件中,新建一个工程,选择适合的单片机型号。

3. 编写程序,设置相应的引脚为输出模式,并配置流水灯的亮灭顺序。

4. 将单片机开发板与面包板连接,将LED灯连接到相应的引脚上。

5. 将编写好的程序下载到单片机中。

6. 打开电源,观察LED灯的亮灭顺序是否符合预期。

五、实验结果与分析经过实验,我们成功地实现了一个简单的流水灯电路。

LED灯按照设定的顺序亮灭,形成了流水灯的效果。

通过调整程序中的指令顺序,我们可以改变LED灯的亮灭顺序,实现不同的流水灯效果。

六、实验心得通过这次实验,我对51单片机的原理和编程方法有了更深入的了解。

流水灯实验是一种简单但基础的实验,通过实际操作和编程,加深了我对单片机的理解和掌握。

在实验过程中,我遇到了一些问题,如LED灯连接错误、程序逻辑错误等,但通过仔细检查和调试,最终成功解决了这些问题。

这次实验让我更加熟悉了单片机的应用,为以后更复杂的项目打下了基础。

七、实验拓展在掌握了基本的流水灯实验后,我们可以进一步拓展实验内容。

例如,可以增加控制开关,实现对流水灯的启停控制;可以设计不同的流水灯效果,如闪烁、变速等;还可以与其他传感器、模块进行组合,实现更多功能和效果。

蜂鸣器与LED流水灯实验报告

蜂鸣器与LED流水灯实验报告

实验名称:蜂鸣器控制实验和基于μC/OS-II的LED流水灯控制实验摘要:熟悉uc/os-II操作系统和LPC2200专用工程模板,在该操作系统上完成流水灯循环控制任务和检测KEY1键控制蜂鸣器任务。

一、实验目的(1)掌握LPC2200专用工程模板(for μC/OS-II)的使用(2)能够在SmartARM2200教学实验开发平台上运行基于μC/OS-II操作系统的程序。

(3)掌握基于μC/OS-II操作系统的用户程序的编写风格二、实验内容建立三个μC/OS-II的任务,1个任务用于分别控制两个LED(P2.30,P2.31)流水灯循环点亮,这里称之为流水灯循环控制任务,一个任务用于检测按键输入(P0.14口的输入),这里就称之为按键检测任务,另一个任务用于控制蜂鸣器,这里就称之为蜂鸣器控制任务。

蜂鸣器控制任务平时处于等待状态,当按键检测任务检测到有效按键输入时,立即唤醒蜂鸣器控制任务。

程序清单:蜂鸣器控制#include "config.h"#define TASK_STK_SIZE 64OS_STK TaskStartStk[TASK_STK_SIZE];OS_STK TaskStk[TASK_STK_SIZE];#define KEY1 (1 << 14) /* P0.14为key1 */#define BEE (1 << 7) /* P0.07为蜂鸣器*/void TaskStart(void *data);void Task(void *data);int main (void){ OSInit();OSTaskCreate(TaskStart, (void *)0,&TaskStartStk[TASK_STK_SIZE - 1], 0);OSStart();return 0;}/*蜂鸣器控制任务*/void TaskStart(void *pdata){ pdata = pdata; /* 避免编译警告*/TargetInit(); /* 目标板初始化*/IO0DIR &= ~KEY1; /* 设置KEY1为输入*/IO0SET = BEE;IO0DIR |= BEE; /* 设置蜂鸣器为输出*/PINSEL0 = (PINSEL0 & 0xcffff3ff); /* 管教选择模块初始化*/ OSTaskCreate(Task, (void *)0, &TaskStk[TASK_STK_SIZE - 1], 10); /* 创建任务*/ for (;;){ OSTaskSuspend(OS_PRIO_SELF);IO0CLR = BEE;OSTimeDly(OS_TICKS_PER_SEC / 8);IO0SET = BEE;OSTimeDly(OS_TICKS_PER_SEC / 4);IO0CLR = BEEOSTimeDly(OS_TICKS_PER_SEC / 8);IO0SET = BEE;OSTimeDly(OS_TICKS_PER_SEC / 4);}}/*按键测试任务*/void Task(void *pdata){ pdata = pdata; /* 避免编译警告*/for ( ; ; ){ OSTimeDly(OS_TICKS_PER_SEC / 50);/* 延时20毫秒*/if ((IO0PIN & KEY1) != 0){ continue;}OSTimeDly(OS_TICKS_PER_SEC / 50);/* 延时20毫秒*/if ((IO0PIN & KEY1) != 0){ continue;}OSTaskResume(0);while ((IO0PIN & KEY1) == 0){ OSTimeDly(OS_TICKS_PER_SEC / 50);/* 延时20毫秒*/}}/*流水灯控制*/#include "config.h"#include "stdlib.h"#define BEEP (1 << 7) /* P0.07为蜂鸣器*/#define LED_ADJ 28#define LED_IOCON (0xFF<<LED_ADJ)#define LED_OFF() IO2SET=LED_IOCON#define LED_DISP(dat) LED_OFF();IO2CLR=((dat)<<LED_ADJ)#define TaskStkLengh 64 //Define the Task0 stack lengthOS_STK TaskStk0[TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈OS_STK TaskStk1[TaskStkLengh]; //Define the Task1 stack 定义用户任务1的堆栈void Task0(void *pdata); //Task0 任务0void Task1(void *pdata); //Task0 任务1int main(void){OSInit ();OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh - 1], 2);OSStart ();return 0;}void Task0(void *pdata){const uint8 DISP_TAB[24]={0x0F,0x00,0x0F,0x00,0x0F,0x00,0x0F,0x00,0x01,0x02,0x04,0x08,0x04,0x02,0x01,0x00,0x05,0x0A,0x05,0x0A,0x05,0x0A,0x05,0x00};uint8 i;pdata = pdata;TargetInit ();PINSEL0 = PINSEL0 & 0xffff3fff; // 管教选择模块初始化IO0DIR = BEEP; // 设置蜂鸣器为输出IO0SET = BEEP;IO2DIR=LED_IOCON;LED_OFF();OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 3);while(1){ for(i=0;i<24;i++){ LED_DISP(DISP_TAB[i]);OSTimeDly(OS_TICKS_PER_SEC/2);}}}void Task1(void *pdata){ pdata = pdata; /* 避免编译警告*/ while(1){OSTimeDly(OS_TICKS_PER_SEC*10);IO0CLR=BEEP;OSTimeDly(OS_TICKS_PER_SEC/2);IO0SET=BEEP;}}}三、实验前准备工作熟悉LPC2000管脚连接模块与EasyARM2000开发板的硬件结构,注意蜂鸣器的控制电路与JP1跳线的接法。

51单片机温度计+计数器(可调时间)+蜂鸣器(生日歌)+花样流水灯6种

51单片机温度计+计数器(可调时间)+蜂鸣器(生日歌)+花样流水灯6种

51单片机课程设计蜂鸣器(生日歌)+温度计+计数器(可调时间)+花样流水灯(6种)#include<reg52.h>#include<intrins.h>#include<stdlib.h>#define uchar unsigned char#define uint unsigned int#define led P1 //将P1口定义位8个leduchar a, count, S1num, xqnum, temp, j, tm, key, coun, L, qdq, mb; //定义变量char yue, ri, shi, fen, miao; //定义月日时分秒int nian; //定义年// ==================定义初始化日历uchar code table0[] = "2020-09-4--FRI--";uchar code table1[] = "08:48:00";uchar code xingqi[][3] = { "MON","TUE","WED","THU","FRI","SAT","SUN" };uint led1[]={0x7e,0xbd,0xdb,0xe7,0xff};// ==================定义初始化日历sbit lcdrs=P2^6; //将lcd1602的RS端口(数据/命令选择端)定义到P2.0 sbit lcdrw=P2^7; //将lcd1602的R/W端口(读/写选择端)定义到P2.1 sbit lcden=P2^5; //将lcd1602的E端口(使能端口)定义到P2.2sbit DQ=P3^7;//ds18b20sbit S1=P3^1; //进入设置退出设置sbit S2=P3^2; //+1 或秒表模式sbit S3=P3^3; //-1 或开始秒表计时sbit S0=P3^0; //进入设置退出设置sbit S4=P3^4; //灯模式切换sbit S5=P3^5;sbit beep = P2^2; //定义蜂鸣器uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159, 212,212,106,126,159,169,190,119,119,126,159,142,159,0};uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};//延时unsigned char code str2[16]={" "};uchar data disdata[5];uint value;//温度值温度值uchar flag;//正负标志正负标志void delay1ms(unsigned int ms)//延时1毫秒{unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void write_com1(unsigned char com1)//写指令//{ delay1ms(1);lcdrs=0;lcdrw=0;lcden=0;P0=com1;delay1ms(1);lcden=1;delay1ms(1);lcden=0;}void write_dat1(unsigned char dat1)//写数据// { delay1ms(1);lcdrs=1;lcdrw=0;lcden=0;P0=dat1;delay1ms(1);lcden=1;delay1ms(1);lcden=0;}void lcd_init()//初始化设置//{write_com1(0x38);delay1ms(5);write_com1(0x08);delay1ms(5);write_com1(0x01);delay1ms(5);write_com1(0x06);delay1ms(5);write_com1(0x0c);delay1ms(5);}void display(unsigned char *p)//显示{while(*p!='\0'){write_dat1(*p);p++;delay1ms(1);}}init_play()//初始化显示{lcd_init();write_com1(0xc0);display(str2);}void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{unsigned char x=0;DQ = 1;//DQ复位delay_18B20(4);//延时DQ=0;//DQ拉低delay_18B20(100);//精确延时大于480usDQ=1;//拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{unsigned char i=0;unsigned char dat1 = 0;for (i=8;i>0;i--){DQ = 0; //给脉冲信号dat1>>=1;DQ=1;//给脉冲信号if(DQ)dat1|=0x80;delay_18B20(10);}return(dat1);}void ds1820wr(uchar wdata)/*写数据*/ {unsigned char i=0;for(i=8;i>0;i--){DQ=0;DQ=wdata&0x01;delay_18B20(10);DQ=1;wdata>>=1;}}read_temp()/*读取温度值并转换*/ {uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/?ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();value=b;value<<=8;value=value|a;if(value<0x0fff)flag=0;else{value=~value+1;flag=1;}value=value*(0.625);//温度值扩大10倍,精确到1位小数return(value);}/*******************************************************************/ void ds1820disp()//温度值显示{uchar flagdat;disdata[0]=value/1000+0x30;//百位数disdata[1]=value%1000/100+0x30;//十位数disdata[2]=value%100/10+0x30;//个位数disdata[3]=value%10+0x30;//小数位if(flag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}write_com1(0xc8);write_dat1(flagdat);//显示符号位write_com1(0xc9);write_dat1(disdata[0]);//显示百位write_com1(0xca);write_dat1(disdata[1]);//显示十位write_com1(0xcb);write_dat1(disdata[2]);//显示个位write_com1(0xcc);write_dat1(0x2e);//显示小数点write_com1(0xcd);write_dat1(disdata[3]);//显示小数位}void delay(uint t) //@12.000MHz延时函数{uint x, y;for (x = t; x > 0; x--)for (y = 110; y > 0; y--);}void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}void PlayMusic(){uint i=0,j,k;while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { //播放各个音符,SONG_LONG 为拍子长度for(j=0;j<SONG_LONG[i]*20;j++){beep=~beep;//SONG_TONE 延时表决定了每个音符的频率for(k=0;k<SONG_TONE[i]/3;k++);}DelayMS(10);i++;}}//======================液晶void write_com(uchar com) //液晶写指令{lcdrw = 0;lcdrs = 0;P0 = com;delay(2);lcden = 1;delay(2);lcden = 0;}void write_data(uchar dat) //液晶写数据{lcdrw = 0;lcdrs = 1;P0 = dat;delay(2);lcden = 1;delay(2);lcden = 0;}void write_sfm(uchar add, uchar dat) //写时分秒函数{uchar shi, ge;shi = dat / 10;ge = dat % 10;write_com(0x80 + 0x40 + add);write_data(0x30 + shi);write_data(0x30 + ge);}void write_yr(uchar add, uchar dat) //写月日函数{uchar shi, ge;shi = dat / 10;ge = dat % 10;write_com(0x80 + add);write_data(0x30 + shi);write_data(0x30 + ge);}void write_nian(uchar add, uint dat) //写年函数{uint qian, bai, shi, ge;qian = dat / 1000;bai = dat % 1000 / 100;shi = dat % 100 / 10;ge = dat % 10;write_com(0x80 + add);write_data(0x30 + qian);write_data(0x30 + bai);write_data(0x30 + shi);write_data(0x30 + ge);}void init_lcd() //液晶初始化{lcden = 0;nian = 2020;yue = 1;ri = 3;shi = 0; //初始shi、fen、miaofen = 0;miao = 0;write_com(0x38); //设置16x2显示,5x7点阵,8位数据口write_com(0x0c); //设置开显示,不显示光标write_com(0x06); //写一个字符后地址指针加1write_com(0x01); //显示清0,数据指针清0}//==================液晶void init() //总初始化函数{init_lcd(); //液晶初始化write_com(0x80); //设置显示初始坐标for (a = 0; a < 14; a++) //显示年月日初始值{write_data(table0[a]);delay(3);}write_com(0x80 + 0x40); //设置显示初始坐标for (a = 0; a < 8; a++) //显示时分秒初始值{write_data(table1[a]);delay(3);}write_nian(0, nian);write_sfm(6, miao); //分别将shi、fen、miao送去液晶显示write_sfm(3, fen);write_sfm(0, shi);qdq=0;mb=0;j=0;L=0;coun=0;count = 0;xqnum = 0;S1num = 0;PT0=1;PT1=0;TH1=(65536-50000)/256;TL1=(65536-50000)%256;TR1=1;ET1=1;led=0xfe;key=0;TMOD = 0x011; //设置定时器0工作模式1TH0 = (65536-50000) / 256; //定时器装初始值TL0 = (65536-50000) % 256;EA = 1; //开总中断ET0 = 1; //开定时器0中断TR0 = 1; //启动定时器0}//=======================流水灯void t0isr() interrupt 3 //定时器2,用于流水灯{TH1=(65536-50000)/256;TL1=(65536-50000)%256;tm++;if(tm>=9){tm=0;switch(key) //六种样式{case 0:led=_crol_(led,1);break;case 1:led=_cror_(led,1);break;case 2:led=_cror_(led,1);break;case 3:led=_crol_(led,1);break;case 4:if(led==0x00)led=0xff;else led=led*2;break;case 5:led=~led;break;}}}//=======================流水灯//=========================== 独立键盘扫描函数void keyscan(){//————————————————————————————————————————————进入日历时钟设置if(S5 == 0){ read_temp();//读取温度ds1820disp();//显示}if (S0 == 0){ beep=0;PlayMusic(); //播放生日快乐beep=1;}if (S1 == 0){delay(2); //确认定义键被按下if (S1 == 0){while(!S1); //确认按键松开S1num++; //定义键S1按下次数记录if (S1num == 1) //S1按下一次时{TR0 = 0; //关闭定时器write_com(0xc0 + 7); //光标定位到秒位置write_com(0x0f); //光标闪烁}if (S1num == 2) //S1按下两次时{write_com(0xc0 + 4); //光标定位到分位置}if (S1num == 3) //S1按下三次时{write_com(0xc0 + 1); //光标定位到时位置}if (S1num == 4) //S1按下四次时{write_com(0x80 + 13); //光标定位到星期位置}if (S1num == 5) //S1按下五次时{write_com(0x80 + 9); //光标定位到日位置}if (S1num == 6) //S1按下六次时{write_com(0x80 + 6); //光标定位到月位置}if (S1num == 7) //S1按下七次时{write_com(0x80 + 3); //光标定位到年位置}if (S1num == 8) //退出设置,开启中断{S1num = 0;delay(3);TR0 = 1;write_com(0x0c);}}}if (S1num != 0) //只有定义键按下后S2、S3、S4才有效{if (S2 == 0){delay(2); //防抖if (S2 == 0) //确认按键被按下{while (!S2); //释放按键确认if (S1num == 1) //S1按下一次时{miao++; //调整秒加1if (miao == 60) //满60清零miao = 0;write_sfm(6, miao); //每调节一次送液晶显示一次write_com(0x80 + 0x40 + 6); //显示位置重新回到调节处}if (S1num == 2) //S1按下两次时{fen++; //调整分加1if (fen == 60)fen = 0;write_sfm(3, fen);write_com(0x80 + 0x40 + 3);}if (S1num == 3) //S1按下三次时{shi++; //调整时加1if (shi == 24)shi = 0;write_com(0x80 + 0x40);write_sfm(0, shi);}if (S1num == 4) //星期加调整{xqnum++;if (xqnum == 7)xqnum = 0;write_com(0x80 + 0x0b);for (a = 0; a < 3; a++){write_data(xingqi[xqnum][a]);delay(5);}}if (S1num == 5) //日加调整{ri++;if (yue == 2){if (nian % 400 == 0){if (ri == 30)ri = 1;}if (nian % 400 != 0){if (ri == 29)ri = 1;}}else if (yue <= 7){if (yue % 2 == 0 & yue != 2){if (ri == 31){ ri = 1; }}else if (yue % 2 != 0 & yue != 2){if (ri == 32){ ri = 1; }}}else if (yue >= 8){if (yue % 2 == 0){if (ri == 32){ ri = 1; }}else if (yue % 2 != 0){if (ri == 31){ ri = 1; }}}write_yr(8, ri);}if (S1num == 6) //月加调整{yue++;if (yue == 13)yue = 1;write_yr(5, yue);}if (S1num == 7) //年加调整{nian++;if (nian == 2030)nian = 2019;write_nian(0, nian);}}}if (S3 == 0){delay(2);if (S3 == 0) //确认按键被按下{while (!S3); //确认按键松开if (S1num == 1){miao--; //调整秒减1if (miao == -1) //减到00后再减重新设置为59miao = 59;write_sfm(6, miao);write_com(0x80 + 0x40 + 6);}if (S1num == 2){fen--; //调整分减1if (fen == -1)fen = 59;write_sfm(3, fen);write_com(0x80 + 0x40 + 3);}if (S1num == 3){shi--; //调整时减1if (shi == -1)shi = 23;write_sfm(0, shi);write_com(0x80 + 0x40);}if (S1num == 4){xqnum--; //调整星期减一if (xqnum == -1)xqnum = 6;write_com(0x80 + 0x0b);for (a = 0; a < 3; a++){write_data(xingqi[xqnum][a]);delay(5);}}if (S1num == 5) //调整日{ri--;if (yue == 2){if (nian % 400 == 0){if (ri == 0){ ri = 29; }}if (nian % 400 != 0){if (ri == 0){ ri = 28; }}}else if (yue <= 7){if (yue % 2 == 0 & yue != 2){if (ri == 0){ ri = 30; }}else if (yue % 2 != 0 & yue != 2){if (ri == 0){ ri = 31; }}}else if (yue >= 8){if (yue % 2 == 0){if (ri == 0){ ri = 31; }}else if (yue % 2 != 0){if (ri == 0){ ri = 30; }}}write_yr(8, ri);}if (S1num == 6) //调整月{yue--;if (yue == 0)yue = 12;write_yr(5, yue);}if (S1num == 7) //调整年{nian--;if (nian == 2030)nian = 2019;write_nian(0, nian);}}}}//————————————————————————————————————-推出日历时钟设置//——————————————————————————————————流水灯设置初值if(S4==0){delay(2);if(S4==0) //确认按键按下{while(!S4);qdq=0; //抢答器重置TR1=1;delay(2);while(S4==0);delay(2);key++;key%=6;if(key==0)led=0xfe;else if(key==1)led=0x7f;else if(key==2)led=0x80;else if(key==3)led=0x01;else if(key==4)led=0xfe;else led=0x55;}}//——————————————————————————————————结束流水灯设置初值}//=========================== 独立键盘扫描函数//=======================定时器0中断服务程序,用于日历时钟、秒表void timer0() interrupt 1{TH0 = (65536-50000) / 256; //重装定时器初始值TL0 = (65536-50000) % 256;count++; //中断次数累加//————————————————————————————————————————————日历时钟if (count == 20) //20次50毫秒即一秒{count = 0;miao++;if (miao == 60) //秒加到60时分进位{miao = 0;fen++;if (fen == 60) //分加到60时时进位{fen = 0;shi++;if (shi == 24) //时加到24时清0{shi = 0;xqnum++;ri++;if (yue == 2) //如果是二月{if (nian % 400 == 0) //闰年判断{if (ri == 30){ri = 1;yue++;write_yr(5, yue);}}if (nian % 400 != 0) //平年判断{if (ri == 29){ri = 1;yue++;write_yr(5, yue);}}}else if (yue <= 7 & yue != 2) //一月到七月{if (yue % 2 == 0) //偶数月(除二月){if (ri == 31){ri = 1;yue++;}}else if (yue % 2 != 0) //奇数月{if (ri == 32){ri = 1;yue++;}}write_yr(5, yue);}else if (yue >= 8) //八月到12月{if (yue % 2 == 0) //偶数月(除二月){if (ri == 32){ri = 1;yue++;if (yue == 13) //如果判断月份为12月,则加一后重新定义月份为1{yue = 1;nian++;write_nian(0, nian);}write_yr(5, yue);}}else if (yue % 2 != 0) //奇数月{if (ri == 31){ri = 1;yue++;write_yr(5, yue);}}}write_yr(8, ri);if (xqnum == 7) //星期写入xqnum = 0;write_com(0x80 + 0x0b);for (a = 0; a < 3; a++){write_data(xingqi[xqnum][a]);delay(5);}}write_sfm(0, shi); //重新写入数据}write_sfm(3, fen); //重新写入数据}write_sfm(6, miao); //重新写入数据}//——————————————————————————————————————————日历时钟结束}//=======================定时器0中断服务程序,用于日历时钟void main() //主函数{init(); //初始化while (1){keyscan(); //检测按键是否被按下}}相关视频在哔哩哔哩:BV1ef4y1q7xY。

单片机实验蜂鸣器和流水

单片机实验蜂鸣器和流水
测量和控制各种物理量,如温 度、压力、流量等。
汽车电子
发动机控制、安全气囊、导航 系统等。
单片机的发展历程
01
02
03
起源
20世纪70年代,随着微处 理器技术的发展,单片机 逐渐问世。
发展阶段
经历了4位、8位、16位和 32位等不同位数的发展, 性能不断提升。
未来趋势
随着物联网、人工智能等 技术的兴起,单片机将更 加智能化、网络化。
2. 代码编写
使用C语言或汇编语言编写代码,控 制单片机依次点亮每个LED灯,形成 流水灯效果。
3. 编译与烧录
将编写好的代码编译后烧录到单片机 中。
4. 测试与验证
观察LED灯是否依次亮起,形成流水 灯效果,并检查是否有闪烁或亮度不 均等问题。
06 实验总结与思考
实验收获与体会
硬件连接理解
通过亲手连接单片机、蜂鸣 器和LED灯,我深入理解了 硬件电路的连接方式,掌握 了基本的硬件操作技能。
04 单片机实验开发环境与工 具
单片机开发板的选择与使用
选择单片机开发板时,需要考 虑其性能、功能、兼容性和易 用性。
开发板上通常集成了单片机、 电源电路、接口电路等,方便 开发者进行实验和开发。
使用单片机开发板时,需要按 照说明文档连接电源、接口等, 确保安全可靠。
编程语言的介绍与选择
01
单片机编程语言常用的 有C语言和汇编语言。
软件编程实践
编写单片机程序使我熟悉了 编程语言和逻辑,学会了如 何通过编程控制硬件。
问题解决能力
在实验过程中遇到问题,通 过查阅资料和尝试不同的解 决方案,提高了我的问题解 决能力。
团队协作精神
与同学共同完成实验,互相 帮助和学习,培养了团队协 作精神。

蜂鸣器与流水灯实验报告

蜂鸣器与流水灯实验报告

======================蜂鸣器与流水灯实验===================实验(一)蜂鸣器一、电路图二、程序注释1、频率、节拍常数的编码2、定时/计数器0中断赋初值,使计数器计满一次时时间为100ms。

同时没记一满次,n减13、毫秒的延时函数4、无参数返回值的延时函数5、主函数,用switch函数选择,当case为0x00时,延时一段时间再开始6、让i自加1,延时7、选择频率常数,选择m、n为第1个,第2个……第i个频率8、开定时器中断,延时4*m的时间等待节拍完成,当n不等于0时,将选出来的频率依次输出,实验(二)流水灯一、电路图二、程序注释①直接赋值控制亮灯法#include <reg52.h>sbit LED0=P1^0 ; //定义八个流水灯等为输出端口P1^0~P1^7 sbit LED1=P1^1 ;sbit LED2=P1^2 ;sbit LED3=P1^3 ;sbit LED4=P1^4 ;sbit LED5=P1^5 ;sbit LED6=P1^6 ;sbit LED7=P1^7 ;void delay(float t) //延时函数{ unsigned int i,j;j=t*100;while(j--){for(i=8000;i;i--);}}void main() //主函数{while(1){LED0=0; //亮第1个灯delay(0.1); //延时0.1sLED0=1; //熄灭LED1=0; //亮第2个灯delay(0.1);LED1=1;LED2=0; //亮第3个灯delay(0.1);LED2=1;LED3=0; //亮第4个灯delay(0.1);LED3=1;LED4=0; //亮第5个灯delay(0.1);LED4=1;LED5=0; //亮第6个灯delay(0.1);LED5=1;LED6=0; //亮第7个灯delay(0.1);LED6=1;LED7=0; //亮第8个灯delay(0.1);LED7=1;}}②循环左移法#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit p1=P1^0;uchar temp;void delay(uint); //延时函数声明void main() //主函数{temp=0xfe; //将0xfe赋给tempP1=temp; //P1值为temp,即11111110,第一个灯亮 while(1){temp=_crol_(temp,1); /*循环左移函数,每次向左移一位,使其第1,2,3……依次为0*/delay(100); //延时0.1sP1=temp; //将temp值赋给P1使}}void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。

单片机实验蜂鸣器和流水灯

单片机实验蜂鸣器和流水灯

}
unsigned int a;//定义循环变量 unsigned char b;
do{ for(b=0;b<46;b++)//46个花样轮流显示 { for(a=0;a<10000;a++);//延时一段时间 P0=design[b];//读已定义的花样数据并将其输出到P0口 }
}while(1);
实验一流水灯蜂鸣器led流水灯模块led流水灯由8只发光二板管组成阳极通过限流电阻接至5v电源阴极可由jp4跳线至51单片机p0端口进行控制
单片机实验蜂鸣器和流水灯
LED流水灯模块
LED流水灯由8只发光二板管组成,阳极通过限流电阻接至5V电源, 阴极可由JP4跳线至51单片机P0端口进行控制。
LED流水灯的供电电路。
JP4:利用短路帽将P0口与8只LED发光管 连接,通过控制P0口线的输出控制8只LED 的亮/灭。
参考程序
#include <reg51.h>
void main(void)
{
//定义流水灯的花样数据
unsigned char code design[46]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
参考程序Biblioteka #include <reg51.h>
sbit beep=P2^6;
void delay(const unsigned int DELAY)
{
unsigned int x, y;
for (x = 0; x <= DELAY; x++)
{
for (y = 0; y <= 120; y++);

TX-1C 单片机开发板实验

TX-1C 单片机开发板实验
【实验说明】
关于按键去抖动的解释,我们在手动按键的时候,由于机械抖动或是其它一些非人为 的因素很有可能会造成误识别,一般手动按下一次键然后接着释放,按键两片金属膜接触的 时间大约为 50ms 左右,在按下瞬间到稳定的时间为 5-10ms,在松开的瞬间到稳定的时间也 为 5-10ms,如果我们在首次检测到键被按下后延时 10ms 左右再去检测,这时如果是干扰 信号将不会被检测到,如果确实是有键被按下,则可确认,以上为按键识别去抖动的原理。
【硬件电路】
25
【程序代码】
#include<reg51.h>
#define uchar unsigned char
uchar j,k,i,a,A1,A2,second; sbit dula=P2^6;
//锁存器控制端定义
sbit wela=P2^7;
uchar code table[]= {
//数字编码
参考程序:
程序一:
ORG 0000H AJMP START
ORG 000BH AJMP TIME0
;定时器 0 的中断向量地址 ;跳转到真正的定时器程序处
ORG 0030H
START:
MOV P1,#0FFH ;关所有灯
MOV TMOD,#00000001B ;定时/计数器 0 工作于方式 1
MOV TH0,#15H
【实验说明】
本开发板上数码管为共阴极。静态数码管显示原理(视频中有详细介绍):这里就共阴极数 码管显示原理进行讲解,一位数码管内一共有 8 个发光二极管,对共阴极来说其 8 个发光二极 管的阴极在数码管内部全部接在一起,也就是“共阴”说法的来源,阳极是独立的,设计电路时 一般把阴极接地,当我们从外部给任一个阳极加一个高电平时这个发光二极管就亮了,如果想要 出一个 8 字,并且把右下角的小数点也点亮的话,那可以给 8 个阳极全送高电平,想让数码管 显示几就给相对应的发光二极管送高电平,因此我们在显示数字的时候首先做的就是给 0-9 十个 数字编好码,在要它亮什么数字的时候直接把这个编码送到它的阳极就行了。另外说一下,一般 的数码管每一段亮至少需要 10 个毫安的电流,而单片机的 IO 口送不出如此大的电流,所以我 们需要加数码管的驱动电路,可以用上拉电阻的方法,也可以使用专门的驱动芯片,本开发板使 用的 74HC573,其输出电流较大,足够点亮数码管。本开发板上的六位数码管中每个相同段号 (段指 a,b,c,d,e,f,g,h)全部是接在一起的,其中每一个位(阴极)是独立的,所以在做静态显 示的时候所有的数码管只能显示相同的数字,当然可以控制哪几位显示,如果让它们显示不同的 数字那就得给每一个数码管加一套驱动电路了。但这样做是没有必要的,后面我们会讲到关于数 码管动态显示原理。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一
流水灯、蜂鸣器
LED流水灯模块

LED流水灯由8只发光二板管组成,阳极通过限流电阻接至5V电源, 阴极可由JP4跳线至51单片机P0端口进行控制。
LED流水灯的供电电路。 JP1是显示电路供电选择跳线。显示电路有LED数码管、LED流水灯、字符 型LCD1602、点阵型LCD12864、点阵LED屏,通过JP1的跳线选择可以对不 同显示电路供电。通常不要对2个及2个以上的显示电路供电,以免互相 影响。
蜂鸣器模块

主板有一只有源蜂鸣器,由PNP型三极管驱动,如下图所示。驱动信 号可通过JP13跳线选择由51单片机的P2.6端口提供。
蜂鸣器电路图
参考程序



#include <reg51.h> sbit beep=P2^6; void delay(const unsigned int DELAY) { unsigned int x, y; for (x = 0; x <= DELAY; x++) { for (y = 0; y <= 120; y++); } } void main(void) { while(1) { beep=1; delay(1000); beep=0; delay(1000); } }

LED流水灯电路图
跳线连接
JP1:用短路帽把5V电源供给流水灯。 (Power for:Water LED) JP4:利用短路帽将P0口与8只LED发光管 连接,通过控制P0口线的输出控制8只LED 的亮/灭。

参考程序

#include <reg51.h> void main(void) { //定义流水灯的花样数据 unsigned char code design[46]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff, 0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x0, 0xe7,0xdb,0xbd,0x7e,0xff,0xff,0x7e,0xbd,0xdb,0xe7,
思考题

用C51写一段程序,让蜂鸣器报警的同时8 个LED灯全亮,蜂鸣器不叫时,LED灯全灭。 蜂鸣器鸣叫的周期为1秒(即响500ms,停 500ms)。

0x0,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};

ห้องสมุดไป่ตู้

unsigned int a;//定义循环变量 unsigned char b; do{ for(b=0;b<46;b++)//46个花样轮流显示 { for(a=0;a<10000;a++);//延时一段时间 P0=design[b];//读已定义的花样数据并将其输出到P0口 } }while(1); }
相关文档
最新文档