单片机实验程序

合集下载

基于C51单片机的温度闭环控制实验程序

基于C51单片机的温度闭环控制实验程序

#include <reg51.h>#include <absacc.h>#include <math.h>void pid(void) //PID算法子程序void init(void) //初始化子程序void display(void) //延时子程序void clear() //清零子程序int mmul(int x,int y) //16位乘法,溢出赋极值int madd(int x,int y) //16位加法,溢出赋极值int change32_16(int x,int t) //32——16char change16_8(int wd) //16——8#define C8255_A XBYTE[0x7F00]#define C8255_B XBYTE[0x7F01]#define C8255_C XBYTE[0x7F02]#define C8255_CON XBYTE[0x7F03]#define AD0809 XBYTE[0xFEFF] //定义AD0809的地址sbit P17=P1^7; //PWM的驱动char TS=0x64; //采样周期int X=0x80;char SPEC=0x28; //给定:要求达到的温度值char IBAND=0x60; //积分分离值:PID算法中积分分离值int KP=12; //比例系数:PID算法中比例项系数char KI=20; //积分系数char KD=32; //微分系数int CK; //控制量:PID算法产生用于控制的量int TC; //采样周期变量char FPWM; //PWM脉冲中间标识位int CK_1; //控制量变量,用于记录上次控制的值int AAAA; // PWM高电平脉冲时间计算int VAA; //AAAA变量int BBB; //PWM低电平脉冲时间计算int VBB; //BBB变量int TKMARK; //采样标志值int ADMARK; //AD转换结束标志位int ADV ALUE; //AD采样后保存int YK; //反馈:测量温度值int EK; //温度误差int EK_1;int AEK;int BEK;unsigned char dis; //BCD码显示unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char b[]={0x00,0x00,0x00,0x00}; //位选/********************温度表**************/unsigned char codea[0x100]={0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x16,0x17,0x18,0x19, 0x1a,0x1b,0x1c,0x1d,0x1e,0x1e,0x1f,0x20,0x21,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x31,0x32,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3 c,0x3d,0x3e,0x3f,0x40,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x4 f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x6 2,0x63,0x64,0x64,0x65,0x65,0x66,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6e,0x6f,0 x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,0x80,0x81,0x82,0x83,0x84,0x84,0x85,0x86,0x87,0x88,0x89,0x8 a,0x8b,0x8c,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9b,0 x9c,0x9c,0x9d,0x9d,0x9e,0x9e,0x9f,0x9f,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0 xb0,0xb0,0xb1,0xb2,0xb3,0xb4,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbd,0xbe,0xbe,0xc1 ,0xc2,0xc3,0xc4,0xc5,0xc6,0xc8,0xca,0xcc,0xce,0xcf,0xd0,0xd1,0xd2,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd ,0xde,0xe3,0xe6,0xe9,0xec,0xf0,0xf2,0xf6,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,}/**************延时子程序*********************/void delay(unsigned int time){unsigned int i;for(i=0;i<time;i++)}/*************主程序*************************/void main(){init();while(1);{while(1){if(TRMARK==0x01)break; //采样周期到否}TRMARK==0x00;while(1){if(ADMARK==0x01)break; //AD转换是否结束}ADMARK=0x00;YK=a[ADV ALUE];dis=(char)YK; //查温度表pid(); //PID算法if(CK<=0x80) //根据CK产生PWMAAAA=0x00;elseAAAA=CK-0x80;BBB=0x7f-AAAA;}}/***********初始化函数*********************/void init(void){YK=0x00; //变量初始化EK=0x00;EK_1=0x00;AEK=0x00;BEK=0x00;CK=0x00;CK_1=0x00;BBB=0x00;VBB=0x00;ADV ALUE=0x00;TKMARK=0x00;ADMARK=0x00;TC=0x00; //采样周期变量FPWM=0x01;AAAA=0x7f;V AA=0x7f;C8255_CON=0x81;display();clear();TMOD=0x11; //T1 ,T0由外部控制中断控制信号,16位定时器,工作在方式一下IP=0x02; //设定T0中断优先级最高IT1=1; //外部中断请求信号方式为脉冲触发方式,外中断1为下降沿有效EX1=1; //允许INT1中断TH0=0xd8;TL0=0xef;TH1=0xd8;TL1=0xef;ET0=ET1=1; //允许T0,T1中断TR0=TR1=1; //启动T0,T1EA=1;AD0809=1; //启动AD转换}void myint3(void) interrupt 3 //定时器1 LED显示{TH1=0xd8;TL1=0xef;ET1=1;display();clear();}void myint1(void) interrupt 2 //外中断1 读AD转换结果{ADV ALUE=AD0809;ADMARK=0x01;}void myint2(void) interrupt 1 //定时器0 启动AD转换{TH0=0xd8;TL0=0xef;ET0=1; //启动定时器0AD0809=1; //启动ADif(TC<TS)TC++; //采样周期变量else{TKMARK=0x01;TC=0x00;}if(FPWM==0x01) //产生PWM ,0x01表示加热模块{if(V A!=0x00){V AA=V AA-1;P17=0; //输出为低加热else{FPWM=0x02;VBB=BBB/2;}}if(FPWM==0x02) //0x02表示停止加热模块{if(VBB!=0x00){VBB=VBB-1;P17=1; //输出为高停止加热}else{FPWM=0x01;V AA=AAAA/2;}}return;}/*****************PID子程序***********/void pid(void){int K,P,I,D;K=P=I=D=0;EK=SPEC-YK;//得到偏差BEK=EK-EK_1-AEK;//12EKAEK=EK-EK_1; //偏差变化量/*********UK=Kp*AEK+Ki*EK+Kd*BEK****/if(abs(EK)>abs(IBAND))I=0; //判积分分离elseI=(EK*TS)/KI; //计算积分项P=AEK;D=((KD/TS)*BEK)/10000; //计算微分项//与书上对照,忽略KP K=madd(I,P);K=madd(D,K);K=mmul(K,KP);CK=K+CK_1;CK=change16_8(CK);CK_1=CK;EK_1=EK;CK=CK+X;}int mmul(int x,int y){int t,z;long s;s=x*y;z=(int)(s&0x0ffff);t=(int)((s>>16)&0x0ffff);s=change32_16(z,t);return(s);}int change32_16(int z,int t) //t=高字节,z=低字节{int s;if(t==0){if((z&0x8000)==0) s=z;else s=0x7fff;}else if((t&0xffff)==0xffff){if((z&0x8000)==0) s=0x8000;else s=z;}else if((t&0x8000)==0) s=0x7fff;else s=0x8000;return(s);}int mmad(int x,int y){int t;t=x+y;if(x>=0&&y>=0) //同号相乘,符号位变反说明溢出{if((t&0x8000)!=0) t=0x7fff;}else if(x<=0&&y<=0){if((t&0x8000)==0) t=0x8000;}return(t);}char change16_8(int wd) //t=高字节,z=低字节{char z,t,s;z=(wd>>8)&0x0ff;if(t==0x00){if((z&0x80)==0) s=z;else s=0x7f;}else if((t&0xff)==0xff){if((z&0x80)==0) s=0x80;else s=z;}else if((t&0x80)==0) s=0x7f;else s=0x80;return(s);}void display() //数码管显示函数{unsigned char i,j=0xf7;b[3]=SPEC/10;b[2]=SPEC%10;b[1]=dis/10;b[0]=dis%10;for(i=0;i<4;i++){C8255_A=j;C8255_B=led[b[i]];delay(0x55);j>>=1;}}void clear(){C8255_B=0x00;}。

