51单片机基本程序

合集下载

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都可以控制时间。

51单片机基本程序

51单片机基本程序

51单片机基本程序在学习嵌入式系统开发中,51单片机是一个重要的组成部分。

通过编写基本程序,可以更好地理解51单片机的原理和工作方式。

本文将介绍51单片机基本程序的编写方法及应用。

一、概述51单片机是一种基于哈佛结构的8位单片机,采用英特尔的经典架构。

通过编写基本程序,可以实现各种功能,如LED灯控制、数码管显示以及与外设的通信等。

二、开发工具在编写51单片机基本程序之前,我们需要准备一些开发工具。

最常用的工具是Keil C51开发环境,它是一种集成开发环境(IDE),提供了包括编译器、调试器在内的多种工具。

另外,还需要一个烧录器,用于将程序烧录到单片机中。

三、编写基本程序编写51单片机基本程序的第一步是创建一个新的项目。

在Keil C51中,选择“File”->“New Project”来创建一个新的项目,然后选择单片机型号和存储路径。

接下来,我们需要编写程序代码。

以下是一个简单的LED闪烁程序的示例:```c#include <reg52.h>sbit LED = P1^0;void delay(unsigned int time) {unsigned int i, j;for (i = 0; i < time; i++)for (j = 0; j < 500; j++); }void main(){while (1){LED = 0; // LED灯亮 delay(1000); //延时1秒 LED = 1; // LED灯灭 delay(1000); //延时1秒 }}```在上述代码中,我们首先定义了一个LED的IO口,并使用了一个延时函数来控制LED的亮灭。

在主函数中,我们使用一个无限循环来实现LED的闪烁。

四、程序调试和测试编写完基本程序后,我们需要对程序进行调试和测试。

在Keil C51中,选择“Debug”->“Start/Stop Debug Session”来启动调试会话。

51单片机串口通信程序。。含详细例子

51单片机串口通信程序。。含详细例子
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
pw.fpReadSign(); SendData();//通知上位机,送出读出器件特征字 }
void Erase()//擦除器件 {
pw.fpErase(); SendData();//通知上位机,擦除了器件 }
void Write()//写器件 {
BYTE n; pw.fpInitPro();//编程前的准备工作 SendData();//回应上位机表示进入写器件状态,
{
unsigned char c;
TMOD = 0x20; // 定时器 1 工作于 8 位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); SCON = 0x50; PCON = 0x00; TR1 = 1; IE = 0x00; // 禁止任何中断 while(1) {
///////////////////////////////////////////////////////////////////////////////// //所支持的 FID,请在这里继续添加
///////////////////////////////////////////////////////////////////////////// extern void PreparePro00();//FID=00:AT89C51 编程器 extern void PreparePro01();//FID=01:AT89C2051 编程器 extern void PreparePro02();//FID=02:AT89S51 编程器

51单片机串口通信程序。。含详细例子

51单片机串口通信程序。。含详细例子

{ P3_4=0; P3_3=1;
} void RstPro()//编程器复位 {
pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 }
void ReadSign()//读特征字 {
} void serial () interrupt 4 using 3 //串口接收中断函数 {
if (RI) { RI = 0 ; ch=SBUF; read_flag= 1 ; //就置位取数标志 }
} main()
{ init_serialcom(); //初始化串口 while ( 1 ) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清 0 send_char_com(ch); } }
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); }
void Lock()//写锁定位
{
pw.fpLock();
SendData();

第3章51系列单片机程序设计(C语言部分)

第3章51系列单片机程序设计(C语言部分)

idata
间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节)
pdata
分页寻址片外数据存储区(256字节)由MOV @Ri访问(i=0,1)
xdata
片外数据存储区(64 KB)由MOVX @DPTR访问
code
程序存储器64 KB空间,由MOVC @DPTR访问
第3章 51系列单片机程序设计(C部分)
/* Ary37定义为abry[3]的第7位 */
第3章 51系列单片机程序设计(C部分)
3.5 数 组
数组:数组是一组类型相同 有序数据的集合。用数组名 和下标来唯一确定数组中的 元素。
第3章 51系列单片机程序设计(C部分)
3.5.1 一维数组
一、一维数组的定义 形式:类型说明符 数组名 [常量表达式]
使用C51进行编程时,MCS-51片内的I/O口与片外扩展的I/O可以统一在一个头文 件中定义,也可以在程序中(一般在开始的位置)进行定义。
对于MCS-51片内I/O口按特殊功能寄存器方法定义。 例如:
sfr P0=0x80 ; /* 定义P0口,地址为80H */ sfr P1=0x90 ; /* 定义P1口,地址为90H */
第3章 51系列单片机程序设计(C部分)
3.4.3 C51数据的存储类型与MCS-51存储结构
表 3.4.2 C51存储类型与MCS-51存储空间的对应关系
存储类型 与存储空间的对应关系
data
直接寻址片内数据存储区,访问速度快(128字节)
bdata
可位寻址片内数据存储区,允许位与字节混合访问(16字节)
据 浮点型(float) 类
型 指针类型
详细见表3.4.1

