内科大信息学院单片机实验

更新时间:2023-09-30 17:45:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

内科大信息学院单片机实验 实验2流水灯

方法1汇编语言

ORG 0000;由单片机型号决定 LJMP main

ORG xxxx;主程序存放的地址

main:mov R0,#8;一个循环需要移动8位

mov a,#01111111b;初始为P0.7灯点亮,其他不亮 setb c;进位为1

loop:mov p1,a;P0.7灯点亮 acall DELAY;延时

rrc a;将A中的数据连循环右移1位10111111 djnz R0,loop;移动不够8位,跳到LOOP处循环

ljmp main;流动点亮1遍后,跳转到MAIN处再循环。 延时:

DELAY:MOV R0,#255;延时一段时间 D1:MOV R1,#255 DJNZ R1,$ DJNZ R0,D1 RET;子程序返回

实现50ms延时,可编写程序如下: DEL:MOV R3,#200 DEL1:MOV R2,#125

DEL2:DJNZ R2,DEL2;125*2=250μs DJNZ R3,DEL1;0.25ms*200=50ms

实验箱单片机外接晶振频率为11.0592MHz,执行一条单周期指令(如:MOV)时间约为1μs,执行一条双周期指令(如:DJNZ)约为2μs。以上程序计算延时时间为: (250+1+2)*200+2=50.602(ms) 方法2.C语言程序 void main()//主函数 {a=0xfe;//给a赋值 while(1)

{P0=a;//给P0口赋值,第一个等亮a为1111 1110,其他不亮 a=~a;//求反a,为0000 0001

a=a<<1;//左移位,a为0000 0010

a=~a;//求反还原a。准备第二个亮灯字a为1111 1101 delay(500);

if(a==0x7f)//如果a是第八个亮灯字 {P0=0x7f;//第八个灯亮一次,,其他不亮 delay(500);

a=0xfe;//准备第一个灯亮灯字,然后无限循环 } } }

实验3音乐蜂鸣器

让蜂鸣器分别产生“多,来,咪,发,索,啦,西”七个音阶; 计算‘do’音对应的脉冲周期:1/261.6≈3.8ms,半个周期为:1.9ms

ORG 0000H;由单片机型号决定 LJMP START

ORG xxxx;START程序存放的地址,如0100H START:CPL P1.0 MOV R0,#19

DEL1:MOV R1,#50

DEL2:DJNZ R1,DEL2;50*2=100μs DJNZ R0,DEL1;0.1ms*19=1.9ms SJMP START END 7个音符

依据键盘(7个键)的动作发出相应的声音,程序如下(实验3) 思路:

蜂鸣脉冲高(低)电平的宽度用定时器T0定时

设内存30H,31H分别存放蜂鸣脉冲高低电平的宽度之定时器初值 定时器定时时间到,将蜂鸣器驱动引脚电平取反 Buzz EQP p1.0;端口命名

ORG 0000H;由单片机型号决定 LJMP MAIN

ORG 000BH;定时器T0中断入口地址 LJMP INT-T0;跳转到定时器T0中断程序 ORG yyyy;主程序MAIN的首地址,如0100H MAIN:

MOV P1,#0FFH;为P1端口输入做准备

MOV TMOD,#01H;设定时器T0为工作模式1 SETB ET0;打开定时器0中断容许位 SETB EA;打开中断总容许位 CLR TR0;关闭定时器0

START:

MOV R0,P1;读P1口状态

CJNE R0,#0FFH,KEY1;R0≠0FFH,说明有键按下,跳到KEY1 CLR TR0;关闭定时器0

SJMP START;无键按下,再回去读P1口 KEY1:

CJNE R0,#0FEH,KEY2;不是KEY1键按下,转去判断KEY2键

MOV 30H,#0FBH;是KEY1键按下,设置“do”音节定时器初值,存30H和31H单元 MOV 31H,#0E9H

LJMP SET-TIMER;跳转去启动定时器0 KEY2:

CJNE R0,#0FDH,KEY3;不是KEY2键按下,转去判断KEY3键 MOV 30H,#0FCH;设置“ruai”音节2,存30H和31H单元 MOV 31H,#05CH

LJMP SET-TIMER;跳转去启动定时器0 KEY3:

CJNE R0,#0FBH,KEY4;不是KEY3键按下,转去判断KEY4键 MOV 30H,#0FCH;设置“mi”音节 MOV 31H,#0C1H LJMP SET-TIMER KEY4:

CJNE R0,#0F7H,KEY5;不是KEY4键按下,转去判断KEY5键 MOV 30H,#0FCH;设置“fa”音节 MOV 31H,#0EFH LJMP SET-TIMER KEY5:

CJNE R0,#0EFH,KEY6;不是KEY5键按下,转去判断KEY6键 MOV 30H,#0FDH;设置“sao”音节 MOV 31H,#045H LJMP SET-TIMER KEY6:

CJNE R0,#0FEH,KEY7;不是KEY6键按下,转去判断KEY7键 MOV 30H,#0FDH;设置“la”音节 MOV 31H,#092H LJMP SET-TIMER KEY7:

CJNE R0,#0BFH,NOKEY;不是KEY7键按下,转去NOKEY键(无按键) MOV 30H,#0FDH;设置“xi”音节 MOV 31H,#0D6H SET-TIMER:

MOV TH0,30H;设置定时器初值 MOV TL0,31H

SETB TR0;启动定时器T0 SJMP START;跳回读键盘程序

NOKEY:

CLR TR0;无键按下

SJMP START;跳回读键盘程序 INT-T0:;定时器T0中断服务cx

MOV TH0,30H;将音节写入定时器T0(定时初值) MOV TL0,31H

CPL BUZZ;蜂鸣器端口取反(送脉冲) RETI END

实验4中断

#include

#define uchar unsigned char #define uint unsigned int sbit INT_1=P3^1; sbit buzz=P1^7; bit flag;

uchar num=0,i=0,k=0xfe;

//uchar code temp[]={0,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void int_timeT1(void); //外部中断1初始化

void int_T1(void);//定时器1初始化

void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t);//ms级延时 void song(int x);//蜂鸣器程序 void main() {

int_timeT1();//外部中断1初始化

while(1) {

if(flag==1) {

song(2); P1=0x7f; }

else if(!flag) {

DelayMs(10);//延时去抖,一般10-20ms int_T1(); //定时器1初始化 while(!flag);

} } }

void int_T1(void)//定时器T1中断初始化 {P1=k;

TMOD|=0x10;//工作方式1 ET1=1; EA=1; TR1=1;

TH1=(65536-50000)/256;

TL1=(65536-50000)%6;//赋初值50ms }

void T1_time()interrupt 3 //定时器1中断子程序 {

TH1=(65536-50000)/256; TL1=(65536-50000)%6;

if(num<20) {

num++; }

else if(num==20) {

num=0; k<<=1; k=k|0x01; i++; P1=k; if(i==7) {

k=0xfe; P1=k; i=0; } } }

void int_timeT1(void) //外部中断1初始化 {

IT1=0;//低电平触发 EX1=1;

本文来源:https://www.bwwdw.com/article/p7fd.html

Top