16位单片机实验程序讲解

16位单片机实验程序讲解

16位单片机实验程序讲解1、用C实现发光二极管单向循环点亮//=============================================================== //// The information contained herein is the exclusive property of// Sunplus Technology Co. And shall not be distributed, reproduced,// or disclosed in whole in part without prior written permission.//// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.// ALL RIGHTS RESERVED//// The entire notice above must be reproduced on all authorized copies.////==============================================================// 工程名称:led1_C.scs// 功能描述: 用C实现发光二极管单向循环点亮// 文件来源:《61板实验教程》"实验一发光二极管单向循环点亮“// 硬件连接:IOA低8位接至SEG接口控制LED的导通// IOB6连至DIG7通过ULN2003A控制8个LED的共阴极电平状态。

// IDE环境:SUNPLUS u'nSPTM IDE 1.8.0//// 涉及的库:// 组成文件:// main.c//// 日期: 2004/8/16//===============================================================#define P_IOA_Data (volatile unsigned int *)0x7000#define P_IOA_Buffer (volatile unsigned int *)0x7001#define P_IOA_Dir (volatile unsigned int *)0x7002#define P_IOA_Attrib (volatile unsigned int *)0x7003#define P_IOB_Data (volatile unsigned int *)0x7005#define P_IOB_Buffer (volatile unsigned int *)0x7006#define P_IOB_Dir (volatile unsigned int *)0x7007#define P_IOB_Attrib (volatile unsigned int *)0x7008#define P_Watchdog_Clear (volatile unsigned int *)0x7012//=============================================================// 函数名称: Delay()// 日期:20040816// 功能描述: 实现延时// 语法格式: void Delay(void);//入口参数: 无// 出口参数: 无// 注意事项: 仅为用户模型//=============================================================void Delay(){ //延时子程序unsigned int i;for(i=0; i<32768; i++){*P_Watchdog_Clear=0x0001; //清WatchDog}}//=============================================================// 函数名称: int main()// 日期:20040816// 功能描述: 发光二极管单向循环点亮// 语法格式: void main(void);// 入口参数: 无// 出口参数: 无// 注意事项: 仅为用户模型//=============================================================int main(){int LedControl = 0x0001;*P_IOA_Dir = 0x00ff; //设置A口低8位为同向低输出*P_IOA_Attrib = 0x00ff;*P_IOA_Data = 0x0000;*P_IOB_Dir=0x0040; //设置B6口为高电平输出,保证LED共阴极接地*P_IOB_Attrib=0x0040;*P_IOB_Data=0x0040;while(1){*P_IOA_Data = LedControl; //送数据到A口LedControl = LedControl << 1;if(LedControl > 0x00FF)LedControl = 0x0001;Delay();}}//=============================================================// main.c 结束//=============================================================2、用C实现发光二极管双向循环点亮//=============================================================== //// The information contained herein is the exclusive property of// Sunplus Technology Co. And shall not be distributed, reproduced,// or disclosed in whole in part without prior written permission.//// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.// ALL RIGHTS RESERVED//// The entire notice above must be reproduced on all authorized copies.////==============================================================// 工程名称:led2_C.scs// 功能描述: 用C实现发光二极管双向循环点亮// 文件来源:《61板实验教程》"实验二发光二极管双向循环点亮“// 硬件连接:IOA低8位接至SEG接口控制LED的导通// IOB6连至DIG7通过ULN2003A控制8个LED的共阴极电平状态。

