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单片机C语言编程入门(详讲版)

51单片机C语言编程入门(详讲版)

中国科学技术大学业余无线电协会编目 录§1 前言 (1)§2 单片机简介 (2)2.1 数字电路简介 (2)2.2 MCS-51单片机简介 (2)2.3 Easy 51 Kit Pro简介 (5)2.4 Easy 51 Kit Pro电路功能分析 (5)§3 MCS-51单片机的C语言编程 (8)3.1 汇编语言 (8)3.2 建立你的第一个C项目 (8)3.3 生成hex文件 (12)3.4 Keil C语言 (14)3.5 单片机I/O (18)3.6 中断 (25)3.7 定时器/计数器 (27)3.8 定时器的应用举例 (29)3.9 外部中断 (34)3.10 串行通信 (38)3.11 定时器2 (43)3.12 看门狗 (47)3.13 空闲模式和掉电模式 (50)§4 MCS-51单片机C语言编程应用进阶 (51)4.1 扫描式键盘 (51)4.2 EEPROM芯片AT93C46的读写 (55)4.3 Keil C的高级使用 (63)§5 编写高质量的单片机C程序 (64)5.1 文件结构 (64)5.2 程序的版式 (66)5.3 单片机程序命名规则与变量选择 (70)5.4 表达式和基本语句 (73)5.5 函数设计 (77)5.6 单片机程序框架 (79)附图:Easy 51 Kit Pro电路图(最小系统板) (80)附图:Easy 51 Kit Pro电路图(学习板) (81)§1 前言什么是单片机,目前还没有一个确切的定义。

普通认为单片机是将CPU、RAM、ROM、定时器/计数器以及输入输出(I/O)接口电路等计算机主要部件集成在一块芯片上,这样所组成的芯片级微型计算机称为单片微型计算机(Single Chip Microcomputer)。

简称为单片微机或单片机。

利用单片机程序,可以实现对硬件系统的小型化的智能控制。

51单片机顺序程序的用法

51单片机顺序程序的用法

51单片机顺序程序的用法
51单片机顺序程序是指按照一定的顺序编写的程序,它是51
单片机的主程序结构。

以下是一般的51单片机顺序程序的用法:
1. 声明和定义变量:在程序的开头,可以声明和定义各种变量,包括整型、字符型、数组、结构体等,根据需要来决定。

2. 初始化:在程序开始时,可以进行一些初始化操作,例如初始化I/O口、定时器、串口等外设,为后续的程序运行做准备。

3. 主程序逻辑:在主程序中,按照一定的顺序执行各种操作,包括输入数据、处理数据和输出结果等。

根据实际需求,可以编写各种功能函数来完成具体的任务。

4. 中断处理:51单片机支持中断,可以在程序中设置中断服
务程序来处理外部中断、定时器中断等。

中断处理程序可以在主程序的逻辑中被调用,根据实际需要进行处理。

5. 循环结构:在程序中可以使用循环结构,如for循环和
while循环等,来重复执行某段代码,实现特定的功能。

6. 结束操作:在程序的结尾,可以进行一些结束操作,如关闭外设、保存数据等。

总的来说,51单片机顺序程序是通过按照一定的顺序编写的
程序来控制单片机进行各种操作,根据实际需求进行初始化、数据处理、中断处理、循环操作等,最终完成预期的任务。

经典从零开始入门学习51单片机教程

经典从零开始入门学习51单片机教程

19
混合编程方法
内嵌汇编
在C语言程序中嵌入汇编代码,以实现一些特定的功 能或优化程序性能。
调用汇编函数
在C语言程序中调用汇编语言编写的函数,实现底层 硬件操作。
混合编程注意事项
了解混合编程中需要注意的问题,如寄存器分配、参 数传递等。
2024/1/26
20
05
51单片机输入输出端口操 作
2024/1/26
16
04
51单片机编程语言基础
2024/1/26
17
汇编语言基础
01
02
03
指令集
了解并掌握51单片机的指 令集,包括数据传送、算 术运算、逻辑运算、位操 作等指令。
2024/1/26
伪指令
熟悉汇编语言中的伪指令 ,如ORG、DB、DW等, 用于定义程序的结构和布 局。
汇编器
学习使用汇编器将汇编语 言程序转换为机器码,以 供51单片机执行。
10
51单片机引脚功能
电源引脚
提供单片机工作所需的电源,包括 Vcc和Gnd引脚。
时钟引脚
提供单片机工作所需的时钟信号, 包括XTAL1和XTAL2引脚。
2024/1/26
复位引脚
用于将单片机复位到初始状态,包 括RST引脚。
I/O引脚
用于与外部设备通信,包括P0、P1 、P2和P3端口引脚。
11
2024/1/26
22
输出端口操作原理及实例
输出端口原理
51单片机的输出端口用于向外部设备发送信号。通过设置端口数据寄存器,我们可以控制输出端口的 电平状态。输出端口通常具有驱动能力,可以直接驱动LED、继电器等负载。
实例
假设我们使用P2.0端口作为输出,控制一个LED灯的亮灭。我们可以通过编程设置P2端口的数据寄存 器,将P2.0端口电平设置为高或低,从而控制LED灯的亮灭。

