13个简单的单片机程序_第1页
13个简单的单片机程序_第2页
13个简单的单片机程序_第3页
13个简单的单片机程序_第4页
13个简单的单片机程序_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精品文档/* *LED 闪烁的简单试验* 连接方法:JP11 ( P2)和JP1 用 8PIN 排线连接起来*/#include <reg51.h>/ 此文件中定义了51 的一些特殊功能寄存器void delay(unsigned int i); /声明延时函数main()P2 = 0x00; / 置 P0口为低电平delay(600); /延时P2 = 0xff; / 置 P0口为高电平delay(600); /延时29欢迎下载 。/* 延时函数*/void delay(unsigned int i)unsigned char j;for(i; i > 0; i-)for(

2、j = 255; j > 0; j-);/* * LED 闪烁的简单试验* 延时实现p2 口LED流水灯效果(用循环移位指令)* 连接方法:JP11 ( P2)和JP1(LED灯 ) 用 8PIN 排线连接起来*/ 此文件中定义了51 的一些特殊功能寄存器*/ #include <reg51.h>#include <intrins.h> void delayms(unsigned char ms)/ 延时子程序unsigned char i;while(ms-)for(i = 0; i < 120; i+); main()unsigned char LED;

3、LED = 0xfe; /0xfe = 1111 1110while(1) P2 = LED;delayms(250);LED = LED << 1; / 循环右移1 位,点亮下一个LED "<<" 为左移位if(LED = 0x00 ) LED = 0xfe; / 0xfe = 1111 1110/* LED点阵实验(流动显示1 2 3 4 5 6 7 8 9)* 说明 通过 P0 和 P2 作为点阵接口* 要求学员掌握LED 点阵的工作原理和各点阵脚的定义及接法,具体接线请参考接线说明* 我们采用的LED点阵式是低功耗,在做实验时可以用单片机脚直

4、接驱动*/#include<reg51.h>unsigned char code tab=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;unsigned char code digittab188=0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00, /00x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00, /10x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00, /20x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00, /30x00,0

5、x00,0x0c,0x14,0x24,0x7f,0x04,0x00, /40x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00, /50x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00, /60x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00, /70x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00, /80x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00, /90x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00, /P0x00,

6、0x00,0x7F,0x48,0x4C,0x73,0x00,0x00, /R0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00, /E0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00, /C0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00, /H0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, /I0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00, /N0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00 / 中;uns

7、igned int timecount;unsigned char cnta;unsigned char cntb;void main(void)TMOD=0x01;TH0=(65536-3000)/256;TL0=(65536-3000)%256;TR0=1;/ 开启定时0ET0=1;EA=1;/ 开启中断cntb=0;while(1) ;/*定时中断*/ void t0(void) interrupt 1 using 0 TH0=(65536-3000)/256; / 定时器高位装载数据TL0=(65536-3000)%256; / 定时器低位装载数据if(cntb<18) / 红色

8、P1=0xFF;P2=tabcnta;P0=digittabcntbcnta;else / 绿色P2=0xFF;P1=tabcnta;P0=digittabcntb-18cnta;if(+cnta>=8) cnta=0; if(+timecount>=333) timecount=0;if(+cntb>=36)cntb=0;/*/*按键状态显示试验/*/* 连接方法:连接JP10( P0)与 JP5(按钮接口)/*JP11 (P2) 与 JP1(LED 接口 )/* 按键则点亮LED灯,8 路指示灯接p0口*/* #include <reg51.h>#includ