单片机程序流程图及源代码

单片机程序流程图及源代码

单片机上机实验报告【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。

实验内容:1)输出实验:假定4个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。

2)输入:从P0口输入某个数据到累加器A,打开观察窗口观察数据是否进入累加器A。

实现方式:通过peripherals实现端口数据观察实验。

程序流程图:将P0到P3端口先赋值为0,调用延迟后,再赋1,然后循环执行。

源代码:ORG 0000H ;程序入口地址LJMP MAIN ;跳转到主程序ORG 0300H ;主程序地址MAIN:MOV P0,#00H;MOV P1 ,#00H;MOV P2 ,#00H;MOV P3 ,#00H ;P0~P3均赋值为0ACALL DEL;调用延迟MOV P0 ,#0FFH;MOV P1 ,#0FFH;MOV P2 ,#0FFH;MOV P3 ,#0FFH;P0~P3均设为1MOV A,P0;将P0口值赋给累加器ACALL DEL;AJMP MAIN;跳转到主程序入口ORG 0200H;延迟程序入口地址DEL:MOV R5,#04H;寄存器实现延迟,F3:MOV R6,#0FFH;若主频为12MHZ则F2:MOV R7,#0FFH;延时为256*256*4F1:DJNZ R7,F1;0.26S,人眼可分辨DJNZ R6,F2;DJNZ R5,F3;RET;从延迟程序返回END;结束3.假设P0口外接一个数码管(共阴),如图,请在数码管上轮流显示数字0~9(采用软件延时)。