51单片机c语言教程

51单片机c语言教程

51单片机c语言教程单片机是一种集成了处理器、存储器和各种输入输出接口的微型计算机。

它可以用来完成各种任务,如控制电机、采集数据、控制显示等。

在单片机中,C语言是一种常用的编程语言,通过使用C语言来编写单片机程序,可以更加方便快捷地完成各种功能。

单片机使用C语言进行编程的主要流程如下:首先,需要搭建一个适合的开发环境。

在使用C语言编写单片机程序之前,需要安装相应的开发工具,如Keil C51、IAR Embedded Workbench等。

这些开发工具可以提供编译、调试等功能,方便我们进行程序开发和调试。

接下来,需要了解单片机的硬件平台。

在编写单片机程序之前,需要了解单片机的硬件结构和各个引脚的功能。

单片机的硬件平台通常包括定时器、串口、数字转换等模块,通过对这些模块的理解,可以更好地利用它们完成各种任务。

然后,可以开始编写C语言程序。

C语言是一种结构化的高级语言,通过使用C语言,可以更方便地完成单片机程序的编写。

在编写C语言程序之前,需要了解C语言的语法和常用的函数库,如输入输出函数库、定时器函数库等。

通过灵活地使用这些函数,可以更加快速地实现想要的功能。

在编写C语言程序时,需要注意一些常见的问题。

比如,需要合理地分配内存空间,避免内存溢出等问题;需要注意函数的调用顺序,保证程序的正确执行;需要考虑编程的效率,避免不必要的计算和资源浪费;需要进行适当的程序调试,确保程序的正确性等。

最后,需要进行程序的下载和调试。

在编写完成单片机程序后,需要将程序下载到单片机的存储器中,并进行相应的调试工作,确保程序能够正常运行。

调试过程中,可以通过调试工具查看程序的执行过程,可以进行单步调试、变量跟踪等操作,帮助我们找出程序中的错误和问题,并进行修正。

通过以上步骤,可以更加方便地使用C语言来编写单片机程序。

当然,单片机的应用非常广泛,不仅仅限于C语言的编程,还可以使用汇编语言、基于图形化编程语言的开发工具等。

(1小时学会C语言51单片机)C语言入门教程1

(1小时学会C语言51单片机)C语言入门教程1

我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机上接上最少的外围电路元件让单片机工作。

一般只须连接晶体、VCC、GND、RST即可,一般情况下,A T89C51的31脚须接高电平。

#include<reg51.h> //头文件定义。

或用#include<at89x51.h>其具体的区别在于:后者定义了更多的地址空间。

//在Keil安装文件夹中,找到相应的文件,比较一下便知!sbit P1_0 = P1 ^ 0; //定义管脚void main (void){while(1){P1_0 = 0;//低电平有效,如果把LED反过来接那么就是高电平有效}}就那么简单,我们就把接在单片机P1_0上的LED点亮了,当然LED是低电平,才能点亮。

因为我们把LED的正通过电阻接至VCC。

P1_0 = 0; 类似与C语言中的赋值语句,即把0 赋给单片机的P1_0引脚,让它输出相应的电平。

那么这样就能达到了我们预先的要求了。

while(1)语句只是让单片机工作在死循环状态,即一直输出低电平。

如果我们要试着点亮其他的LED,也类似上述语句。

这里就不再讲了。

点亮了几个LED后,是不是让我们联想到了繁华的街区上流动的彩灯。

