单片机实验参考程序

合集下载

单片机实验程序

单片机实验程序

实验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 。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档