程序流程图:将数码管的真值编码0~9依次赋给P0并调用延迟,然后循环运行程序即可。

源代码:ORG 0000H; 程序入口SJMP MAIN; 跳转到主程序ORG 0300H; 主程序入口地址MAIN:MOV P0,#0FCH; 将数码管0的编码赋给P0口ACALL DELAY; 调用延迟,使数码管亮0持续0.33SMOV P0,#60H; show 1ACALL DELAY;MOV P0,#0DAH; show 2ACALL DELAY;MOV P0,#0F2H; show 3ACALL DELAY;MOV P0,#66H; show 4ACALL DELAY;MOV P0,#0B6H; show 5ACALL DELAY;MOVP0,#0BEH; show 6ACALL DELAY;MOV P0,#0E0H; show 7ACALL DELAY;MOV P0,#0FEH; show 8ACALL DELAY;MOV P0,#0F6H; show 9ACALL DELAY;AJMP LOOP; 跳转到主程序入口ORG 0200H; 延迟程序入口DEL:MOV R5,#05H; 采用软件延迟,若主频为12MHz,则DEL1:MOV R6,#0FFH; 定时时间为256*256*5*1uS=0.33S,DEL2:MOV R7,#0FFH; 人眼可分辨。

单片机实验全部程序

单片机实验全部程序

实验一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;}}}}}实验原理图。

单片机实验程序及流程图

单片机实验程序及流程图

《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义三.程序清单及程序流程框图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”即可实现其功能。

单片机实验源程序及结果

单片机实验源程序及结果