51单片机程序代码

51单片机程序代码
流水灯左移
ORG 0000H
START: MOV R2,#8
MOV A ,#0FEH
CLR C
LOOP: MOV P1,A
LCALL DELAY
RR A
DJNZ R2,LOOP
LJMP START
DELAY: MOV R5,#30
END
1-8 连续稳定显示
ZWMADDR EQU P2
ZXMADDR EQU P0
ORG 0000H
ST: LJMP MAIN
ORG 0100H
MAIN: MOV R3,#0FEH
MOV R4,#01H
LOOP:MOV DPTR,#CHAR
MOV A,R4
MOVC A,@A+DPTR
MOV P0,A
MOV P2,R3
MOV R2,#05H
LCALL DELAY
MOV A,R3
RL A
MOV R3,A
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
END
4 中断1次8移动
ZWMADDR EQU P2
ZXMADDR EQU P0
ORG 0000H
LJMP ST
ORG 0003H
INTO:LJMP INT0S
ST: SETB PX0
SETB PT0
SETB ET0
SETB EA
SETB TR0
MOV A,#80H
MOV ZXMADDR,A
MOV A,#0FEH
LOOP: MOV ZWMADDR,A
LJMP LOOP

51单片机指令表汇总

51单片机指令表汇总

51单片机指令表汇总51 单片机是一种广泛应用于电子工程和嵌入式系统开发的微控制器。

要熟练掌握 51 单片机的编程,了解其指令表是至关重要的。

下面就为大家汇总一下 51 单片机的常见指令。

数据传送类指令MOV 指令:这是最基本的数据传送指令,用于在寄存器之间、寄存器与存储器之间传送数据。

例如,“MOV A, 50H”就是将立即数 50H传送到累加器 A 中。

MOVX 指令:用于在片外数据存储器和累加器 A 之间进行数据传送。

比如“MOVX A, @DPTR”,将片外数据存储器中由数据指针 DPTR 所指定单元的内容传送到累加器 A 中。

MOVC 指令:用于访问程序存储器中的数据表格。

“MOVC A, @A+DPTR”是常见的用法。

算术运算类指令ADD 指令:实现加法运算。

像“ADD A, R0”就是将累加器 A 的内容和寄存器 R0 的内容相加,结果存放在累加器 A 中。

ADDC 指令:带进位加法指令。

考虑了上一次运算产生的进位标志。

SUBB 指令:用于减法运算,并且会考虑借位标志。

逻辑运算类指令ANL 指令:进行逻辑与操作。

例如“ANL A, R0”,将累加器 A 和寄存器 R0 的内容进行逻辑与运算,结果存放在累加器 A 中。

ORL 指令:执行逻辑或操作。

XRL 指令:实现逻辑异或运算。

控制转移类指令JC 指令:若进位标志为 1 则跳转。

JZ 指令:若累加器 A 的内容为 0 则跳转。

LJMP 指令:长跳转指令,可以跳转到 64KB 程序存储器空间的任意位置。

位操作类指令SETB 指令:将指定的位设置为 1。

例如“SETB P10”,将 P1 端口的第 0 位置 1。

CLR 指令:把指定的位清零。

这些只是 51 单片机指令的一部分,实际应用中还有更多的指令和组合使用方式。

在编程时,合理选择和运用这些指令能够实现各种复杂的功能。

比如,通过数据传送指令来初始化变量和读取外部数据;利用算术运算指令进行数值计算;借助逻辑运算指令处理逻辑关系;使用控制转移指令实现程序的分支和循环;运用位操作指令控制单个引脚的状态。

51单片机频率计程序

51单片机频率计程序

