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单片机实用教程入门之跑马灯
MCS-8051 单片机实用教程深圳伟凡数码 QQ:59059381上一节讲了 KEIL 软件的基本使用, 本节开始学习编程,编写第一个程序,如果从没学过的朋友不需要深入了解,只 要按照下面写出第一个程序。
好, 就来试试,很有意思的。
这里主要讲些技巧, 而不是专门的 C 语言,如过想学习更深入 的 C 语言, 请参考相关 C 语言书籍。
前面我们已经讲了怎样建立文件,这里就不多讲了。
按照下面动手写下面程序,当写好后, 我们就可以进行编译了, 点工具栏上的按钮或者 按键盘的功能键 F7 开始编译了,在最下面一个白色窗口显示编译结果, 0 Error(s)表示没有错误,正确的通过编译,0 Warning 表示 0 警告,这里 如果有 1 个或多个警告,并不影响程序的正确编译, 只是表明程序有多余的没有应用的程序。
下面表示程序已经正确的通过了. 如果你的也是这样的, 那就恭喜你成功了。
下面我们就来说说这个程序的基本知识,要记住的, a. 符号// 后面表示注释部分,或者程序的说明部分, 比如上面的程序名称, 日期等 b. /* */ 这个也是表示注释部分. 注意, 注释部分是不被编译的,注释是方便我们更能理解程序 c . #include<stdio.h> 这个表示头文件,表示我们要用到的函数或者定义,由#include<头文件名> 组成,编写规则头文件MCS-8051 单片机实用教程存深圳伟凡数码 QQ:59059382后面不能 有分号" ; ". #include<reg51.h> 也是头文件, 这是我们 51 单片机的头文件, 定义了单片机的特殊功能寄器的定义,我们可以打开头文件查看, 方法是: 将鼠标移动到文件名上, 点鼠标右键,出现以下菜单,点击蓝色部 分,这样就打开了 51 头文件。
打开 51 文件之后, 我们看到了对 51 单片机的端口定时器中断等进行了定义,想要了解含义,去看看单片机的资料, 这里不多讲。
跑马灯控制(定时中断应用)
江 苏 省 盐 城 技 师 学 院教 案 首 页编 号:YJQD-0507-07 版 本:B/O 流水号: 编 制: 审 核: 批 准:课题: 跑马灯控制(定时中断应用) 教学目的、要求:1、学习使用定时/计数器实现精确延时。
2、 熟练掌握移位指令。
教学重点、难点:熟练掌握移位指令授课方法: 启发式教学、任务驱动型教学、实验教学 教学参考及教具(含电教设备):高职高专规划教材《单片机原理与控制技术》、多媒体设备、DVCC 系列单片机微机仿真实验系统实验指导书。
授课执行情况及分析:板书或教学设计:授课日期班 级课题:跑马灯控制(定时中断应用)一、知识回顾 二、任务引入 三、任务分析 四、相关知识 (1)电路功能 (2)硬件电路 (3)控制程序五、任务实施 六、任务拓展 七、巡回指导 八、结束指导课题 跑马灯控制(定时中断应用)课前准备:1、DVCC 系列单片机微机仿真实验系统2、安装有DVCC 实验系统软件的计算机、多媒体投影仪3、万用表及常用电工工具组织教学:检查学生人数、标志牌佩戴、工作服及工具准备情况。
知识回顾(复习提问):定时中断的设定方法是什么?任务引入:开始时P1.0亮,延时0.2S 后,P1.1亮,如此左移7次后至P1.7再延时0.2S 右移至P1.6,如此右移7次至P1.0,循环显示。
任务分析:一、硬件图EA/VP 31X119X218RESET 9RD 17WR 16INT012INT113T014T115P101P112P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PSEN 29ALE/P 30TXD 11RXD 10Vss 20Vcc 40U28051R1200R2200R3200R4200R5200R6200R7200R8200D1LED D2LED D3LED D4LED D5LED D6LED D7LED D8LEDT1XTALC130p FC230p Fa b f c g deVCC 1234567a b c d e f g 8dpdp9DS1AMBERCAa b f c g deVCC 1234567a b c d e f g 8dpdp9DS2AMBERCAA B C DR910K R1010K R1110K R1210K+5V+5VR0110k+5V+C0122u F二、功能说明开始时P1.0亮,延时0.2S 后,P1.1亮,如此左移7次后至P1.7再延时0.2S 右移至P1.6, 如此右易7次至P1.0,循环显示。
51单片机8个跑马灯程序汇编设计思路
【51单片机8个跑马灯程序汇编设计思路】1. 引言在嵌入式系统中,跑马灯程序是一个非常常见且基础的程序设计。
通过控制LED灯的亮灭顺序,实现灯光在一组灯中顺序轮流亮起的效果。
其中,51单片机是一种常用的嵌入式系统开发评台,本文将探讨如何通过汇编语言设计实现8个跑马灯程序的思路和方法。
2. 分析题目我们需要对题目进行细致的分析。
51单片机8个跑马灯程序要求我们设计并实现一个程序,能够控制8个LED灯依次轮流亮起的效果。
这意味着我们需要对LED灯进行控制,并且需要考虑如何实现循环、延时等功能。
3. LED灯控制在实现跑马灯程序时,首先需要考虑如何控制LED灯的亮灭。
一种常见的方法是通过I/O口控制LED灯的高低电平,从而实现灯的亮灭。
我们需要了解51单片机的I/O口控制方式,并结合LED灯的连接方式进行设计。
4. 循环控制跑马灯程序的核心在于实现LED灯的依次轮流亮起。
这就需要我们设计循环控制的程序结构。
在汇编语言中,可以通过跳转指令和计数器来实现循环效果,我们需要考虑如何设计循环的次数和顺序。
5. 延时控制为了让人眼能够观察到LED灯的亮灭效果,我们需要在程序中添加延时控制。
这需要我们了解51单片机的定时器控制和时钟频率,并根据LED灯的亮度要求设计合适的延时程序。
6. 汇编设计思路在进行汇编设计时,可以按照以下步骤进行:1)设置I/O口控制LED灯的引脚,确定LED的连接方式;2)设计循环控制结构,确定LED灯的顺序和次数;3)添加延时程序,控制LED灯亮灭的时间间隔;4)编写中断程序,处理定时器中断等事件;5)调试程序,验证跑马灯效果是否符合要求。
7. 个人观点和理解通过设计这个跑马灯程序,我深切体会到了汇编语言的精妙之处。
通过对硬件的直接控制和对程序结构的精心设计,我感受到了嵌入式系统开发中的乐趣和挑战。
而对于初学者来说,设计跑马灯程序也是一个很好的学习过程,可以加深对于51单片机结构和编程思想的理解。
跑马灯
基于C51单片机的跑马灯程序设计本文由仇看风雨贡献/************ 单片机学习板V1.0 ********************//*功能描述:跑马灯练习 */*//*功能:控制学习板上的8个LED显示 *//*接外部晶振11.0592 MHZ *//**************************************************///P0口控制8个LED 把学习板上的4位拨码开关的 1 拨到ON#include <reg51.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longvoid delay(unsigned int count);//延时程序void led_display(void);//LED显示子程序//数据模式 LED_DATA[0]显示次数 LED_DATA[1]显示速度LED_DATA[2]-[18]显示数据uchar codeLED_DATA1[18]={3,50,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0 x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00};//弹跳灯uchar codeLED_DATA2[18]={5,120,0xC3,0x66,0x3C,0x18,0x18,0x3C,0x66,0xC3, 0xC3,0x66,0x3C,0x18,0x18,0x3C,0x66,0xC3};//双灯对撞模式uchar codeLED_DATA3[18]={5,80,0x00,0x81,0xc3,0xe7,0xff,0xe7,0xc3,0x81,0 x00,0x81,0xc3,0xe7,0xff,0xe7,0xc3,0x81};//拉链模式uchar codeLED_DATA4[18]={3,50,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0 xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00};//LED灯柱uchar codeLED_DATA5[18]={3,100,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa, 0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa};//动感灯uchar codeLED_DATA6[18]={10,40,0xFF,0x00,0xFF,0x00,0xAA,0x00,0x55,0x00, 0x2A,0x00,0x54,0x28,0x00,0x28,0x00,0x10};//特殊爆闪uchar codeLED_DATA7[18]={10,50,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00, 0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};//爆闪/***************************延时子程序start***************************/void delay(unsigned int count){unsigned int i,j;for(j=0;j<120;j++);}/***************************延时子程序end***************************/void led_display(void){uchar i,j;/****************显示模式1**********************/ for(i=0;i<LED_DATA1[0];i++){ for(j=2;j<18;j++){P0=~LED_DATA1[j];delay(LED_DATA1[1]);}}/**********************************************/ /****************显示模式2**********************/ for(i=0;i<LED_DATA2[0];i++){ for(j=2;j<18;j++){P0=~LED_DATA2[j];delay(LED_DATA2[1]);}}/**********************************************/ /****************显示模式3**********************/ for(i=0;i<LED_DATA3[0];i++){P0=~LED_DATA3[j];delay(LED_DATA3[1]);}}/**********************************************/ /****************显示模式4**********************/ for(i=0;i<LED_DATA4[0];i++){ for(j=2;j<18;j++){P0=~LED_DATA4[j];delay(LED_DATA4[1]);}}/**********************************************/ /****************显示模式5**********************/ for(i=0;i<LED_DATA5[0];i++){ for(j=2;j<18;j++){P0=~LED_DATA5[j];delay(LED_DATA5[1]);}}/**********************************************/ /****************显示模式6**********************/for(i=0;i<LED_DATA6[0];i++){ for(j=2;j<18;j++){P0=~LED_DATA6[j];delay(LED_DATA6[1]);}}/**********************************************/ /****************显示模式7**********************/ for(i=0;i<LED_DATA7[0];i++){ for(j=2;j<18;j++){P0=~LED_DATA7[j];delay(LED_DATA7[1]);}}/**********************************************/ }main(){P0=1;//清LEDwhile(1){led_display();//调用LED显示程序}}。
单片机实例之跑马灯
让LED点亮,需要在引脚上输出低电平,就是 在P1.0引脚上输出0,应使用的命令是:
light=0;(汇编:CLR P1.0) 同理,让LED熄灭,应使用的命令是:
light=1; (汇编:SETB P1.0)
4、延时程序的编写
KEIL 软件开发平台
图3-8 新建工程窗口
KEIL 软件开发平台
图3-9 单片机选择窗口
KEIL 软件开发平台
图3-10 目标1属性设置窗口
KEIL 软件开发平台
图3-11 目标1输出窗口设置
KEIL 软件开发平台
图3-13 软件输入窗口
KEIL 软件开发平台
图3-14 目标1添加窗口
KEIL 软件开发平台
图3-15 目标1添加文件窗口
(二) Keil 程序调试 1.程序调试时的常用窗口 编译文件界面
KEIL 软件开发平台
图3-16 编辑文件界面
调试程序窗口
KEIL 软件开发平台
字母C:代码存储空间 D:直接寻址的片内存储空间 I:间接寻址的片内存储空间 X:扩展的外部RAM空间 “数字”:想要查看的地址。
根据前面的分析,实现任务的思路是:程序 开始时,给某一变量赋初始值0xFE,然后每次将 数据左移后送入P1口直到所有循环次数输出完毕, 再次重复整个过程。根据思路得出的程序框图如 图3-29所示。
图3-29 程序流程图
(1)C语言程序:
#include "reg51.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int void mDelay(unsigned int Delay) { unsigned int i;
51单片机C语言程序(二)定时计数器中断
51单片机C语言程序(二)定时/计数器中断程序一利用定时/计数器T0从P1.0输出周期为1s 的方波,让发光二极管以1HZ闪烁,#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit P1_0=P1^0;uchar tt;void main() //主函数{TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0while(1);//等待中断产生}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==20){tt=0;P1_0=~P1_0;}}程序二利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。
#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit P1_0=P1^0;uchar tt,a;void main() //主函数{TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0a=0xfe;while(1);//等待中断产生}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==2){tt=0;a=_crol_(a,1);}}程序三同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔2s依次输出1,10,50,100,200,400,800,1k(hz)的方波#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit beep=P2^3;uchar tt;uint fre,flag;void main() //主函数{fre=50000;TMOD=0x11;//设置定时器0,定时器1为工作方式1TH0=(65536-fre)/256;TL0=(65536-fre)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断ET1=1;TR1=1;TR0=1;//启动定时器0while(1);//等待中断产生}void timer0() interrupt 1 //定时器0中断{TR0=0; //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失TH0=(65536-fre)/256;TL0=(65536-fre)%256;tt++;if(flag<40) //以下几个if分别用来选取不同的频率{tt=0;fre=50000;beep=~beep;}if(flag>=40&&flag<80) {tt=0;fre=50000;beep=~beep;}if(flag>=80&&flag<120) {tt=0;fre=10000;beep=~beep;}if(flag>=120&&flag<160) {tt=0;fre=5000;beep=~beep;}if(flag>=160&&flag<200) {tt=0;fre=2500;beep=~beep;}if(flag>=200&&flag<240) {tt=0;fre=1250;beep=~beep;}if(flag>=240&&flag<280) {tt=0;fre=625;beep=~beep;}if(flag>=280&&flag<320) {tt=0;fre=312;beep=~beep;}if(flag>=320&&flag<360){tt=0;fre=156;beep=~beep;}TR0=1;}void timer1() interrupt 3 //定时器1中断用来产生2秒时间定时{TH1=(65536-50000)/256;TL1=(65536-50000)%256;flag++;if(flag==360){flag=0;fre=50000;}程序四用定时器以间隔500MS在6位数码管上依次显示0、1、2、3....C、D、E、F,重复。
如何用51单片机数码管实现跑马灯功能?
如何用51单片机数码管实现跑马灯功能?51单片机数码管显示跑马灯程序源代码讲解基于51单片机学习板。
用S1键作为控制跑马灯的方向按键,S5键作为控制跑马灯方向的加速度按键,S9键作为控制跑马灯方向的减速度按键,S13键作为控制跑马灯方向的启动或者暂停按键。
记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。
(2)实现功能:跑马灯运行:第1个至第8个LED灯一直不亮。
在第9个至第16个LED灯,依次逐个亮灯并且每次只能亮一个灯。
每按一次独立按键S13键,原来运行的跑马灯会暂停,原来暂停的跑马灯会运行。
用S1来改变方向。
用S5和S9来改变速度,每按一次按键的递增或者递减以10为单位。
数码管显示:本程序只有1个窗口,这个窗口分成3个局部显示。
8,7,6位数码管显示运行状态,启动时显示“on”,停止时显示“oFF”。
5位数码管显示数码管方向,正向显示“n”,反向显示“U”。
4,3,2,1位数码管显示速度。
数值越大速度越慢,最慢的速度是550,最快的速度是50。
(3)源代码讲解如下:#include "REG52.H"#define const_voice_short 40 //蜂鸣器短叫的持续时间#define const_key_time1 20 //按键去抖动延时的时间#define const_key_time2 20 //按键去抖动延时的时间#define const_key_time3 20 //按键去抖动延时的时间#define const_key_time4 20 //按键去抖动延时的时间void initial_myself();void initial_peripheral();void delay_short(unsigned int uiDelayShort);void delay_long(unsigned int uiDelaylong);。
第一篇:51单片机的中断和定时
第一篇:51单片机的中断和定时自学51单片机也有两个星期了,今天第一次写关于51的博客,也是因为感觉定时和中断挺重要的,要记录一下了。
定时器/计数器51的定时器/计数器有2个分别是T1和T0,52系列的单片机有3个定时器/计数器,T0和T1是通用定时器/计数器,定时器/计数器2(简称T2)是集定时、计数和捕获三种功能于一体,功能更强。
首先看一下这个简单点的功能,我在实验中用到的定时器的作用是高精度延时的作用,之前使用的通过while和for循环的延时方法都只是大概的时间,而定时器则可以精确设定时间在1微秒(10^-6)左右(以晶振频率为11.0592MHZ来说),其最大的时间取值为0.071,可见已经可以达到钟表的误差水准了。
定时器/计数器0和1的方式控制寄存器TMOD:T1 T0T1和T0分别代表单片机两个计数器GATE:门控制位。
当门控制位GATE=1时,定时器/计数器的运行受外部引脚输入电平的控制。
其中INT0引脚控制T0,INT1引脚控制T1.当控制引脚为高电平且TR0或TR1置1时,相应的定时器/计数器才被选通。
当门控制位GATE=0时,只要TR0或TR1置1,相应的定时器/计数器就被选通,此时不受外部引脚的控制。
C/T:该位为0的时候,用作定时器,该位为1的时候,用做计数器。
TH1)和一个具有32为分频的低8位计数器中的(TL0或TL1)的低5位(0~4)组合成。
模式1:16位的计数器。
(TH1,TL1)模式2:自动装载8位计数器。
主要应用在串口波特率发生器。
模式3:将16位计数器分成两个独立的8位计数器TL0和TH0.定时器/计数器的工作模式3只适用于 T0.模式0&模式3:几乎不用。
特殊功能寄存器TCONT1 T0 定时中断溢出标志位TF1/TF0:当定时器T1/T0溢出时,硬件自动将TF0/TF1置1,并申请中断。
当进入中断服务程序时,硬件又将自动清零TF1/TF0.启/停控制位TR1/TR0:该位由软件置位和复位。
c51单片机定时器中断的执行过程
c51单片机定时器中断的执行过程
C51单片机定时器中断的执行过程可以分为以下几个步骤:
1. 初始化定时器:首先需要对定时器进行初始化,设置定时器的计数模式、计数值、溢出方式等参数。
这些参数可以通过编程实现,也可以通过硬件电路进行调整。
2. 启动定时器:初始化完成后,需要启动定时器。
启动定时器后,定时器开始按照预设的参数进行计数。
当计数值达到预设的溢出值时,定时器会产生一个溢出信号。
3. 设置中断服务程序:为了在定时器溢出时执行特定的操作,需要设置一个中断服务程序 ISR)。
中断服务程序是一段特殊的代码,它会在定时器溢出时被自动调用。
4. 开启中断:在中断服务程序设置完成后,需要开启相应的中断。
开启中断后,当定时器溢出时,CPU会自动跳转到中断服务程序执行。
5. 执行中断服务程序:当定时器溢出时,CPU会暂停当前任务,跳转到中断服务程序执行。
在中断服务程序中,可以执行一些特定的操作,如更新显示、读取传感器数据等。
6. 返回主程序:中断服务程序执行完成后,CPU会自动返回到主程序继续执行。
这样,通过定时器中断,可以实现对单片机的周期性控制和数据采集等功能。
MCS-51单片机控制跑马灯的三种方法
MCS-51单片机控制跑马灯的三种方法
在MCS一51单片机的控制系统中,它的四个并行8位输入输出端口P0一P3是我们经常使用的。
在并行端口的编程学习中,跑马灯是单片机并行端口输出控制的典型实例。
所谓跑马灯,是指将八个发光二极管分别连接到单片机的某一并行端口的八根线上,通过编程控制这八个发光二极管从低到高或从高到低依次点亮。
图1 跑马灯电路图
如图1所示,将8个发光二极管阴极接到MCS一51单片机P1端口的8根端口线上,阳极通过限流电阻接+5V电源。
要让发光二极管点亮,则对应的端口线应该为低电平(0);而要让其熄灭,对应的端I=I线应该为高电平(1)。
由此,我们假定跑马灯由端I=1的低位向高位轮流点亮.可以得到如下状态:
表1 跑马灯状态表
从表1可以看出,P1端口的状态共有8种,在跑马灯的显示过程中.这8种状态依次出现,循环往复。
而要实现跑马灯的这种显示功能.我们可以采用三种方法:
(1)穷举法;
(2)移位法;
(3)查表法。
下面分别来介绍一下这三种方法。
一、穷举法对于单片机的显示状态来说,它的8种状态是循环显示的。
所谓穷举法。
是指将单片机所有的显示状态全部列举出来。
写在程序的主函数中,通过while(1)的死循环来实现这些状态的循环显示。
程序如下:
#include<reg51.h>//延时函数.延时0.5s
voiddelay()。
51单片机8个跑马灯程序汇编设计思路
51单片机8个跑马灯程序汇编设计思路51单片机8个跑马灯程序汇编设计思路主题:51单片机8个跑马灯程序汇编设计思路引言:在微电子领域中,51单片机是应用最广泛的一种单片机。
它具有性能稳定、开发简单、存储容量大等特点,广泛应用于各种电子设备中。
其中,跑马灯程序是初学者最常接触的一个项目,通过实践该项目,我们可以提高对汇编语言的理解和应用能力。
本文将介绍51单片机8个跑马灯程序汇编设计的思路,以帮助读者更好地掌握该项目。
一、跑马灯程序的基本原理1.1 硬件设计51单片机跑马灯程序的实现需要使用LED灯和适当的电路连接。
我们可以选择使用8个LED灯,分别连接到IO口P0.0~P0.7上。
通过对IO口的控制,即可控制LED灯的亮灭。
1.2 软件设计在51单片机中,我们需要使用汇编语言来编写程序。
跑马灯程序的实现思路是通过对LED灯的逐个依次点亮和熄灭,实现灯光在各个LED之间不断左右滚动的效果。
通过不断循环该过程,即可实现跑马灯效果。
二、跑马灯程序的编写2.1 初始化设置在程序的开始部分,我们需要进行一些初始化设置。
需要设置IO口的工作模式,将所有IO口设置为输出模式。
需要设置定时器和中断相关的参数,以便后续的延迟操作。
2.2 跑马灯效果的实现跑马灯的实现思路可以分为两个部分:向左滚动和向右滚动。
2.2.1 向左滚动向左滚动的实现思路是依次点亮LED灯,然后通过适当的延迟时间熄灭LED灯,实现灯光的滚动效果。
在点亮一个LED灯之后,下一个LED灯便开始点亮。
通过循环该操作,即可实现向左滚动的效果。
2.2.2 向右滚动向右滚动的实现思路与向左滚动类似,只是点亮LED灯的顺序相反。
在点亮一个LED灯之后,上一个LED灯便开始点亮。
通过循环该操作,即可实现向右滚动的效果。
2.3 循环控制为了实现跑马灯的效果,我们需要将向左滚动和向右滚动两个操作循环执行。
通过添加一个计数器变量,当计数器达到一定的值时,切换滚动方向,实现跑马灯效果的循环。
51单片机的音乐跑马灯设计
摘要单片机技术是一门不可或缺的技术,对我们将来的工作以及生活和学习都有很密切的联系。
近年来,随着电子技术和微机计算机的迅速发展,单片机的档次不断提高,其应用领域也在不断的扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到了广泛的应用,成为现代电子系统中最重要的智能化的核心部件。
本设计使用AT89C52芯片,利用P0的8个端口连接8个发光二极管,P1的8个端口连接8个发光二极管,通过P0.0到P0.7的值和P1.0到P1.7的值控制“跑马灯”的亮灭,以达到显示效果。
设计的中断程序要对多个按键动作进行响应,灯光变换的花样有15种,用模式按钮切换。
按下模式按钮键,程序将按十五种模式切换,每按一次模式按钮键,切换一次跑马灯模式,而加速按钮和减速按钮可以改变闪烁速度;最后一种模式为音乐模式,加速按钮可切换音乐。
在单片机运行时,可以在不同状态下让跑马灯显示不同的组合,作为单片机系统正常的指示。
当单片机系统出现故障时,可以利用跑马灯显示当前的故障码,对故障做出诊断。
此外,跑马灯在单片机的调试过程中也非常有用,可以在不同时候将需要的寄存器或关键变量的值显示在跑马灯上,提供需要的调试信息。
关键词:音乐跑马灯;AT89C52单片机;74LS245驱动芯片;LED发光二极管1 设计概述 (1)1.1设计目的 (1)1.2设计作用 (1)1.3设计要求 (1)1.4系统设计框图 (1)2元器件介绍 (3)2.1AT89C52单片机 (3)2.2驱动芯片74LS245 (3)2.3其他元件及功能 (4)3 硬件电路设计 (6)3.1单片机最小系统 (6)3.2LED显示部分 (7)3.3按钮控制部分 (7)3.4数码管显示电路 (8)3.5蜂鸣器部分 (8)3.6系统总电路图 (9)4 软件设计 (10)4.1 程序流程图 (10)4.2 程序设计 (10)5 结束语 (32)参考文献 (33)1 设计概述1.1设计目的利用所学单片机的理论知识进行软硬件整体设计,培养学生分析、解决问题的能力,锻炼学生理论联系实际、综合应用的能力。
单片机课程设计跑马灯的控制
单片机课程设计跑马灯的控制摘要:本设计选择对跑马灯的控制,先构思跑马灯实现预想效果,然后进行分析,根据要求编写程序,选择硬件端口,并进行调试致预想效果,最后浅谈课程设计的经历,以及总结。
目录一)课程设计的目的二)课程设计的要求三)流程图四)原理图五)程序语言六)总结七)参考资料设计题目:试设计一个闪烁跑马灯控制器,该控制器可以控制8个灯顺序亮灭。
当单片机上电后,8个灯依次从左向右亮,并且每个灯亮的时间为1秒钟。
这时,如果按钮K1按下,则灯亮的顺序是从右向左,同样,每个灯亮的时间是1秒钟。
这时,如果按下按钮K2,则此时,4个灯亮4个灯灭,延迟4秒钟以后,又开始从左向右点亮。
最后,若按下按钮K3,则全部灯亮。
此时若想再次点亮灯,必须重新上电。
题目分析:该题目要求控制8盏灯的亮灭,可使用单片机的P1.0到P1.8口来控制。
按钮K1用P3.4口,K2用P3.2口,及外部中断0,K3用P3.3口,及外部中断1,分别来实现。
单片机使用AT89C52,电源使用5V标准电源。
顺序亮灭使用外部中断源构成循环控制语句。
一、课程设计的目的课程设计是本专业集中实践环节的主要内容之一。
训练正确地应用单片机,培养解决工业控制、工业检测等领域具体问题的能力。
学生通过所做课题,熟悉单片机应用系统开发研制的过程,软硬件设计的工作方法、内容及步骤,对学生进行基本技能训练。
例如组成系统、编程、调试、绘图等。
使学生理论联系实际,提高动手能力和分析问题、解决问题的能力。
通过本课程设计,主要达到以下目的:1.使学生增进对单片机的感性认识,加深对单片机理论方面的理解。
2.使学生掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通讯等。
3.使学生了解和掌握单片机应用系统的软/硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。
二、课程设计的要求1.学生需认真阅读课程设计任务书,熟悉有关设计资料及参考资料,熟悉各种设计规范的有关内容,认真完成任务书规定的设计内容。
51单片机的例子LCD的使用和定时器中断
最先接触的单片机是51单片机,那是在去年,刚大一,班上没有人学。
我就先学了,我不是那种喜欢超前学习的人,只是恰好兴趣所在。
由于身边没有学单片机的同学,学的人我也不认识,就自个儿去图书馆找本书,一个人在自习室啃了几个晚上,觉着这东西好这样看着也不是个办法。
当天晚上,我回到寝室就打开电脑,干嘛呢,上淘宝啊。
买了好多东西(现在看来,有好些完全没必要买),等货到了就开干,焊板子,做简单系统……后来认识一电子协会的学长,问了他一些问题,结果被他说了一句“你不想买开发板还想学单片机啊?”。
是啊,一个大一的新生是多么的信任他的学长,至少现在看来是这样的。
本来我觉得单片机没什么神的,还觉得很有趣,被他这么一句,我就“不打自招”承认自己浅薄了(事实上,对于一些人来说学51单片机是有必要买开发板的,但如果热衷于动手,爱单片机的人来说,自己焊板子是一种享受,那之后我买了开发板,到现在还是新的)。
其实吧,耐着性子把单片机的原理的书籍啃啃,看得懂看不懂都没关系,把它学一遍。
然后跟着书中(如果书中没有例子或实验,或者实验少的话,可以找另外的书,要么上网找很方便的)做一些实验,哪里不懂的,再回过头去看书,这一次是有目的的看。
不出两个月的时间,这51单片机入门就差不多了。
可有些人没坚持大两个月,就被吓倒在门外了。
其实当你真正入门之后,你会恍然间发现根本没有所谓的门槛。
好了废话不说了。
下面这是一个很适合初学者做的例子。
也不是说这个例子有多经典,关键,说实话这个例子不难,但涉及到两方面的知识。
一是用DS18B20温度触感器进行温度的采集,在LCD1602上显示出当前的温度。
而是定时器中断,在LCD上模拟一个简单的时钟。
有关DS18B20、LCD1602和中断的内容如果现在不是很清晰的上网一搜一大把。
下面这个程序关键性语句都有注释。
#include <at89x51.h>//C51单片机的头文件#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define LCD P2sbit DQ=P1^4;sbit rs=P1^5;sbit rw=P1^6;sbit en=P1^7;uchar tm[6]={0};uchar t[2];//用两个来存温度的值void delay(uint i){while(i--);}void write_com(uchar cmd){rs=0;rw=0;en=0;P2=cmd;en=1;delay(500);en=0;}void write_date(uchar date){rs=1;rw=0;en=0;P2=date;en=1;delay(100);en=0;}void init(){write_com(0x38);delay(1);write_com(0x0c);delay(1);write_com(0x06);delay(1);write_com(0x01);delay(1);}void init_D(void){uchar x=0;DQ=1; //DQ复位delay(8); //稍做延时DQ=0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ=1; //拉高总线delay(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(20);}uchar readchar(void){uchar i=0;uchar dat=0;for(i=8;i>0;i--){DQ=0; // 给脉冲信号dat>>=1;DQ=1; // 给脉冲信号if(DQ)dat|=0x80;delay(4);}return(dat);}void writechar(uchar dat){uchar i=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;delay(5);DQ=1;dat>>=1;}}void temp(){uchar x;int k=1;init_D();writechar(0xCC); //跳过读序号列号的操作writechar(0x4E); //写入"写暂存器"命令,修改TH和TL和分辩率配置寄存器//先写TH,再写TL,最后写配置寄存器writechar(110); //写入想设定的温度报警上限writechar(-20); //写入想设定的温度报警下限writechar(0x3f); //写配置寄存器,格式为0 R1 R0 1,1 1 1 1//上限温度-22,下限-24,分辨率10位,也就是0.25C//R1R0=00分辨率娄9位,R1R0=11分辨率为12位delay(80); // this message is wery importantinit_D();writechar(0xCC); // 跳过读序号列号的操作writechar(0x44); // 启动温度转换delay(80); // this message is wery importantinit_D();writechar(0xCC); //跳过读序号列号的操作writechar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay(80);t[0]=readchar(); //读取温度值低位t[1]=readchar(); //读取温度值高位write_com(0xcc);if(t[1]>0x07) //判断正负温度{k=0;write_date('-');t[1]=~t[1]; /*下面几句把负数的补码*/t[0]=~t[0]; /* 换算成绝对值*********/t[0]++;if(t[0]>255)t[1]++;}t[1]<<=4;t[1]=t[1]&0x70;x=t[0];x>>=4;x=x&0x0f;t[1]=t[1]|x;if(k==0&&(t[1]==0||t[1]==16||t[1]==32))t[1]+=16;if(k==1)if(t[1]/100!=0)write_date(t[1]/100+0x30);elsewrite_date(0xfe);write_date((t[1]%100)/10+0x30);write_date((t[1]%100)%10+0x30);write_date('C'); write_date(0xfe);}void nowtime(){int i;tm[5]++;tm[4]+=tm[5]/10;tm[3]+=tm[4]/6;tm[2]+=tm[3]/10;tm[1]+=tm[2]/6;tm[0]+=tm[1]/10;tm[5]%=10;tm[4]%=6;tm[3]%=10;tm[2]%=6;tm[1]%=10;if(tm[0]==2)if(tm[1]==4)for(i=0;i<6;i++)tm[i]=0;write_com(0x86);for(i=0;i<6;i++){write_date(tm[i]+0x30);if((i==1)||(i==3))write_date(':');}}void lcdstr(uchar *p){while(*p!='\0'){write_date(*p);p++;}}main(){uchar Now[]="Now:";uchar Tem[]="temperature:";TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0init();init_D();lcdstr(Now);write_com(0xc0);lcdstr(Tem);while(1);}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;nowtime();temp();}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h> //包括一个52标准内核的头文件
sbit P10 = P1^0; //头文件中没有定义的IO就要自e,0xfd,0xfb,0xf7};//预定的写入P1的值
uchar ledi; //用来指示显示顺序
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
RCAP2L =0x00;
TR2=1; //启动定时器
{
t=0;
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
}
}
产品有售淘宝店:
电子开发直销
郑兴电子直销部
诚信科技厂家直销
ET2=1; //打开定时器2中断
EA=1; //打开总中断
while(1) //主程序循环
{
if(ldelay) //发现有时间溢出标记,进入处理
{
ldelay=0; //清除标记
P1=ledp[ledi]; //读出一个值送到P1口
ledi++; //指向下一个
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
}
}
}
//定时器2中断
timer2() interrupt 5
{
static uchar t;
TF2=0;
t++;
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
bit ldelay=0; //长定时溢出标记,预置是0
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
//定时器中断方式的跑马灯
void main(void) // 主程序
汇诚科技厂家直销