单片机实验程序
基于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位单片机实验程序讲解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灯闪烁、温度监测、电机控制等。
单片机实验程序全
名称:主程序
说明:
**********************************************************/
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)
单片机整套实验及程序(交通灯_跑马灯等)
实验1 跑马灯实验一、实验目的●初步学会Proteus ISIS和uVision2单片机集成开发环境的使用;●初步掌握采用汇编语言与C语言开发单片机系统的程序结构;●掌握80C51单片机通用I/O口的使用;●掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。
二、实验设备及器件●硬件:PC机,HNIST-1型单片机实验系统●软件:Proteus ISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容●编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管(D1、D2、D3、D4)按照一定的方式点亮。
如点亮方式为:先点亮D1,延时一段时间,再顺序点亮D2……D4,然后又是D4……D1,同时只能有一个灯亮;然后每隔一段时间一次使相邻两个灯亮,三个灯亮,四个灯亮,最后闪烁三次,接着循环变化。
●基于Proteus ISIS仿真环境完成上述功能的仿真。
●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。
四、实验原理图图3.1 跑马灯实验电路原理图电路原理图如上图3.1所示,AT89S52的P1.0~P1.3控制4个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。
五、软件流程图与参考程序●主程序流程图如下:●参考程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa,num,speed,flag;uchar code table[]={0x0e,0x0d,0x0b,0x07};uchar code table1[]={0x0a,0x05,0x09,0x06};uchar codetable2[]={0x0c,0x09,0x03,0x08,0x01,0x0e,0x0c,0x08,0x00};void delay(uint z)//延时函数{uint x;uchar y;for(x=z;x>0;x--)for(y=200;y>0;y--);}void init()//条件初始化函数{ flag=0;speed=10;//控制跑马灯流水速度TMOD=0x01;//中断方式TH0=(65535-50000)/256;TL0=(65536-50000)%256;//初值EA=1;//打开总中断ET0=1;//打开外中断0TR0=1;}void main(){init();//调用初始化函数while(1){if(flag){delay(2000);//调用延时函数for(num=0;num<4;num++)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=0;num<4;num++)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=0;num<6;num++)//两个,三个,四个跑马灯依次闪烁{P1=table2[num];delay(2000);}for(num=0;num<5;num++)//闪烁5次{P1=0xff;//全暗delay(2000);P1=0X00;//全亮delay(2000);}speed=speed-3;//变速if(speed==4){speed=10;}}}}void timer0() interrupt 1//中断函数{TH0=(65535-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==speed){aa=0;flag=1;}}六、实验思考题●请用汇编指令完成本实验内容,深刻理解汇编语言程序设计结构。
单片机实验二 定时器实验程序
sbit L3=P0^7;
unsigned char keynum;
unsigned int lasttime=100;
bit bset=0;
unsigned char keyscan();
void display();
unsigned char getkey();
void set();
code unsigned char table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
sbit H1=P3^6;
sbit H2=P3^7;
sbit L1=P0^5;
void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
P1M1=0x00;
P1M0=0xff;
while(1)
{
keynum=keyscan();
display();
set();
}
}
void timer0() interrupt 1
{
P1=0X00;
W1=1;
W2=0;W3=1;W4=1;
P1=table[(unsigned char)(lasttime%1000/100)]|a;
}
else if(ct1<60)
{
P1=0X00;
W2=1;
W3=0;W4=1;W1=1;
P1=table[(unsigned char)(lasttime%1000%100/10)]|a;
单片机实训报告实验步骤
一、实验目的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. 实验过程中,积极思考,勇于创新,提高动手能力。
单片机实验程序..
一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位并送1发光二极管显示MOV 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 0000HLJMP INITTAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ;字符段码表0-7 DB 080H,090H ;字符段码表8-FINIT: lcall Init_Device ;调用初始设置子程序INIT1: MOV R1,#00H ;操作数据初始值MOV A,R1MAIN: MOV 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;检查操作数据是否大于显示范围(F)SJMP INIT1 ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END二1.例程5程序修改(1)将KEY2、KEY4的功能对调(2)每次停下再启动以后,更改发光二极管点亮的循环方向$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令ORG 0000HLJMP INITIAL ;主程序入口ORG 0003HLJMP STOP ;外中断0服务程序入口,开始键(STAR)ORG 0013HLJMP STAR ;外中断1服务程序入口停止键(STOP)ORG 0100HINITIAL: L CALL 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 ;设置INT0(开始键STAR)为高优先级MOV TCON,#05H ;外中断采用边沿触发SETB EX0 ;INT1(停止键STOP)开中断SETB EA ;开放中断LOOP: CLR EA ;关闭中断CJNE R4, #0FH, LPRL ACJNE R4,#0FH,LPMOV P3,ACJNE R4,#0FH,LPINC R1CJNE R4,#0FH,LPSETB EALCALL DELAY1LCALL DELAY1LCALL DELAY1LCALL DELAY1CJNE R1,#8H,LOOPMOV R1,#0HSJMP LOOPLP: CLR 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;停止键的中断服务程序STOP: 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 ;中断返回;启动键的中断服务程序STAR: 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 ;调用显示子程序显示初值0MOV 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显示计数器0的计数值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: MOV DPTR,#TABMOVC A,@A+DPTRRETTAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ;显示段码0-7 DB 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、D的ASCII码(2)将接收的第2、第3字节数据的显示位置交换$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令NUM2 EQU 07F80H ;NUM2地址NUM3 EQU 07F90H ;NUM3地址NUM4 EQU 07FA0H ;NUM4地址NUM5 EQU 07FB0H ;NUM5地址TIM_L EQU 0FDH ;T/C1低字节计数值TIM_H EQU 0FDH ;T/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 ;通信操作状态寄存器清除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 E A ;开中断;主循环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有效键值移入位累加器CJC K2 ;键值无效转KEY3键值的分析MOV A,#2 ;否则,KEY2代码送A寄存器SJMP K5K2: RRC A ;KEY3有效键值移入位累加器CJC K3 ;键值无效转KEY4键值的分析MOV A,#3 ;否则,KEY3代码送A寄存器SJMP K5K3: RRC A ;KEY4有效键值移入位累加器CJC K4 ;键值无效转按键无效处理MOV A,#4 ;否则,KEY4代码送A寄存器SJMP K5K4: MOV A,#0FFH ;按键无效代码送A寄存器K5: RETDISPLAY: MOV A,REC_BUF2 ;读取接收的第2字节数据SWAP A ;高、低4位交换ANL A,#0FH ;分离高4位有效数值CALL DECODE ;换码MOV DPTR,#NUM2MOVX @DPTR,A ;在数码管NUM2显示第2字节数据高4位数值MOV A,REC_BUF2 ;读取接收的第2字节数据ANL A,#0FH ;提取低4位有效数值CALL DECODE ;换码MOV DPTR,#NUM3MOVX @DPTR,A ;在数码管NUM3显示第2字节数据低4位数值MOV A,REC_BUF1 ;读取接收的第3字节数据SWAP A ;高、低4位交换ANL A,#0FH ;分离高4位有效数值CALL DECODE ;换码MOV DPTR,#NUM4MOVX @DPTR,A ;在数码管NUM4显示第3字节数据高4位数值MOV A,REC_BUF1 ;读取接收的第3字节数据ANL A,#0FH ;提取低4位有效数值CALL DECODE ;换码MOV DPTR,#NUM5MOVX @DPTR,A ;在数码管NUM5显示第3字节数据低4位数值RET;------ DECODE PROGRAM -------DECODE: MOV DPTR,#TABMOVC A,@A+DPTRRET;------ DELAY PROGRAM ------DELAY: MOV R5,#80HD1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RETTAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8HDB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END。
《单片机C语言程序设计》实验报告一
《单片机C语言程序设计》实验报告一、实验目的和要求1、熟悉单片机硬件结构及其工作原理。
2、掌握单片机的I/O端口应用。
二、实验内容和原理实验1——P1作为输入端口(1)硬件设计P1端口的高四位P14、P15、P16和P17分别接4个独立按键S01、S02、S03、S04以及4个LED VD5、VD6、VD7、VD8;当独立按键按下时,对应发光二极管亮,比如S01按下时,VD5被点亮,同时P30输出低电平VD17被点亮。
电路原理图如图所示P1端口作为输入端口所需元器件入表所示(2)C源程序实验1:实验2:#include <REGX51.H>#include <Delay10ms.h>unsigned char tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff}; unsigned char tab2[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; unsigned char tab3[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};int i;void MOD1(void){for(i=0;i<8;i++){P1= tab1[i];Delay10ms();}P1= tab1[8];for(i=0;i<8;i++){P0= tab1[i];Delay10ms();}P0= tab1[8];for(i=0;i<8;i++){P3= tab1[i];Delay10ms();}P3= tab1[8];for(i=0;i<8;i++){P2= tab1[i];Delay10ms();}P2= tab1[8];}void MOD2(void){for(i=0;i<8;i++){P2= tab2[i];Delay10ms();}for(i=0;i<8;i++){P3= tab2[i];Delay10ms();}for(i=0;i<8;i++){P0= tab2[i];Delay10ms();}for(i=0;i<8;i++){P1= tab2[i];Delay10ms();}}void MOD3(void) {for(i=0;i<8;i++){P1= tab3[i];Delay10ms();}for(i=0;i<8;i++){P0= tab3[i];Delay10ms();}for(i=0;i<8;i++){P3= tab3[i];Delay10ms();}for(i=0;i<8;i++){P2= tab3[i];Delay10ms();}}int main (void){while(1){MOD1();MOD2();MOD3();}三、主要仪器设备Protues硬件仿真调试软件Keil编程软件四、操作方法与实验步骤1、根据实验一新建工程操作,新建工程。
《单片微机原理及应用》实验参考程序(32页)
《单片微机原理及应用》实验参考程序杭州电子科技大学电子信息学院张学超编写(使用达爱思Dais-80958B单片机实验开发系统)一、软件实验参考程序软件实验一清零程序Array ;将2000H-20FFH的内容清零SS01: CLR AMOV DPTR, #2000HMOV R7, #0FFHCLR0: MOVX @DPTR,AINC DPTRDJNZ R7, CLR0CLR1: SJMP CLR1 ; SJMP $软件实验二拆字程序;把2000H的内容拆开,高4位送2001H的低4位,低4位清零。
SS02: MOV DPTR, #2000HMOVX A, @DPTR ;取数MOV B, A ;暂存该数SW AP A ;高低半字节交换ANL A, #0FH ;屏蔽高4位INC DPTRMOVX @DPTR,A ;原数高半字节送2001HMOV A, B ;取回原数ANL A, #0FH ;屏蔽高4位INC DPTRMOVX @DPTR,A ;原数低半字节送2002HSJMP $软件实验三拼字程序;把2000H和2001H的低4位分别送入2002H的高低4位。
SS03: MOV DPTR, #2000HMOVX A, @DPTR ;取第一个半字节ANL A, #0FH ;屏蔽高4位SW AP A ;高低半字节交换MOV B, A ;暂存该数INC DPTRMOVX A, @DPTR,;取第二个半字节ANL A, #0FH ;屏蔽高4位ORL A, B ;两个半字节拼成一个字INC DPTRMOVX @DPTR,A ; 拼好的字送2002HSJMP $软件实验四数据区传送子程序;把R2R3为源RAM区首址内的R6R7字节数据传送到R4R5为目的RAM区。
SS04: MOV DPH, R2MOV DPL, R3 ;取源地址指针MOVX A, @DPTR ;取数据INC DPTR ;源地址指针+1MOV R2, DPHMOV R3, DPL ;保存源地址指针MOV DPH, R4MOV DPL, R5 ;取目的地址指针MOVX @DPTR, A ;存数据INC DPTR ;目的地址指针+1MOV R2, DPHMOV R3, DPL ;保存目的地址指针CLR CMOV A, R7SUBB A, #1MOV R7, AMOV B, A ;暂存16位字节数低字节MOV A, R6SUBB A, #0MOV R6, A ;字节数减一:(R6R7)← (R6R7)−1ORL A, B ;(R6R7)=0?JNZ SS04 ;未完继续传送RETSS04C: MOV R3, #00HMOV R2, #20H ;指定源地址为MOV R5, #00HMOV R4, #30H ;指定目的地址为3000HMOV R7, #00HMOV R6, #01H ;传送字节数为100HLCALL SS04 ;从2000H开始向3000H开始的地址区传送100H个数据SJMP $软件实验五数据排序实验;把8051中RAM 50H-5AH中放入不等的数据,运行本实验程序后检查50-5AH中内容是否按从小到大排列。
单片机定时器实验程序
定时器#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intUchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71}; //0~F的共阴极字段码表uchar chocode[]={0xfe,0xfd,0xfb,0xf7}; //位选码表uchar N,M;sbit P3_5=P3^5; //位定义sbit P3_6=P3^6;sbit P3_7=P3^7;sbit P0_4=P0^4;sbit P3_3=P3^3;sbit P3_4=P3^4;sbit P0_7=P0^7;//===================================延时1毫秒======================void Delay1ms(){unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}//==================================延时300毫秒=====================void Delay300ms(){unsigned char i, j, k;i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i);}//=====================================数码管显示==================void display(uchar N,M){P0=chocode[3];P1=table[M];Delay1ms();P1=0;P0=chocode[2];P1=table[N];Delay1ms();P1=0;P0=chocode[1];P1=table[0];Delay1ms();P1=0;P0=chocode[0];P1=table[0];Delay1ms();P1=0;}//========================扫描键盘,设置倒计时初值=============== void Scan_Key(void){uchar m;bit FLAG0=0;P3_6=0;P3_7=1;P0=0xff;m=P0;switch(m&0xf0){case 0xd0: N++;FLAG0=1;if(M==10){N++;M=0;}break;case 0xb0: M++;FLAG0=1;if(M==10){M=0;N++;}break;default: break;}if(FLAG0){while((P0|0x0f)!=0xff) //松手检测{display(N,M);}}else{display(N,M);}P3_6=1;P3_7=0;P0=0xff;m=P0;switch(m&0xf0){case 0xd0: N--;FLAG0=1;break;case 0xb0: M--;FLAG0=1;break;default: break;}if(FLAG0){while((P0|0x0f)!=0xff) //松手检测{display(N,M);}}else{display(N,M);}P3_7=1;P3_6=0;}//==========================主函数==============================main(){P1=0x0;while(1){uchar i;Scan_Key(); //扫描键盘,确定倒计时初值P0=0xff;if(P0_7==0) //检测是否开始倒计时{while((P0|0x0f)!=0xff) //松手检测{display(N,M);}while(1) //定时开始{for(i=0;i<120;i++) //循环定时120次,实现定时1秒钟{TMOD=0x01;TH0=0xd8;TL0=0xf0;TR0=1;display(N,M);do{display(N,M);} while(TF0==0);//检测是否完成一次定时}if((M|N)==0) //定时到,所有灯闪烁{while(1){P0=0xff;P2=0x00;P0_4=0;P3_3=0;P3_4=0;P3_5=0;Delay300ms();P2=0xff;P0_4=1;P3_3=1;P3_4=1;P3_5=1;Delay300ms();}}if(M==0){M=9;N--;}else M--;}}}}。
单片机实验 带程序的
五.实验步骤: 1. 连接电源线和串行口数据线; 2. 把P3.1接至P3.0孔,P1.0~P1.7分别接发光二极管 L1~L8孔。 3.打开DICE—5203 K实验开发系统的电源; 4. 启动计算机,打开桌面软件文件夹,选择MS51仿真 开发系统图标双击,进入软件编程界面; 5. 编制程序,调试、运行; 6. 从按键开关输入数字量,观察发光二极管的发光状 态,或从寄存器观察其对应数值。 六.思考题: 修改程序,使串行口工作于方式3或 2(考虑波特率)。
四、实验步骤 (一)定时/计数器T0延时实验 1、连接电源线和串行口数据线; 2、用插针将P1.0孔与发光二极管L1孔相连, P1.1孔与发光二极管L2孔相连; 3、打开DICE—5203 K实验开发系统的电源; 4、启动计算机,打开桌面软件文件夹,选择 MS51仿真开发系统图标双击,进入软件 编程界面; 5、编制程序,调试、运行; 6、观察发光二极管状态。
• void tim0(void) interrupt 1 using 1 • { EA=0; • i++; • j++; • if(i==20) • {P1_0=!P1_0; • i=0;} • if(j==100) • {P1_1=!P1_1; • j=0;} • TH0=(65536-50000)/256; • TL0=(65536-50000)%256; • EA=1; • }
ds-ms(int j) {uchar k; while(j--!=0) for(k=0,k<125,k++);}
void main (void) { uchar i,a; COM8255 =0x80; a =0x01; for(i=0,i<8,i++) {PB8255=a; ds-ms(500); a=a<<1; if(a==0)a=0x01; } }
单片机定时器实验程序
void tim(void) interrupt 1 using 1
{
ET0=0; TR0=0;
//关闭中断 保证程序顺利运行
TH0=0xd8; //重新赋值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
time--; //second 秒减 1
if(time==0) //second
void DelayMS(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) for(j=300;j>0;j--);
}
/******************************************************************/
/*
显示函数 1
*/
/******************************************************************/
T1_init();
//P0=0xff;
while(1) { keyscan(); // k = key(); switch(k) { case KM: { Display1(); break; }
//无任何按键按下 默认为 0 返回
case 1: { time+=10; time=time%99; Display1(); k=KM; break; }
void T1_init()
{ TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式 1,16 位定时 TH0=0x0dc; TL0=0x00; EA=1; //开总中断 //IE= 0x82; //打开中断
51单片机实验程序
用查表方式编写y=x13+x23+x33。
(x为0~9的整数)#include<reg51。
h>void main(){int code a[10]={0,1,8,27,64,125,216,343,512,729};//将0~9对应的每位数字的三次方的值存入code中,code为程序存储器,当所存的值在0~255或-128~+127之间的话就用char,而现在的值明显超过这个范围,用int较合适.int的范围是0~65535或-32768~32767。
int y,x1,x2,x3;//此处定义根据习惯,也可写成char x1,x2,x3但是变量y一定要用int 来定义。
x1=2;x2=4;x3=9;//x1,x2,x3三个的值是自定的,只要是0~9当中的数值皆可,也可重复.y=a[x1]+a[x2]+a[x3];while(1);//单片机的程序不能停,这步就相当于无限循环的指令,循环的内容为空白。
}//结果的查询在Keilvision软件内部,在仿真界面点击右下角(一般初始位置是右下角)的watch的框架内双击“double-click or F2 to add”文字输入y后按回车,右侧会显示其16进制数值如0x34,鼠标右键该十六进制,选择第一行的decimal,可查看对应的10进制数。
1、有10个8位二进制数据,要求对这些数据进行奇偶校验,凡是满足偶校验的数据(1的个数为偶数)都要存到内RAM50H开始的数据区中。
试编写有关程序。
#include〈reg51。
h>void main(){int a[10]={0,1,5,20,24,54,64,88,101,105};//将所要处理的值存入RAM中,这些可以根据个人随意设定,但建议不要超过0~255的范围.char i; //定义一个变量char *q=0x50;//定义一个指针*q指向内部0x50这个地址。
for(i=9;i〉=0;i--)//9~0循环,共十次,也可以用for(i=0;i〈10;i++){ACC=a[i];//将a[i]的值赋给累加器ACCif (P==0)//PSW0位上的奇偶校验位,如果累加器ACC内数值1的个数为偶数那么P为0,若为奇数,P为1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);}}}}}。