9、e <intrins.h> sbit BEEP = P15;sbit RELAY = P14;sbit K1 = P00; sbit K2 = P01;sbit K3 = P02; sbit K4 = P03;sbit K5 = P04; sbit K6 = P05;void beep();/* main()while(1)P2 = 0xff;if(K1=0)P2 = 0xfe;if(K2 = 0)P2 = 0xfd;if(!K3)P2 = 0xfb;if(!K4)P2 = 0xf7;喇叭发声if (!K5 ) beep(); /RELAY = 1;if (!K6 )RELAY =

10、 0; / 通过了反相器void beep()unsigned char i , j;BEEP=!BEEP;/BEEP取反 需要产生方波for (i=0;i<100;i+)for (j = 0 ; j<250 ; j+) / _nop_();BEEP=1;/关闭蜂鸣器/*按键控制程序*连接方法:JP10( P2)与 JP1 ( LED灯)连接,JP11 ( P0) 与 JP5(按键接口)连接开始点亮P1LED按 P01按 P00 LED 向左移一位连续按动按钮LED会不停的左移或右移LED移一位/#include <reg51.h>#include <intrin

11、s.h>unsigned char scan_key();void proc_key(unsigned char key_v);void delayms(unsigned char ms);sbitK1 = P00;/ 对应按钮K1sbitK2 = P01;/ 对应按钮K2main()unsigned char key_s,key_v;key_v = 0x03;P2 = 0xfe;while(1) key_s = scan_key(); if(key_s != key_v) delayms(10);key_s = scan_key(); if(key_s != key_v) key_v

12、= key_s; proc_key(key_v);unsigned char scan_key()unsigned char key_s;key_s = 0x00;key_s |= K2;key_s <<= 1;key_s |= K1;return key_s;void proc_key(unsigned char key_v)if(key_v & 0x01) = 0)P2 = _cror_(P2,1);else if(key_v & 0x02) = 0)P2 = _crol_(P2, 1);/ 延时子程序void delayms(unsigned char ms)

13、unsigned char i;while(ms-)for(i = 0; i < 120; i+);/*二进制加法试验*p2 口 八 个 灯 作 二 进 制 加 法 。 理 解 二 进 值 的 计 算*硬件连接:p2 口 8 路指示灯*;*描述:*;p2 口 八 个 灯 作 二 进 制 加 法 。 理 解 二 进 值 的 计 算*;* 连接方法:JP11( P2) 和 JP1(LED灯 ) 用 8PIN排线连接起来* */声明延时函数#include <reg52.h>void delay(unsigned int i); / main()unsigned char Num

14、= 0xff;while (1)P2 = Num;delay(1000); / 延时函数Num-; void delay(unsigned int i)/*延时函数*/unsigned char j;for(i; i > 0; i-)for(j = 255; j > 0; j-);/* 文件名 C51 音乐程序( 八月桂花) 功能 通过单片机演奏音乐/*/ #include <REG52.H> #include <INTRINS.H>/ 本例采用89C52, 晶振为 11.0592MHZ/ 关于如何编制音乐代码, 其实十分简单, 各位可以看以下代码./ 频率

15、常数即音乐术语中的音调, 而节拍常数即音乐术语中的多少拍/ 所以拿出谱子, 试探编吧!sbit Beep = P15 ;unsigned char n=0; /n 为节拍常数变量unsigned char code music_tab =0x18, 0x30, 0x1C , 0x10, / 格式为 : 频率常数, 节拍常数, 频率常数, 节拍常数,0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20,

16、 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20

17、, 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B,

18、 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C

19、, 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00;void int0() interrupt 1 /采用中断0 控制节拍 TH0=0xd8;TL0=0xef;n-;void delay (unsigned char m) / 控制频率延时unsigned i=3*m;while(-i);void delayms(unsigned char a) / 豪秒延时子程序各位可编译while(-a);/采用while(-a)不要采用while(a-);一下看看汇

20、编结果就知道了!void main() unsigned char p,m; /m 为频率常数变量unsigned char i=0;TMOD&=0x0f;TMOD|=0x01;TH0=0xd8;TL0=0xef;IE=0x82;play:while(1)a: p=music_tabi;if(p=0x00) i=0, delayms(1000);goto play; /延时1 秒 , 回到开始再来一遍else if(p=0xff) i=i+1;delayms(100),TR0=0; goto a; /延时100ms,继续取下一音符else m=music_tabi+, n=music_

21、tabi+; /节拍常数TR0=1;/while(n!=0) Beep=Beep,delay(m);/完成 , 通过 P1 口输出音频( 可多声道哦!)TR0=0;/如果碰到结束符,若碰到休止符,取频率常数和开定时器1等待节拍关定时器1/*(c) Copyright 2004-2006*All Rights Reserved版权所有:朗顿科技*/ #include <reg52.h> sbit buzz = P35;void T0_irq(void) interrupt 1 using 1 TH0 = -(300/256);TL0 =- (300%256);buzz = buzz;

22、 main()TMOD = 0x01;TH0 = -(1000/256);TL0 =- (1000%256);EA = 1;ET0 = 1;TR0 = 1;for(;)/* 描述:跑马灯程序* 连接方法:JP11 ( P2)和JP1(LED灯 ) 用 8PIN 排线连接起来*/#include<reg51.h>#include <intrins.h>/* * 延时子程序*/ void delayms(unsigned char ms) unsigned char i;while(ms-)for(i = 0; i < 120; i+);/*主程序*/ main()u

23、nsigned char LED;LED = 0xfe;P2 = LED;while(1)delayms(250);LED = _crol_(LED,1);/ 循环右移1 位,点亮下一个LED 此函数位库函数P2 = LED;/* 标题 :试验数码管上显示数字( 单片机直接实现位选共阴极 )* 连接方法:P0与 J12 用 8PIN 排线连接P1 与 JP16 用排线连接* 请学员认真消化本例程,用 573 锁存器控制和单片机脚直接位选控制*/#include <reg51.h>#include <intrins.h>void delay(unsigned int i)