#include <REG52.H>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longuchar led_code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管段选码,0~9uchar led_bit[]={0x01,0x02,0x04,0x08,0x10,0x20};//数码管位选码,分别对应1~6uint over_count=0,cap_count=0;//分别定义T2溢出次数、T2捕捉数ulong sig_t=0;//被测信号周期,单位为usvoid timer2isr(void)interrupt 5 using 2//T2中断子程序,测量输入脉冲宽度{if(EXF2==1){EXF2=0;//清中断标志cap_count++;//捕捉次数加1if(cap_count==1)//第一次捕捉到负脉冲时将下述变量清0,为第2次捕捉作准备{TH2=0;TL2=0;RCAP2H=0;RCAP2L=0;over_count=0;return;}sig_t=RCAP2H*256+RCAP2L+over_count*65536+30;//第2次捕捉到脉冲下降沿时计算出该信号的周期,30为误差TH2=0;//将相关寄存器和变量清0TL2=0;RCAP2H=0;RCAP2L=0;over_count=0;cap_count=0;}else{over_count++;TF2=0;//T2溢处次数加1,溢出标志位清零}}void display(ulong tempdata)//用数码管动态显示一个6位整数{uchar led_data[6];uchar i;uint k;for(i=0;i<6;i++)//将6位整数中的每一位分离出来{led_data[5-i]=tempdata%10;tempdata =tempdata/10;}for(i=0;i<6;i++)//将上述分离出来的每位整数显示出来{P2=0;P0=led_code[led_data[i]];//输出段码P2=led_bit[i];//位选数码管for(k=0;k<1000;k++);///每位数码管之间的延时}}void main(void){TH2=0;TL2=0;RCAP2H=0x00;RCAP2L=0x00;//以置初值T2CON=0x0D;//设置T2工作方式,EXEN2=1,TR2=1,C/T2=0,CP/_RL2=1 EA=1;//全部中断允许ET2=1;//T2中断开while(1){display(sig_t);//显示脉冲周期}}。

51单片机程序

51单片机程序

(一)A/D的应用//拧动电位器,会在数码管的前三位显示0-255之间的数值。

这就是把模拟电压转换成数字信号。

//有些拧动电位器后数码管数可能不会动态变化,请用户按下实验板上的S22复位按键可更新数据//这种显象产生的原因是和AD芯片自身的一些特性有关。

#include<reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit adrd=P3^7; //IO口定义sbit adwr=P3^6;sbit diola=P2^5;sbit dula=P2^6;sbit wela=P2^7;unsigned char j,k,adval;void delay(unsigned char i) //延时程序{for(j=i;j>0;j--)for(k=125;k>0;k--);}uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管编码0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void display(uchar bai_c,uchar sh_c,uchar g_c) //显示程序{P0=table[bai_c]; //显示百位dula=1;dula=0;P0=0xfe;wela=1;wela=0;delay(5);dula=0;P0=table[sh_c]; //显示十位dula=1;dula=0;wela=0;P0=0xfd;wela=1;wela=0;delay(5);P0=table[g_c]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(5);}void main() // 主程序{uchar a,A1,A2,A2t,A3;while(1){wela=1;P0=0; //选通ADCSadwr=0; //AD写入(随便写个什么都行,主要是为了启动AD转换)_nop_();adwr=1;P0=0xff; //关闭ADCSdelay(10);wela=0; //关闭有AD片选信号锁存器的锁存端以防止在操作数码管时使AD的片选发生变化for(a=20;a>0;a--) //需要注意的是ADC0804在写和读之间的时间间隔要足够长否则无法读出数据{ //这里把显示部分放这里的原因也是为了增加写读之间的时间间隔display(A1,A2,A3);} //送去显示各位。

51单片机C语言编程基础及实例

51单片机C语言编程基础及实例

51单片机C语言编程基础及实例51单片机C语言编程基础及实例C语言是一门通用计算机编程语言,应用广泛。

下面是店铺整理的51单片机C语言编程基础及实例,希望对大家有帮助!单片机的外部结构:DIP40双列直插;P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)电源VCC(PIN40)和地线GND(PIN20);高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)四个8位通用I/O端口,对应引脚P0、P1、P2和P3;两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1) 一个串行通信接口;(SCON,SBUF)一个中断控制器;(IE,IP)针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。

C语言编程基础:十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。

如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。

++var表示对变量var先增一;var—表示对变量后减一。