实验2.2 (跑马灯)主要程序代码; code sectionORG ROMStartEntry:LDS #RAMEnd+1 ; initialize the stack pointerLDAA #$FFSTAA DDRBLDAA #$C0STAA IRQCRCLI ; enable interruptsLDAA #$FFSTAA PORTBLDAA #$0FSTAA PORTBBSR DELAYRTIDELAY:PSHXPSHYLDX #200DELAY1: LDY #200DELAY2: NOPNOPDBNE Y,DELAY2DBNE X,DELAY1PUL YPULXRTI;************************************************************** ;* Interrupt Vectors *;************************************************************** ORG $FFFEDC.W Entry实验2.3 (4个拨位开关(SW3-1、2、3、4)控制4个LED的亮或灭)主要程序代码ORG $2000LDAA #$F0STAA DDRBSHIFT: LDAA PORTBSTAA PORTBBRA DELAYLSLALSLALSLALSLABRA SHIFTDELAY: PSHAPSHBPSHXLDX #$0200DELAY1: LDY #$0500DELAY2: DEYBNE DELAY2DEXBNE DELAY1PULXPULBPULARTS实验4.1 (A/D转换)主要程序代码ORG ROMStartEntry:LDS #RAMEnd+1 ; initialize the stack pointerLDAA #$FFSTAA DDRTLDAA #$00STAA PTTLDAA #$C0STAA ATD0CTL2LDAA #$08STAA ATD0CTL3LDAA #$E7STAA ATD0CTL4LDAA #$A5STAA ATD0CTL5LDAA #$00STAA ATD0DIENW AIT: ; BRCLR A TD0STA T1,#$01,W AITLDAA A TD0STA T1ANDA #$01BNE CONBRA W AITCON: LDAA ATD0DR0LCOMASTAA PTTBRA W AIT;************************************************************** ;* Interrupt Vectors *;************************************************************** ORG $FFFEDC.W Entry ; Reset Vector实验4.2 (SCI串行通信与A/D转换)主要程序代码ORG ROMStartEntry:LDS #RAMEnd+1 ; initialize the stack pointerSEILDX #13STX SCI0BDLDAA #0STAA SCI0CR1LDAA #$0CSTAA SCI0CR2BRCLR SCI0SR1,#$88,*STAA SCI0DRLLDAA #$FFSTAA DDRTLDAA #$00STAA PTTLDAA #$C0STAA ATD0CTL2LDAA #$08STAA ATD0CTL3LDAA #$E7STAA ATD0CTL4LDAA #$A5STAA ATD0CTL5LDAA #$00STAA ATD0DIENW AIT0: BRCLR SCI0SR1,#$20,*LDAA SCI0DRLLDAB #$88CBABNE W AIT0W AIT: BRCLR A TD0STA T1,#$01,W AITLDAA A TD0DR0LCOMABRCLR SCI0SR1,#$80,*STAA SCI0DRLBRA W AIT;************************************************************** ;* Interrupt Vectors *;************************************************************** ORG $FFFEDC.W Entry ; Reset Vector实验3.1 (外部中断IRQ触发的LED跑马灯)主要程序代码FLAG EQU $2000; code sectionORG ROMStartMAIN:Entry:LDS #RAMEnd+1LDAA #$FFSTAA DDRBLDAA #$C0STAA IRQCRCLILDAA #$FFSTAA PORTBNEXT: LDAA #$00STAA FLAGWAIT: CMPA FLAGBEQ WAITSECLDAA #$FESHIFT: STAA PORTBBSR DELAYLDAB PTPANDB #$01BEQ NEXTROLABRA SHIFTIRQ_ISR:LDAA #$FFSTAA FLAGRTIDELAY:PSHXPSHYDELAY1: LDY #200DELAY2: NOPNOPDBNE Y,DELAY2DBNE X,DELAY1PULYPULXRTSORG $FFF2FDB IRQ_ISR;************************************************************** ;* Interrupt Vectors * ;************************************************************** ORG $FFFEDC.W Entry ; Reset Vector实验3.2 (3s精确定时)主要程序代码ORG ROMStartEntry:LDS #RAMEnd+1 ; initialize the stack pointerSEILDAA #$FFSTAA DDRBLDAA #$FFSTAA PORTBLDAA #$80STAA TSCR1LDAA #$07STAA TSCR2LDAA #$01STAA TIELDAA #$01STAA TIOSLDAA #$00STAA TCTL2LDAA #$01STAA TFLG1LDX #46875ADDX TCNTSTX TC0CLIWAIT: BRA W AITTC0_ISR:SEILDAA #$01STAA TFLG1LDX #46875ADDX TCNTSTX TC0LDAA #$7FSTAA PORTBBSR DELAYLDAA #$FFSTAA PORTBCLIRTI;************************************************************** ;* Interrupt Vectors *;************************************************************** ORG $FFEEFDB TC0_ISRORG $FFFEDC.W Entry ; Reset Vector。

最新修改后单片机实验程序

最新修改后单片机实验程序