我们是不是也可以让几个LED依次按顺序亮呢?答案是肯定的!其实显示的原理很简单,就是让一个LED灭后,另一个立即亮,依次轮流下去。

假设我们有8个LED分别接在P1口的8个引脚上。

硬件连接,在P1_1--P1_7上再接7个LED即可。

例程如下:#include<reg51.h>sbit P1_0 = P1 ^ 0;sbit P1_1 = P1 ^ 1;sbit P1_2 = P1 ^ 2;sbit P1_3 = P1 ^ 3;sbit P1_4 = P1 ^ 4;sbit P1_5 = P1 ^ 5;sbit P1_6 = P1 ^ 6;sbit P1_7 = P1 ^ 7;void Delay(unsigned char a){unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。

51单片机C语言编程入门(详讲版)

51单片机C语言编程入门(详讲版)

中国科学技术大学业余无线电协会编目 录§1 前言 (1)§2 单片机简介 (2)2.1 数字电路简介 (2)2.2 MCS-51单片机简介 (2)2.3 Easy 51 Kit Pro简介 (5)2.4 Easy 51 Kit Pro电路功能分析 (5)§3 MCS-51单片机的C语言编程 (8)3.1 汇编语言 (8)3.2 建立你的第一个C项目 (8)3.3 生成hex文件 (12)3.4 Keil C语言 (14)3.5 单片机I/O (18)3.6 中断 (25)3.7 定时器/计数器 (27)3.8 定时器的应用举例 (29)3.9 外部中断 (34)3.10 串行通信 (38)3.11 定时器2 (43)3.12 看门狗 (47)3.13 空闲模式和掉电模式 (50)§4 MCS-51单片机C语言编程应用进阶 (51)4.1 扫描式键盘 (51)4.2 EEPROM芯片AT93C46的读写 (55)4.3 Keil C的高级使用 (63)§5 编写高质量的单片机C程序 (64)5.1 文件结构 (64)5.2 程序的版式 (66)5.3 单片机程序命名规则与变量选择 (70)5.4 表达式和基本语句 (73)5.5 函数设计 (77)5.6 单片机程序框架 (79)附图:Easy 51 Kit Pro电路图(最小系统板) (80)附图:Easy 51 Kit Pro电路图(学习板) (81)§1 前言什么是单片机,目前还没有一个确切的定义。

普通认为单片机是将CPU、RAM、ROM、定时器/计数器以及输入输出(I/O)接口电路等计算机主要部件集成在一块芯片上,这样所组成的芯片级微型计算机称为单片微型计算机(Single Chip Microcomputer)。

简称为单片微机或单片机。

利用单片机程序,可以实现对硬件系统的小型化的智能控制。

2024年51单片机教程

2024年51单片机教程

51单片机教程一、引言51单片机是一种经典的微控制器,因其性能稳定、价格低廉、应用广泛而备受青睐。

本教程旨在帮助初学者快速掌握51单片机的原理和应用,使读者能够熟练地使用51单片机进行嵌入式系统设计。

二、51单片机简介1.151单片机的概念51单片机是指以Intel的8051微控制器为核心的单片机系列。

它是一种8位的微控制器,内部集成了中央处理器(CPU)、存储器、输入/输出接口等模块。

1.251单片机的特点(1)结构简单:51单片机内部结构清晰,易于学习和使用。

(2)性能稳定:51单片机采用哈佛结构,具有高速、低功耗的特点。

(3)资源丰富:51单片机内部资源丰富,如定时器/计数器、串行通信接口等。

(4)价格低廉:51单片机价格低廉,广泛应用于嵌入式系统设计。

三、51单片机硬件结构2.1中央处理器(CPU)51单片机的CPU包括运算器、控制器和累加器。

运算器负责完成算术和逻辑运算;控制器负责指令的译码和执行;累加器用于暂存操作数和运算结果。

2.2存储器51单片机的存储器分为程序存储器(ROM)和数据存储器(RAM)。

程序存储器用于存放程序代码,数据存储器用于存放程序运行时的数据。

2.3输入/输出接口51单片机具有丰富的输入/输出接口,如并行接口、串行接口等。

这些接口可以连接各种外部设备,实现数据交换和控制功能。

四、51单片机指令系统3.1指令分类51单片机的指令分为数据传送指令、算术运算指令、逻辑运算指令、控制转移指令等。

