单片机程序汇总,大家参考一下剖析

合集下载

51单片机常见程序,附带注释

51单片机常见程序,附带注释

51 单片机常见程序附带注释三位数分离成 3 个一位数,截取bai=num/100;// 输出百位数shi=num%100/10;// 输出十位数ge=num/10;// 输出个位数//跑马灯程序。

当时间约为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){aa=_crol_(aa, 1);P2=aa; // 控制单片机接口p2, 循环亮delayms(500); 灯一直亮灭,原因是视觉延迟// 当500 换成5,看起来全亮,实际上#include<reg52.h> 看上去全亮。

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 #define uchar unsigned char void delayms(uint);uchar aa;void main(){aa=0xfe;while(1){P2=aa; delayms(500); 灯一直亮灭,原因是视觉延迟// 无符号整型,占16 位数,表示围0~65536 // 无符号字符型占八位数,表示围0~255// 定义变量// 控制单片机接口p2, 循环亮// 当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 int sbit dula1=P1A7;uchar num,num1; // 共阴极数码管 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++)// 申明 U1 锁存器锁存端 段选 sbit dula2=P0A7;// 申明 U1 锁存器锁存端段选uchar code table[]={{for(num=0;num<=9;num++){dula2=1; // 打开U1 锁存端P1=table[num]; // 送入位选信号器dula2=0; // 关闭U1 锁存500 毫秒约0.3sdelayms(100); // 延时dula1=1; // 打开U1 锁存端P2=table[num1]; // 送入位选信号器dula1=0;// 关闭U1 锁存500 毫秒约0.3s}delayms(100); // 延时}}}void delayms (uint xms){uint x, y ;dula1=0;// 关闭 U1 锁存器for (y=200;y>0;y--);}#include <reg52.h> //52 系列单片机头文件 (目标:用单片机和两个共阴极数码 管)#define uchar unsigned char #define uint unsigned int sbit dula1=P1A7; sbit dula2=P2A7; uchar num,num1; uchar code table[]={ 0x3f,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]; // 送入位选信号for (x=xms;x>0;x--) //x=xms 即延时约为 xms 毫秒// 申明 U1 锁存器锁存端 段选 // 申明 U1 锁存器锁存端段选// 共阴极数码管 0123456789abcdefdelayms(1000);// 延时 500 毫秒约0xc0,0xf9,0xa4, 0xb0,// 共阳极数字: 0123456789abcdefg0.3s for(num=0;num<=9;num++)dula2=1; // 打开 U1 锁存端P1=table[num]; // 送入位选信号 dula2=0;// 关闭 U1 锁存器 500 毫秒约 0.3s }} } void delayms (uint xms) { uint x, y ; for (x=xms;x>0;x--) delayms(1000);// 延时//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=P1A 6; //申明U1锁存器锁存端 段选 sbit dula2=P0A7; //申明U1锁存器锁存端段选uchar code table[]={0x99,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=Ox11;〃设置定时器0和1为工作方式1 (M1M0为01, 0001 00THO= (65535-50000)/256;// 装初值12.00M 晶振定时50s 数为50000 TL0= (65535-50000)%256;TH1= (65535-50000)/256;// 装初值12.00M 晶振定时50s 数为50000 TL1= (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=P1A7; //申明U1锁存器锁存端段选sbit dula2=P0A7; //申明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 锁存0.1 毫秒// 每1s 进位一打开U1锁存端// 送入位选信号// 关闭U1 锁存器// 延时0.1 毫秒}}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--)for (y=110;y>0;y--); }delayms(1175); //for(num=0;num<=9;num++){dula2=1;P1=table[num];dula2=0;delayms(1000);}//x=xms 即延时约为xms 毫秒延时//#include <reg52.h> //52 系列单片机头文件 (目标:控制时间 24 小时一循环,蜂鸣器每过一段时间响一次)#define uchar unsigned char #define uint unsigned int sbit dula1=P1A7; sbit dula2=P2A7; 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,// 申明 U1 锁存器锁存端// 申明 U1 锁存器锁存段选 段选0xcd,0xa1,0x86,0x8e}; void delayms(uint) ; void main (){while(1)f=0; // 控制蜂鸣器的不响 每 1ms 进位一for(num=0;num<=9;num++)//{锁存端dula2=1;// 打开 U1选信号P2=table[num];// 送入位U1锁存器dula2=0;// 关闭// 延时 0.1 毫秒delayms(1074);}// 控制蜂鸣器的响delayms(1000); }}}{进位一for(num2=0;num2<=59;num2++){for(num4=0;num2<=59;num4++)// 每 60 分// 每 60s 进位一{for(num3=0;num3<=23;num3++) // 每天进位一f=1;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=P1A7; // 申明U1 锁存器锁存端段选sbit dula2=P2A7; // 申明U1 锁存器锁存端段选uchar num,num1;uchar code table[]={0xc0,0xf9,0xa4, 0xb0,// 共阳极数字:0123456789abcdefg0x99,0x92,0x82,0xf8,}void delayms (uint xms)uint x, y ;0x80,0x90,0x88,0x83, 0xcd,0xa1,0x86,0x8e}; void delayms(uint) ; void main (){while(1)for(num1=0;num1<6;num1++){dula1=1; P1=table[num1]; dula1=0;delayms(100);// 打开 U1 锁存端 // 送入位选信号 // 关闭 U1 锁存器// 延时 500 毫秒约0.3s器500 毫秒约 0.3s for(num=0;num<=9;num++){dula2=1; P2=table[num]; dula2=0;delayms(100);// 打开 U1 锁存端 // 送入位选信号 // 关闭 U1 锁存// 延时dula1=0; // 关闭 U1 锁存器uchar num,num1; uchar code table[]={0x99,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]; // 送入位选信号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 int sbit dula1=P1A7; // 申明 U1 锁存器锁存端 段选 sbit dula2=P2A7;// 申明 U1 锁存器锁存端段选0xc0,0xf9,0xa4, 0xb0, // 共阳极数字: 0123456789abcdefgdelayms(100); // 延时500 毫秒约0.3sfor(num=0;num<=9;num++){dula2=1; // 打开U1 锁存端P2=table[num]; // 送入位选信号器dula2=0; // 关闭U1 锁存500 毫秒约0.3sdelayms(100);// 延时}}}}void delayms (uint xms)//延时子程序{uint x, y ;for (x=xms;x>0;x--) //x=xms 即延时约为xms毫秒for (y=300;y>0;y--);0.3sfor(num=0;num<=9;num++){dula2=1; //打开U2锁存端 P2=table[num];// 送入位选信号#include <reg52.h> //52 系列单片机头文件 (目标:用单片机和两个共阳极数码 管,控制依次显示 0到 59,时间间隔约 0.5, 程序停止) #define uchar unsigned char #define uint unsigned intsbit dula1=P1A7; sbit dula2=P2A7; // 申明 U1 锁存器锁存端段选 段选uchar num,num1; uchar code table[]={ 0xc0,0xf9,0xa4, 0xb0, // 共阳极数字: 0123456789abcdefg0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xcd,0xa1,0x86,0x8e}; voiddelayms(uint) ; void main ()while(1){for(num=0;num1<6;num1++) {dula1=1; P1=table[num1]; dula1=0; delayms(100);// 打开 U1 锁存端 // 送入位选信号 // 关闭 U1 锁存器// 延时 500 毫秒约#include <reg52.h> //52 系列单片机头文件 (目标:用单片机和共阳极数码管, 控制依次显示 0到 9,时间间隔约 0.5s ;)#define uchar unsigned char #define uint unsigned int500 毫秒约 0.3sdelayms(100);// 延时}}}}void delayms (uint xms){uint x, y ;for (x=xms;x>0;x--)〃x=xms 即延时约为xms 毫秒for (y=300;y>0;y--);器// 关闭 U1 锁存}dula2=0;sbit dula1=P1A7;// 申明 U1 锁存器锁存端 段选// 打开 U1 锁存端 // 送入位选信号 // 关闭 U1 锁存器// 延时 500 毫秒约 0.3//打开U2锁存端 // 送入位选信号//关闭U2锁存器// 延时 500 毫秒约 0.3sbit dula2=P2A7; // 申明 U2 锁存器锁存端 段选uchar num; uchar codetable[]={ 0xc0,0xf9,0x a4, 0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xcd,0xa1,0x86,0x8e}; void delayms(uint) ; void main (){while(1)// 共阳极数字: 0123456789abcdefgfor(num=0;num<10;num++){dula1=1; P1=table[num]; dula1=0; delayms(100);dula2=1; P2=table[num]; dula2=0; delayms(100);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=P2A6; //申明U1锁存器锁存端段选sbit wela=P2A7; //申明U2锁存器锁存位选sbit led1=P1A0; // 申明灯 1 点0uchar code table[]={ // 共阴极数码管0123456789abcdef0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delayms(uint) ; voiddisplay(uchar,uchar) ; uchar num,num1,num2,shi,ge; void main (){TMOD=0x01;〃设置定时器0和1为工作方式1 (M1M0为01, 0001 00THO= (65535-50000)/256;// 装初值12.00M 晶振定时50s 数为50000 TL0= (65535-50000)%256; TH1= (65535-50000)/256;// 装初值12.00M 晶振定时50s 数为50000 TL1= (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++;//num1 每加 1次判断一次是否到 4次 ,时间间隔200ms // 重装初值if(num1==4)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; // 个位数// 共阴极数码管 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 ( M1M (为01, 0001 0001 )TH0= (65535-50000)/256;// 装初值 12.00M 晶振定时 50s 数为 50000TL0= (65535-50000)%256;TH1= (65535-50000)/256;// 装初值 12.00M 晶振定时 50s 数为 50000 TL1=(65535-50000)%256;EA=1;// 开总中断ET0=1; // 开定时器 0 中断ET1=1; // 开定时器 1 中断TR0=1;// 启动定时器 0TR1=1;// 启动定时器 1#include <reg52.h> //52 系列单片机头文件 (目标:用定时器 0 的方式 1 实现第 一个灯管以200ms 闪烁;用定时器1的方式1实现数码管前两位59s 循环计时)#define uchar unsigned char 占八位数,表示围 0~255// 无符号字符型 #define uint unsignedint 数,表示围// 无符号整型, 占 16位 sbit dula=P2A 6;//申明U1锁存器锁存端 段选 sbit wela=P2A7;//申明U2锁存器锁存 位选sbit led1=P1A0;// 申明灯 1 点 0 uchar code table[]={while(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>O;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=P1A0; II声明单片机P1 口的第一位uchar num;void main (){TMOD=0x01;〃设置定时器0为工作方式1 (M1M(为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都可以控制时间。

单片机程序详解

单片机程序详解

程序详解:程序清单:;共阳数码管加减显示SP1 BIT P3.6 ;定义加数据按键SP2 BIT P3.7 ;定义减数据按键ORG 00H ;程序的开始地址AJMP MAIN ;跳转到程序开始地址ORG 30H ;数据开始地址MAIN: ;主函数CLR SP1 ;要求按键高电平有效,在此将电平拉低CLR SP2 ;同上K1: ;标号LCALL DISP ;LCALL长调用指令,调用DISP程序JNB SP1,K2 ;JNB为判断bit转移指令,当bit满足为低电平时跳转,检测SP1是否按下,按下继续往下执行程序,没有按下跳转到K2处执行程序;JNB bit ,rel;(bit)=0,PC←(PC)+3+rel,否则顺序执行LCALL DISP ;再次调用DISP程序JB SP1,$-3 ;再次确认按键是否被按下,去按键抖动INC 30H ;INC增一指令,30H中的内容自增一MOV A,30H ;将30H中的数据送到累加器A中CJNE A,#10,K1 ;CJNE判断命令,判断累加器A中的数据是否为10,也就是说按键的次数不能大于10次,小于10跳转到K1处执行程序,大于10继续往下执行程序MOV 30H,#0 ;30H清零操作INC 31H ;31H增一MOV A,31H ;将31H中的数据送到累加器A中CJNE A,#10,K1 ;CJNE判断命令,判断累加器A中的数据是否为10,也就是说按键的次数不能大于10次,小于10跳转到K1处执行程序,大于10继续往下执行程序MOV 31H,#0 ;31H清零操作INC 32H ;32H增一MOV A,32H ;将32H中的数据送到累加器A中CJNE A,#10,K1 ;CJNE判断命令,判断累加器A中的数据是否为10,也就是说按键的次数不能大于10次,小于10跳转到K1处执行程序,大于10继续往下执行程序MOV 32H,#0 ;32H清零操作LJMP MAIN ;返回到程序开始处K2:ACALL DISP ;ACALL短调用指令,调用DISP程序JNB SP2,K1 ;JNB为判断bit转移指令,当bit满足为低电平时跳转,检测SP2是否按下,按下继续往下执行程序,没有按下跳转到K1处执行程序;JNB bit ,rel;(bit)=0,PC←(PC)+3+rel,否则顺序执行LCALL DISP ;再次调用DISP程序JB SP2,$-3 ;再次确认按键是否被按下,去按键抖动DEC 30H ;DEC减一指令,30H中的内容自减一MOV A,30H ;将30H中的数据送到累加器A中CJNE A,#0FFH,K2;判断30H中的数是否为255,也就是说按键的次数不能大于10次,小于255跳转到K2处执行程序,大于255继续往下执行程序MOV 30H,#9 ;30H赋初始值9DEC 31H ;31H减一MOV A,31H ;将31H中的数据送到累加器A中CJNE A,#0FFH,K2;判断31H中的数是否为255,也就是说按键的次数不能大于10次,小于255跳转到K2处执行程序,大于255继续往下执行程序MOV 31H,#9 ;31H赋初始值9DEC 32H ;32H减一MOV A,32H ;将32H中的数据送到累加器A中CJNE A,#0FFH,K2;判断32H中的数是否为255,也就是说按键的次数不能大于10次,小于255跳转到K2处执行程序,大于255继续往下执行程序MOV 32H,#9 ;32H赋初始值9LJMP MAIN ;返回到程序开始处DISP: ;显示程序MOV DPTR,#TAB ;讲表格中的数据装入DPTR中MOV A,30H ;将30H中的数送到累加器A中MOVC A,@A+DPTR ;查表,将查到的数送到累加器A中SETB P2.2 ;选定数码管第四位点亮MOV P0,A ;将累加器A中的数送到P0口,作为显示数据ACALL DLY ;调用延时程序CLR P2.2 ;关闭数码管第四位的显示MOV A,31H ;将31H中的数送到累加器A中MOVC A,@A+DPTR ;查表,将查到的数送到累加器A中SETB P2.1 ;选定数码管第三位点亮MOV P0,A ;将累加器A中的数送到P0口,作为显示数据ACALL DLY ;调用延时程序CLR P2.1 ;关闭数码管第三位的显示MOV A,32H ;将32H中的数送到累加器A中MOVC A,@A+DPTR ;查表,将查到的数送到累加器A中SETB P2.0 ;选定数码管第二位点亮MOV P0,A ;将累加器A中的数送到P0口,作为显示数据ACALL DLY ;调用延时程序CLR P2.0 ;关闭数码管第二位的显示RET ;调用程序返回DLY: ;延时程序MOV R6,#2D1:MOV R7,#248DJNZ R7,$DJNZ R6,$-4RETTAB: DB 0C0H;0 ;字符表 DB 0F9H;1DB 0A4H;2DB 0B0H;3DB 099H;4DB 092H;5DB 082H;6DB 0F8H;7DB 080H;8DB 090H;9END ;程序结束。

单片机程序100范例+详细注释

单片机程序100范例+详细注释

100例程序设计范例汇总第一章 (4)【实例1】使用累加器进行简单加法运算: (4)【实例2】使用B寄存器进行简单乘法运算: (4)【实例3】通过设置RS1,RS0选择工作寄存器区1: (4)【实例4】使用数据指针DPTR访问外部数据数据存储器: (4)【实例5】使用程序计数器PC查表: (4)【实例6】IF语句实例: (4)【实例7】SWITCH-CASE语句实例: (4)【实例8】FOR语句实例: (4)【实例9】WHILE语句实例: (5)【实例10】DO...WHILE语句实例: . (5)【实例11】语句形式调用实例: (5)【实例12】表达式形式调用实例: (5)【实例13】以函数的参数形式调用实例: (5)【实例14】函数的声明实例: (5)【实例15】函数递归调用的简单实例: (5)【实例16】数组的实例: (6)【实例17】指针的实例: (6)【实例18】数组与指针实例: (6)【实例19】P1口控制直流电动机实例 (6)第二章 (8)【实例20】用74LS165实现串口扩展并行输入口 (8)【实例21】用74LS164实现串口扩展并行输出口 (10)【实例22】P0I/O扩展并行输入口 (12)【实例23】P0I/O扩展并行输出口 (12)【实例24】用8243扩展I/O端口 (12)【实例25】用8255A扩展I/O口 (14)【实例26】用8155扩展I/O口 (19)第三章 (26)【实例29】与AT24系列EEPROM接口及驱动程序 (26)【实例30】EEPROM(X5045)接口及驱动程序 (30)【实例31】与铁电存储器接口及驱动程序 (33)【实例32】与双口RAM存储器接口及应用实例 (35)【实例33】与NANDFLASH(K9F5608)接口及驱动程序 (35)第四章 (43)【实例34】独立键盘控制 (43)【实例35】矩阵式键盘控制 (44)【实例36】改进型I/O端口键盘 (46)【实例37】PS/2键盘的控制 (49)【实例39】段数码管(HD7929)显示实例 (54)【实例40】16×2字符型液晶显示实例 (55)【实例41】点阵型液晶显示实例 (61)【实例42】LCD显示图片实例 (63)第五章 (70)【实例43】简易电子琴的设计 (70)【实例44】基于MCS-51单片机的四路抢答器 (71)【实例45】电子调光灯的制作 (76)【实例46】数码管时钟的制作 (81)【实例47】LCD时钟的制作 (96)【实例48】数字化语音存储与回放 (103)【实例49】电子标签设计 (112)第六章 (120)【实例50】指纹识别模块 (121)【实例51】数字温度传感器 (121)第七章 (124)【实例53】超声波测距 (124)【实例54】数字气压计 (125)【实例55】基于单片机的电压表设计 (132)【实例56】基于单片机的称重显示仪表设计 (133)【实例57】基于单片机的车轮测速系统 (136)第八章 (138)【实例58】电源切换控制 (138)【实例59】步进电机控制 (140)【实例60】单片机控制自动门系统 (141)【实例61】控制微型打印机 (144)【实例62】单片机控制的EPSON微型打印头 (144)【实例63】简易智能电动车 (145)【实例64】洗衣机控制器 (149)第九章 (152)【实例65】串行A/D转换 (152)【实例66】并行A/D转换 (153)【实例67】模拟比较器实现A/D转换 (154)【实例68】串行D/A转换 (155)【实例69】并行电压型D/A转换 (156)【实例70】并行电流型D/A转换 (156)【实例71】2I C接口的A/D转换 (157)【实例72】2I C接口的D/A转换 (161)【实例73】单片机间双机通信 (164)【实例74】单片机间多机通信方法之一 (166)【实例75】单片机间多机通信方法之二 (171)【实例76】PC与单片机通信 (176)【实例77】红外通信接口 (178)第十一章 (180)【实例79】单片机实现PWM信号输出 (180)【实例80】实现基于单片机的低频信号发生器 (182)【实例81】软件滤波方法 (183)【实例82】FSK信号解码接收 (186)【实例83】单片机浮点数运算实现 (187)【实例84】神经网络在单片机中的实现 (192)【实例85】信号数据的FFT变换 (194)第十二章 (198)【实例86】2I C总线接口的软件实现 (198)【实例87】SPI总线接口的软件实现 (200)【实例88】1-WIRE总线接口的软件实现 (205)【实例89】单片机外挂CAN总线接口 (207)【实例90】单片机外挂USB总线接口 (210)【实例91】单片机实现以太网接口 (214)【实例92】单片机控制GPRS传输 (221)【实例93】单片机实现TCP/IP协议 (223)第十三章 (229)【实例94】读写U盘 (229)【实例95】非接触IC卡读写 (234)【实例96】SD卡读写 (238)【实例97】高精度实时时钟芯片的应用 (242)第十四章 (247)【实例98】智能手机充电器设计 (247)【实例99】单片机控制门禁系统 (248)第一章【实例1】使用累加器进行简单加法运算:MOV A,#02H ;A←2ADD A,#06H ;A←A+06H【实例2】使用B寄存器进行简单乘法运算:MOV A,#02H ; A←2MOV B,#06H ; B←6MUL AB ; BA←A*B=6*2【实例3】通过设置RS1,RS0选择工作寄存器区1:CLR PSW.4 ; PSW.4←0SETB PSW.5 ; PSW.5←1【实例4】使用数据指针DPTR访问外部数据数据存储器:MOV DPTR, #data16 ; DPTR←data16MOVX A, @ DPTR ; A←((DPTR))MOVX @ DPTR, A ; (DPTR)←A【实例5】使用程序计数器PC查表:MOV A, #data ;A←dataMOVC A, @ A+DPTR ; PC←(PC)+1 ,A←((A)+(PC)) 【实例6】if语句实例:void main(){ int a,b,c,min;printf("\n please input three number:");scanf("%d%d%d ",&a,&b,&c);if(a<b&&a<c) printf("min=%d\n",a );else if(b<a&&b<c) printf("min=%d\n",b);else if(c<a&&c<c) printf("min=%d\n",c);else printf("There at least two numbers are equal\n");}【实例7】switch-case语句实例:void main(){ int num; printf("input one number:");scanf("%d",& num);switch(num){ case 1: printf("num =%d\n", num);break;case 2: printf("num =%d\n", num);break;case 3: printf("num =%d\n", num);break;case 4: printf("num =%d\n", num);break;default: printf("The number is out of the range\n", num);}}【实例8】for语句实例:void main(){ for(int a=10;n>0;a --)printf("%d",a);}【实例9】while语句实例:void main(){ int i=0;while(i<=10) i++;}【实例10】do…while语句实例:void main(){ int i=0;do{ i++;}while(i<=10);}【实例11】语句形式调用实例:void main(){ int i=0; while(i<=10) i++; ……Sum(); /*函数调用*/}【实例12】表达式形式调用实例:void main(){ int a,b,i=0; while(i<=10) i++; ……i=4*Sum(a,b); /*函数调用*/}【实例13】以函数的参数形式调用实例:void main(){ int a,b,c,i=0; while(i<=10) i++; ……i= max(c,Sum(a,b)); /*函数调用*/ }【实例14】函数的声明实例:void main(){ int max(int x,int y); /*函数的声明*/ int a,b,c,i=0; while(i<=10) i++; ……i= max(c,Sum(a,b)); /*函数调用*/ }【实例15】函数递归调用的简单实例:void fun(){ int a=1, result,i;for(i=0;i<10;){ i=a+I;result = fun(); /*函数调用*/}return result;}【实例16】数组的实例:void main(){ char num[3] [3]={{ '','#',''},{'#','','#'},{'','#',''}}; /*定义多维数组*/ int i=0,j=0;for(;i<3;i++){ for(;j<3;j++) printf(“%c”,num[i][j]);printf(“/n”);}【实例17】指针的实例:void main(){ int a=3,*p;p=&a; /*将变量a的地址赋值给指针变量p*/printf(“%d,%d”,a,*p); /*输出二者的数值进行对比*/}【实例18】数组与指针实例:void main(){ int i=3,num[3]={1,2,3},*p;p=num; /*将数组num[]的地址赋值给指针变量p*/result =max(p,3); /*函数调用,计算数组的最大值*/}【实例19】P1口控制直流电动机实例sfr p1=0x90;sbit p10=p1^0;sbit p11=p1^1;void main (){int i, m;int j=100;int k=20;// 正快转for (i=0; i<100; i++){P10=1;for (j=0; j<50; j++){m=0;}}P10=0;for (j=0; j<10; j++){m=0}//正慢转for (i=0; i<100; i++) {P10=1;for (j=0; j<10; j++) {m=0}}p10=0;for (j=0; j<50; j++) {m=0}// 负快转for (i=0; i<100; i++) {p11=1;for (j=0; j<50; j++) {m=0;}}p11=0;for (j=0; j<10; j++) {m=0;}// 负慢转for (i=0; i<100; i++) {p11=1;for (j=0;j<10;j++) {m=0;}}p11=0for (j=0; j<50; j++) {m=0;}}第二章【实例20】用74LS165实现串口扩展并行输入口(1)函数声明管脚定义//---------------------------------------库函数声明,管脚定义------------------------------------------ #include<reg52.h>sbit LOAD=P1^7;//用P1^7控制SH/ 管脚(2)串口初始化函数UART_init()//-------------------------------------------------------------------------------------------------------------- // 函数名称:UART_init()// 功能说明:串口初始化,设定串口工作在方式0//-------------------------------------------------------------------------------------------------------------- void UART_init(void){SCON=0x10;//设串行口方式0,允许接收,启动接收过程ES=0;//禁止串口中断}(3)数据接收函数PA()//-------------------------------------------------------------------------------------------------------------- // 函数名称:PA()// 输入参数:无// 输出参数:返回由并口输入的数据// 功能说明:接收八位串行数据//-------------------------------------------------------------------------------------------------------------- unsigned char PA(void){unsigned char PA_data;LOAD=0;//当P1.7输出低电平,74LS165将并行数据装入寄存器//当中LOAD=1;//当P1.7输出高电平,74LS165在时钟信号下进行移位UART_init();//74LS165工作在时钟控制下的串行移位状态while(RI==0);//循环等待RI=0;PA_data=SBUF;return PA_data;//返回并行输入的数据}(1)函数声明管脚定义//---------------------------------------库函数声明,管脚定义------------------------------------------ #include<reg52.h>sbit a7=ACC^7;sbit simuseri_CLK=P1^6;//用P1^6模拟串口时钟sbit simuseri_DATA=P1^5;//用P1^5模拟串口数据sbit drive74165_LD=P1^7;//用P1^7控制SH/ 管脚(2)数据输入函数in_simuseri()//-------------------------------------------------------------------------------------------------------------- // 函数名称:in_simuseri()// 输入参数:无// 输出参数:data_buf// 功能说明:8位同位移位寄存器,将simuseri_DATA串行输入的数据按从低位到// 高位// 保存到data_buf//-------------------------------------------------------------------------------------------------------------- unsigned char in_simuseri(void){unsigned char i;unsigned char data_buf;i=8;do{ACC=ACC>>1;for(;simuseri_CLK==0;);a7= simuseri_DA TA;for(;simuseri_CLK==1;);}while(--i!=0);simuseri_CLK=0;data_buf=ACC;return(data_buf);}(3)数据输出函数PAs()//-------------------------------------------------------------------------------------------------------------- // 函数名称:PAs()// 输入参数:无// 输出参数:PAs _buf,返回并行输入74LS165的数据// 功能说明:直接调用,即可读取并行输入74LS165的数据,不需要考虑74LS165的// 工作原理//--------------------------------------------------------------------------------------------------------------unsigned char PAs(void){unsigned char PAs_buf;drive74165_LD=0;drive74165_LD=1;PAs_buf= in_simuseri();return(PAs_buf);}【实例21】用74LS164实现串口扩展并行输出口单片机串口驱动74LS164的程序主要包括函数声明管脚定义部分、串口初始化函数以及数据发送函数。

单片机程序设计总结

单片机程序设计总结

单片机程序设计总结经过多年的单片机领域研究,总结一下几点的程序设计的经验要想设计程序就必须了解单片机一些基础知识1 指令是指计算机执行某种操作的命令,仅仅是简单完一件细小工作命令。

如 MOVLW 06H 或 I=0X06;就是将06H的立即数移动给单片机内的工作寄存器。

或 O6H的立即数赋予I......1,程序是指众多的单片机指令构成有一定规模及次序,具有特定功能、能完成特定任务的指令集合。

只要了解这些你就可以知道,程序是什么了,就是我们日常生活中的一些做事流程,用指令书写的方式记下来。

就这么简单。

接下来就是变量,他是为指令运行的提供操作对象空间,没有的变量,指令与程序就是神马浮云。

什么都不是。

空间是什么,说白就是可以放东西的地方,单片机的空间就是他的内存是可以用来存放数据了-----单片机定义为寄存器。

那数据是什么呢,说白了就是个数----二进制的数,为什么用二进制呢,就是因为计算机很傻了,他就走两个极端,要么没有电,要么有电,没有中间态,所以就用二进制配他了。

现在知道的变量的作用就好办,既然是个空间--变量,就要有存放与取出、清空的功能,变量的数据处理有输入、输出、清零,而且单片机中的变量不是一个哦,是很多数以百计千记的变量,且变量都有独立的房间与名字。

因此单片机在运行时,其实就是在指令控制下,完成变量与变量间的数据交换与处理,而这些交换处理目的就是为完成程序特定的功能而运行了。

说到这里就要提一下变量的性别与生命期,有点神哦,有生命的东西。

变量的类别:全局静态变量:全局静态变量是用来保存程序运行中必须的全部区域内不动产---数据不能变化了,编辑后,就固定了,他是用来保存如显示需要的字符码,图像码,声音码及子程序(模块)内特殊用途的一些特殊数据,且这种变量是不能被修改,永恒固定生命期:活到整个程序的结束,且每个程序段--子程序都可以读取他(但不能写)局部静态变量: 局部静态变量是用来保存程序运行中必须的局部区域的不动产---数据不能变化了,编辑后,就固定了,保存的如按键时间,声音时间,及子程序(模块)内特殊用途等一些特殊数据,且这种变量是不能被修改,永恒固定生命期:活到整个程序的结束,且只能在规定的子程序内可以读取他(但不能写) 超出不能使用。

单片机程序架构详解篇

单片机程序架构详解篇

单片机程序架构详解一、前言单片机,也称为微控制器(Microcontroller),是将计算机的体系结构集成到一个芯片上的微型计算机。

由于其体积小、成本低、可靠性高等特点,单片机在工业控制、智能仪表、家用电器等领域得到了广泛应用。

了解单片机的程序架构是编写和优化单片机程序的关键。

二、单片机程序架构概述单片机的程序架构主要由以下几个部分组成:1. 硬件抽象层(HAL):这一层为上层软件提供了一个与硬件无关的接口,使得软件可以独立于硬件进行开发和运行。

HAL层通常包括对单片机各种外设(如GPIO、UART、SPI、PWM等)的操作函数。

2. 系统服务层:这一层提供了系统级的各种服务,如任务调度、内存管理、时间管理等。

这些服务使得上层应用程序可以更加专注于业务逻辑的实现。

3. 应用层:这是最上层,直接面向用户,包含了各种应用程序的逻辑代码。

三、各层详解1. 硬件抽象层(HAL)硬件抽象层(HAL)是单片机程序架构中非常重要的一层,其主要目标是使得硬件相关的操作与具体的硬件实现无关。

这样,当硬件平台发生变化时,只要HAL层设计得当,上层代码就不需要改变。

HAL层通常包括以下内容:* 各种外设寄存器的操作函数:例如,GPIO的输入输出函数、UART的发送接收函数等。

这些函数隐藏了具体的寄存器操作细节,使得开发者只需要关注功能实现而不需要关心底层寄存器的操作。

* 硬件初始化函数:用于在系统启动时对单片机进行初始化,如配置时钟、启动看门狗等。

* 中断处理函数:用于处理单片机的各种中断事件,如定时器溢出、串口接收等。

2. 系统服务层系统服务层提供了单片机操作系统所需的各种服务,如任务调度、内存管理、时间管理等。

这些服务使得上层应用程序可以更加专注于业务逻辑的实现。

以下是一些常见的系统服务:* 任务调度:多任务环境下,任务调度器负责分配CPU时间给各个任务,使得各个任务能够按需运行。

* 内存管理:负责动态内存的分配和释放,如堆和栈的管理。

单片机程序大全

单片机程序大全

独立按键#include<reg52。

h>#define uchar unsigned char#define uint unsigned intsbit P27=P2^7;sbit K5=P1^4;sbit fmq=P3^6;uchar num;unsigned char code s8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delay1ms(uint i){uchar j;while(i—-){for(j=0;j<115;j++) //1ms基准延时程序{;}}}void beep() //产生1KHZ频率声音的函数{fmq=0;delay500us();fmq=1;delay500us();}void delay500us(){unsigned char j;for(j=0;j<57;j++) //500us基准延时程序 {;}}void main(){ uchar t;P27=0;while(1){if(K5==0){delay1ms(15);if(K5==0){for(t=0;t〈100;t++){ beep();}num=num+1;if(num==16){num=0;}while(!K5);//等待按键释放}}P0=s8[num];}}#include<reg52.h>#define uchar unsigned char //数据类型的宏定义#define uint unsigned int //数据类型的宏定义sbit P27=P2^7;unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};//共阳数码管显示字型码数组 1011 1111 "—”void delay1ms(uint i){uchar j;while(i--){for(j=0;j<115;j++); //1ms基准延时程序}}void display(unsigned char i){P27=0; //选通最有端的数码管显示P0=table[i]; //显示i参数传来的字型码}void main(void){unsigned char temp;display(16); //初始显示 "-"while(1){P1=0xff; //先向P1口写1;端口读状态P1=0xf0;temp=P1;if(temp!=0xf0){delay1ms(15);if(temp!=0xf0){P1=0xfe;temp=P1;switch(temp){case(0xee):display(0);break;case(0xde):display(1);break;case(0xbe):display(2);break;case(0x7e):display(3);break;}P1=0xfd;temp=P1;switch(temp){case(0xed):display(4);break;case(0xdd):display(5);break;case(0xbd):display(6);break;case(0x7d):display(7);break;}P1=0xfb;temp=P1;switch(temp){case(0xeb):display(8);break;case(0xdb):display(9);break;case(0xbb):display(10);break;case(0x7b):display(11);break;}P1=0xf7;temp=P1;switch(temp){case(0xe7):display(12);break;case(0xd7):display(13);break;case(0xb7):display(14);break;case(0x77):display(15);break;}}}}}/*行线接P1.0-P1。

单片机程序大全

单片机程序大全

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

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

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

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

一、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灯闪烁、温度监测、电机控制等。

单片机程序总结

单片机程序总结
write(table[1]);
write(table[2]);
write(table[3]);
write(table[4]);
delay_ms(10);
}}
-------------------------------------动态扫描数码显示实验----------------------------------------------”168168”--4----
for(;time>0;time--)
for(j=0;j<125;j++) ;
}
main()
{
while(1)
{
control=0;
delay(500);
control=1;
delay(500);
}
}
-------------------------
#include <reg51.h>
unsigned int i;
继电器的开合控制灯的亮灭。
-----------------------延时子程序方法------------------
#include<reg51.h>
unsigned char t;
sbit control=P1^0;
void delay(unsigned int time)
{
unsigned int j=0;
void delay(unsigned int z)
{
unsigned int j;
for(;z>0;z--)
for(j=0;j<10;j++);
}
main()
{
while(1)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第八章4节支持手打!!#include<reg51.h>#include <math.h>#define PI 3.1415unsigned int num;void main() {while (1) {for (num = 0 ; num < 360 ; num++)P2= 127 +127 * sin((float)num / 180 * PI);}}#include<absacc.h>#define DAC0832 XBYTE[0xfeff] //设置DAC0832的访问地址unsigned char num;void main() {while (1) {for (num = 0 ; num < 255 ; num++) //上升段波形DAC0832=num;for (num = 255 ; num > 0 ; num--) //下降段波形DAC0832=num;//DAC0832转换输出}}#include<absacc.h>#include<reg51.h>#define DAC1 XBYTE[0xfeff] //设置1#DAC0832输入锁存器的访问地址#define DAC2 XBYTE[0xfdff] //设置2#DAC0832输入锁存器的访问地址#define DAOUT XBYTE[0xefff] //两个DAC0832的DAC寄存器访问地址void main (void){unsigned char num; //需要转换的数据while(1){for(num =0; num <=255; num++){DAC1 = num; //上锯齿送入1#DACDAC2 = 255-num; //下锯齿送入2#DACDAOUT = num; //两路同时进行D/A转换输出}}}/*发送程序*/#include<reg51.h>#define uchar unsigned charchar code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//'0'~'9'void delay(unsigned int time){unsigned int j = 0;for(;time>0;time--)for(j=0;j<125;j++);}void main(void){uchar counter=0; //定义计数器TMOD=0x20; //T1定时方式2TH1 = TL1 = 0xf4; //2400b/sPCON=0; //波特率不加倍SCON = 0x50; //串口方式1,TI和RI清零,允许接收;TR1=1; //启动T1while(1){SBUF = counter; //发送联络信号while(TI==0); //等待发送完成TI = 0; //清TI标志位while(RI==0); //等待乙机回答RI = 0;if(SBUF ==counter){ //若返回值与发送值相同,组织新数据P2 = map[counter]; //显示已发送值if(++counter>9) counter=0;//修正计数器值delay(500);}}}/*接收程序*/#include<reg51.h>#define uchar unsigned charchar code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//'0'~'9'void main(void){uchar receiv; //定义接收缓冲TMOD=0x20; //T1定时方式2TH1=TL1=0xf4; //2400b/sPCON=0; //波特率不加倍SCON=0x50; //串口方式1,TI和RI清零,允许接收;TR1=1; //启动T1while(1){while(RI==1){ //等待接收完成RI = 0; //清RI标志位receiv = SBUF; //取得接收值SBUF = receiv; //结果返送主机while(TI==0); //等待发送结束TI = 0; //清TI标志位P2 = map[receiv];//显示接收值}}}第六章方式一。

查询方式:#include <reg51.h>sbit P2_0=P2^0;void main (void) {TMOD = 0x01; //T0定时方式1TR0=1; //启动T0for( ; ; ){TH0 = 0xfc; //装载计数初值TL0 = 0x18;do{ } while(!TF0); //查询等待TF0复位P2_0 =!P2_0; //定时时间到P1.0反相TF0 = 0; //软件清TF0}}中断方式:#include <reg51.h>sbit P2_0=P2^0;void timer0 (void) interrupt 1 {P2_0 = !P2_0; //P1.0取反TH0 = 0xfc; //计数初值重装载TL0 = 0x18;}void main (void) {TMOD = 0x01; //T0定时方式1P2_0=0;TH0=0xfc; //预置计数初值TL0=0x18;EA=1;ET0=1;TR0=1;do { } while (1);}方式2中断方式#include <reg51.h>sbit P2_0=P2^0;timer0 () interrupt 1 { //T0定时中断P2_0 = !P2_0; //P1.0取反}main(){TMOD = 0x02; //T0定时方式2TH0 = TL0 = 0x06;EA= ET0 = 1;TR0=1;while(1);}#include <reg51.h>unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char count=0; //计数器赋初值int0_srv () interrupt 1{ //T0中断函数if(++count==100) count=0; //判断循环是否超限P0=table[count/10]; //显示十位数P2=table[count%10]; //显示个位数}main(){P0=P2=table[0]; //显示初值“00”TMOD=0x06; //T0计数方式2TH0=TL0=0xff; //计数初值ET0=1; //开中断EA=1;TR0=1; //启动T0while(1);}计数#include <reg51.h>sbit P3_0=P3^0;void main (){TMOD = 0x06; //设置为T0计数方式2TL0 = 0xff; //初值0xff可使1个外来脉冲即产生溢出TR0 = 1; //启动计数器while (1){while (!TF0); //等待首次溢出TF0 = 0; //清TF0溢出标志TMOD = 0x02; //设置为T0定时方式2TL0=0x06; //500微秒定时初值P3_0 = 0;while (!TF0); //等待再次溢出TF0 = 0; //清TF0溢出标志P3_0 = 1;TMOD = 0x06; //设置为T0计数方式2TL0 = 0xff; //1次溢出计数初值}}#include <reg51.h>#define uchar unsigned charuchar time; //中断次数uchar period=250; //1个周期的次数uchar high=50; //20%高电平的次数timer0() interrupt 1{//T0中断函数TH0=0xd1; //重装载计数初值TL0=0x20;if (++time==high) P2=0;//高电平时间到,P2变低else if (time==period){time=0;P2=1;}//周期时间到,P2变高}void main (){TMOD = 0x01; //T0定时方式1TH0 = 0xd1; //首次装入计数初值TL0 = 0x20;EA=ET0=1;TR0 = 1; //启动计数器do { }while (1);}#include <reg51.h>#define uchar unsigned charbit ldelay=0; //长定时溢出标记uchar t=0; //定时溢出次数void main(void) {uchar code ledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar ledi; //指示显示顺序TMOD=0x01; //定义T0定时方式1TH0 =0x3c;TL0 =0xb0;//溢出20次=1秒(12M晶振)TR0=1;EA=ET0=1;while(1){if(ldelay) { //发现有时间溢出标记,进入处理ldelay=0; //清除标记P2=ledp[ledi]; //读出一个值送到P2口ledi++; //指向下一个if(ledi==8)ledi=0;//到了最后一个灯就换到第一个}}}timer0() interrupt 1 { //T0中断函数if(++t==20){t=0; ldelay=1;}//刷新长定时溢出标记TH0 =0x3c;TL0 =0xb0; //重置T0初值}第五章#include <reg51.h>char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //led字模0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};char key_buf[] = {0xee, 0xde, 0xbe, 0x7e,0xed, 0xdd, 0xbd, 0x7d,//键值0xeb, 0xdb, 0xbb, 0x7b,0xe7, 0xd7, 0xb7, 0x77};void getKey () interrupt 0{ //中断函数char key_scan[] = {0xef, 0xdf, 0xbf, 0x7f}; //键扫描码char i = 0, j = 0;for (i = 0; i < 4 ; i++) {P2= key_scan[i]; //输出扫描码for (j = 0 ; j < 16 ;j++) {if (key_buf[j]== P2){ //读键值,并判断键号P0= led_mod[j]; //显示闭合键键号break;}}}P2=0x0f; //为下次中断做准备}void main(void) {P0 = 0x00; //开机黑屏IT0=1; //脉冲触发EX0=1; //INT0允许EA=1; //总中断允许P2 = 0x0f; //为首次中断做准备,列线全为0,行线全为1while(1); //模拟其他程序功能}#include "reg51.h"char led[]={0xfe,0xfd,0xfb,0xf7};//LED花样数据bit dir=0,run=0; //全局变量void delay(unsigned int time);key() interrupt 0{ //键控中断函数switch (P0 & 0x0f){ //修改标志位状态case 0x0e:run=1;break;case 0x0d:run=0,dir=0;break;case 0x0b:dir=1;break;case 0x07:dir=0;break;}}void main(){char i;IT0=1;EX0=1;EA=1;//边沿触发、INT0允许、总中断允许while(1){if (run)if(dir) //若run=dir=1,自上而下流动for(i=0;i<=3;i++){P2=led[i];delay(200);}else //若run=1,dir=0,自下而上流动for(i=3;i>=0;i--){P2=led[i];delay(200);}else P2=0xff; //若run=0,灯全灭}}void delay(unsigned int time){unsigned int j = 0;for(;time>0;time--)for(j=0;j<125;j++);}#include "reg51.h"char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //led字模0x7f,0x6f}; //显示字模sbit D1=P3^0;void delay(unsigned int time){//延时unsigned char j=255;for(;time>0;time--)for(;j>0;j--);}key0() interrupt 0 { //K0中断函数unsigned char i;D1=IE0; //IE0状态输出for(i=0;i<=9;i++){ //字符0-9循环1圈P2=led_mod[i];delay(35000);}P2=0x40; //结束符“-”}key1() interrupt 2 { //K1中断函数unsigned char i;for(i=0;i<=9;i++){ //字符0-9循环1圈D1=IE0; //IE0状态输出P1=led_mod[i];delay(35000);}P1=0x40; //结束符“-”}void main(){unsigned char i;TCON = 0x05; //脉冲触发方式PX0=0;PX1=1; //INT1优先D1=0;P1=P2=0x40; //输出初值IE=0x85; //开中断while(1){for(i=0;i<=9;i++){ //字符0-9无限循环P0=led_mod[i];delay(35000);}}}第四章//实例1 独立按键识别#include <REG51.H>void main() {char key = 0;while(1){key = P0 & 0x0f; //读取按键状态if (key != 0x0f) P2 = key; //显示到led }}#include "reg51.h"unsigned char led[]={0xfe,0xfd,0xfb,0xf7}; //LED灯的花样数据void delay(unsigned char time){ //延时函数unsigned int j=15000;for(;time>0;time--)for(;j>0;j--);}void main(){bit dir=0,run=0; //标志位定义及初始化char i;while(1){switch (P0 & 0x0f){ //读取键值case 0x0e:run=1;break; //K1动作,设run=1case 0x0d:run=0,dir=0;break;//K2动作,设run=dir=0case 0x0b:dir=1;break; //K3动作,设dir=1case 0x07:dir=0;break; //K4动作,设dir=0}if (run) //若run=dir=1, 自上而下流动if(dir)for(i=0;i<=3;i++){P2=led[i];delay(200);}else //若run=1,dir=0, 自下而上流动for(i=3;i>=0;i--){P2=led[i];delay(200);}else P2=0xff; //若run=0,灯全灭}}#include <reg51.H>sbit P3_7=P3^7; //定义计数器端口unsigned char count =0; //定义计数器unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(unsigned int time){unsigned int j = 0;for (;time>0;time --)for(j = 0;j<125;j++);}void main(void) {P0=P2=table[0]; //显示初值00while(1) {if(P3_7==0){ //检测按键是否压下delay(10);if(P3_7==0){count++; //计数器增1if(count==100) count=0; //判断循环是否超限P0=table[count/10]; //十位输出显示P2=table[count%10]; //个位输出显示while(P3_7==0); //等待按键抬起,防止连续计数}}}}。

相关文档
最新文档