将RAM30H、31H、32H内容相加并存入33HORG 0000HLJMP 0200HORG 0200HST:MOV R0,#30HMOV R1,#03HMOV A,#00HLOOP: ADD A,@R0INC R0DJNZ R1,LOOPMOV @R0,ASJMP $END单片机8个LED灯来回左移右移ORG 0000HSTART:MOV R2,#8MOV #01HCLR CLOOP: MOV P1,ALCALL DELAYRLC ADJNZ R2,LOOPMOV R2,#8LOOP1: MOV P1,ALCALL DELAYRRC ADJNZ R2,LOOP1LJMP START添加DELAY的延时程序部分实验3-3LED数码管“8”从右往左不停移动ZWMADDR EQU 8002HZXMADDR EQU 8004HORG 0000HST: LJMP MAINORG 0030HMAIN: MOV A,#7FHLOOP: MOV DPTR,#ZXMADDRMOVX @DPTR,AMOV A,#01HMOV DPTR,#ZWMADDRLOOP1: MOVX @DPTR,AMOV R2,#25HRL ASJMP LOOP1DELAY: PUSH 02HLP1: PUSH 02HLP2: PUSH 02HLP3: DJNZ R2,LP3POP 02HDJNZ R2,LP2POP 02HDJNZ R2,LP1POP 02HDJNZ R2,DELAYRETEND实验3-4LED数码管把0-f逐一从左向右显示ZWMADD R EQU 8002HZWMADDR EQU 8004HORG 0000HST: LJMP MAINORG 0100HMAIN: MOV R3,#01HMOV R4,#00HLOOP: MOV DPTR,#CHARMOV A,R4MOVC A,@A+DPTRMOV DPTR,#ZXMADDRMOVX @DPTR,AMOV A,R3MOV DPTR.#ZWMADDRMOVX @DPTR,AMOV R2,#25HLCALL DELAYMOV A,R3RL AMOV R3,AINC R4CJNE R4,#10H,LOOPSJMP MAINDELAY: PUSH 02HLP1: PUSH 02HLP2: PUSH 02HLP3: DJNZ R2,LP3POP 02HPOP 02HDJNZ R2,LP1POP 02HDJNZ R2,DELAYRETCHAR: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71HEND3-4大改LED数码管上显示0-f先慢后快ZWMADDR EQU 8002HZXMADDR EQU 8004HORG 0000HST: LJMP MAINORG 0100HMOV R5,#02HMAIN: MOV R3,#80HMOV R4,#00HINC R5LOOP: MOV DPTR,#CHARMOV A,R4MOVC A,@A+DPTRMOV DPTR,#ZXMADDRMOVX @DPTR,AMOV A,R3MOV DPTR,#ZWMADDRMOVX @DPTR,ACLR AMOV A,R5JB ACC.0,AGAINMOV R2,#25HLCALL DELAYAGAIN: MOV R2,#14HLCALL DELAYCLR AMOV A,R3RR AMOV R3,ANEXT: INC R4CJNE R4,#10H,LOOPSJMP MAINDELAY: PUSH 02HLP1: P USH 02HLP2: P USH 02HLP3: D JNZ R2,LP3POP 02HDJNZ R2,LP2POP 02HDJNZ R2,LP1POP 02HDJNZ R2,DELAYRETCHAR: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07HDB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71HEND实验4-1使数码管不停取反达到一闪一闪效果ORG 0000HSTART: CPL P1.0MOV R2,#25HLCALL DELAYSJMP STARTDELAY: PUSH 02HLP1: P USH 02HLP2: P USH 02HLP3: D JNZ R2,LP3POP 02HDJNZ R2,LP2POP 02HDJNZ R2,LP1POP 02HRETEND实验4-2低四位输入,高四位输出的与输入相反。

单片机程序大全

单片机程序大全

单片机程序大全(以下是一个以“单片机程序大全”为题目的文章范例,依据题目性质并非一个合同或作文的格式。

请注意,这个范例只是为了明示写作格式的变化,并非提供一个实际的单片机程序大全。

)单片机程序大全本文将为大家提供一个全面的单片机程序大全,涵盖了各种常见的单片机应用。

希望本文能够对单片机程序的学习和实践有所帮助。

一、LED灯程序LED灯是一个常见的单片机实验项目。