x |= 0x0f;表示为 x = x | 0x0f;TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。

While( 1 ); 表示无限执行该语句,即死循环。

语句后的分号表示空循环体,也就是{;}在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)代码#include //该头文档中有单片机内部资源的符号化定义,其中包含P1.3void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口{P1_3 = 1; //给P1_3赋值1,引脚P1.3就能输出高电平VCCWhile( 1 ); //死循环,相当 LOOP: goto LOOP;}注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。

51单片机程序烧录教程

51单片机程序烧录教程

目录•引言•51单片机基础知识•程序烧录工具及准备•程序烧录步骤详解•程序烧录常见问题及解决方法•实例演示与操作实践引言目的和背景介绍51单片机的程序烧录方法和步骤提供详细的教程和指导,帮助读者更好地掌握51单片机的程序烧录技能教程内容概述0151单片机简介和基础知识02程序烧录前的准备工作03程序烧录步骤和注意事项04常见问题和解决方法51单片机基础知识51单片机简介•51单片机是对所有兼容Intel 8051指令系统的单片机的统称。

该系列单片机的始祖是Intel的8051单片机,后来随着Flashrom技术的发展,8051单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。

很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。

0102 03中央处理器(CPU)由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;RAM用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;ROM用以存放程序、一些原始数据和表格;1 2 3四个8位并行I/O口,既可用作输入,也可用作输出;I/O口两个16位定时器/计数器,可对机器周期计数,也可对外部输入脉冲计数;定时器/计数器(ROM)可响应三个内部中断源和两个外部中断源的中断请求;中断系统串行口一个全双工串行通信口,用于实现单片机和其他设备之间的串行数据传送;特殊功能寄存器(SFR)21个特殊功能寄存器,用于存放相应功能部件的控制/状态字,以实现对单片机的各功能部件进行管理、控制、监视。

主电源引脚(2根)VCC(Pin40):电源输入,接+5V电源。

GND(Pin20):接地线。

XTAL1(Pin19)和XTAL2(Pin20)。

外接一个振荡器(包括外部晶振),形成振荡电路。

RST/VPD(Pin9):复位引脚。

ALE/PROG(Pin30):地址锁存允许信号。

51单片机程序(计时器)

51单片机程序(计时器)

