51单片机常见程序,附带注释
- 格式:doc
- 大小:142.50 KB
- 文档页数:44
51 单片机常见程序附带注释三位数分离成3个一位数,截取bai=num/100;//输出百位数shi=num%100/10;//输出十位数ge=num/10;//输出个位数#include<reg52.h> //跑马灯程序。
当时间约为20ms,形成动态扫描,看上去全亮。
#include<intrins.h>#define uint unsigned int //无符号整型,占16位数,表示围0~65536#define uchar unsigned char //无符号字符型占八位数,表示围0~255void delayms(uint);uchar aa; //定义变量void main(){aa=0xfe;while(1){P2=aa; //控制单片机接口p2,循环亮delayms(500); //当500换成5,看起来全亮,实际上灯一直亮灭,原因是视觉延迟aa=_crol_(aa, 1);}}void delayms(uint xms) //子程序,延时,通过数数{uint i, j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}#include<reg52.h> //跑马灯程序。
现在时间较长,多以是亮灭的流动,当时间约为20ms,形成动态扫描,看上去全亮。
#include<intrins.h>#define uint unsigned int //无符号整型,占16位数,表示围0~65536#define uchar unsigned char //无符号字符型占八位数,表示围0~255void delayms(uint);uchar aa; //定义变量void main(){aa=0xfe;while(1){P2=aa; //控制单片机接口p2,循环亮delayms(500); //当500换成5,看起来全亮,实际上灯一直亮灭,原因是视觉延迟aa=_crol_(aa, 1);}}void delayms(uint xms) //子程序,延时,通过数数{uint i, j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}#include <reg52.h> //52系列单片机头文件(目标:用单片机和两个共阴极数码管:使用单片机的引脚1和2,控制两个数码管静态显示00到59)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P0^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={ //共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint) ;void main (){while(1){for(num1=0;num1<=5;num1++){for(num=0;num<=9;num++){dula2=1; //打开U1锁存端P1=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sdula1=1; //打开U1锁存端P2=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=200;y>0;y--);}#include <reg52.h> //52系列单片机头文件(目标:用单片机和两个共阴极数码管)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={ //共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint) ;void main (){while(1){for(num1=0;num1<=9;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(1000); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U1锁存端P1=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1000); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=200;y>0;y--);}有语法错误#include <reg52.h> //52系列单片机头文件#define uchar unsigned char //无符号字符型占八位数,表示围0~255#define uint unsigned int //无符号整型,占16位数,表示围sbit dula1=P1^6; //申明U1锁存器锁存端段选sbit dula2=P0^7; //申明U1锁存器锁存端段选uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void display(uchar,uchar) ;uchar num,num2,shi,ge;void main (){TMOD=0x11;//设置定时器0和1为工作方式1(M1M0为01,0001 00TH0= (65535-50000)/256;//装初值12.00M晶振定时50s数为50000TL0= (65535-50000)%256;TH1= (65535-50000)/256;//装初值12.00M晶振定时50s数为50000TL1= (65535-50000)%256;EA=1;// 开总中断ET0=1; // 开定时器0中断ET1=1; // 开定时器1中断TR0=1;// 启动定时器0TR1=1;// 启动定时器1while(1)// 程序停止在这里不停的对数码管动态扫描同时等待中断的发生 {display(shi,ge);dula2=1; //打开U1锁存端P1=table[shi]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1175); //延时0.1毫秒}}void delayms(uint xms) //延时子程序{uint i,j;for (i=xms;i>0;i--) //i=xms即延时约为xms毫秒for (j=110;j>0;j--);}void T1_time()interrupt 1{TH1= (65536-50000)/256; //重装初值TL1= (65536-50000)%256;num2++; //num每加1次判断一次是否到20次if(num2==20){num2=0; //然后把num2清0重新再计数20次num++;if (num==60) //这个数用来送数码管显示,到60后归0num=0;shi=num/10; //把一个2位数分离后分别送数码管显示,十位数ge=num%10; //个位数}#include <reg52.h> //52系列单片机头文件(目标:控制时间24小时一循环)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P0^7; //申明U1锁存器锁存端段选uchar num,num1,num2,num3,num4;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num3=0;num3<=23;num3++) //每天24小时进位一{for(num2=0;num2<=59;num2++) //每60分进位一{for(num1=0;num1<=5;num1++) //每6*10s进位一{dula2=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1175); //延时0.1毫秒for(num=0;num<=9;num++) //每1s进位一{dula2=1; //打开U1锁存端P1=table[num]; //送入位选信号dula2=0;//关闭U1锁存器delayms(1000);//延时0.1毫秒}}}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒 for (y=110;y>0;y--);}#include <reg52.h> //52系列单片机头文件(目标:控制时间24小时一循环,蜂鸣器每过一段时间响一次)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选sbit f=P0; //声明单片机 P0口的第一位,也就是三极管基级的位置单片机第39接口uchar num,num1,num2,num3,num4;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num3=0;num3<=23;num3++) //每天进位一{for(num2=0;num2<=59;num2++) //每60分进位一{for(num4=0;num2<=59;num4++) //每60s 进位一{f=0; //控制蜂鸣器的不响for(num=0;num<=9;num++) //每1ms进位一{dula2=1; //打开U1锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(1074);//延时0.1毫秒}f=1; //控制蜂鸣器的响delayms(1000);}}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=10;y>0;y--);}#include <reg52.h> //52系列单片机头文件(目标:用单片机和两个共阳极数码管,控制依次显示0到59,然后循环,有合适的时间间隔,程序停止)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num1=0;num1<6;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U1锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=200;y>0;y--);}#include <reg52.h> //52系列单片机头文件(目标:用单片机和两个共阳极数码管,控制依次显示0到59,时间间隔约0.5,程序停止)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U1锁存器锁存端段选uchar num,num1;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num=0;num1<6;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U1锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}}void delayms (uint xms)//延时子程序{uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=300;y>0;y--);}#include <reg52.h> //52系列单片机头文件(目标:用单片机和两个共阳极数码管,控制依次显示0到59,时间间隔约0.5,程序停止)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U2锁存器锁存端段选uchar num,num1;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num=0;num1<6;num1++){dula1=1; //打开U1锁存端P1=table[num1]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; //打开U2锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3s}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=300;y>0;y--);}#include <reg52.h> //52系列单片机头文件(目标:用单片机和共阳极数码管,控制依次显示0到9,时间间隔约0.5s;)#define uchar unsigned char#define uint unsigned intsbit dula1=P1^7; //申明U1锁存器锁存端段选sbit dula2=P2^7; //申明U2锁存器锁存端段选uchar num;uchar code table[]={0xc0,0xf9,0xa4, 0xb0, //共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xcd,0xa1,0x86,0x8e};void delayms(uint) ;void main (){while(1){for(num=0;num<10;num++){dula1=1; //打开U1锁存端P1=table[num]; //送入位选信号dula1=0; //关闭U1锁存器delayms(100); //延时500毫秒约0.3秒dula2=1; //打开U2锁存端P2=table[num]; //送入位选信号dula2=0; //关闭U2锁存器delayms(100); //延时500毫秒约0.3秒}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--) //x=xms即延时约为xms毫秒for (y=300;y>0;y--);}#include <reg52.h> //52系列单片机头文件(目标:用定时器0的方式1实现第一个灯管以200ms闪烁;用定时器1的方式1实现数码管前两位59s循环计时)#define uchar unsigned char //无符号字符型占八位数,表示围0~255#define uint unsigned int //无符号整型,占16位数,表示围sbit dula=P2^6; //申明U1锁存器锁存端段选sbit wela=P2^7; // 申明U2锁存器锁存位选sbit led1=P1^0; //申明灯1点0uchar code table[]={ //共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint) ;void display(uchar,uchar) ;uchar num,num1,num2,shi,ge;void main (){TMOD=0x01;//设置定时器0和1为工作方式1(M1M0为01,0001 00TH0= (65535-50000)/256;//装初值12.00M晶振定时50s数为50000TL0= (65535-50000)%256;TH1= (65535-50000)/256;//装初值12.00M晶振定时50s数为50000TL1= (65535-50000)%256;EA=1;// 开总中断ET0=1; // 开定时器0中断ET1=1; // 开定时器1中断TR0=1;// 启动定时器0TR1=1;// 启动定时器1while(1)// 程序停止在这里不停的对数码管动态扫描同时等待中断的发生 {display(shi,ge);}}void display (uchar shi,uchar ge) //控制数码管{dula=1; //打开U1锁存端段选P0=table[shi]; //送入段选信号dula=0; //关闭U1锁存器P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存器时wela=1; //原来的段选数据通过位选锁存器造成混乱P0=0xfe; //送位选数据wela=0;delayms(5); //延时dula=1; //打开U1锁存端段选P0=table[ge]; //送入段选信号dula=0; //关闭U1锁存器P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存器时 wela=1; //原来的段选数据通过位选锁存器造成混乱P0=0xfe; //送位选数据wela=0;delayms(5); //延时}void delayms(uint xms) //延时子程序{uint i,j;for (i=xms;i>0;i--) //i=xms即延时约为xms毫秒for (j=110;j>0;j--);}void T0_time()interrupt 1{TH0= (65536-50000)/256; //重装初值TL0= (65536-50000)%256;num++;if(num1==4) //num1每加1次判断一次是否到4次 ,时间间隔200ms {num1=0; //然后把num1清0重新再计数4次led1=~led1; //让发光管状态取反}}void T1_time()interrupt 3{TH1= (65536-50000)/256; //重装初值TL1= (65536-50000)%256;num2++; //num每加1次判断一次是否到20次if(num2==20){num2=0; //然后把num2清0重新再计数20次num++;if (num==60) //这个数用来送数码管显示,到60后归0num=0;shi=num/10; //把一个2位数分离后分别送数码管显示,十位数ge=num%10; //个位数}}#include <reg52.h> //52系列单片机头文件(目标:用定时器0的方式1实现第一个灯管以200ms闪烁;用定时器1的方式1实现数码管前两位59s循环计时)#define uchar unsigned char //无符号字符型占八位数,表示围0~255#define uint unsigned int //无符号整型,占16位数,表示围sbit dula=P2^6; //申明U1锁存器锁存端段选sbit wela=P2^7; // 申明U2锁存器锁存位选sbit led1=P1^0; //申明灯1点0uchar code table[]={ //共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint) ;void display(uchar,uchar) ;uchar num,num1,num2,shi,ge;void main (){TMOD=0x01;//设置定时器0和1为工作方式1(M1M0为01,0001 0001)TH0= (65535-50000)/256;//装初值12.00M晶振定时50s数为50000TL0= (65535-50000)%256;TH1= (65535-50000)/256;//装初值12.00M晶振定时50s数为50000TL1= (65535-50000)%256;EA=1;// 开总中断ET0=1; // 开定时器0中断ET1=1; // 开定时器1中断TR0=1;// 启动定时器0TR1=1;// 启动定时器1while(1)// 程序停止在这里不停的对数码管动态扫描同时等待中断的发生{display(shi,ge);}}void display (uchar shi,uchar ge) //控制数码管{dula=1; //打开U1锁存端段选P0=table[shi]; //送入段选信号dula=0; //关闭U1锁存器P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存器时wela=1; //原来的段选数据通过位选锁存器造成混乱P0=0xfe; //送位选数据wela=0;delayms(5); //延时dula=1; //打开U1锁存端段选P0=table[ge]; //送入段选信号dula=0; //关闭U1锁存器P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存器时wela=1; //原来的段选数据通过位选锁存器造成混乱P0=0xfe; //送位选数据wela=0;delayms(5); //延时}void delayms(uint xms) //延时子程序{uint i,j;for (i=xms;i>0;i--) //i=xms即延时约为xms毫秒for (j=110;j>0;j--);}#include <reg52.h> //52系列单片机头文件(目标:中断程序,控制1点0二极管10ms闪烁)#define uchar unsigned char#define uint unsigned intsbit led1=P1^0; //声明单片机 P1口的第一位uchar num;void main (){TMOD=0x01;//设置定时器0为工作方式1(M1M0为01)TH0= (65535-50000)/256;//装初值12.00M晶振定时50ms数为50000TL0= (65535-50000)%256;EA=1;// 开总中断ET0=1; // 开定时器0中断TR0=1;// 启动定时器0while(1)// 程序停止在这里等待中断的发生{if(num==200)//判断一次是否到20{num=0; //然后把num清0重新再计数20次led1=~led1; //让发光管状态取反}}}void T0_time()interrupt 1{TH0= (65535-50000)/256; //重装初值TL0= (65535-50000)%256;num++; //num加上1}#include <reg52.h> //52系列单片机头文件(目标:中断程序,控制1点0二极管100ms闪烁,若num=10,则0.05s闪烁,换句话控制5000或者num都可以控制时间。