24、;/函数声名char DelayCNT;/ 定义变量/ 此表为 LED 的字模 , 共阴数码管0-9 -unsignedcharcode0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; /( 非译码器控制) 数码Disp_Tab段码控制/ 此表为 8 个数码管位选控制, 共阴数码管1-8 个 -unsigned char code dispbit8=0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F; /位选控制查表的方法控制/* 主函数 */main()unsigned int i,LedNumVal=

25、1 ; /变量定义unsigned int LedOut10;/ 变量定义DelayCNT=0;while(1)if(+DelayCNT>=20) DelayCNT=0;+LedNumVal;/控制数字变化速度/20 个扫描周期清零一次/ 每隔 20 个扫描周期加一次LedOut0=Disp_TabLedNumVal%10000/1000;LedOut1=Disp_TabLedNumVal%1000/100|0x80;LedOut2=Disp_TabLedNumVal%100/10;LedOut3=Disp_TabLedNumVal%10;LedOut4=Disp_TabLedNumVa

26、l%10000/1000;/ 千位LedOut5=Disp_TabLedNumVal%1000/100|0x80; /百位带小数点LedOut6=Disp_TabLedNumVal%100/10;/ 十位LedOut7=Disp_TabLedNumVal%10; /个位for( i=0; i<9; i+)P0 = LedOuti;P1 = dispbiti; /使用查表法进行位选/* switch(i)/ 使用 switch 语句控制位选case 0:P1 = 0x7F; break;case 1:P1 = 0xbF; break;case 2:P1 = 0xdF; break;case

27、 3:P1 = 0xeF; break;case 4:P1 = 0xf7; break;case 5:P1 = 0xfb; break;case 6:P1 = 0xfd; break;case 7:P1 = 0xfe; break;*/delay(150);/ 扫描间隔时间太长会数码管会有闪烁感void delay(unsigned int i)char j;for(i; i > 0; i-)for(j = 200; j > 0; j-);/* 标题:试 验 数 码 管 上 如 何 显 示 数 字 (共 阳 极 )* 连接方法:P0 与 JP3 用 8PIN 排线连接* 请学员认真

28、消化本例程,用单片机脚直接控制数码管*/#include <reg51.h>#include <intrins.h>#define NOP() _nop_() /* 定义空指令*/void delay(unsigned int i);/函数声名/ 此表为 LED 的字模unsignedcharcodeLED7Code0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39, 0x5E,0x79,0x71;main() unsigned int LedNumVal=1 ,C ; /定义变量while(

29、1) if (+C>= 300) LedNumVal+ ; / 每隔 300 个扫描周期加一次C =0;/每隔 300个扫描清零为小数点共阴和共阳此/ 将字模送到P0 口显示P0 = LED7CodeLedNumVal%10&0x7f; /LED7 0x7f处也是不一样;delay(150); / 调用延时程序/*延时程序*/ void delay(unsigned int i)char j;for(i; i > 0; i-)for(j = 200; j > 0; j-);/* 标题 :试验数码管上显示数字(译码器位选共阴极)* 连接方法:P0与 J12 用 8PIN

30、 排线连接* 请 学 员 认 真 消 化 本 例 程 , 用 573 锁 存 器 和 译 码 器 控 制 和 数 码 管*/#include <reg51.h>#include <intrins.h>sbit LS138A = P22;sbit LS138B = P23;/sbit LS138C = P24;/ 定义 138 译码器的输入A脚由 P2.2 控制定义138 译码器的输入脚B 由 P2.3 控制函数声名/ 定义138 译码器的输入脚C由 P2.4 控制void delay(unsigned int i);/ char DelayCNT;/ 此表为 LED 的

31、字模 , 共阴数码管0-9 -unsignedcharcodeDisp_Tab0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40;/* 主函数 */ main()unsigned int i,LedNumVal=1 ;unsigned int LedOut10;DelayCNT=0;while(1) / 进入循环状态if(+DelayCNT>=50)DelayCNT=0; / 延时计数每扫描一次加一次+LedNumVal; / 每隔 50 个扫描周期加一次LedOut0=Disp_TabLedNumVal%10000/1000;LedOut1=Disp_TabLedNumVal%1000/100|0x80;LedOut2=Disp_TabLedNumVal%100/10;LedOut3=Disp_TabLedNumVal%10;LedOut4=Disp_TabLedNumVal%10000/1000;/ 千位LedOut5=Disp_TabLedNumVal%1000/100|0x80; /百位带小数点LedOut6=Disp_TabLedNumVal%100/10;/ 十位LedOut7=Disp_TabLedNumVal%10; /个位for( i=0; i<9; i+) /实

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论