计时器1、LCD.c#include <reg51.h>#include<LCD.h>unsigned char code number_X[]={ //宽x高=8x16,纵向字节倒序0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, //00x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, //10x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, //20x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, //30x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, //40x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, //50x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, //60x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, //70x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, //8 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, //9 0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // . 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, //-0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //nop 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, //:0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};void LCD_WriteCommandE1(unsigned char com) {while(CRADD1 & 0x80);CWADD1 = com;}void LCD_WriteDataE1(unsigned char dat){while(CRADD1 & 0x80);DWADD1 = dat;}void LCD_WriteCommandE2(unsigned char com) {while(CRADD2 & 0x80);CWADD2 = com;}void LCD_WriteDataE2(unsigned char dat){while(CRADD2 & 0x80);DWADD2 = dat;}void LCD_Init(){LCD_WriteCommandE1(0xe2);LCD_WriteCommandE2(0xe2);LCD_WriteCommandE1(0xa4);LCD_WriteCommandE2(0xa4);LCD_WriteCommandE1(0xa9);LCD_WriteCommandE2(0xa9);LCD_WriteCommandE1(0xa0);LCD_WriteCommandE2(0xa0);LCD_WriteCommandE1(0xc0);LCD_WriteCommandE2(0xc0);LCD_WriteCommandE1(0xaf);LCD_WriteCommandE2(0xaf);}void LCD_Clear(void){unsigned char i,j;for(i=0;i<4;i++){LCD_WriteCommandE1(i+0xb8);LCD_WriteCommandE2(i+0xb8);LCD_WriteCommandE1(0x00);LCD_WriteCommandE2(0x00);for(j=0;j<0x50;j++){LCD_WriteDataE1(0x00);LCD_WriteDataE2(0x00);}}}void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p) {unsigned int seg,i,j;unsigned char a,L,n;switch(lin){case 0: n=0xba;break;case 1: n=0xb8;break;}for(i=0;i<len;i++){for(j=0;j<2;j++){L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg<16;seg++){if (L < 61){a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(*p++);}else{a = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(*p++);}L++;}}col=col+16;}}void display_number(unsigned char lin,unsigned int col,unsigned char num) {unsigned int seg,i,j;unsigned char a,L,n,k;switch(lin){case 0: n=0xba;break;case 1: n=0xb8;break;}k=num*16;for(j=0;j<2;j++){L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg<8;seg++){if (L < 61){a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(number_X[k++]);}else{a = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(number_X[k++]);}L++;}}}void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat) {unsigned int seg;unsigned char k[4];k[3]=dat%10;k[2]=((dat/10)%10);k[1]=((dat/100)%10);k[0]=((dat/1000)%10);if(k[0]==0) {k[0]=12;}if((k[0]==12)&&(k[1]==0)){ k[0]=12;k[1]=12;}if((k[0]==12)&&(k[1]==12)&&(k[2]==0)){k[0]=12;k[1]=12;k[2]=12;}for(seg=0;seg<4;seg++){display_number(lin,col,k[seg]);col=col+10;}}void display_signed_int(unsigned char lin,unsigned int col,signed int dat) {unsigned int seg;unsigned char k[5],a;k[0]=12;if(dat<0){dat=(~dat)+1;k[0]=11;}k[4]=dat%10;k[3]=((dat/10)%10);k[2]=((dat/100)%10);k[1]=((dat/1000)%10);a=k[0];if(k[1]==0) {k[0]=12;k[1]=a;}if((k[1]==a)&&(k[2]==0)){ k[0]=12;k[1]=12;k[2]=a;}if((k[1]==12)&&(k[2]==a)&&(k[3]==0)){k[0]=12;k[1]=12;k[2]=12;k[3]=a;} for(seg=0;seg<5;seg++){display_number(lin,col,k[seg]);col=col+10;}}void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat) {unsigned int seg;unsigned char k[3];k[1]=dat%10;k[0]=((dat/10)%10);for(seg=0;seg<2;seg++){display_number(lin,col,k[seg]);col=col+10;}}1、LCD.h#include <reg51.h>#include <absacc.h>#ifndef __LCD__#define __LCD__#define CWADD1 XBYTE[0x8000]#define DWADD1 XBYTE[0x8001]#define CRADD1 XBYTE[0x8002]#define DRADD1 XBYTE[0x8003]#define CWADD2 XBYTE[0x8004]#define DWADD2 XBYTE[0x8005]#define CRADD2 XBYTE[0x8006]#define DRADD2 XBYTE[0x8007]extern void LCD_Init();extern void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p);extern void display_signed_int(unsigned char lin,unsigned int col,signed int dat);extern void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat);extern void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat);extern void LCD_Clear(void);#endif1、MCU.c#include <reg51.h>#include "MCU.h"void timer0_init(void){ //okTMOD|=0x01; //Timer0 is 16 bits timer, timer1 is Baud rate generatorTH0=0x97;TL0=0xd5;TR0=1;ET0=1;}2、MCU.h#ifndef __MCU__#define __MCU__extern void timer0_init(void); #endif3、MAIN.c#include <reg51.h>#include<LCD.h>#include<main.h>#include "MCU.h"void wait(unsigned int x){unsigned int i;i=0;for(i=0;i<x;i++);}void timer0(void)interrupt 1 {TH0=0x3c;TL0=0xb0;ms_count++;if(ms_count>=20){ms_count=0;second_count++;if(second_count>=60){second_count=0;minute_count++;if(minute_count>=60){minute_count=0;hous_count++;if(hous_count>=24){hous_count=0;}}}}}void main(void){float F;signed int a;LCD_Init();LCD_Clear();timer0_init( );display_cn(0,20,3,dzb);display_cn(1,18,1,hous);display_cn(1,50,1,minute);display_cn(1,82,1,second);EA=1;while(1){display_unsigned_char(1,0,hous_count);display_unsigned_char(1,34,minute_count);display_unsigned_char(1,66,second_count);wait(5000);}}4、MAIN.h(字模通过软件自建)#ifndef MAIN_H__#define MAIN_H__// 中文字模库16x16点阵code unsigned char dzb[]={ //纵向字节倒序.....................................// 计.....................................// 时.....................................// 器};code unsigned char second[]={ ......................................// 秒};code unsigned char minute[]={ .....................................// 分};code unsigned char hous[]={ ......................................// 时};unsigned char ms_count,second_count,minute_count,hous_count; #endif。

图文51单片机超详细教程PPT(绝对值)