3.2指令格式51单片机的指令格式通常为操作码+操作数。

操作码表示指令的功能,操作数表示指令的操作对象。

3.3指令执行过程51单片机的指令执行过程包括取指令、译码、执行等阶段。

在执行过程中,CPU根据指令的要求完成相应的操作。

五、51单片机编程4.1开发环境51单片机的编程开发环境通常采用Keil、Proteus等软件。

这些软件提供了代码编写、编译、调试等功能。

4.2编程语言51单片机的编程语言主要为C语言和汇编语言。

51单片机基础程序

51单片机基础程序

点亮第一个LED 1月23号#include <reg52.h>sbit led0=P0^0;void main(){led0=0;}___________________________________________________________ ___点亮一排LED#include <reg52.h>void main(){P0=0xaa;//10101010}___________________________________________________________ ___点亮P 2口流水灯 1月26上午方法1 位操作#include <reg52.h>sbit led0=P0^0;sbit led1=P0^1;sbit led2=P0^2;sbit led3=P0^3;sbit led4=P0^4;sbit led5=P0^5;sbit led6=P0^6;sbit led7=P0^7;void delay(void){unsignedchar a,b; for(a=0;a<200;a++) for(b=0;b<200;b++); }void main(){while(1){led0=0;delay();led0=1;delay();led1=0; delay(); led1=1; delay();led2=0; delay(); led2=1; delay();led3=0; delay(); led3=1; delay();led4=0; delay(); led4=1; delay();led5=0;led5=1;delay();led6=0;delay();led6=1;delay();led7=0;delay();led7=1;delay();}}方法2 总线方法#include <reg52.h>#define uchar unsigned char#define uint unsigned intunsignedchartable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};{uchara,b;for(a=0;a<200;a++)for(b=0;b<200;b++);}void main(){uchari;while(1){for(i=0;i<8;i++){P0=table[i];//11111110 delay();}// P0=0xfd;//11111101}}方法三移位流水#include <reg52.h>#define uchar unsigned char#define uint unsigned intvoid delay(void){uchara,b;for(a=0;a<200;a++)for(b=0;b<200;b++);}void main(){uchark,i;while(1){k=0xfe;//11111110 << for(i=0;i<8;i++){P0=k;delay();k=k<<1; //11111100 | k=k|0x01;//把最低位置1//11111101} //11111010 } //00000001 //11111011}方法四函数调用#include <reg52.h>#include <intrins.h>#define uchar unsigned char #define uint unsigned int void delay(void){uchara,b;for(a=0;a<200;a++)for(b=0;b<200;b++);}void main(){uchark;k=0xfe;while(1){P0=k;delay();k=_crol_(k,1);}}___________________________________________________________ ___蜂鸣器继电器1月28号#include <reg52.h>sbit beep=P0^1;void main(){beep=1;}#include <reg52.h>sbit relay=P0^0;void delay(void){unsignedchar a,b; for(a=0;a<200;a++) for(b=0;b<200;b++); }void main(){while(1){relay=1;delay();relay=0;delay();}}____________________________________________________________ __步进电机的按键控制1月29号#include <reg52.h>void delay(unsigned int t);//Motorsbit k1=P2^7;sbit k2=P2^6;sbit F1 = P1^0;sbit F2 = P1^1;sbit F3 = P1^2;sbit F4 = P1^3;unsigned char codeFFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转unsigned char codeFFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转/* 步进电机驱动*/void motor_ffw(){unsigned char i;unsigned int j;for (j=0; j<12; j++) //转1*n圈{for (i=0; i<8; i++) //一个周期转30度 {P1 = FFW[i]&0x1f; //取数据delay(10); //调节转速 }}}void motor_ffz(){unsigned char i;unsigned int j;for (j=0; j<12; j++) //转1*n圈{for (i=0; i<8; i++) //一个周期转30度 {P1 = FFZ[i]&0x1f; //取数据delay(10); //调节转速 }}}void motor_stop(){P1=1;}voiddelay(unsigned int t){unsigned int k;while(t--){for(k=0; k<80; k++){}}}main(){while(1){P2=0xff;switch (P2){case(0xfe): motor_ffw();break;case(0xfd): motor_ffz();break;default : motor_stop(); break; }}_____________________________________________________________ _呼吸灯4月13号#include<reg51.h>#define uint unsigned intuint i;sbit led=P2^3;void delay(uint a){while(a-=1);}void breath(){ uint i;for(i=1;i<=499;i++) { led=0;delay(i);led=1;delay(501-i);}for(i;i>=1;i--){ led=0;delay(i);led=1;delay(501-i);}}void main(){ while(1){ breath(); }___________________________________________________________ ____________________流水呼吸灯4月15号#include<reg51.h>#include<intrins.h> //调用库函数#define uchar unsigned char#define uint unsigned int //宏定义uint i;uchar bb;void delay(uint a){ while(a--) ; //定义延时函数}void breath() //定义呼吸函数{ uint i;for(i=1;i<=499;i++) //FOR循环{ P2=bb; //控制BB位的LEDdelay(i); //延时,随着 FOR循环延时点亮的时间逐渐缩短,即每次循环的时间减少,亮度减弱P2=0XFF;delay(501-i); //BB位LED为低电平的时间增长,高电平时间为0}for(i;i>=1;i--) //由高电平时间为0转换为低电平为0{ P2=bb;delay(i);P2=0XFF;delay(501-i);}}void main(){ bb=0xfe;while(1) //循环主函数 { breath();bb=_crol_(bb,1); //_crol_带循环//<<是位左移,后面补0}}___________________________________________________________ ____________________//数码管动态显示7月21号#include <reg51.h>intduanxuan[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; int i,k,e,z=0xfe;void delay (int j){while (j--);}void disp(){P0=0x00;P1=0xff;P0=duanxuan[k];P1=z;delay(200);z=z<<1;z=z|0x01;}void main (){for (k=0;k<=8;k++){disp();}}______________________________________________________________ _________________点阵显示7月23号没有取模软件,懒得算数____________________________________________________________ ___________________独立按键7月23号#include <reg51.h>unsignedcharsmg_gy[]={~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x 7f,~0x6f};sbit k1=P3^0;sbit led=P0^0;void delay(int t) //误差 0us{unsigned char j;for (;t>0;t--)for(j=19;j>0;j--);}void main (){intnum;P3=0xff;while(1)//消抖{if(k1==0){delay(200);if (k1==0){num++;led=0;if(num==8)num=0;while (!k1);}delay(200);while (!k1);}elseled=1;P1=smg_gy[num];}}__________________________________________________________8 8月2号矩阵键盘#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar duanxuan[16]={~0x3f,~0x06,~0x5b,~0x4f, ~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f,~0x77,~0x7c}; uchar table[12]={0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};void display(uchar i){P1=duanxuan[i];}void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}void main(){unsigned char i,key_1,key_2,hh;while (1){P3=0xf0;key_1=P3;if(key_1!=0xf0){delay_50us(200);key_1=P3;if(key_1!=0xf0){P3=0x0f;key_2=P3;hh=key_1|key_2;for(i=0;i<12;i++){if(hh==table[i]){display(i);break;}}}}}}___________________________________________________________ 8月7号中断函数#include<reg52.h>#include<intrins.h> //调用库函数#define uchar unsigned char#define uint unsigned int //宏定义sbit p=P0^0;void delay(uint a){while(a--) ; //定义延时函数}void clock(void){p=0;delay(100);}void main(){IT0=0;EA=1;EX0=1;//<<是位左移,后面补0 while(1){P2=0x00;clock();}}void it0() interrupt 0{P2=0xf0}__________________________________________________________ 8月11号定时器方式的数码管动态显示#include <reg51.h>#include <intrins.h>unsigned char num,k=0,z=0xfe;int duanxuan[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};void main(){TMOD=0X01; //设置定时器工作方式为定时方式1 TH0=(65536-500)/256; //装入初值12M晶振定时TL0=(65536-500)%256;EA=1; //打开总中断开关ET0=1; //打开定时器开关TR0=1; //启动定时器while(1){if(num==5){num=0;P1=z;P0=duanxuan[k];k++;k=k%8;z=_crol_(z,1);}} //等待中断响应}void time0 () interrupt 1{TH0=(65536-500)/256; //装入初值12M晶振定时 TL0=(65536-500)%256;num++;}。