以下是一个基本的LED灯闪烁程序的代码,使用C语言编写:```c#include <reg51.h>#define LED P0void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {LED = 0xFF; // 所有LED灯亮delay(1000); // 延时1秒LED = 0x00; // 所有LED灯灭delay(1000); // 延时1秒}}```二、温度监测程序单片机可以用于温度监测,以下是一个简单的温度监测程序的代码示例,使用C语言编写:```c#include <reg51.h>#define TEMP P1void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {if (TEMP > 30) {P0 = 0x01; // 温度过高,亮起警示灯 } else {P0 = 0x00; // 温度正常,灭掉警示灯 }delay(100); // 延时0.1秒}}```三、电机控制程序单片机常用于电机控制,以下是一个电机正反转控制程序的代码示例,使用C语言编写:```c#include <reg51.h>#define MOTOR P2void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {MOTOR = 0x01; // 电机正转delay(1000); // 延时1秒MOTOR = 0x02; // 电机反转delay(1000); // 延时1秒}}```以上仅是三个简单的单片机程序示例,单片机的应用非常广泛,包括但不限于LED灯闪烁、温度监测、电机控制等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一#include<reg52.h>#include<reg52.h>#define uchar unsigned charsbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff}; tab2[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3b,0x37,0x2f,0x1f}; tab3[]={0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; tab4[]={0x1f,0x2f,0x37,0x3b,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f}; void Delay1s() //@11.0592MHz{ unsigned char i,j,k;for(i=10;i>0;i--)for(j=200;j>0;j--)for(k=250;k>0;k--)}void delay20ms(){unsigned char i,j;for(i=100;i>0;i--)for(j=60;j>0;j--);}void flick(){uchar d;while(d<=2){P2=0x00;P3=0xc3;Delay1s();P2=0xff;P3=0xff;Delay1s();d++;}}void main(){uchar b,y,n;flick();while(1){n=b;y=(n%2);if(y==1){uchar x;for(x=0;x<12;x++){P2=tab3[x];P3=tab4[x];Delay1s();H1=0;H2=0;L1=1;L2=1;L3=1;if(!L1||!L2||!L3){Delay20ms();if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}if(y==0){uchar x;for(x=0;x<12;x++){P2=tab1[x];P3=tab2[x];Delay1s();H1=0;H2=0;L1=1;L2=1;L3=1;if(!L1||!L2||!L3){ delay20ms()if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}}二#include<reg52.h>#include<reg52.h>#define uchar unsigned charsbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff}; tab2[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3b,0x37,0x2f,0x1f}; tab3[]={0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; tab4[]={0x1f,0x2f,0x37,0x3b,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f}; void Delay1s() //@11.0592MHz{ unsigned char i,j,k;for(i=10;i>0;i--)for(j=200;j>0;j--)for(k=250;k>0;k--)}void delay10ms(){unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--);}void flick(){uchar d;while(d<=2){P2=0x00;P3=0xc3;Delay1s();P2=0xff;P3=0xff;Delay1s();}}void main(){uchar b,y,n;flick();while(1){n=b;y=(n%2);if(y==1){uchar x;for(x=0;x<12;x++){P2=tab3[x];P3=tab4[x];Delay1s();H1=0;H2=0;L1=1;L2=1;L3=1;if(!L1||!L2||!L3){Delay10ms();if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}if(y==0){uchar x;for(x=0;x<12;x++){P2=tab1[x];P3=tab2[x];Delay1s();H1=0;H2=0;L1=1;L3=1;if(!L1||!L2||!L3){ delay10ms()if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}}}三#include<reg52.h>#include<reg52.h>#define uchar unsigned charsbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff}; tab2[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3b,0x37,0x2f,0x1f}; tab3[]={0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; tab4[]={0x1f,0x2f,0x37,0x3b,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f}; void Delay1s() //@11.0592MHz{ unsigned char i,j,k;for(i=0;i<10;i++)for(j=0;j<200;j++)for(k=0;k<250;k++)}void delay10ms(){unsigned char i,j,k;for(i=0;i<5;i++)for(j=0;j<4;j++)for(k=0;k<248;k++);}void flick(){uchar d;while(d<=2){P2=0x00;P3=0xc3;Delay1s();P2=0xff;P3=0xff;Delay1s();d++;}}void main(){uchar b,y,n;flick();while(1){n=b;y=(n%2);if(y==1){uchar x;for(x=0;x<12;x++){P2=tab3[x];P3=tab4[x];Delay1s();H1=0;H2=0;L1=1;L2=1;L3=1;if(!L1||!L2||!L3){Delay10ms();if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}if(y==0){uchar x;for(x=0;x<12;x++){P2=tab1[x];P3=tab2[x];Delay1s();H1=0;H2=0;L1=1;L2=1;L3=1;if(!L1||!L2||!L3){ delay10ms()if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}}}四#include<reg52.h>#include<reg52.h>#define uchar unsigned charsbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff}; tab2[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3b,0x37,0x2f,0x1f}; tab3[]={0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; tab4[]={0x1f,0x2f,0x37,0x3b,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f}; void Delay1s() //@11.0592MHz{ unsigned char h,i,j,k;for(h=0;h<5;h++)for(i=0;i<4;i++)for(j=0;j<116;j++)for(k=0;k<214;k++)}void delay10ms(){unsigned char h,i,j,k;for(i=0;i<5;i++)for(j=0;j<4;j++)for(k=0;k<248;k++);}void flick(){uchar d;while(d<=2){P2=0x00;P3=0xc3;Delay1s();P2=0xff;P3=0xff;Delay1s();d++;}}void main(){uchar b,y,n;flick();while(1){n=b;y=(n%2);if(y==1){uchar x;for(x=0;x<12;x++){P2=tab3[x];P3=tab4[x];Delay1s();H1=0;H2=0;L1=1;L2=1;L3=1;if(!L1||!L2||!L3){Delay10ms();if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}if(y==0){uchar x;for(x=0;x<12;x++){P2=tab1[x];P3=tab2[x];Delay1s();H1=0;H2=0;L1=1;L2=1;L3=1;if(!L1||!L2||!L3){ delay10ms()if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}}}五#include<reg52.h>#include<reg52.h>#define uchar unsigned charsbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff}; tab2[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3b,0x37,0x2f,0x1f}; tab3[]={0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; tab4[]={0x1f,0x2f,0x37,0x3b,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f}; void Delay1s() //@11.0592MHz{ unsigned char h,i,j,k;for(h=0;h<5;h++)for(i=0;i<4;i++)for(j=0;j<116;j++)for(k=0;k<214;k++)}void delay10ms(){unsigned char i,j,k;for(i=108;i>0;i--)for(j=145;j>0;j--);}void flick(){uchar d;while(d<=2){P2=0x00;P3=0xc3;Delay1s();P2=0xff;P3=0xff;Delay1s();d++;}}void main(){uchar b,y,n;flick();while(1){n=b;y=(n%2);if(y==1){uchar x;for(x=0;x<12;x++){P2=tab3[x];P3=tab4[x];Delay1s();H1=0;H2=0;L1=1;L2=1;L3=1;if(!L1||!L2||!L3){Delay10ms();if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}if(y==0){uchar x;for(x=0;x<12;x++){P2=tab1[x];P3=tab2[x];Delay1s();H1=0;H2=0;L1=1;L2=1;L3=1;if(!L1||!L2||!L3){ delay10ms()if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}}}六#include<reg52.h>#include<reg52.h>#define uchar unsigned charsbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff}; tab2[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3b,0x37,0x2f,0x1f}; tab3[]={0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; tab4[]={0x1f,0x2f,0x37,0x3b,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f}; void Delay1s() //@11.0592MHz{ unsigned char h,i,j,k;for(i=0;i<5;i++)for(i=0;i<4;i++)for(j=0;j<116;j++)for(k=0;k<214;k++)}void delay20ms(){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++)for(k=0;k<248;k++);}void flick(){uchar d;while(d<=2){P2=0x00;P3=0xc3;Delay1s();P2=0xff;P3=0xff;Delay1s();d++;}}void main(){uchar b,y,n;flick();while(1){n=b;y=(n%2);if(y==1){uchar x;for(x=0;x<12;x++){P2=tab3[x];P3=tab4[x];Delay1s();H1=0;H2=0;L1=1;L2=1;L3=1;if(!L1||!L2||!L3){Delay20ms();if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}if(y==0){uchar x;for(x=0;x<12;x++){P2=tab1[x];P3=tab2[x];Delay1s();H1=0;H2=0;L1=1;L2=1;L3=1;if(!L1||!L2||!L3){ delay20ms()if(!L1||!L2||!L3)b+=1;while(!L1||!L2||!L3);}}}}}。

相关文档
最新文档