图文51单片机超详细教程PPT(绝对值)

寄存器组
包括累加器A、寄存器B、 程序状态字PSW等,用于 暂存数据和状态信息。
存储器组织
程序存储器
用于存放程序代码和表格常数,一般 采用ROM或EPROM芯片。
特殊功能寄存器SFR
用于控制单片机的各种功能,如定时 器、中断等。
数据存储器
用于存放数据,包括内部RAM和外部 RAM。
I/O端口及特殊功能寄存器
硬件电路设计思路及关键器件选型建议
51单片机
选用高性能、低功耗的51单片机 ,如STC89C52RC等。
无线通信模块
根据实际需求选用合适的无线通 信模块,如ESP8266 Wi-Fi模块
、HC-05蓝牙模块等。
电源芯片
选用稳定性好、效率高的电源芯 片,如LM2596等。
软件编程实现过程剖析
初始化单片机系统
51单片机在工业自动化、智能家居、仪器 仪表等领域有着广泛的应用基础,为开发者 提供了丰富的经验和案例参考。
应用领域与市场需求
应用领域
51单片机广泛应用于工业自动化、智能家居、仪器仪表、汽车电子、医疗设备等领域。例如,工业自动化中的电 机控制、温度控制等;智能家居中的智能照明、智能安防等;仪器仪表中的数据采集、显示控制等。
市场需求
随着物联网、人工智能等技术的快速发展,对单片机的性能和功能提出了更高的要求。同时,市场对于低功耗、 高可靠性、安全性等方面的需求也在不断增加。因此,未来51单片机需要不断提升自身性能,满足市场需求。
02
51单片机硬件结构
中央处理器CPU
01
02
03
运算器
进行算术运算和逻辑运算 。
控制器
取指、译码、执行,控制 单片机各部分协调工作。

51单片机实验程序

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

1第一位隔一秒闪烁一次#include<reg52.h>#define uint unsigned intsbit led1=P1^0;uint i;uint j;void main(){while(1){led1=0;for(i=1000;i>0;i--)for(j=110;j>0;j--);led1=1;for(i=1000;i>0;i--)for(j=110;j>0;j--);}}2复杂广告灯#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar discode[]={ 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,//正向流水灯0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,//反向流水灯0xAA,0x55,0xAA,0x55,0xAA,0x55,0xFF,//隔灯闪烁3次0xF0,0x0F,0xF0,0x0F,0xFF,//高四盏。

低四盏闪烁2次0x33,0xCC,0x33,0xCC,0x33,0xCC,0xFF//隔两盏闪烁3次};void delayms(uint ms){uint i;while(ms--){for(i=0;i<120;i++);}}void main(void){uchar i;P0=0xFF;while(1){for(i=0;i<35;i++){P0=discode[i];delayms(250);}}}3拉幕式与闭幕式广告灯#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar discode1[4]={0x18,0x24,0x42,0x81}; uchar discode2[4]={0x7E,0x3C,0x18,0x00}; void delayms(uint ms){uint i;while(ms--){for(i=0;i<120;i++);}}void main(void){uchar i,j;P0=0xFF;while(1){for(i=0;i<4;i++){j=discode1[i];P0=~j;delayms(500);}j=0xFF;P0=~j;delayms(500);for(i=0;i<4;i++){j=discode2[i];P0=~j;delayms(500);}}}4流水灯跑马灯左移右移#include<reg52.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint s){uint i;while(s--){for(i=0;i<120;i++);}}void main(void){uchar i,j;P0=0xFF;while(1){j=0x01;for(i=0;i<8;i++){P0=~j;delay(500);j=j<<1;}P0=0xFF;delay(1000);j=0x80;for(i=0;i<8;i++){P0=~j;delay(500);j=j>>1;}}}5千位静态显示数字#include<reg52.h>sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)void main(){SMG_q=0;P0=0xF8;while(1);}6,4位数码管同时静态显示#include<reg52.h>#define unchar unsigned char#define uint unsigned intsbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)unchar mun;uchar; code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delay(uint);void main(void){SMG_q=0; SMG_b=0; SMG_s=0; SMG_g=0;//P1=0xf0;两种都可以实现。