51单片机入门参考程序及图例

51单片机入门参考程序及图例
主函数
------------------------------------------------*/
void main (void)
{
yuandian=0;
start=1; //按键输入端口电平置高
zhu=0;//主臂在上升极限
fu=0;//副臂在上升极限
zhujia=0;//主夹打开
fujia=0;//副夹打开
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
zhu=0;//主复位
fu=0;//副复位
zhujia=0;//主夹复位
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时
DelayMs(50000);//延时

51单片机C语言编程入门以及keil_uvision使用方法介绍(详讲版)

51单片机C语言编程入门以及keil_uvision使用方法介绍(详讲版)
同时,本学习资料还致力于引导读者编写高质量的单片机 C 语言程序。尽管单片机程序 的规模有限,但高质量的单片机程序除了可以优化运行效率外,对程序的开发速度和可维护 性也具有重要的影响。
中国科学技术大学业余无线电协会
1
51 单片机 C 语言编程入门——Easy 51 Kit Pro 配套学习资料
§2 单片机简介
§3 MCS-51 单片机的 C 语言编程……………………………………………………………… 8 3.1 汇编语言………………………………………………………………………………… 8 3.2 建立你的第一个 C 项目………………………………………………………………… 8 3.3 生成 hex 文件…………………………………………………………………………… 12 3.4 Keil C 语言……………………………………………………………………………… 14 3.5 单片机 I/O……………………………………………………………………………… 18 3.6 中断……………………………………………………………………………………… 25 3.7 定时器/计数器………………………………………………………………………… 27 3.8 定时器的应用举例……………………………………………………………………… 29 3.9 外部中断………………………………………………………………………………… 34 3.10 串行通信……………………………………………………………………………… 38 3.11 定时器 2……………………………………………………………………………… 43 3.12 看门狗………………………………………………………………………………… 47 3.13 空闲模式和掉电模式………………………………………………………………… 50

手把手教你学51单片机(C语言版)

手把手教你学51单片机(C语言版)
10.1 数字秒表实例
10.1.2 定时时间精准性调 整
10.1.4 数码管扫描函数算 法改进
12
Part One
11 UART串口通信
11 UART串口通信
11.1 串行通信的 初步认识
11.2 RS-232通 信接口
11.3 USB转串口 通信
11.4 IO口模拟 UART串口通信
11.5 UART串口 通信的基本应用
A
C
E
13.2 1602整屏 移动
13.4 计算器实 例
13.6 练习题
13.1 通信时序 解析
13.3 多.c文件 的初步认识
B
13.5 串口通信机制 和实用的串口例程
D
F
15
Part One
14 I^2C总线与E^2PROM
14 I^2C总线与E^2PROM
14.1 I2C时 序初步 认识
14.2 I2C寻 址模式
18 RS-485通信与Modbus协议
01
18.1 RS485通信
02
18.2 Modbus 通信协议介绍
18.2.1 Modbus协议 特点 18.2.2 RTU协议帧数 据
03
18.3 Modbus 多机通信例程
04
18.4 练习题
20
Part One
19 实践项目开发——多功能电子钟
19 实践项目开发——多功能电子钟
1.6 答读者问
03
Part One
2 点亮你的LED
2 点亮你的LED
2.1 单片机的 内部资源
2.2 单片机最 小系统
2.3 LED小灯
2.6 练习题
2.5 程序下载

51单片机Keil C语言入门教程

51单片机Keil C语言入门教程
1.电源引脚 Vcc 40 电源端 GND 20 接地端 *工作电压为 5V,另有 AT89LV51 工作电压则是 2.7-6V, 引脚功能一样。
2.外接晶体引脚
-7-

51 单片机 C 语言入门教程(磁动力工作室)
图 2-2 外接晶体引脚 XTAL1 19 XTAL2 18 XTAL1 是片内振荡器的反相放大器输入端,XTAL2 则是输出端,使用外部振荡器 时,外部振荡信号应直接加到 XTAL1,而 XTAL2 悬空。内部方式时,时钟发生器对振 荡脉冲二分频,如晶振为 12MHz,时钟频率就为 6MHz。晶振的频率可以在 1MHz-24MHz 内选择。电容取 30PF 左右。 *型号同样为 AT89C51 的芯片,在其后面还有频率编号,有 12,16,20,24MHz 可选。 大家在购买和选用时要注意了。如 AT89C51 24PC 就是最高振荡频率为 24MHz,40P6 封 装的普通商用芯片。 3.复位 RST 9 在振荡器运行时,有两个机器周期(24 个振荡周期)以上的高电平出现在此引腿 时,将使单片机复位,只要这个脚保持高电平,51 芯片便循环复位。复位后 P0-P3 口 均置 1 引脚表现为高电平,程序计数器和特殊功能寄存器 SFR 全部清零。当复位脚由 高电平变为低电平时,芯片为 ROM 的 00H 处开始运行程序。常用的复位电路如图 2- 3 所示。 *复位操作不会对内部 RAM 有所影响。
图 1-1 启动时的屏幕
-1-

51 单片机 C 语言入门教程(磁动力工作室)
接着按下面的步骤建立您的第一个项目: (1)点击 Project 菜单,选择弹出的下拉式菜单中的 New Project,如图 1-2。接着弹 出一个标准 Windows 文件对话窗口,如图 1-3,这个东东想必大家是见了 N 次的了,用法 技巧也不是这里要说的,以后的章节中出现类似情况将不再说明。在“文件名”中输入您的 第一个 C 程序项目名称,这里我们用“test”,这是笔者惯用的名称,大家不必照搬就是了, 只要符合 Windows 文件规则的文件名都行。“保存”后的文件扩展名为 uv2,这是 KEIL uVision2 项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1点亮LED灯#include "reg52.h"sbit led1=P1^0;void main(void){while(1){led1=0;}}2延时函数#include "reg52.h"sbit led1=P1^0;void delay_ms(int z){int a;for( ;z>0;z--)for(a=110;a>0;a--); }void main(void){while(1){led1=0;delay_ms(500);led1=1;delay_ms(500);}}3按键控制LED灯#include "reg52.h"sbit led1=P1^0;void delay_ms(int z){int a;for( ;z>0;z--)for(a=110;a>0;a--);}void main(void){while(1){led1=0;delay_ms(500);led1=1;delay_ms(500);}}4PWM控制LED灯#include"reg52.h"sbit led1=P1^0;sbit led2=P1^7;void delay_us(int a){for( ;a>0;a--);}void main(){ int p=0,l=300;led2=0;while(1){led1=0;delay_us(p);led1=1;delay_us(l);p++;if(p==300){p=300;}l--;if(l<0){l=0;}// delay_us(300);}}5库函数流水灯#include "reg52.h"#include "intrins.h"void delay_ms(int z){int a;for( ;z>0;z--)for(a=110;a>0;a--);}void main(void){unsigned char a,s;while(1){a=0x7f;for(s=0;s<8;s++) //循环8次{ P1=a;delay_ms(100); //延时一下每个灯亮300msa=_cror_(a,1);}a=0xfe;for(s=0;s<8;s++) //循环8次{ P1=a;delay_ms(100); //延时一下每个灯亮300msa=_crol_(a,1);}}}6流水灯左右移动#include "reg52.h"void delay_ms(int d) //延时函数原理就是让单片机不停地作加减法运算{int v;for( ;d>0;d--)for(v=110;v>0;v--);}void main(){int a;while(1){for(a=0;a<8;a++) //循环8次{P1=~(0x01<<a); //依次点亮leddelay_ms(300); //延时一下每个灯亮300ms }for(a=0;a<8;a++) //循环8次{P1=~(0x80>>a); //依次点亮leddelay_ms(300); //延时一下每个灯亮300ms }}}7外部中断#include"reg52.h"sbit led1=P1^0;void delay_ms(int z){int a;for( ;z>0;z--)for(a=110;a>0;a--);}void main(void){ EA = 1; // 打开总中断EX0 = 1; // 打开中断0IT0 = 0; // 触发方式=1高电平触发=0低电平触发EX1 = 1; // 打开中断1IT1 = 0; //while(1){led1=0;delay_ms(200);led1=1;delay_ms(200);}}void int0() interrupt 0{led1=0;}void int1() interrupt 2{led1=0;delay_ms(500);led1=1;delay_ms(500);}8单个数码管#include "reg52.h"sbit w1=P2^4;sbit w2=P2^5;sbit w3=P2^6;sbit w4=P2^7;unsigned char smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9数组void delay_ms(int z) //延时函数{int a;for( ;z>0;z--)for(a=110;a>0;a--);}/*主函数*/void main(void){w1=0; //打开第一位数码管控制正极的三极管while(1){P0=smg[]; //显示下标为k的数scankey(); //扫描按键状态}}9两位数码管#include "reg52.h"sbit w1=P2^4;sbit w2=P2^5;unsigned char smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9数组291625334void delay_ms(int z) //延时函数{int a;for( ;z>0;z--)for(a=110;a>0;a--);}/*主函数*/void main(void){ int s=39;while(1){w1=0; //打开第一位数码管的正极P0=smg[s/10]; //送入要显示的数据到数码管delay_ms(2);//延时一会P0=0xff; //w1=1; //第一位数码管的正极也就失去了正极w2=0; //打开第二位数码管的正极P0=smg[s%10];//送入要显示的数据到数码管delay_ms(2); //延时一会P0=0xff;w2=1;}}10按键控制四位数码管#include "reg52.h"sbit w1=P2^4;sbit w2=P2^5;sbit w3=P2^6;sbit w4=P2^7;sbit k1=P3^2;sbit k2=P3^3;unsigned char smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9数组291625334int k=0;void delay_ms(int z) //延时函数{int a;for( ;z>0;z--)for(a=110;a>0;a--);}void display(unsigned int s){w1=0; //打开第一位数码管的正极P0=smg[s/1000]; //送入要显示的数据到数码管delay_ms(2);//延时一会P0=0xff; //w1=1; //第一位数码管的正极也就失去了正极w2=0; //打开第二位数码管的正极P0=smg[s%1000/100];//送入要显示的数据到数码管delay_ms(2); //延时一会P0=0xff;w2=1;w3=0; //打开第一位数码管的正极P0=smg[s%1000%100/10]; //送入要显示的数据到数码管delay_ms(2);//延时一会P0=0xff; //w3=1; //第一位数码管的正极也就失去了正极w4=0; //打开第二位数码管的正极P0=smg[s%1000%100%10];//送入要显示的数据到数码管delay_ms(2); //延时一会P0=0xff;w4=1;}/*主函数*/void main(void){while(1){ if(k1==0){delay_ms(5);if(k1==0){k=k+50;if(k>2000) k=0;while(k1==0) display(k);}}if(k2==0){delay_ms(5);if(k2==0){k=k-50;if(k<0)k=2000;while(k2==0) display(k);}}display(k);}}11定时器#include "reg52.h"sbit w1=P2^4;sbit w2=P2^5;sbit w3=P2^6;sbit w4=P2^7;unsigned char smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9数组291625334int m,c,f;void delay_ms(int z) //延时函数{int a;for( ;z>0;z--)for(a=110;a>0;a--);}void display(unsigned int s,l){w1=0; //打开第一位数码管的正极P0=smg[s/10]; //送入要显示的数据到数码管delay_ms(2);//延时一会P0=0xff; //w1=1; //第一位数码管的正极也就失去了正极w2=0; //打开第二位数码管的正极P0=smg[s%10];//送入要显示的数据到数码管delay_ms(2); //延时一会P0=0xff;w2=1;w3=0; //打开第一位数码管的正极P0=smg[l/10]; //送入要显示的数据到数码管delay_ms(2);//延时一会P0=0xff; //w3=1; //第一位数码管的正极也就失去了正极w4=0; //打开第二位数码管的正极P0=smg[l%10];//送入要显示的数据到数码管delay_ms(2); //延时一会P0=0xff;w4=1;}/*主函数*/void main(void){TMOD=0x01; //设置定时器模式TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;while(1){display(f,m);}}void miaodata() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;c++;if(c==20){c=0;m++;if(m==60){m=0;f++;if(f==60){f=0;}}}}12串口通信#include<reg52.h>#define uchar unsigned char#define baud9600 9600UL#define baud19200 19200UL#define fosc 11059200UL//其中,UL代表unsigned long #define baud_9600 1sbit dj=P1^0;sbit m0=P1^1;sbit m1=P1^2;int fx; //初始化舵机在中间void delay(int a){for(a=110;a>0;a--);}void stop(){m0=0;m1=0;}void up(){m0=0;m1=1;}void dn(){m0=1;m1=0;}void serial_init(void){TMOD=0x21;//T1工作在方式2SCON=0x50;//SM1=1串口通信在模式1,REN=1并启动串口。

相关文档
最新文档