单片机实验参考程序
单片机实验程序
实验1 基本I/O口赋值ORG 0000HAJMP MAINORG 0030HMOV P0,#7FHACALL DELAYMOV P0,#0BFHACALL DELAYMOV P0,#0DFHACALL DELAYMOV P0,#0EFHACALL DELAYMOV P0,#0FEHACALL DELAYMOV P0,#0FDHACALL DELAYMOV P0,#0FBHACALL DELAYMOV P0,#0F7HACALL DELAYMOV P0,#0EFHACALL DELAYMOV P0,#0DFHACALL DELAYMOV P0,#0BFHACALL DELAYMOV P0,#7FHACALL DELAYAJMP MAIN DELAY: MOV R1,#255 LOOP1:MOV R2, #255 LOOP2: DJNZ R2,$DJNZ R1,LOOP1RETEND2、实验二独立按键识别ORG 0000HAJMP MAINORG 0030HMAIN: MOV P0,#0FFHMOV A,#0FFHW AIT: MOV P0,AJB P3.0,WAITACALL DELAYCPL AACALL DELAYMOV P0,#7FHACALL DELAYMOV P0,#0BFHACALL DELAYMOV P0,#0DFHACALL DELAYMOV P0,#0EFHACALL DELAYMOV P0,#0FEHACALL DELAYMOV P0,#0FDHACALL DELAYMOV P0,#0FBHACALL DELAYMOV P0,#0F7HACALL DELAYMOV P0,#0EFHACALL DELAYMOV P0,#0DFHACALL DELAYMOV P0,#0BFHACALL DELAYMOV P0,#7FHACALL DELAYJMP W AITDELAY: ;误差0usMOV R7,#04HDL1:MOV R6,#74HDL0:MOV R5,#0D6HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1NOPRET实验三:矩阵键盘识别#include <AT89X51.H>unsigned char key;unsigned char Tab[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00};//按键延时程序void ys(){unsigned char aaa,bbb;for(aaa=200;aaa>0;aaa--)for(bbb=0;bbb<200;bbb++);}void main(void){key=0;while(1){P3=0x7f;if(P3!=0x7f){ys();if(P3!=0x7f){switch(P3){case 0x77:key=12;break;case 0x7b:key=8;break;case 0x7d:key=4;break;case 0x7e:key=0;break;}P0=~key;}}P3=0xbf;if(P3!=0xbf){ys();if(P3!=0xbf){switch(P3){case 0xb7:key=13;break;case 0xbb:key=9;break;case 0xbd:key=5;break;case 0xbe:key=1;break;}P0=~key;}}P3=0xdf;if(P3!=0xdf){ys();if(P3!=0xdf){switch(P3){case 0xd7:key=14;break;case 0xdb:key=10;break;case 0xdd:key=6;break;case 0xde:key=2;break;}P0=~key;}}P3=0xef;if(P3!=0xef){ys();if(P3!=0xef){switch(P3){case 0xe7:key=15;break;case 0xeb:key=11;break;case 0xed:key=7;break;case 0xee:key=3;break;}P0=~key;}}P2=Tab[key];P0=0XFE;}}实验四:秒脉冲定时器ORG 0000HLJMP MAINORG 000BHLJMP INTT0ORG 0030HMAIN:MOV TMOD,#01HMOV TL0,#0B0HMOV TH0,#3CHSETB EASETB ET0SETB TR0MOV R0,#40MOV R1,#0SJMP $INTT0:MOV TL0,#0B0HMOV TH0,#3CHDJNZ R0,INTT0ENDMOV R0,#40LCALL MIAOINTT0END:RETIMIAO:INC R1CJNE R1,#10,NEXTMOV R1,#0NEXT: MOV DPTR,#DUANMOV A,R1MOVC A,@A+DPTRMOV P2,AMOV P0,#0FEHRETDUAN: DB 0FCH, 060H, 0DAH, 0F2HDB 066H, 0B6H, 0BEH, 0E0HDB 0FEH, 0F6H, 0EEH, 03EHDB 09CH, 07AH, 09EH, 08EHEND实验五:按键计数器#include<AT89X51.H>unsigned char Tab[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0 ,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00};unsigned char b=0,a=0;void ys(unsigned int t){unsigned int aaa,bbb,cc=0;for(aaa=t;aaa>0;aaa--){ for(bbb=0;bbb<150;bbb++) ;if((a==9)&(b==9)) {a=0;b=0;}if(a==10) {b=b+1;a=0;}if (cc==0){P2=Tab[a];P0=0xFE; cc=1 ;}else {P2=Tab[b];P0=0xFD;cc=0;}}}void int0(void) interrupt 0{ys(10);if(P3_2==0){a++;ys(300);}}void main(void){EA=1;EX0=1;IT0=0;while(1) {ys(300);}}实验六:数码管并行静态显示#include <AT89X51.H>//*********数码管段显示代码表***********//unsigned char Tab[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0 ,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00};unsigned char mg=0,ms=0,bittime=20;//显示程序//void display(void){TI=0;SBUF=Tab[ms];while(!TI);TI=0;SBUF=Tab[mg];while(!TI);}//定时中断服务程序//void timer0 (void) interrupt 1 using 0{TH0=0x3c;TL0=0xb0;bittime--;while(bittime==0){ bittime=20;mg++;if(mg==10) {ms++;mg=0;}if(ms==6) ms=0;if((mg<6)&&(ms==0)) P0_0=~P0_0; else P0_0=1;display();//每经一秒调用一次显示程序}}//主程序void main(void){TMOD=0X01;SCON=0X00;TH0=0x3c;TL0=0xb0;EA=1;ET0=1;TR0=1;while(1);}实验七:动态扫描数字钟#include<AT89X51.H>unsigned char mg=0,ms=0,fg=0,bittime=0,bitdisplay=0;sbit key1=P3^0;sbit key2=P3^1;sbit key3=P3^2;unsigned char Tab []={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8 E,0x00};void delay(unsigned int t){ unsigned int i,j;for(i=0;i<t;i++){ for(j=0;j<200;j++);}}void timer0 (void) interrupt 1 using 0{TH0=0xE0;TL0=0xC0;switch(bitdisplay){case 0:P2=Tab[mg%10];P0=0xFE;break;case 1:P2=Tab[mg/10];P0=0xFD;break;case 2: P2=0x02;P0=0xFB;break;case 3:P2=Tab[ms%10];P0=0xF7;break;case 4:P2=Tab[ms/10];P0=0xEF;break;case 5:P2=0x02;P0=0xDF;break;case 6:P2=Tab[fg%10];P0=0xBF;break;case 7:P2=Tab[fg/10];P0=0x7F;break;}bitdisplay++ ;bittime++;if(bitdisplay==8){bitdisplay=0;}}void main(void){TMOD=0x01;TH0=0xE0;TL0=0xC0; EA=1;ET0=1;TR0=1;while(1){if(bittime==250){bittime=0;mg++;} if(mg==60){mg=0;ms++;}if(ms==60){ms=0;fg++;}else if(fg==24)fg=0;if(key1==0){delay(200);mg++;if(mg==60)mg==0;}if(key2==0){delay(200);ms++;if(ms==60)ms==0;}if(key3==0){delay(200);fg++;if(fg==24)fg==0;}}}单片机考试范围:1.考试开卷考试,时间50分钟;不允许带U盘、手机等电子存储设备。
单片机实验全部程序
实验一I /O口输出实验—LED流水灯实验源程序#include<reg52.h>#include<intrins.h>sbit out0 = P2^0;sbit out7 = P2^7;sbit in = P1^0;void delay() //延迟函数{unsigned char i,j;for(i = 0; i<255;i++){for(j = 0;j<255;j++);}}void main(){P2 = 0xfe;while(out7 == 1) //左移位{if(in == 0) //改进有键按下时循环(必须一直按下){delay();P2 = _crol_(P2,1);}}while(out0 == 1) //右移位{if(in == 0) //改进有键按下时循环(必须一直按下){delay();P2 = _cror_(P2,1);}}}实验二定时器实验实验源程序#include "reg51.h"#include <intrins.h>#define uchar unsigned char#define uint unsigned intLight_left_right(); /*从左往右流动*/Light_shining(); //灯闪烁delay(uint t){uint s,i;for(s=0;s<t;s++) /*延时*/for(i=0;i<255;i++);}initial() //初始化;{EA=1; //总中断开关打开;EX0=1; //允许外中断0中断;IT0=0; //外中断0电平触发;}void main(void){initial();P1=0xff;while(1){Light_shining();}}void inter_func() interrupt 0 //外中断0中断函数;{Light_left_right();}Light_shining() //灯闪烁{P1=0xff;delay(255);P1=0x00; //交替闪烁delay(255);}Light_left_right() /*从左往右流动*/ {uchar i;P1=0xfe; /*下移初始值*/delay(150);for(i=1;i<8;i++){P1=_crol_(P1,1);delay(150);}}实验原理图实验三单个外部中断实验实验源程序#include<reg52.h>#include <intrins.h>sbit in = P3^2;void delay_10ms(unsigned char delay_ms_num) //延时函数{unsigned int i,j,k;for(i = 0;i<=delay_ms_num;i++)for(j = 0;j<=100;j++)for(k = 0;k>=100;k++);}void tx_init() //中断初始化函数{EA = 1; //总中断开EX0 = 1; //外部中断0开IT0 = 0; //选择为电平触发方式}void main(){tx_init(); //中断初始化P2 = 0x00; //初始化P2口while(1) //延迟循环求反{delay_10ms(100);P2 = ~P2;}}void tx0_func() interrupt 0 //中断服务程序{P2 = 0xfe; //将P2口初始化while(1) //使LED流水显示{P2 = _crol_(P2,1);delay_10ms(100);if(in == 1) //扫描P3.2口若它没按下则跳出循环{break;}}P2 = 0x00; //出中断是对P2口初始化}实验原理图实验四双单片机通信实验实验源程序#include<reg52.h>unsigned char num = 10;unsigned char temp ;unsigned char r;sbit in = P1^7;void delay(); //延迟函数unsigned keyscan(); //键盘扫描函数void spi_init4800(); //波特率为4800void main(){spi_init4800();while(1){keyscan();switch(num) //接收按键号并输出给数码管{case 0:{P2 = 0xc0;r = 0xc0; delay();break;}case 1:{P2 = 0xf9;r = 0xf9;delay();break;}case 2:{P2 = 0xa4;r = 0xa4;delay();break;}case 3:{P2 = 0xb0;r = 0xb0;delay();break;}case 4:{P2 = 0x99;r = 0x99;delay();break;}case 5:{P2 = 0x92;r = 0x92;delay();break;}case 6:{P2 = 0x82;r = 0x82;delay();break;}case 7:{P2 = 0xf8;r = 0xf8;delay();break;}case 8:{P2 = 0x80;r = 0x80;delay();break;}case 9:{P2 = 0x90;r = 0x90;delay();break;}default:P2 = 0xff;}}}void delay() //延迟函数{unsigned char i,j;for(i = 0;j <= 5;j++)for(j = 0;j <=200;j++);}unsigned keyscan() //键盘扫描{P1=0xfe;temp = P1;temp=temp&0xf8;while(temp!=0xf8){delay();temp=P1;temp=temp&0xf8;while(temp!=0xf8){temp=P1;switch(temp){case 0xf6:num=1;break;case 0xee:num=4;break;case 0xde:num=7;break;}while(temp!=0xf8){temp=P1;temp=temp&0xf8;}}}P1=0xfd;temp=P1;temp=temp&0xf8;while(temp!=0xf8){delay();temp=P1;temp=temp&0xf8;while(temp!=0xf8){temp=P1;switch(temp){case 0xf5:num=2;break;case 0xed:num=5;break;case 0xdd:num=8;break;case 0xbd:num=0;break;}while(temp!=0xf8){temp=P1;temp=temp&0xf8;}}}P1=0xfb;temp=P1;temp=temp&0xf8;while(temp!=0xf8){delay();temp=P1;temp=temp&0xf8;while(temp!=0xf8){temp=P1;switch(temp){case 0xf3:num=3;break;case 0xeb:num=6;break;case 0xdb:num=9;break;;}while(temp!=0xf8){temp=P1;temp=temp&0xf8;}}}return num;}void spi_init4800() //波特率为4800{IE = 0x94; //总中断串行口中断和计数器一中断开SCON = 0x40; //八位异步收发,波特率可变// TCON = 0x04;PCON = 0x80; //波特率加倍TI = 0; //软件清零表示未发送完TMOD = 0x20; //8位自动装入模式TH1 = 0xfa; //装入初值TL1 = 0xfa;TR1 = 1; //启动T}void spi_send() interrupt 2 //外部中断1函数{EX1 = 0; //关外部中断1REN = 1; //准许串行口接收数据SBUF = r; //发送数据}void spi_sendfinish() interrupt 4 //定时器1中断函数{if(RI == 1) //查询接收数据完成标志位{RI = 0; //接收中断标志位清零P0 = SBUF; //P0口将接受的数据读出REN = 0; //禁止接收数据}elseTI = 0; //关定时器1中断EX1 = 1; //准许外部中断1}实验原理图实验五单片机与PC之间串行通信实验实验源程序#include<reg52.h>sbit KEY=P3^2;void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}void inti_com(void){SCON=0x50;TMOD=0x20;PCON=0x00;TH1=0xFD;TL1=0xFD;TR1=1;}void main(){inti_com();while(1){if(!KEY) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY) //再次确认按键是否按下,没有按下则退出{while(!KEY);//如果确认按下按键等待按键释放,没有释放则一直等待SBUF=0xAB;}}}}实验原理图实验六8255并行I/O扩展实验实验源程序#include<reg52.h>#include "absacc.h"/*#define up_pa8255 XBYTE[0XF8]//上一片的各端口及控制寄存器地址#define up_pb8255 XBYTE[0XF9]#define up_pc8255 XBYTE[0XFA]#define up_ctrl8255 XBYTE[0XFB]*/#define down_pa8255 XBYTE[0XFF7C]//下一片的各端口及控制寄存器地址#define down_pb8255 XBYTE[0XFF7D]#define down_pc8255 XBYTE[0XFF7E]#define down_ctrl8255 XBYTE[0XFF7F]void delay10ms(void){unsigned char i=0,j=0;for(i=0;i<20;i++)for(j=0;j<248;j++);}//------------------------------------------------void main(void){unsigned int temp;down_pa8255=0xff;delay10ms();down_ctrl8255=0x82;delay10ms();while(1){temp=down_pb8255;delay10ms();down_pa8255=temp;}}实验原理图实验七矩阵键盘扫描实验实验源程序#include <reg52.h> //52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit wei1=P2^0; //申明U1锁存器的锁存端sbit wei2=P2^1;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}void display(uchar num){P0=table[num]; //显示函数只送段选数据}void matrixkeyscan(){uchar temp,key;P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:key=2;break;case 0x7e:key=3;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}display(key);}}P1=0xfd;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xed:key=4;break;case 0xdd:key=5;break;case 0xbd:key=6;break;case 0x7d:key=7;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}display(key);}}P1=0xfb;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xeb:key=8;break;case 0xdb:key=9;break;case 0xbb:key=10;break;case 0x7b:key=11;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}display(key);}}P1=0xf7;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xe7:key=12;break;case 0xd7:key=13;break;case 0xb7:key=14;break;case 0x77:key=15;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}display(key);}}}void main(){wei1=0;wei2=1;P0=0x00;while(1){matrixkeyscan();//不停调用键盘扫描程序}}实验原理图实验八1602液晶显示的控制(44780)实验源程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]="windway a good news";//uchar code table1[]="5201314";sbit lcden=P2^2;sbit lcdrs=P2^0;sbit lcdrw=P2^1;#define LCD_Data P0uchar num;uchar num1[3];uint ii;//长延时void delay(void){uint x,y;for(x=5;x>0;x--)for(y=7269;y>0;y--);}//短延时void delay1(void){uint y;for(y=5552;y>0;y--);}uchar LCD_Status(void){lcdrs = 0;lcdrw = 1;lcden = 0;lcden = 0;lcden = 1;while (LCD_Data & 0x80); //检测忙信号return(LCD_Data);}//写命令void write_com(uchar com,busy){ if(busy) LCD_Status();lcdrs=0;lcdrw=0;P0=com;delay1();lcden=1;delay1();lcden=0;}//写数据void write_data(uchar date){ // LCD_Status();lcdrs=1;lcdrw=0;P0=date;delay1();lcden=1;delay1();lcden=0;}//初始化void init(){lcden=0;write_com(0x38,0);delay1();write_com(0x38,0);delay1();write_com(0x38,0);delay1();write_com(0x38,1);write_com(0x08,1);write_com(0x01,1);write_com(0x0e,1); //write_com(0x0c,1); //write_com(0x0e,1); 光标闪烁write_com(0x06,1);}//在指定位置写一个字符void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; // 算出指令码write_com(X,0); //这里不检测忙信号,发送地址码write_data(DData);}//写字符串void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar b=0;while (DData[b]>'\0') //若到达字串尾则退出{DisplayOneChar(X++, Y, DData[b++]); //显示单个字符if(X==16){X=0;Y^=1;}}}//主函数void main(){delay();init();DisplayListChar(0,0,table);while(1){}}实验原理图实验九A/D转换实验实验源程序#include<reg51.h>#include<stdio.h>#define uchar unsigned char#define uint unsigned int#define N 5uchar getdata;sbit ST=P2^1;sbit CLK=P2^0;sbit EOC=P2^3;sbit OE=P2^7;sbit P24=P2^4;sbit P25=P2^5;sbit P26=P2^6;void inital(){TMOD=0x01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;ET0=1;EA=1;TR0=1;}void intr()interrupt 1{TH0=(65536-2000)/256;TL0=(65536-2000)%256;CLK=~CLK;}void delayms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}void main(){P24=0;P25=0;P26=0;inital();while(1){P1=0xff;ST=0;OE=0;ST=1;delayms(1);ST=0;while(EOC==0);OE=1;getdata=P1;OE=0;P0=getdata;}}实验原理图实验十D/A转换实验实验源程序#include<reg52.h>sbit CS=P2^0;sbit WRDA=P2^1;void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}void main(){unsigned int i;CS=1;CS=0;WRDA=0;while(1){P1=0;DelayMs(1000);P1=0xff;DelayMs(1000);}}实验原理图实验十一温度传感器DS18B20实验实验源程序#include<reg52.h>#define DataPort P0bit ReadTempFlag;sbit COM2=P2^2;sbit COM1=P2^1;sbit ds18b20_dq=P3^7;#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuint Tn;float Td;bit fuhao;void delay15us(uint t) //!!正常的程序示波器显示稳定数据丰富,不正常的显示不稳定数据短,这种情况应该是时序问题{ //时序问题1.要准确测量延时函数的持续时间2.要看哪里遗漏了延时,或延时不够长,尤其是读完数据和写完数据之后for(t;t>0;t--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}_nop_();_nop_();_nop_();_nop_();}bit init_ds18b20(){bit flag; //判断是否初始化成功ds18b20_dq=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();ds18b20_dq=0;delay15us(31);ds18b20_dq=1;delay15us(2); //给18b20反映时间,等待它输出存在脉冲flag=ds18b20_dq; //检测总线上的低电平delay15us(31);//延时足够长时间,等待存在脉冲输出完毕return flag;}uint read_ds18b20(){uint i,dat;for(i=0;i<8;i++){ds18b20_dq=1;_nop_();ds18b20_dq=0;_nop_();ds18b20_dq=1;_nop_();_nop_();_nop_();_nop_(); //dat>>=1; //从低位开始读,用这种形式;从高位开始读,直接右移if(ds18b20_dq==1)dat|=0x80;elsedat|=0x00; //从总线读取数据delay15us(1); //每读完一位要延时一定时间//!!!错误原因点之一:此处延时3个微妙太短了}return dat;}void write_ds18b20(uchar date){uint i,dat;dat=date;for(i=0;i<8;i++){ds18b20_dq=1;_nop_();ds18b20_dq=0;ds18b20_dq=dat&0x01; //数据写到总线上dat=dat>>1;delay15us(1); //等待18b20检测到数值ds18b20_dq=1;//_nop_(); //每写完一位要延时一定时间}//_nop_(); //稍作延时,给硬件一点反应时间}/*****************************************************函数功能:做好读温度的准备***************************************************/void ReadyReadTemp(){init_ds18b20(); //将DS18B20初始化write_ds18b20(0xCC); //跳过读序号列号的操作write_ds18b20(0x44); //启动温度转换//delay(200); //转换一次需要延时一段时间init_ds18b20(); //将DS18B20初始化write_ds18b20(0xCC); //跳过读序号列号的操作write_ds18b20(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位}readc_ds28b20(){uchar dh,dl;ReadyReadTemp();dl=read_ds18b20(); //低八位dh=read_ds18b20(); //高八位if((dh&0xf8)==0xf8){dh=~dh;dl=~dl+1; //这里的数据判断,转换没有任何问题fuhao=1;if(dl>255)dh=dh+1;}elsefuhao=0;Tn=dh*16+dl/16; //整数部分Td=(dl%16)*10/16; //小数部分*10/16可以把16进制小数变成10进制小数}void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}void main(){Tn=0;COM1=0;COM2=0;while(1){readc_ds28b20();DataPort=Tn%10;COM2=1;DelayMs(40);COM2=0;DataPort=(Tn%100)/10;COM1=1;DelayMs(40);COM1=0;}}实验原理图实验十二直流电机控制实验实验源程序#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit K1=P3^4;sbit K2=P3^5;sbit DW_PWM = P3^7;//定义电机信号输出端口sbit DW_DIR = P3^6; //控制电机正反转,DW_DIR = 1,正转;DW_DIR = 0,反转void DelayUs2x(unsigned char t);//us级延时函数声明void DelayMs(unsigned char t); //ms级延时void main (void){unsigned char i;DW_DIR = 1;while (1) //主循环{if(!K1) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!K1) //再次确认按键是否按下,没有按下则退出{while(!K1);//如果确认按下按键等待按键释放,没有释放则一直等待{i=i-1;//释放则执行需要的程序}}}if(!K2) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!K2) //再次确认按键是否按下,没有按下则退出{while(!K2);//如果确认按下按键等待按键释放,没有释放则一直等待{i=i+1;//释放则执行需要的程序}}}DW_PWM=1;DelayMs(20+i);DW_PWM=0;DelayMs(20-i);}}void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}实验原理图实验十三步进电机控制实验实验源程序#include <reg52.h>sbit K1=P0^0;sbit K2=P0^1;sbit A1=P2^0; //定义步进电机连接端口sbit B1=P2^1;sbit C1=P2^2;sbit D1=P2^3;#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电unsigned char Speed;void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------主函数------------------------------------------------*/main(){//unsigned int K1,K2;旋转一周时间Speed=10;Coil_OFF;K1=1;K2=1;while(!K1) //正向{Coil_A1DelayMs(Speed);Coil_DA1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替DelayMs(Speed); //改变这个参数可以调整电机转速,//数字越小,转速越大,力矩越小Coil_D1DelayMs(Speed);Coil_CD1DelayMs(Speed);Coil_C1DelayMs(Speed);Coil_BC1DelayMs(Speed);Coil_B1DelayMs(Speed);Coil_AB1DelayMs(Speed);}while(!K2)//反向{Coil_A1DelayMs(Speed);Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替DelayMs(Speed); //改变这个参数可以调整电机转速,//数字越小,转速越大,力矩越小Coil_B1DelayMs(Speed);Coil_BC1DelayMs(Speed);Coil_C1DelayMs(Speed);Coil_CD1DelayMs(Speed);Coil_D1DelayMs(Speed);Coil_DA1DelayMs(Speed);}Coil_OFF;}实验原理图实验十四直流电机测速实验实验源程序#include <reg52.h>unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};unsigned char temp[8];unsigned char dispcount;unsigned char T0count;unsigned char timecount;bit flag;unsigned long x;void main(void){unsigned char i;TMOD=0x15;TH0=0;TL0=0;TH1=(65536-5000)/256;TL1=(65536-5000)%256;TR1=1;TR0=1;ET0=1;ET1=1;EA=1;while(1){if(flag==1){flag=0;x=T0count*65536+TH0*256+TL0;for(i=0;i<8;i++){temp[i]=0;}i=0;while(x/10){temp[i]=x%10;x=x/10;i++;}temp[i]=x;for(i=0;i<6;i++){dispbuf[i]=temp[i];}timecount=0;T0count=0;TH0=0;TL0=0;TR0=1;}}}void t0(void) interrupt 1 using 0 {T0count++;}void t1(void) interrupt 3 using 0 {TH1=(65536-5000)/256;TL1=(65536-5000)%256; timecount++;if(timecount==200){TR0=0;timecount=0;flag=1;}P2=0xff;P0=dispcode[dispbuf[dispcount]];P2=dispbit[dispcount];dispcount++;if(dispcount==8){dispcount=0;}}实验原理图实验十五16X16阵列LED显示实验源程序#include <reg51.h>#define uint unsigned int#define uchar unsigned charunsigned char code hanzi[]={//哈(0) 尔(1) 滨(2) 冰(3) 雪(4) 节(5) 欢(6) 迎(7)你(8)0x00,0x40,0x00,0x40,0x08,0xA0,0x7C,0xA0,0x49,0x10,0x49,0x08,0x4A,0x0E,0x4D,0xF4,0x48,0x00,0x48,0x08,0x4B,0xFC,0x7A,0x08,0x4A,0x08,0x02,0x08,0x03,0xF8,0x02,0x08,/*"哈",0*/0x08,0x00,0x08,0x00,0x08,0x00,0x1F,0xFC,0x10,0x04,0x21,0x08,0x41,0x00,0x81,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,/*"尔",1*/0x00,0x80,0x20,0x40,0x17,0xFE,0x14,0x02,0x88,0x14,0x43,0xE0,0x4A,0x00,0x0A,0x00,0x13,0xFC,0x12,0x10,0xE2,0x10,0x2F,0xFE,0x20,0x00,0x21,0x10,0x22,0x08,0x04,0x04,/*"滨",2*/0x00,0x40,0x40,0x40,0x20,0x40,0x20,0x44,0x00,0x68,0x07,0x70,0x11,0x60,0x11,0x50,0x21,0x50,0xE2,0x48,0x22,0x48,0x24,0x44,0x28,0x42,0x20,0x40,0x21,0x40,0x00,0x80,/*"冰",3*/0x3F,0xF8,0x01,0x00,0x7F,0xFE,0x41,0x02,0x9D,0x74,0x01,0x00,0x1D,0x70,0x00,0x00,0x3F,0xF8,0x00,0x08,0x00,0x08,0x1F,0xF8,0x00,0x08,0x00,0x08,0x3F,0xF8,0x00,0x08,/*"雪",4*/0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x08,0x20,0x00,0x00,0x7F,0xF8,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0x50,0x02,0x20,0x02,0x00,0x02,0x00,0x02,0x00,/*"节",5*/ 0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,0x05,0x04,0x49,0x08,0x2A,0x40,0x14,0x40,0x10,0x40,0x28,0xA0,0x24,0xA0,0x45,0x10,0x81,0x10,0x02,0x08,0x04,0x04,0x08,0x02,/*"欢",6*/ 0x00,0x00,0x20,0x80,0x13,0x3C,0x12,0x24,0x02,0x24,0x02,0x24,0xF2,0x24,0x12,0x24,0x12,0x24,0x12,0xB4,0x13,0x28,0x12,0x20,0x10,0x20,0x28,0x20,0x47,0xFE,0x00,0x00,/*"迎",7*/ 0x08,0x80,0x08,0x80,0x08,0x80,0x11,0xFE,0x11,0x02,0x32,0x04,0x34,0x20,0x50,0x20,0x91,0x28,0x11,0x24,0x12,0x24,0x12,0x22,0x14,0x22,0x10,0x20,0x10,0xA0,0x10,0x40/*"你",8*/ };void delay(uchar z){uchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar jiaohuan(uchar dat){uchar i,b;for(i=0;i<8;i++){b<<=1;if((dat&0x01)==1){b=b|0x01;}elseb=b&0xfe;dat>>=1;}return b;}void main(void){uchar i,j,k,temp1,temp2;while(1){for(j=0;j<9;j++) //对9字进行切换{for(k=0;k<180;k++) //一个字循环24次{for(i=0;i<16;i++) //动态显示一个字{temp1=hanzi[2*i+32*j];temp2=hanzi[2*i+1+32*j];P0=~temp1;P2=~temp2;delay(1);P1=i+1;}}}}}实验原理图。
单片机实验参考程序
1、使四个灯全亮#include<reg51.h>void main(){P1=0x0f; /*P1=00001111,p1引脚低四位置高电平点亮四个灯*/ }2、跑马灯#include<reg51.h>int c=0,i=0;unsigned int a=0x01;void main(){EA=1; /*开中断*/ET0=1; /*定时器T0中断允许*/TMOD=0x01; /*使用定时器T0的方式1*/TH0=(65536-46083)/256; /*T0高8位赋值*/TL0=(65536-46083)%256; /*T0低8位赋值*/TR0=1; /*启动定时器T0*/while(1) /*开始循环等待中断*/;}void timer0(void)interrupt 1 /*定时器中断函数*/{c++;if(c==20){i++;if(i%2!=0){P1=~a;a<<=1;if(a==0x10) a=0x01;}else P1=0xff;c=0;}TH0=(65536-46083)/256; /*T0高8位赋值*/TL0=(65536-46083)%256; /*T0低8位赋值*/}3、PCF8576芯片驱动的液晶显示“ENG”#include <intrins.h>#include <reg51.h>#define uchar unsigned char /*宏定义*/#define uint unsigned int#define _Nop() _nop_() /*定义空指令*//* 常,变量定义区 *//*端口位定义*/sbit SDA=P1^7; /*模拟I2C数据传送位*/sbit SCL=P1^6; /*模拟I2C时钟控制位*//*状态标志*/bit ack; /*应答标志位*//******************************************************************* **起动总线函数函数原型: void Start_I2c();功能:启动I2C总线,即发送I2C起始条件******************************************************************** /void Start_I2c(){SDA=1; /*发送起始条件的数据信号*/_Nop();SCL=1;_Nop(); /*起始条件建立时间大于4.7us,延时*/_Nop();_Nop();_Nop();_Nop();SDA=0; /*发送起始信号*/_Nop(); /* 起始条件锁定时间大于4μs*/_Nop();_Nop();_Nop();_Nop();SCL=0; /*钳住I2C总线,准备发送或接收数据 */_Nop();_Nop();}/***********************************************结束总线函数函数原型: void Stop_I2c();功能:结束I2C总线,即发送I2C结束条件***********************************************/void Stop_I2c(){SDA=0; /*发送结束条件的数据信号*/_Nop(); /*发送结束条件的时钟信号*/SCL=1; /*结束条件建立时间大于4μs*/_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1; /*发送I2C总线结束信号*/_Nop();_Nop();_Nop();_Nop();}/******************************************************************* 字节数据传送函数函数原型: void SendByte(uchar c);功能:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作(不应答或非应答都使ack=0 假) 。
单片机实验程序 (排版后)
;实验一P1口的输入输出ORG 0000HLJMP LOOPLOOP:MOV A,#01HMOV R2,#4OUTPUT:MOV R3,20OUTPUT1:MOV P1,AACALL DELAYDJN2R3,OUTPUT1RL ADJN2R2,OUTPUTLJMPLOOPDELAY1:MOV RT,#125DELAY LOOP:DJN2R6,DELAY LOOPDJN2R7,DELAU LOOPRETEND;实验一P1口循环点灯程序OUTBIT equ 08002hOUTSEG equ 08004hIN equ 08001hLEDBuf equ 40hORG 0000Hljmp StartORG 0100HLEDMAP:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07hdb 7fh, 6fh,77h,7ch,39h,5eh,79h,71hdb 00h,49h,6EhDelay:mov r7,#00DelayLoop:djnz r7,DelayLoopdjnz r6,DelayLoopretDisplayLED:mov r0,#LEDBufmov r1,#6mov r2,#00100000bLoop:mov dptr,#OUTBITmov a,#0movx @dptr,a ;关所有八段管mov a,@r0MOV DPTR,#LEDMapMOVC A,@A+DPTRmov dptr,#OUTSEGmovx @dptr,amov dptr,#OUTBIT ;立即数送数据指针mov a,r2movx @dptr,a ;外部RAM(16位写操作),显示一位8段管mov r5,#200 ;改为200,可看到闪烁(逐位显示)call Delaymov a,r2 ;显示下一位rr amov r2,ainc r0djnz r1,Loopmov dptr,#OUTBITmov a,#0movx @dptr,aretStart:mov sp,#60hMOV LEDBuf , #0DHMOV LEDBuf+1, #05HMOV LEDBuf+2, #0EHMOV LEDBuf+3, #11HMOV LEDBuf+4, #00HMOV LEDBuf+5, #04HDIRLOP:LCALL DisplayLED; 长子程序调用LJMP DIRLOP; 长转移END; 实验五八段数码管显示OUTBIT equ 08002hOUTSEG equ 08004hIN equ 08001hLEDBuf equ 40hORG 0000Hljmp STARTORG 0100HLEDMAP:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07hdb 7fh, 6fh,77h,7ch,39h,5eh,79h,71hdb 00h,49h,6Eh,36h,Delay:mov r7,#00DelayLoop:djnz r7,DelayLoopdjnz r6,DelayLoopretDisplayLED:mov r0,#LEDBufmov r1,#6mov r2,#00100000bLoop:mov dptr,#OUTBITmov a,#0movx @dptr,a ;关所有八段管mov a,@r0MOV DPTR,#LEDMapMOVc A,@A+DPTRmov dptr,#OUTSEGmovx @dptr,amov dptr,#OUTBIT ;立即数送数据指针mov a,r2movx @dptr,a ;外部RAM(16位写操作),显示一位8段管mov r6,#2 ;改为200,可看到闪烁(逐位显示)call Delaymov a,r2 ;显示下一位rr amov r2,ainc r0djnz r1,Loopmov dptr,#OUTBITmov a,#0movx @dptr,aretStart:mov sp,#60hMOV LEDBuf , #0DHMOV LEDBuf+1, #01HMOV LEDBuf+2, #01HMOV LEDBuf+3, #04HMOV LEDBuf+4, #05HMOV LEDBuf+5, #00HDIRLOP:LCALL DisplayLED; 长子程序调用LJMP DIRLOP; 长转移END; 实验六行列扫描式键盘OUTBIT EQU 08002H ; 位控制口OUTSEG EQU 08004H ; 段控制口IN EQU 08001H ; 键盘读入口LEDBUF EQU 60H ; 显示缓冲LJMP STARTLEDMAP:DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H ; 八段管显示码DB 7FH, 6fH, 77H, 7CH, 39H, 5EH, 79H, 71H DELAY:MOV R7,#01H; 延时子程序MOV R6,#01HDELAYLOOP:DJNZ R7,DELAYLOOPDJNZ R6,DELAYLOOPRETDISPLAYLED:MOV R0,#LEDBUFMOV R1,#06H; 共6个八段管MOV R2,#00100000B ; 从左边开始显示LOOP:MOV DPTR,#OUTBITMOV A,#0HMOVX @DPTR,A ; 关所有八段管MOV A,@R0MOV DPTR,#OUTSEGMOVX @DPTR,AMOV DPTR,#OUTBITMOV A,R2MOVX @DPTR,A ; 显示一位八段管MOV R6,#01HCALL DELAYMOV A,R2; 显示下一位RR AMOV R2,AINC R0DJNZ R1,LOOPRETTESTKEY:MOV DPTR,#OUTBITMOV A,#00HMOVX @DPTR,A ; 输出线置为0MOV DPTR,#INMOVX A,@DPTR ; 读入键状态CPL AANL A,#0FH ; 高四位不用RETKEYTABLE: DB 16H,15H,14H,0FFH ; 键码定义DB 13H,12H,11H,10HDB 0DH,0CH,0BH,0AHDB 0EH,03H,06H,09HDB 0FH,02H,05H,08HDB 00H,01H,04H,07HGETKEY:MOV DPTR, #OUTBITMOV P2, DPHMOV R0, #LOW(IN)MOV R1, #00100000BMOV R2, #06HKLOOP:MOV A, R1 ; 找出键所在列CPL AMOVX @DPTR, ACPL ARR AMOV R1,A ; 下一列MOVX A , @R0CPL AANL A, #0FHJNZ LOOP1 ; 该列有键入DJNZ R2, KLOOPMOV R2, #0FFH ;没有键按下, 返回0ffh SJMP EXITLOOP1: MOV R1,A ; 键值= 列X 4 + 行MOV A,R2DEC ARL ARL AMOV R2,A ; r2 = (r2-1)*4MOV A,R1 ; r1 中为读入的行值MOV R1,#04HLOOP2:RRC A ; 移位找出所在行JC EXITINC R2 ; r2 = r2+ 行值DJNZ R1,LOOP2Exit:MOV A, R2 ; 取出键码MOV DPTR, #KEYTABLEMOVC A,@A+DPTRMOV R2,AWAIT:MOV DPTR,#OUTBIT ; 等键释放CLR AMOVX @DPTR, AMOV R6, #10HCALL DELAYCALL TESTKEYJNZ W AITMOV A, R2RETSTART:MOV SP, #50HMOV LEDBUF+0, #3FH ; 显示8.8.8.8.MOV LEDBUF+1, #6DHMOV LEDBUF+2, #5BHMOV LEDBUF+3, #07HMOV LEDBUF+4, #0MOV LEDBUF+5, #0MAIN:CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JZ MAIN ; 无键入, 继续显示CALL GETKEYMOV R5,A ; 读入键码ANL A, #0FH ; 显示键码MOV DPTR, #LEDMAPMOVC A, @A+DPTRMOV LEDBUF+5,AMOV A,R5RR ARR ARR ARR AANL A, #0FHMOVC A, @A+DPTRMOV LEDBUF+4,ALJMP MAINEND;实验七外部中断LED EQU P1.0 ;p1.0口连接LED显示灯LEDBUF EQU 00H ;初始值设为0,即为低电平ORG 0000HLJMP STARTORG 0003H ;外部中断0(INT0)的入口地址LJMP INT0 ;跳转到中断入口处ORG 0100HSTART: MOV SP,#60H ;地址指针CLR LEDBUFCLR LEDMOV TCON,#01H ;初始化,设置为工作方式1MOV IE,#10000001B ;EA=1开中断,EX0=1外部中断0中断允许ORL IP,#0000H ;中断优先级设置LJMP $INT0:PUSH PSW ;程序状态字PSW内容压入堆栈保存CPL LEDBUF ;取反,即发生翻转MOV C,LEDBUFMOV LED,CPOP PSW ;恢复程序状态字PSW的内容RETIEND;实验八计数器ORG 0000HLJMP STARTORG 0100HLEDMAP:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7ch,39h,5eh,79h,71h START: MOV 40H,#00H ;千MOV 41H,#00H ;百MOV 42H,#00H ;十MOV 43H,#00H ;个MOV 44H,#05HMOV 45H,#00HMOV TMOD,#05H ;初始化,工作方式设置MOV TL0,#00H ;初值设为0,低4位MOV TH0,#00H ;初值设为0,高4位SETB TR0 ;TR0=1,启动计数器LOOP1:MOV R3,TL0 ;低位送到R3MOV A,R3ANL A,#0FH ;低八位低4位个MOV 43H,AMOV A,R3SW AP A ;高低位交换ANL A,#0FHMOV 42H,A ;低八位高4位十MOV R3,TH0 ;高位送到R3MOV A,R3ANL A,#0FH ;高八位低4位百MOV 41H,AMOV A,R3SW AP A ;高低位交换ANL A,#0FH ;高八位高4位千MOV 40H,AMOV R0,#40H ;数据缓冲区地址MOV R1,#6 ;循环次数MOV R2,#00100000B ;最高位开始显示LOOP2:MOV DPTR,#8002H ;送位地址CLR AMOVX @DPTR,A ;关所有位MOV A,@R0 ;去显示数据MOV DPTR,#LEDMAP ;送段码表首地址MOVC A,@A+DPTR ;由序码找段码MOV DPTR,#8004H ;送段口地址MOVX @DPTR,A ;送段码MOV DPTR,#8002H ;送位口地址MOV A,R2MOVX @DPTR,A ;显示位ACALL DELAY ;调用延时子程序MOV A,R2 ;取显示位RR A ;右移,下一位显示MOV R2,AINC R0 ;数据地址加1,准备取下一个数DJNZ R1,LOOP2 ;(R1-1)≠0,即6位未显示完,循环JMP LOOP1DELAY:MOV R6,#3 ;延时1msD1:MOV R7,#248DJNZ R7,$DJNZ R6,D1RETEND;实验九定时器;硬件:P1.0接T1,P1.7接LEDORG 0000HLJMP STARTORG 0000BHLJMP T0SORG 001BHLJMP T1SORG 0100HSTART:MOV TMOD,#01100001BMOV TL1,#0FBHMOV TH1,#0FBHMOV IE,#0FFHMOV IP,#00HCLR P1.0SETB TR1LOOP1:LOOP2:MOV TH0,#03CHMOV TL0,#0B0HSETB TR0;LOOP3:JBC TF0,LOOP4; SJMP LOOP3;LOOP:JBC TF1,LOOP1LOOP3:NOPNOPSJMP LOOP3T0S:CPL P1.0MOV TH0,#03CHMOV TL0,#0B0HRETIT1S:CPL P1.7RETIEND;实验十模拟量输入;AD_CS----CS1CS0832 EQU 09000HOUTBIT EQU 0A002H ;位显示地址OUTSEG EQU 0A004H ;段显示地址LEDBUF EQU 40H ;显示缓冲区地址CS0809 EQU 8000HRADING EQU 31H ;I0~I7通道号寄存器RAD EQU 32H ;AD值寄存器ORG 0000HLJMP MAINORG 0100HLEDMAP: DB3FH,06H,5BH,4FH,66H ;0~4DB6DH,7DH,07H,7FH,6FH ;5~9DB77H,7CH,39H,5EH,79H,71H ;A~F;延时子程序;*************************************** DELAY: MOV R7,#0FFHDL0: DJNZ R7,DL0DJNZ R6,DELAYRET;LED显示子程序;**************************************** DISPLAY:MOV R0,#LEDBUF ;送数据地址,即显示缓冲区地址MOV R1,#6 ;循环次数MOV R2,#20H ;从高位开始显示,即左边开始LOOP: MOV DPTR,#OUTBIT ;送位口地址MOV A,#00HMOVX @DPTR,A ;关断所有数码管MOV A,@R0 ;取显示数据MOV DPTR,#LEDMAP ;送段码表首地址MOVC A,@A+DPTR ;由序码求段码MOV DPTR,#OUTSEG ;送段口地址MOVX @DPTR,A ;段显示MOV DPTR,#OUTBIT ;送位口地址MOV A,R2 ;送显示位MOVX @DPTR,A ;位显示MOV R6,#03HCALL DELAY ;调用子程序MOV A,R2 ;送显示位RR A ;右移,准备显示下一位MOV R2,AINC R0 ;数据存储区加1,准备显示下一位DJNZ R1,LOOP ;循环六次MOV DPTR,#OUTBIT ;送位口地址MOV A,#00HMOVX @DPTR,A ;关断所有数码管RET;主程序;************************************MAIN: MOV SP,#60HMOV LEDBUF,#01HMOV LEDBUF+1,#01HMOV LEDBUF+2,#05HMOV LEDBUF+3,#00HMOV LEDBUF+4,#00HMOV LEDBUF+5,#00HMOV R5,#011H ;数字量应00到0FFH DIRLOP: LCALL DISPLAY ;调用显示子程序DJNZ R5,DIRLOP ;(R5-1)≠0,跳转ADLOOP:MOV RADING,#01H ;置初值LCALL AD ;调用AD转换子程序LCALL ADDIR ;调用读取和显示AD 转换结果子程序LCALL DISPLAY ;调用显示子程序LJMP ADLOOP ;循环AD: MOV DPTR,#CS0809 ;指向0通道MOV A,DPL ;ADD A,RADINGMOV DPL,AMOVX @DPTR,A ;启动AD转换MOV R5,#40H ;查询,是否转换结束DJNZ R5,$MOVX A,@DPTR ;读取转换结果MOV RAD,A ;送转换结果RETADDIR:MOV A,RAD ;取转换结果SWAP A ;交换高低位ANL A,#0FH ;低位清零MOV LEDBUF+4,A ;显示高位MOV A,RAD ;取转换结果ANL A,#0FH ;交换高低位MOV LEDBUF+5,A ;显示低位RETEND; 实验十一模拟量输出;DA_CS----CS1CS0832 EQU 09000HORG 0000HMOV DPTR,#CS0832 ;地址指向CS0832 LOOP:MOV A,#000H ;初值为0MOVX @DPTR,A ;数字量送CS0832转换MOV A,#020H ;增加值MOVX @DPTR,A ;数字量送CS0832转换MOV A,#040H ;增加数值MOVX @DPTR,A ;数字量送CS0832转换MOV A,#060H ;增加数值MOVX @DPTR,A ;数字量送CS0832转换MOV A,#080H ;增加数值MOVX @DPTR,A ;数字量送CS0832转换MOV A,#0A0H ;增加数值MOVX @DPTR,A ;数字量送CS0832转换MOV A,#0C0H ;增加数值MOVX @DPTR,A ;数字量送CS0832转换MOV A,#0D0H ;增加数值MOVX @DPTR,A ;数字量送CS0832转换MOV A,#0E0H ;增加数值MOVX @DPTR,A ;数字量送CS0832转换MOV A,#0FFH ;增加数值MOVX @DPTR,A ;数字量送CS0832转换LJMP LOOP ;循环;实验十二串行通信OUTBIT EQU 8002HOUTSEG EQU 8004HIN EQU 8001H ;键盘行地址RKEY EQU 46H ;键值存储区LEDBUF EQU 40H ;显示缓冲区地址RCVBUF EQU 50H ;存储串口接收到的值HASHRCV EQU 20H.0 ;任意设置的一个判断位ORG 0000HLJMP MAINORG 0023H ;串行口中断入口地址,见教材p89 JNB TI,SO_R ;判断TI是否置位,没有说明还未接收完,跳转CLR T INOPSJMP SO_RETSO_R: CLR RI ;将RI清零MOV RCVBUF,SBUFSETB HASHRCV;SO_RET: RETIORG 0100HLEDMAP: DB 3FH,06H,5BH,4FH,66HDB 6DH,7DH,07H,7FH,6FHDB 77H,7CH,39H,5EH,79H,71HDB 00H,49HDELAY: MOV R7,#0FAHDL0: DJNZ R7,DL0DJNZ R6,DELAYRETKEY: LCALL TESTKEYJZ KEYQ ;没有按下,跳转退出MOV R6,#10LCALL DELAY ;防抖延时10msLCALL TESTKEY ;再次确认JZ KEYQLCALL GETKEY ;取键值WAITREL:MOV DPTR,#OUTBITCLR AMOVX @DPTR,A ;对列置零MOV R6,#10LCALL DELAY ;防抖延时LCALL TESTKEYJNZ W AITREL ;没有松开继续循环KEYQ: RET;测试键值子程序TESTKEY:MOV DPTR,#OUTBITMOV A,#0HMOVX @DPTR,A ;对列置零(必须先对列置零,不然无法进行下面的判断)MOV DPTR,#IN ;读取行值,注意无键按下时,4条行线全为1MOVX A,@DPTRCPL AANL A,#0FH ;对行进行判断RET ;无键按下,返回的A值为0,有键按下时返回的A值不为0;得到键值子程序,原理为在某一行线为0的前提下,通过逐次给位线送0来GETKEY: MOV DPTR,#OUTBITMOV A,#11011111BMOVX @DPTR,A ;第5列置零MOV DPTR,#INMOVX A,@DPTRCPL AANL A,#0FHK58: CJNE A,#08H,K54 ;判断地本列的第一位行线是否按下,相等说明正是此键按下,否则转移MOV RKEY,#07H ;将键值存入LJMP GETKQ ;跳转K54: CJNE A,#04H,K52MOV RKEY,#04HLJMP GETKQK52: CJNE A,#02H,K51MOV RKEY,#01HLJMP GETKQK51: CJNE A,#01H,K48MOV RKEY,#00HLJMP GETKQK48: MOV DPTR,#OUTBITMOV A,#11101111BMOVX @DPTR,A ;第4列置零MOV DPTR,#INMOVX A,@DPTRCPL AANL A,#0FHCJNE A,#08H,K44MOV RKEY,#08HLJMP GETKQK44: CJNE A,#04H,K42MOV RKEY,#05HLJMP GETKQK42: CJNE A,#02H,K41MOV RKEY,#02HLJMP GETKQK41: CJNE A,#01H,K38MOV RKEY,#0FHLJMP GETKQK38: MOV DPTR,#OUTBITMOV A,#11110111BMOVX @DPTR,A ;第3列置零MOV DPTR,#INMOVX A,@DPTRCPL AANL A,#0FHCJNE A,#08H,K34MOV RKEY,#09HLJMP GETKQK34: CJNE A,#04H,K32MOV RKEY,#06HLJMP GETKQK32: CJNE A,#02H,K31MOV RKEY,#03HLJMP GETKQK31: CJNE A,#01H,K28MOV RKEY,#0EHLJMP GETKQK28: MOV DPTR,#OUTBITMOV A,#11111011BMOVX @DPTR,A ;第2列置零MOV DPTR,#INMOVX A,@DPTRCPL AANL A,#0FHCJNE A,#08H,K24MOV RKEY,#0AHLJMP GETKQK24: CJNE A,#04H,K22MOV RKEY,#0BHLJMP GETKQK22: CJNE A,#02H,K21MOV RKEY,#0CHLJMP GETKQK21: CJNE A,#01H,K18MOV RKEY,#0DHLJMP GETKQK18: MOV DPTR,#OUTBITMOV A,#11111101BMOVX @DPTR,A ;第1列置零MOV DPTR,#INMOVX A,@DPTRCPL AANL A,#0FHCJNE A,#08H,K14MOV RKEY,#10HLJMP GETKQK14: CJNE A,#04H,K12MOV RKEY,#11HLJMP GETKQK12: CJNE A,#02H,K11MOV RKEY,#12HLJMP GETKQK11: CJNE A,#01H,K08MOV RKEY,#13HLJMP GETKQK08: MOV DPTR,#OUTBITMOV A,#11111110BMOVX @DPTR,A ;第0列置零MOV DPTR,#INMOVX A,@DPTRCPL AANL A,#0FHK04: CJNE A,#04H,K02MOV RKEY,#14HLJMP GETKQK02: CJNE A,#02H,K01MOV RKEY,#15HLJMP GETKQK01: CJNE A,#01H,K00MOV RKEY,#16HLJMP GETKQK00: MOV RKEY,#0EEHSJMP GETKQGETKQ: RET;跳出;-----------------------------------;显示子程序DISPLAY:MOV R0,#LEDBUFMOV R1,#6 ;初始化MOV R2,#20HLOOP: MOV DPTR,#OUTBITMOV A,#00HMOVX @DPTR,A ;关断所有数码管MOV A,@R0MOV DPTR,#LEDMAPMOVC A,@A+DPTR ;由序码求段码MOV DPTR,#OUTSEGMOVX @DPTR,A ;段显示MOV DPTR,#OUTBITMOV A,R2MOVX @DPTR,A ;位显示MOV R6,#03HCALL DELAY ;调用子程序MOV A,R2RR AMOV R2,AINC R0DJNZ R1,LOOP ;循环六次MOV DPTR,#OUTBITMOV A,#00HMOVX @DPTR,A ;关断所有数码管RET;------------------------------------;主程序开始MAIN: MOV SP,#60HMOV IE,#00H ;置ES为0,禁止串行中断,教材p113MOV TMOD,#20H ;定时器方式T1控制,选择方式2(自动重装),定时MOV TH1,#0F3H ;重装载值???MOV TL1,#0F3H ;初装载值(每12个机器周期溢出一次),教材p99ANL PCON,#07FH ;波特率倍增位为0;ORL PCON,#80H ;或波特率倍增位为1MOV SCON,#50H ;串行口工作方式1,REN置1,允许接收SETB TR1 ;TR置1,启动定时器SETB ES ; ;允许串行中断SETB EA ;;开中断MOV LEDBUF,#01HMOV LEDBUF+1,#01HMOV LEDBUF+2,#01HMOV LEDBUF+3,#04HMOV LEDBUF+4,#05HMOV LEDBUF+5,#00HMLOOP: JB HASHRCV,RCVDATLCALL DISPLAYLCALL TESTKEYJZ MLOOP ;判断返回的A值是否为0,为0说明无键按下,继续做循环LCALL GETKEY ;A不为0,跳到得到键值子程序MOV A,RKEY ;将得到的键值取出MOV SBUF,A ;送入缓冲区,为接收做准备,并立即启动接收JNB RI,$ ;;R1为0则等待,此时说明循环六次结束LJMP RCVDAT ;将输入的键值显示出来MOV A,RKEY ; ;取键值ANL A,#0F0H ; ;地位清零SW AP AMOV LEDBUF+4,A ;显示高位MOV A,RKEYANL A,#0FHMOV LEDBUF+5,A ;显示低位LJMP MLOOPRCVDAT: CLR HASHRCV;清除标志位MOV A,RCVBUF ; ;接收数据ANL A,#0F0H ; ;低位清零SW AP AMOV LEDBUF,A ;显示高位MOV A,RCVBUFANL A,#0FHMOV LEDBUF+1,A ;显示低位LJMP MLOOPEND。
单片机实验步骤最新版本
实验一:IO实验1—流水灯一、实验程序//********************************************************************************* //程序:ex1.c//功能:采用循环结构实现的流水灯控制程序//实验箱上D1区J52接P1//********************************************************************************* #include<reg52.h> /*包含头文件REG51.H*/#define uchar unsigned char /*宏定义后方便书写*/#define uint unsigned int /*宏定义后方便书写*/#define LED P1 /*定义8个LED接至P1口*/void DelayMS(uint x); //延时函数声明void LED_Down(uint x); //单只LED依次灯下移点亮函数声明void LED_Up(uint x); //单只LED依次灯上移点亮函数声明void main() //主程序{while(1){LED_Down(3); //单只LED依次灯下移点亮三圈LED_Up(3); //单只LED依次灯上移点亮三圈}}//********************************************************************************* //函数名:LED_Down//函数功能:单只LED依次灯下移点亮//形式参数:uint x;下移点亮x圈//********************************************************************************* void LED_Down(uint x){uchar i,j;for(i=0;i<x;i++) //单只LED依次灯下移点亮x圈{LED=0xfe; //最上边的LED亮for(j=0;j<8;j++){DelayMS(250); //延时函数调用LED=(LED<<1)|0x01; //下移1位后,将LSB设为1,点亮下一个LED}}}//********************************************************************************* //函数名:LED_Up//函数功能:单只LED依次灯上移点亮//形式参数:uint x;上移点亮x圈//********************************************************************************* void LED_Up(uint x){uchar i,j;for(i=0;i<x;i++) //单只LED依次灯上移点亮x圈{LED=0x7f; //最下边的LED亮for(j=0;j<8;j++){DelayMS(250); //延时函数调用LED=(LED>>1)|0x80; //上移1位后,将MSB设为1,点亮上一个LED}}}void DelayMS(uint x) //延时函数{uint j,k; //定义无符号字符型变量j和kfor(k=0;k<x;k++) //双重for循环语句实现软件延时for(j=0;j<120;j++); //循环体为空循环}二、实验内容:1、基本内容(1)认真理解并读懂程序,将所给程序在KEIL中编译,产生HEX文件;(2)将程序烧写到实验箱中的单片机中;(3)连接实验箱中的硬件:(4)运行程序,在实验箱中实现程序功能。
单片机实验程序
单片机实验程序“模仿式”实验九工业顺序控制(int0.int1综合实验);掌控工业顺序控制的直观编程,中断的采用org0000hsjmpmainorg0013hljmpintomain:movp1,#00horlp3,#00hpo11:jnbp3.4,po11orlie,#84horlip,#04hmovpsw,#00hmovsp,#53hpo12:movp1,#01hacallpo1bhmovp1,#02hacallpo1bhmovp1,#04hacallpo1bhmovp1,#08hacallpo1bhmovp1,#10hacallpo1 bhmovp1,#20hacallpo1bhmovp1,#40hacallpo1bhsjmppo12;开工吗?;初始化;第一道工序;第二道工序;第三道工序;第四道工序;第五道工序;第六道工序;第七道工序into:movb,r2;维护现场po17:movp1,#00h;第一关输入mov20h,#0a0h;震荡次数po18:setbp1.7;震荡acallpo1a;延时clrp1.7;暂停acallpo1a;延时djnz20h,po18;不为零转clrp1.7acallpo1ajnbp3.3,po17;故障消解吗?movr2,b;恢复正常现场reti po19:movr2,#10h;延时1acalldelypo1a:movr2,#06hacalldelypo1bh:movr2,#30hacalldelydely:push02hdel2:push02hdel3:push02hdel4:djnzr2,del4pop02hdjnzr2,del3pop02hdjnzr2,del2pop02hdjnzr2,dely;延时2;延时3;延时子程序“恶搞式”实验九工业顺序控制(int0.int1综合实验);掌控工业顺序控制的直观编程,中断的采用org0000h sjmpmainorg0013hljmpintomain:movp1,#00horlp3,#00hpo11:jnbp3.4,po11orlie,#84horlip,#04hmovpsw,#00hmovsp,#53hpo12:movp1,#01hacallpo1bhmovp1,#02hacallpo1bhmovp1,#04hacallpo1bhmovp1,#08hacallpo1bhmovp1,#10hacallpo1 bhmovp1,#20hacallpo1bhmovp1,#40hacallpo1bhsjmppo12;开工吗?;初始化;第一道工序;第二道工序;第三道工序;第四道工序;第五道工序;第六道工序;第七道工序into:movb,r2;维护现场po17:movp1,#00h;第一关输入mov20h,#0a0h;震荡次数po18:setbp1.7;震荡acallpo1a;延时clrp1.7;暂停acallpo1a;延时djnz20h,po18;不为零转clrp1.7acallpo1ajnbp3.3,po17;故障消解吗?movr2,b;恢复正常现场retipo19:movr2,#10h;延时1acalldelypo1a:movr2,#06hacalldelypo1bh:movr2,#30hacalldelydely:push02hdel2:push02hdel3:push02hdel4:djnzr2,del4pop02hdjnzr2,del3pop02hdjnzr2,del2pop02hdjnzr2,dely;延时2;延时3;延时子程序“恶搞式”实验九工业顺序控制(int0.int1综合实验);掌控工业顺序控制的直观编程,中断的采用org0000h sjmpmainorg0013hljmpintomain:movp1,#00horlp3,#00hpo11:jnbp3.4,po11orlie,#84horlip,#04hmovpsw,#00hmovsp,#53hpo12:movp1,#01hacallpo1bhmovp1,#02hacallpo1bhmovp1,#04hacallpo1bhmovp1,#08hacallpo1bhmovp1,#10hacallpo1 bhmovp1,#20hacallpo1bhmovp1,#40hacallpo1bhsjmppo12;开工吗?;初始化;第一道工序;第二道工序;第三道工序;第四道工序;第五道工序;第六道工序;第七道工序into:movb,r2;维护现场po17:movp1,#00h;第一关输入mov20h,#0a0h;震荡次数po18:setbp1.7;震荡acallpo1a;延时clrp1.7;暂停acallpo1a;延时djnz20h,po18;不为零转clrp1.7acallpo1ajnbp3.3,po17;故障消解吗?movr2,b;恢复正常现场retipo19:movr2,#10h;延时1acalldelypo1a:movr2,#06hacalldelypo1bh:movr2,#30hacalldelydely:push02hdel2:push02hdel3:push02hdel4:djnzr2,del4pop02hdjnzr2,del3pop02hdjnzr2,del2pop02hdjnzr2,dely;延时2;延时3;延时子程序“恶搞式”实验九工业顺序控制(int0.int1综合实验);掌控工业顺序控制的直观编程,中断的采用org0000hsjmpmainorg0013hljmpintomain:movp1,#00horlp3,#00hpo11:jnbp3.4,po11orlie,#84horlip,#04hmovpsw,#00hmovsp,#53hpo12:movp1,#01hacallpo1bhmovp1,#02hacallpo1bhmovp1,#04hacallpo1bhmovp1,#08hacallpo1bhmovp1,#10hacallpo1 bhmovp1,#20hacallpo1bhmovp1,#40hacallpo1bhsjmppo12;开工吗?;初始化;第一道工序;第二道工序;第三道工序;第四道工序;第五道工序;第六道工序;第七道工序into:movb,r2;维护现场po17:movp1,#00h;第一关输入mov20h,#0a0h;震荡次数po18:setbp1.7;震荡acallpo1a;延时clrp1.7;暂停acallpo1a;延时djnz20h,po18;不为零转clrp1.7acallpo1ajnbp3.3,po17;故障消解吗?movr2,b;恢复正常现场retipo19:movr2,#10h;延时1acalldelyretpo1a:movr2,#06hacalldelyretpo1bh:movr2,#30hacalldelyretdely:push02hdel2:push02hdel3:push02hdel4:djnzr2,del4pop02h djnzr2,del3pop02hdjnzr2,del2pop02hdjnzr2,delyret;延时2;延时3;延时子程序。
单片机实验程序全
名称:主程序
说明:
**********************************************************/
void main(void)
{
//-----------------------------初始化TIMER0
buzzer=~buzzer;
}
if(voice==2)
{TH0=T0ReLoadH2;
TL0=T0ReLoadL2;
buzzer=~buzzer;
}
if(voice==3)
{
}
}
4 LED数码管动态扫描显示实验
#include<STC12c5A32s2.h>
#defineuint unsignedint
功能:产生10ms定时中断
**********************************************************/
void Timer0_Int(void) interrupt1
{if(voice==1)
{TH0=T0ReLoadH1;//重装载计数器初值
TL0=T0ReLoadL1;
#define T0_TIME1254//定时时间us为单位
#define T0ReLoadL1((65536-(uint)(T0_TIME1*11.0592/12)) % 256)
#define T0ReLoadH1((65536-(uint)(T0_TIME1*11.0592/12)) / 256)
if(Keydec==0)
单片机实验程序(全)
2 基本输入输出实验(蜂鸣器控制程序)/******************************************************* 名称:基本输入输出(I/O )程序说明:********************************************************/#include<STC12c5A32s2.h> //包含头文件#define uint unsigned int //宏定义#define uchar unsigned charsbit buzzer=P3A5;sbit Keyadd=P2A。
;sbit Keydec=P2A1;sbit Keycom=P2A2;void Delay(uint z){ uint x;uchar y;for(x=z;x>0;x--) //延时{for(y=250;y>0;y--);}} void main(void){ uchar voice;voice=3;while(1){if(Keyadd==0) voice=1;// 按键被按下时为0 if(Keydec==0) voice=2; if(Keycom==0)voice=3;if(voice==1) {buzzer=~buzzer; Delay(1);}else if(voice==2) {buzzer=~buzzer;Delay(20);}elsebuzzer=1;3 定时器中断实验/******************************************************* 名称: 实验三作业说 明:****************************************************** #include<STC12c5A32s2.h> #defineuint unsigned int #define ucharunsigned char uchar counter; uchar voice; sbit buzzer=P3A 5; sbit Keyadd=P2A 。
单片机原理与应用实验指导书(含参考程序)
单片机实验实验说明:实验一和二做一次实验三和四做一次实验五和六分别做一次实验一 P1口实验一一、实验目的:1.学习P1口的使用方法。
2.学习延时子程序的编写和使用。
二、实验设备:EL-MUT-II型实验箱,8051CPU板三、实验内容:1.P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。
2.P1口做输入口,接八个按纽开关,以实验箱上74LS273做输出口,编写程序读取开关状态,在发光二极管上显示出来。
四、实验原理:P1口为准双向口,P1口的每一位都能独立地定义为输入位或输出位。
作为输入位时,必须向锁存器相应位写入“1”,该位才能作为输入。
8031中所有口锁存器在复位时均置为“1”,如果后来在口锁存器写过“0”,在需要时应写入一个“1”,使它成为一个输入。
可以用第二个实验做一下实验。
先按要求编好程序并调试成功后,可将P1口锁存器中置“0”,此时将P1做输入口,会有什么结果。
再来看一下延时程序的实现。
现常用的有两种方法,一是用定时器中断来实现,一是用指令循环来实现。
在系统时间允许的情况下可以采用后一种方法。
本实验系统晶振为6.144MHZ,则一个机器周期为12÷6.144us即1÷0.512us。
现要写一个延时0.1s的程序,可大致写出如下:MOV R7,#X (1)DEL1:MOV R6,#200 (2)DEL2:DJNZ R6,DEL2 (3)DJNZ R7,DEL1 (4)上面MOV、DJNZ指令均需两个机器周期,所以每执行一条指令需要1÷0.256us,现求出X值:1÷0.256+X(1÷0.256+200×1÷0.256+1÷0.256)=0.1×10⁶指令(1)指令(2)指令(3)指令(4)所需时间所需时间所需时间所需时间X=(0.1××10⁶-1÷0.256)/(1÷0.256+200×1÷0.256+1÷0.256)=127D=7FH经计算得X=127。
单片机实验程序
实验2:结合开发板电路原理图,用Keil C编写程序,功能要求如下:当按下按键K1时,LED亮1个灯;当按下K2时,LED亮2个灯;K3亮3个灯;K4亮4个灯。
(亮哪几个灯可自选,汇编和C语言自选。
提示:在OK300C开发板中,按键与P3口相连, LED与P0口相连)。
#include<reg51.h>sbit P30=P3^0;sbit P31=P3^1;sbit P32=P3^2;sbit P33=P3^3;sbit P00=P0^0;sbit P01=P0^1;sbit P02=P0^2;sbit P03=P0^3;void main(void){P3=0XFF;P0=0XFF;if (P33==0) {P03=0;P02=0;P01=0; P00=0;}if (P32==0){P02=0;P01=0; P00=0;}if (P31==0){P01=0; P00=0;}if (P30==0) P00=0;}实验3:实验前编写好汇编语言程序,程序功能实现方向可控的流水灯。
编程要求:用八个LED发光二极管实现流水灯,系统启动后,流水灯左向流转,按下K1键,则反向流转,再按则再反向……。
(即作业三程序)ORG 0000HSJMP 0030HORG 0030HMAIN:MOV P3,#0FFHMOV R0,#11111110BLJMP LOOP1LOOP1:JNB P3.0,LOOP2MOV P0,R0LCALL DELAYMOV A,R0RL AMOV R0,ALJMP LOOP1LOOP2:JNB P3.0,LOOP1MOV P0,R0LCALL DELAYMOV A,R0RR AMOV R0,ALJMP LOOP2DELAY:MOV R2,#255D1:MOV R3,#255DJNZ R3,$DJNZ R2, D1RETEND实验四:编程要求:用八个LED发光二极管实现流水灯,系统启动后,流水灯左向流转,每按下K1键一次,则流转速度减慢一点;按下K2键则速度增加,每按一次加速一点;按下K3键则流转方向倒转。
单片机试验程序
0030 74AA MOV A,#0AAH
0032 75FOBB MOV B,#0BBH
0035 900010 MOV DPTR,#0010H
POP ACC
POP PSW
SJMP $
SUBR: MOV DPTR,#0150H
MOVX A,@DPTR
END
实验二 在实验仪上熟悉MCS-51的一般指令
示例1:立即数的加减。
ORG 0050H
MOV A,#0AH
ADD A,#0E3H
SUBB A,#2FH
ORG 0000H
LJMP MAIN
ORG 0400H
MAIN: MOV DPTR,#1000H
3.读懂下面的程序,运行后查看结果
ORG 0150H
LOOP: MOV R0,#20H
MOV R7,#08H
CLR TR0
DEC R7
MOV R2,#05H
ACALL ZERO
MOV DPTR,#1030H
MOV R2,#05H
ACALL ZERO
LOOP1:MOV A,@R0
MOV 10H,A
INC R0
MOV 11H,@R0
CLR C
INC DPTR
XCH A,R2
MOVX A,@DPTR
MOV DPTR,#0060H
MOVX @DPTR,A
SJMP $
END
结果(A)=0BEH
示例2:寄存器内容的加减。
ORG 0100H
MOV R0,#1AH
MOV R1,#08H
单片机实验参考程序
单片机实验参考程序1.存储块赋值将内部ram30h-40h的所有单元内容全部赋值为33h,并将这些单元的内容传递到片外ram的0040h-0050h单元中。
建议:(1)精简提炼原程序;(2)有规律地修正内部ram30h-40h中的数据orgljmporgstart:movmovincmovincmovincmovincmovincmovincmovincmovincmovincmov movmovmovmain:movmovxincincdjnzmain2:ljmpend00hstart100hr0,#30h@r0,#33hr0@r0,#33hr0@r0,#33hr0@r0,#33hr0@r0,#33hr0@r0,#33hr0@r0,#33 hr0@r0,#33hr0@r0,#33hr0@r0,#33hr0,#30hdptr,#40hr7,#10ha,@r0@dptr,ar0dptrr7,mainmain22.数据排序将内部ram3ah-40h中的随机数按从小到大的顺序排列。
要求:(1)用查表法修改内部ram中原来的数据,这样可以修改内部ram中的数据而不改变原指令。
(2)用“冒泡”法重新改编此程序。
sizeequ6;数据个数arrayequ3ah;数据初始地址changebit0;互换标志org00hljmpstartorg100hstart:movr0,#arraymov@r0,#33hincr0mov@r0,#05hincr0mov@r0 ,#78hincr0mov@r0,#10hincr0mov@r0,#90hincr0mov@r0,#45hmain:movr0,#arraymovr7,#size-1clrchangemain2:mova,@r0movr2,aincr0movb,@r0cjnea,b,main4sjmpmain6main4:jcmain 6;前小后大,不交换setbchange;前大后小,置交换标志xcha,@r0;交换decr0xcha,@r0incr0main6:djnzr7,main2jbchange,mainmain8:ljmpmain8endmain:movr7,#size-1main2:movr0,#arraymova,r7movr6,adecr6main2:mova,@r0movr2,aincr0movb,@r0cjnea,b,main4sjmpmain6mai n4:jcmain6xcha,@r0decr0xcha,@r0incr0main6:djznr6,main2djnzr7,main2;前小后大,不互换;互换3.p1口输入的参照程序:p1口做输出口,p1.0引脚接一只发光二极管,编写程序,使该发光二极管循环亮灭(亮0.2s、灭0.8s)。
单片机实训报告实验步骤
一、实验目的1. 掌握单片机的基本工作原理和硬件结构。
2. 熟悉单片机的编程方法,提高编程能力。
3. 学习单片机的调试技巧,提高调试效率。
4. 通过实际操作,培养动手能力和团队合作精神。
二、实验仪器与设备1. 单片机实验开发板2. 编译器(如Keil、IAR等)3. 仿真软件(如Proteus、Multisim等)4. 连接线、电源、示波器等辅助设备三、实验步骤1. 熟悉单片机实验开发板(1)观察开发板的硬件结构,了解各个模块的功能和连接方式。
(2)熟悉开发板上的按键、LED、串口、I2C、SPI等接口。
2. 编写程序(1)根据实验要求,设计程序功能。
(2)选择合适的编程语言(如C语言、汇编语言等)。
(3)使用编译器编写程序代码,并进行语法检查。
3. 程序调试(1)使用仿真软件(如Proteus)对程序进行仿真调试。
(2)观察程序运行结果,检查程序是否存在错误。
(3)根据仿真结果,修改程序代码,直至程序正常运行。
4. 硬件连接(1)根据程序功能,连接开发板上的相关硬件模块。
(2)确保连接正确,避免短路或接触不良。
5. 实验运行(1)打开电源,启动单片机。
(2)观察程序运行情况,验证程序功能是否实现。
(3)根据实验要求,调整程序参数或硬件配置,优化程序性能。
6. 数据采集与记录(1)使用示波器等设备,采集实验过程中的数据。
(2)记录实验数据,为后续分析提供依据。
7. 结果分析(1)对实验数据进行整理和分析,评估程序性能。
(2)总结实验过程中的经验教训,提出改进措施。
8. 实验报告撰写(1)整理实验过程,包括实验步骤、实验数据、实验结果等。
(2)分析实验结果,总结实验经验教训。
(3)撰写实验报告,要求格式规范、内容完整。
四、实验注意事项1. 确保实验环境安全,避免触电、短路等事故。
2. 严格遵守实验操作规程,避免损坏实验设备。
3. 注意程序调试过程中的细节,提高调试效率。
4. 实验过程中,积极思考,勇于创新,提高动手能力。
单片机整套实验及程序
单片机整套实验及程序引言单片机作为嵌入式系统开发的核心技术之一,广泛应用于各个领域,在教育、科研和工业生产中占有重要地位。
本文将介绍单片机整套实验及程序设计的相关内容,通过实际操作和编程实践,帮助读者更好地理解和掌握单片机的基本原理和应用。
实验一:LED闪烁实验LED闪烁实验是单片机入门实验的重要一环。
通过这个实验,我们可以了解到单片机引脚的输入输出特性、编程语言的基本结构以及简单的电路连接方法。
实验目的•掌握单片机引脚的输入输出特性;•了解单片机编程语言的基本结构;•学会使用电路连接方法。
实验材料•单片机开发板;•电阻、LED灯、杜邦线等电子元件。
实验步骤1.连接电路:将单片机的一个GPIO引脚连接到一个电阻,再将电阻的另一端连接到LED的正极,LED的负极连接到地线。
2.编写程序:使用C语言或汇编语言编写LED闪烁的程序。
程序的核心是通过控制GPIO引脚的高低电平来控制LED的亮灭。
3.烧录程序:将编写好的程序烧录到单片机中。
4.调试程序:通过观察LED的亮灭情况,判断程序是否运行正常。
程序示例(C语言)下面是一个使用C语言编写的LED闪烁程序示例:#include <reg51.h>void delay(unsigned int time) {while(time--);}void mn() {while(1) {P1 = 0xFF; // 将P1口设置为高电平delay(10000);P1 = 0x00; // 将P1口设置为低电平delay(10000);}}实验结论通过LED闪烁实验,我们成功地掌握了单片机引脚的输入输出特性、编程语言的基本结构以及简单的电路连接方法。
这为之后的实验和项目开发奠定了重要的基础。
实验二:数码管显示实验数码管是一种常见的数字显示设备,它广泛应用于计时器、计数器、温度显示等场景。
通过数码管显示实验,我们可以学习如何控制数码管的显示和编程。
实验目的•学会使用单片机输出控制信号控制数码管的显示;•理解数码管的工作原理;•掌握数码管编程的方法。
单片机实验程序
• 8206 00
• 8207 00 • • • • • 8208 820A 820C 820E DCFC DBFB DAF4 22
DE0:
NOP
NOP DJNZ R4,DE0 DJNZ R3,DE1 DJNZ R2,DE2 RET END
• • • • • •
实验三、P3.3口输入、P1口输出 一、实验目的 ①掌握P3.3口、P1口简单使用。 ②学习延时程序的编写和使用。 二、实验内容 ① P3.3口做输入口,外接一脉冲,每输入一 个脉冲,P1口按十六进制加一。 • ②P1口做输出口,编写程序,使P1口接的8个 发光二极管L1-L8按16进制加一方式点亮发光 二极管。 • 三、实验说明
单片机程序ຫໍສະໝຸດ • • • • • •软件程序 实验一 清零程序 一、实验内容 把7000H~70FFH的内容清零。 二、实验框图
开始
R0=00
00
7000H
DPTR+1,R0+1 N R0=FF Y 结束
• 三、实验程序
• • • • • • • • • • 0030 0030 0032 0035 0036 0037 0038 0039 003C 1 ORG 0030H 7800 2 CLEAR: MOV R0,#00H 907000 3 MOV DPTR,#7000H E4 4 CLEAR1:CLR A F0 5 MOVX @DPTR,A A3 6 INC DPTR 08 7 INC R0 B800F9 8 CJNE R0,#00H,CLEAR1 80F2 9 SJMP CLEAR 10 END
• 实验二、查询P3.2管脚的输入 • 一、实验目的
• 掌握P3、P1口的使用。
• 二、实验内容
单片机实验程序及流程图
《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义三.程序清单及程序流程框图ORG 0000H Array LJMP MAINMAIN: MOV R0,#30HMOV R2,#10HCLR AA1: MOV @R0,AINC R0INC ADJNZ R2,A1MOV R0,#30HMOV R1,#40HMOV R2,#10HA2: MOV A, @R0MOV @R1,AINC R0INC R1DJNZ R2, A2MOV R1,#40HMOV DPTR ,#4800HMOV R2, #10HA3: MOV A,@R1MOVX @DPTR ,AINC R1INC DPTRDJNZ R2,A3MOV SP,#60HMOV R2,#10HMOV DPTR ,#4800HPUSH DPLPUSH DPHMOV DPTR,#5800HMOV R3,DPLMOV R4,DPHA4: POP DPHPOP DPLMOVX A,@DPTRINC DPTRPUSH DPLPUSH DPHMOV DPL,R3MOV DPH,R4 MOVX @DPTR,A INC DPTRMOV R3,DPLMOV R4,DPHDJNZ R2,A4MOV R0,#50HMOV DPTR,#5800H MOV R2,#10HA5: MOVX A,@DPTR MOV @R0,AINC R0 INC DPTR DJNZ R2,A5POP DPH POP DPL HERE: LJMP HEREEND《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义三.实验电路四.程序清单及流程图程序一ORG 0000HLJMP MAIN ORG 000BH LJMP IPTO MAIN: MOV SP, #30H MOV TMOD, #01HCLR 00H SETB EA SETB ET0 MOV TH0, #3CH MOV TL0, #0B0H MOV R1, #14H SETB TR0 MOV A, #0feH MOV P1, A NT: JNB 00H, NT RL A MOV P1, ACLR 00H LJMP NT IPTO: MOV TH0,#3CH MOV TL0,#0B0HDJNZ R1, TIOMOV R1, #14HSETB 00HTIO: RETIEND程序二只需将程序一中“RL A”改为“RR A”即可实现其功能。
单片机八个实验程序
单片机八个实验程序单片机试验程序实验一:用程序使A T89C51单片机的P1.0~P1.7引脚循环输出高电平,经反相器后控制小灯循环点亮。
#includevoid delay();void main(){while(1){P1=0x00; delay();P1=0x01; delay();P1=0x02; delay();P1=0x04; delay();P1=0x08; delay();P1=0x10; delay();P1=0x20; delay();P1=0x40; delay();P1=0x80; delay();}}void delay(){ int i=0;while(i<10000) i++;}实验二:147页,例题6.1 #include unsigned char n=0x01; main(){P1=0xFF;EA=1;EX0=1;IT0=1;while(1);}int_0()interrupt 0 {P1=~n;n<<=1;if(n==0) n=0x01;}实验三:154页例题6.6 #includesbit P1_0=P1^0; char count=20;main(){TMOD=1;TL0=0xB0;TH0=0x3C;TR0=1;ET0=1;EA=1;while(1);}t0_int() interrupt 1 {TL0=0xB0;TH0=0x3C;count--;if(count==0){P1_0=! P1_0;count=20;}}例题6.5,153页#include //包含特殊功能寄存器声明头文件sbit P1_0=P1^0; //定义特殊功能位P1_0main() //主函数{TMOD=1; //设置定时/计数器0工作于方式1TL0=0xF0; //装入计数初值TH0=0xD8;TR0=1; //启动定时器T0ET0=1; //允许定时器T0中断EA=1; //开放CPU中断while(1);}t0_int() interrupt 1 //中断函数{P1_0=! P1_0; //P1.0取反TL0=0xF0; //重新装入计数初值TH0=0xD8;实验四:三首歌/**********硬件连线*************///用导线将P1.0口连接"电子音响驱动控制"模块的"SIN"输入插孔#includesbit P1_0=P1^0;#define mvar 11059200/12/2//对晶振为11.0592MHz进行12分频后,为机器周期的倒数,再除以2定时时间到P1口反向//为了通过计数器让P1.0发出一定频率的方波,要求:// (12/fosc)*(65536-X)x2=1/f.因而16位计数初始值X=65536-(11059200/12/2)/f//因而把(11059200/12/2)预定义#define uint unsigned int#define uchar unsigned char//freq[]为发出dao-xi即1-7(又分低音和高音)频率表uint code freq[]={65535,262,294,330,349,392,440,494,523,578,659,698,784 ,880,988};//单位Hz uchar code yinfu[]={0x64,0xa2,0xc1,0xa2,0x62,0x84,0x61,0x81,0x61,0x81,0xa4,0xa1,0x91,0xa1,0x81,0x64,0xa2,0xc1,0xd2,0xd2,0xd2,0xa2,0xc4,0xa1,0xc1,0xa1,0xc1,0xd2,0xd2,0xd2,0xa2,0xc4,0xc2,0x62,0xc2,0x62,0xa2,0xa2,0x84,0x00};//音符表高4位音阶,低4位代表该音节持续的拍数,猪八戒背媳妇*//*uchar code yinfu[]={0x64,0x62,0x52,0x64,0x84,0x92,0xa1,0x91,0x82,0x92,0xa8,0x62,0xd2,0xd2,0xc2,0x92,0xa1,0x91,0x82,0x22,0xa8,0x08,0x82,0x62,0x62,0x82,0x94,0x52,0x52,0xa2,0xc2,0xa2,0x92,0x88,0x62,0x82,0x92,0xa2,0x92,0x82,0x52,0x32,0x68,0x00};//最炫民族风*//*uchar code yinfu[]={0x02,0x52,0x62,0x82,0xc2,0xa4,0x92,0xa5,0xa2,0xa8,0x04,0x82,0x91,0xc1,0xc2,0xa2,0x92,0x82,0x82,0x92,0x82,0x82,0x88,0x04,0x82,0x91,0xc1,0xc2,0xa2,0x92,0x82,0x92,0x92,0x91,0xa1,0x62,0x64,0x62,0x82,0x92,0x92,0x91,0xa1,0x82,0x02,0x62,0x51,0x61,0x52,0x54,0x54,0x54,0x54,0x00};//怒放的生命*/uchar high,low,temp1,temp2,temp3,count;timer0() interrupt 1 using 1 /* T0中断服务程序*/{TH0=high;TL0=low;P1_0=!P1_0;}void Delay();//声明延时函数main() //_at_ 0x30{TMOD=0x01; /* 定时器0方式1 */EA=1; /* 开CPU中断*/ET0=1; /* 开T0中断*/while(1){count=0;next:temp1=yinfu[count];if(temp1==0){TR0=0;goto stop;}else{ temp2=(temp1&0x0f);//原来用temp2=(temp1&&0x0f)是错误的;注意&是按位与,//而&&是逻辑与temp1>>=4;}if(temp1==0){P1_0=1;TR0=0;goto w1; }// temp1--;若将freq[]中的第一个数65535去掉,则需要增加该语句high=(65536-mvar/(freq[temp1]))/256;low=(65536-mvar/(freq[temp1]))%256;TH0=high;TL0=low;TR0=1;w1:for(;temp2>0;temp2--)Delay();count++;goto next;stop:TR0=0;}//while(1)结束}//main()结束void Delay()//11.0592Mhz下延时0.250883秒{uint i,j;for(i=0;i<80;i++)//若想加快演唱节奏,可以修改成i<130或i<120for(j=0;j<200;j++);}实验五:多机点对点串行通信,175页//先运行乙机的接收程序,再运行甲机的发送程序;然后乙机复位,查看仿真上数据变化。
《单片机实验程序..》
1. 修改例程一的源程序(1) 将A寄存器的初值改为80H (正逻辑,数据位为1表示发光二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管情况与修改前相同。
(2) 将LED向左循环移位点亮改为向右循环移位点亮(3) 加快LED循环移位点亮的速度$include (C8051F020.inc) ;C8051F02x系列单片机信忐INIT: LCALL Init_Device 调用初始设置子程序(1) MOV A,#080H ;赋初始值并在发光二极管上CPL AMOV P3,ALOOP: CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAY发光二极管显示(2) RL A ;A寄存器内容右移1位并送1MOV P3,AAJMP LOOP ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#00HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc); 初始设置子程序文件包含伪指令END(3)可删除几个CALL DELAY语句即可加快循环速度2.将例程二0——F的循环显示改为0——9的循环显示$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令ORG 0000HTAB:INIT: INIT1:MAIN:DELAY: D1: LJMP INIT;字符段码表0-7 DB 080H,090H ;字符段码表8-Flcall Init_Device ;调用初始设置子程序MOV R1,#00H ;操作数据初始值MOV A,R1MOV DPTR,#TAB ;读取与A中数值对应的显示段码MOVC A,@A+DPTRMOV P5,A ;段码送并仃口1显示CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYINC R1 ;操作数据(R1)增1MOV A,R1CJNE A,#0AH,MAIN ;检查操作数据是否大于显示氾围SJMP INIT1 ;无限循环MOV R5,#0H ;延时子程序MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8HDB1.例程5程序修改(1)(2) $include将KEY2、KEY4的功能对调每次停下再启动以后,更改发光二极管点亮的循环方向(C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令主程序入口ORGLJMP0000HINITIAL ;ORG 0003HLJMP STOP ;外中断0服务程序入口,开始键(STAR)ORG 0013HLJMP STAR ;外中断1服务程序入口停止键(STOP)ORG 0100HLCALL Init_Device ;调用初始设置子程序MOV P3,#0FFH ;熄灭全部发光二极管MOV A,#0FFHMOV DPTR,#7F80HMOVX @DPTR,A ;清除数码管2 (NUM2 )显示MOV A,#0FEH ;点亮发光二极管的初始数据MOV R1,#1H ;发光二极管点亮位置初值MOV R4,#0FHMOV IP,#04H ;设置INTO (开始键STAR)为高优先级MOV TCON,#05H ;外中断采用边沿触发SETB EX0 ;INT1 (停止键STOP)开中断SETB EA ;开放中断CLR EA ;关闭中断CJNE R4, #0FH, LPRL ACJNE R4,#0FH,LPMOV P3,ACJNE R4,#0FH,LPINC R1CJNE R4,#0FH,LPSETB EAINITIAL: LOOP:LP: STOP: STAR:LCALL DELAY1LCALL DELAY1LCALL DELAY1LCALL DELAY1CJNE R1,#8H,LOOPMOV R1,#0HSJMP LOOPCLR EACJNE R4,#0F0H,LOOPRR ACJNE R4,#0F0H,LOOPMOV P3,ACJNE R4,#0F0H,LOOPDEC R1CJNE R4,#0F0H,LOOPSETB EALCALL DELAY1LCALL DELAY1LCALL DELAY1LCALL DELAY1CJNE R1,#0H,LPMOV R1,#8HSJMP LP;停止键的中断服务程序PUSH ACC ;保护A寄存器内容MOV A,R1 ;读取发光二极管点亮位置计数值MOV DPTR,#TABMOVC A,@A+DPTR ;获取发光二极管点亮位置计数值的显示段码MOV DPTR,#7F80HMOVX @DPTR,A ;发光二极管点亮位置计数值的显示数据送显示SETB EX1 ;INT0 (启动键STAR)开中断JNZ $ ;等待重新启动条件--A=0MOV A,#0FFHMOVX @DPTR,A ;清除数码管2 (NUM2 )显示CLR EX1 ;禁止INT0中断(避免程序误动作)POP ACC ;恢复A寄存器内容CLR IE1;清除INT1 (停止键STOP)中断标志(避免程序误动作)RETI ;中断返回;启动键的中断服务程序MOV A,#00H ;设置启动条件--A=0CLR IE0 ;清除INT0 (启动键STOP) 中断标志(避免程序误动作)PUSH ACCMOV A,R4CPL AMOV R4,APOP ACCRETI ;中断返回TAB: DB 0C0H,0F9H,0A4H,0B0H,099H ;0--4段码DB 092H,082H,0F8H,080H ;5--8段码DELAY1: MOV R6,#0 ;延时子程序D1: MOV R7,#0DJNZ R7,$DJNZ R6,D1RET$include (Init_Device.inc)END2. 修改例程6,将计数范围由0-F扩展至00-FF (使用定时器/计时器0),并在2位数码管上用10进制数显示计数结果(00-99);初始设置子程序文件包含伪指令$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令DP2 EQU 07F80HDP_L EQU 30H ;低位数值暂存器DP_H EQU 31H ;高位数值暂存器MAIN: LCALL Init_Device ;调用初始设置子程序MOV TMOD,#00000101B ;C/T0 工作于方式2MOV A,#0 ;显示初值为0MOV DP_L,AMOV DP_H,ACALL DISPLAY ;调用显示子程序显示初值0 MOV TL0,#0 ;C/T0置初值0SETB TR0 ;启动计数器0LOOP: MOV A,TL0 ;读计数器0的计数值CJNE A,#0AH,L1MOV TL0,#0MOV A,#0INC DP_HMOV A,DP_HCJNE A,#0AH,MMMOV DP_H,#0MM: MOV A,#0L1: MOV DP_L,A ;在NUM2 显示计数器CALL DISPLAY ;调用显示子程序显示讨SJMP LOOP ;无限次循环;显示子程序DISPLAY: MOV A,DP_L ;读低位显示值CALL DECODE ;调用换码子程序MOV DPTR,#DP2 ;显示段码送NUM2MOVX @DPTR,AMOV A,DP_H ;读高位显示值CALL DECODE ;调用换码子程序MOV P5,ARET;换码子程序DECODE: MOVMOVCRETDPTR,#TAB A,@A+DPTRTAB: DBDB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ;显示段码0-7 080H,090H,088H,083H,0C6H,0A1H,086H,08EH ;显示段码8-F$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END通过对例程8的程序进行修改和上机调试,改变源程序的功能(1) 将发送1、2、3、4的ASCII码改为发送A、B、C、ASCII 码(2) 将接收的第2、第3子R数据的显示位置交换$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令NUM2 EQU 07F80H ;NUM2地址NUM3 EQU 07F90H ;NUM3地址NUM4 EQU 07FA0H ;NUM4地址NUM5 EQU 07FB0H ;NUM5地址TIM_L EQU 0FDH ;I/C1低字节计数值TIM_H EQU 0FDH ;I/C1高字节计数值REC_BUF0 EQU 32H ;数据接收缓冲器0REC_BUF1 EQU 34H ;数据接收缓冲器1REC_BUF2 EQU 33H ;数据接收缓冲器2FLAG BIT 01H ;数据发送完成标志ORG 0000HLJMP MAIN ;转主程序ORG 0023HLJMP RECE ;转串行通信中断程序;主程序MAIN: lcall Init_Device ;C8051F02x系列单片机信息头文件包含伪指令MOV A,#0FFHMOV P5,AMOV DPTR,#NUM2MOVX @DPTR,A ;清除数码管NUM1的显示MOV DPTR,#NUM3MOVX @DPTR,A ;清除数码管NUM2的显示MOV DPTR,#NUM4MOVX @DPTR,A ;清除数码管NUM3的显示MOV DPTR,#NUM5MOVX @DPTR,A ;清除数码管NUM4的显示MOV R6,#0 ;走1伯操彳F状态奇存命清除MOV SP,#40H ;堆栈栈底设置MOV TMOD,#00100000B ;T/C1 方式2MOV TH1,#TIM_H ;T/C1重装填值MOV TL1,#TIM_L ;T/C1计数值SETB TR1 ;启动T/C1MOV SCON0,#01010000B ;串曰万式1SETB ES ;串口中断允许SETB EA ;开中断;主循环LOOP: CALL KEYBOARD ;调用案件状态分析子程序CJNE A,#0FFH,L0 ;按键状态发生变化转L0CLR FLAG ;按键状态无变化,清除发送完成标志SJMP LOOPL0: JB FLAG,LOOP ;数据发送完成,返回主循环MOV R7,A ;否则,键值暂存R7MOV A,#043H ;CMOV SBUF0,A ;发送字符C的ASCII码值CALL DELAYMOV A,#04FH ;OMOV SBUF0,A ;发送字符O的ASCII码值CALL DELAYMOV A,#04DH ;MMOV SBUF0,A ;发送字符M的ASCII码值CALL DELAYMOV A,#04BH ;KMOV SBUF0,A ;发送字符K的ASCII码值CALL DELAYMOV A,#40H ;发送数字0的ASCII码值MOV SBUF0,ACALL DELAYMOV A,R7ADD A,#40H ;生成键值的ASCII码值MOV SBUF0,A ;发送键值的ASCII码值SETB FLAG ;置位发送完成标志SJMP LOOP;中断服务程序RECE: JNB TI,REC1 ;非发送转接收处理CLR TI ;否则,清除发送中断标志RETI ;中断返回REC1: PUSH ACC ;保护累加器AMOV A,SBUF0 ;读接收缓冲器CJNE R6,#0,REC2CJNE A,#43H,REC6 ;接收状态为0,进行字符C的过滤处理MOV R6,#1 ;接收状态改为1SJMP REC6REC2: CJNE R6,#1,REC3CJNE A,#4FH,REC5 ;接收状态为1,进行字符O的过滤处理MOV R6,#2 ;接收状态改为2SJMP REC6REC3: CJNE R6,#2,REC4CJNE A,#4DH,REC5 ;接收状态为2,进行字符M的过滤处理MOV R6,#3 ;接收状态改为3MOV R5,#3 ;数据接收计数器设置为 3SJMP REC6REC4: CJNE R6,#3,REC6PUSH ACC ;接收状态为3,暂存接收的内容MOV A,#REC_BUF0ADD A,R5MOV R0,A ;生成接收数据存放缓冲器地址POP ACC ;恢复接收数据至A寄存器MOV @R0,A ;保存接收的数据DEC R5 ;接收数据计数器减1CJNE R5,#0,REC6CALL DISPLAY ;接收数据计数器减为0,进行接收结果的显示REC5: MOV R6,#0 ;接收状态恢复为0 (就绪状态)REC6: POP ACC ;恢复累加器ACLR RI ;清除接收中断标志RETI ;中断返回KEYBOARD: MOV A,P2 ;读按键状态输入端口RR ARR ARRC A ;KEY1有效键值移入位累加器 CJC K1 ;键值无效转KEY2键值的分析MOV A,#1 ;否则,KEY1代码送A寄存器SJMP K5K1: RRC A ;KEY2有效键值移入位累加器 C JC K2 ;键值无效转KEY3键值的分析MOV A,#2 ;否则,KEY2代码送A寄存器SJMP K5K2: RRC A ;KEY3有效键值移入位累加器 C JC K3 ;键值无效转KEY4键值的分析MOV A,#3 ;否则,KEY3代码送A寄存器SJMP K5K3: RRC A ;KEY4有效键值移入位累加器 C JC K4 ;键值无效转按键无效处理MOV A,#4 ;否则,KEY4代码送A寄存器SJMP K5K4: MOV A,#0FFH ;按键无效代码送A寄存器;读取接收的第2字节数据 ;高、低4位交换 ;分离高4位有效数值 ;换码 ;在数码管NUM2显示第2字节数据高4位数值;读取接收的第2字节数据 ;提取低4位有效数值 ;换码 ;在数码管NUM3显示第2字节数据低4位数值;读取接收的第3字节数据 ;高、低4位交换 ;分离高4位有效数值 ;换码 ;在数码管NUM4显示第3字节数据高4位数值;读取接收的第3字节数据 ;提取低4位有效数值 ;换码 ;在数码管NUM5显示第3字节数据低4位数值DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EHK5:RET $include (Init_Device.inc) ;初始设置子程序文件包含伪指令 DISPLAY:MOV A,REC_BUF2SWAP A ANLA,#0FH CALLDECODE MOVDPTR,#NUM2MOVX @DPTR,AMOVA,REC_BUF2ANL A,#0FH CALL DECODEMOV DPTR,#NUM3MOVX @DPTR,AMOVA,REC_BUF1SWAP AANL A,#0FHCALL DECODEMOV DPTR,#NUM4MOVX @DPTR,AMOVA,REC_BUF1ANL A,#0FH CALL DECODEMOV DPTR,#NUM5MOVX @DPTR,ARET ; ---- DECODE PROGRAM ------DECODE: MOV DPTR,#TABMOVCA,@A+DPTR RET; ---- DELAY PROGRAM ——DELAY: MOV R5,#80HD1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RETTAB:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一键盘输入实验参考程序:;4*4矩阵键盘读取程序,利用P0口,列线左起P0.0-P0.3;行线上起P0.4-P0.7,行线默认接高电平,;P3.7作为键盘被读取的提示灯; 0 1 2 3; 4 5 6 7; 8 9 A B; C D E F;不考虑有两个或以上按键同时按下的情况,;每次扫描到一个有按下则结束本次扫描SETB P3.7 ;确认关闭键盘响应指示灯MAIN: MOV R0,#0EFH ;用于给键盘行列线确定的电平MOV R1,#0H ;循环次数,R1=0对应第一行,=1为第二行,以此类推SMAIN: MOV P0,R0 ;改变行线的状态,列线全处于高电平NOPNOPMOV A,P0JB ACC.0,L1 ;判断某行的第一列是否按下,按下则P0.0为低电平MOV R2,#0H ; 将某行的列码保存至R2,显示程序会根据此值和R1的值计算具体为何按键按下ACALL DISPSJMP MAIN ; 每次扫描到一个有按下则结束本次所有扫描L1: JB ACC.1,L2 ;判断某行的第二列是否按下,按下则P0.1为低电平MOV R2,#01HACALL DISPSJMP MAINL2: JB ACC.2,L3 ;判断某行的第三列是否按下,按下则P0.2为低电平MOV R2,#02HACALL DISPSJMP MAINL3: JB ACC.3,SKIP ;判断某行的第四列是否按下,按下则P0.3为低电平MOV R2,#03HACALL DISPSJMP MAIN ;SKIP: INC R1 ;R1加1,共计4行,MOV A,R0RL A ;左移R0内的值,以并扫描下一行MOV R0,ACJNE R1,#04H,SMAIN ;若四行扫描完毕,则跳转至程序最初,相关参数为初始值NO: MOV P2,#0FFH ;程序能执行到此说明四行扫描完毕并且一个按键都没按下,关闭数码管和指示灯SETB P3.7SJMP MAINDISP: CLR P3.7 ;点亮键盘响应指示灯MOV A,R1RL ARL A ;R1对应行,具体的按键计算为R1*2+R2ADD A,R2ADD A,#3H ;下列指令与表格见有3字节的距离MOVC A,@A+PCMOV P2,A ;十六进制的高位用数码管L1显示RET ;共阳数码管0-F的显示码DIS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HDB 80H,90H,88H,83H,0C6H,0A1H,86H,8EHDELAY: m ov r7,#255;延时del1: mov r6,#255;del2: djnz r6,del2djnz r7,del1retEND实验二显示实验动态显示,2个数码管,公共端为P0.6、P0.7,段控制接至P2口ORG 00HDISPORT EQU P2ONESP BIT P0.7 ;公共控制端TENSP BIT P0.6MOV DISPORT,#00HSTART: MOV R0,#0HMOV R1,#0H ;初始化:关闭显示,设置个位、十位均为0,分别存放于R0,R1 MAIN: ;ACALL DELAYACALL DELAY ;调用延时程序,延时程序内部实现动态显示的刷新过程INC R0 ;个位加1CJNE R0,#10D,MAIN ;判断个位加1后是否=10,若不等说明<=8,继续循环MOV R0,#00D ;个位加1后=10,说明要像十位进1,并且清零个位INC R1CJNE R1,#10D,MAIN ;判断十位是否=10,若不等说明<=8,继续循环SJMP START ;若十位加1后=10,说明已到99,跳至程序开头DELAY: MOV DPTR,#TAB ;延时程序的开头首先根据RO、R1里面的值找到其对应的显示码MOV A,R0MOVC A,@A+DPTRMOV R2,A ;个位显示码查到后存放至R2MOV A,R1MOVC A,@A+DPTRMOV R3,A ;十位显示码查到后存放至R3MOV R6,#255D ;延时约900msMOV R7,#255DDELAY1: MOV DISPORT,R2 ;送个位显示码至端口,共阴数码管SETB ONESPCLR TENSP ;打开个位公共端,关闭十位数码管的公共端DJNZ R7,DELAY1 ;延时约1.5msMOV R7,#255D ;为保证个位十位显示时间相当,此值为190左右更合适;有意识在十位显示循环内部添加NOP,延长时间,观察个十位亮度DELAY2: CJNE R1,#0D,MID ;判断十位是否为0MOV DISPORT,#00D;为0,则关闭十位数码管显示CLR TENSPCLR ONESPSJMP MID1MID: MOV DISPORT,R3 ;不为0,则显示对应的值SETB TENSPCLR ONESPNOPNOPNOPNOPNOPNOPNOPNOPNOPMID1: DJNZ R7,DELAY2DJNZ R6,DELAY1RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH JMP STARTENDDIV ABMOV 40H,AMOV A,BMOV B,#05DDIV ABMOV 41H,Amov dptr,#table ;显示mov a, 40hmovc a,@a+dptrmov p0,aclr p0.7mov dptr,#tablemov a, 41hmovc a,@a+dptrmov p2,asjmp midSW: CPL CLOCKRETI ;中端程序翻转CLOCK引脚,形成时钟信号TABLE: D B 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H ;显示码表,小数点不亮DELAY: M OV R7, #5D1: MOV R6, #5D2: MOV R5, #5D3: DJNZ R5,D3DJNZ R6,D2DJNZ R7,D1RETEND实验四串行通信上位机采用网上下载的串口调试软件,本设计中使用的软件界面如下。
ORG 00HSJMP MAINORG 23HLJMP COMPRO ;串行中断入口ORG 40HMAIN:MOV TMOD,#20H ;定时器T1工作模式2,初值224DMOV TL1,#0F3HMOV TH1,#0F3HMOV SCON,#50H ;串口工作模式1,波特率2.4k,无奇偶校验CLR RICLR TISETB TR1SETB EASETB ES ;打开串行口中断WAIT: JB P3.3,$ ;S3没按下为高电平,等待ACALL DELAYJB P3.3,$MOV A,#20HMOV SBUF,A ;发送空格MOV DPTR,#TDATA ;将要发送的数据表格地址给DPTR XY: MOV A,#00HMOVC A,@A+DPTRCJNE A,#00FFH,XY ;判断有没发完SJMP W AITTDATA: DB 'Changzhou ','Institute ','of Technology!',0AH,0FFH;要发送的信息,0AH换行的ASCII码,0FFH为设定的信息结束标志delay: mov r7,#255 ;延时del1: mov r6,#255 ;NOPNOPNOPdel2: djnz r6,del2djnz r7,del1retCOMPRO: JNB TI,RECV ;串行通信中断处理程序;判断是接受中断还是发送中断的标志,从而进行对应的处理CLR TI ;发送中断处理,首先清标志位MOV A,#00HMOVC A,@A+DPTRCJNE A,#00FFH,TXDA;判断是否为信息结束标志,否则发送SJMP RETURN;是结束标志退出中断TXDA: MOV SBUF,AINC DPTR;发送后,数据指针加1,指向要发送的下一字节数据SJMP RETURNRECV: CLR RI ;接受中断处理MOV A,SBUFMOV R5,AANL A,#0FH ;取低4位显示ADD A,#13 ;加上本条指令与显示码表格首地址间的间隔MOVC A,@A+PCMOV P2,A ;十六进制的低位用数码管L2显示MOV A,R5SWAP AANL A,#0FHADD A,#4HMOVC A,@A+PCMOV P0,A ;;十六进制的高位用数码管L1显示SJMP RETURNDIS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HDB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH;共阳数码管0-F的显示码RETURN: NOPRETIEND。