while(1){for(mun=0;mun<16;mun++){P0=table[mun];delay(500);}}}void delay(uint s){uint i;while(s--)for(i=120;i>0;i--);}7.数码管动态显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit q = P1^0; //定义数码管阳级控制脚(千位)sbit b = P1^1; //定义数码管阳级控制脚(百位)sbit s = P1^2; //定义数码管阳级控制脚(十位)sbit g = P1^3; //定义数码管阳级控制脚(个位)//unchar mun;uchar; code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delay(uint);void main(void){while(1){q=0;P0=table[1];delay(500);q=1;b=0;P0=table[2];delay(500);b=1;s=0;P0=table[3];delay(500);s=1;g=0;P0=table[4];delay(500);g=1;}}void delay(uint s){uint i;while(s--)for(i=120;i>0;i--);}8.1中断定时器0工作1LED 1s闪烁#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit led1=P1^0;uchar num;void main(){TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;while(1);}void T0_time() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;if(num==50){num=0;led1=~led1;}}8.2中断定时器LED,前两位数码管59s循环计数#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit led1=P0^0;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delay(uint);void display(uchar,uchar); uchar num,num1,num2,shi,ge; void main(void){TMOD=0x11;TH0=(65536-45872)/256;TL0=(65536-45872)%256;TH1=(65536-45872)/256;TL1=(65536-45872)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;while(1){display(shi,ge);}}void display(uchar shi,uchar ge) { P1=0xff;P1=0xfd;P0=table[shi];delay(10);P1=0x00;P1=0xff;P1=0xfe;P0=table[ge];delay(10);P1=0x00;}void delay(uint s){uint i,j;for(i=s;i>0;i--)for(j=110;j>0;j--);}void T0_time()interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num1++;if(num1==50){num1=0;led1=~led1;}}void T1_time()interrupt 3{TH1=(65536-45872)/256;TL1=(65536-45872)%256;num2++;if(num2==20){num2=0;num++;if(num==60)num=0;shi=num/10;ge=num%10;}}//灯的亮灭。

9.1独立键盘使用#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit k1=P3^4; //独立键盘,k1 k2 k3 k4分别接,p34.p35 p36 p37.sbit k2=P3^5;sbit k3=P3^6;sbit k4=P3^7;sbit d=P1^2;sbit c=P1^3;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delayms(uint);uchar numt0,num;void display(uchar numdis) //显示59s的常用方式{ uchar shi,ge;shi=numdis/10;ge=numdis%10;P1=0xff; //控制十位数字P1=0xfd;P0=table[shi];delayms(10);P1=0x00;P1=0xff; //控制个位数字P1=0xfe;P0=table[ge];delayms(10);P1=0x00;}void delayms(uint xms) //简单的延时程序{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void init() //初始化函数{TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;}void keyscan() //控制键盘的程序{if(k1==0){delayms(10); //去抖动延时if(k1==0){num++;if(num==60)num=0;while(!k1); //等待按键释放}}if(k2==0){delayms(10);if(k2==0){if(num==0)num=60;num--;while(!k2);}}if(k3==0){delayms(10);if(k3==0){num=0;while(!k3);}}if(k4==0){delayms(10);if(k4==0){while(!k4);TR0=~TR0;}}}void main() //主函数{init(); //1,先初始化数据init()while(1){keyscan(); //键盘选择?display(num); //显示两位数字函数}}void T0_time()interrupt 1 //中断服务程序{TH0=(65536-45872)/256;TL0=(65536-45872)%256;numt0++;if(numt0==20) //1s的判断{numt0=0;num++;if(num==60)num=0;}}9.2矩阵键盘使用#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delayms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void display(uchar num){P0=table[num];P1=0xf0;}void jianpan(){uchar temp,key;P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xfe) //11111高位没有零,(没有键按下){delayms(10);temp=P3; //随时可能有键按下temp=temp&0xf0;if(temp!=0xfe){temp=P3;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=P3;temp=temp&0xf0;}display(key);}}P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xfe) //222222高位没有零,(没有键按下){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xfe){temp=P3;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=P3;temp=temp&0xf0;}display(key);}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xfe) //333333高位没有零,(没有键按下){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xfe){temp=P3;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=P3;temp=temp&0xf0;}display(key);}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xfe) //44444高位没有零,(没有键按下){delayms(10);temp=P3;temp=temp&0xf0;if(temp!=0xfe){temp=P3;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=P3;temp=temp&0xf0;}display(key);}}}void main(void){P1=0x0f; //打开数码管选通开关while(1){jianpan(); //扫描键盘程序}}。

相关文档
最新文档