51单片机C语言应用程序实例精讲_第1页
51单片机C语言应用程序实例精讲_第2页
51单片机C语言应用程序实例精讲_第3页
51单片机C语言应用程序实例精讲_第4页
51单片机C语言应用程序实例精讲_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

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

文档简介

1、/*/* Copyright (c) 2004, 通信工程学院戴佳 */* All rights reserved. */* 作 者:戴佳 */*/* 4位8段数码管分别动态显示“1234”, */#include 7LEDShow.hvoid main()DIGPORT = 0;/ 关闭显示TMOD = 0x01;/ T0工作方式1/* 2ms 定时设置 */time0_tmp = 65536-time0*fosc/12;TH0 = (time0_tmp/256);TL0 = (time0_tmp%256);TR0 = 1;ET0 = 1;EA = 1;digbit = 0x01;/ 从第一

2、位数码管开始wordbuf3 = 4;wordbuf2 = 3;wordbuf1 = 2;wordbuf0 = 1;while(1); /* 定时器0中断服务子程序,定时动态扫描显示 */void time0_int(void) interrupt 1TH0 = (time0_tmp/256);TL0 = (time0_tmp%256);display();/* 根据共阴极字型编码表获取09,AB字型代码 */uchar getcode(uchar i)uchar p;switch (i)case 0: p=0x3f;break;/* 0 */case 1: p=0x06;break;/* 1

3、 */case 2: p=0x5B;break;/* 2 */case 3: p=0x4F;break;/* 3 */case 4: p=0x66;break;/* 4 */case 5: p=0x6D;break;/* 5 */case 6: p=0x7D;break;/* 6 */case 7: p=0x07;break;/* 7 */case 8: p=0x7F;break;/* 8 */case 9: p=0x67;break;/* 9 */case 10: p=0x77;break;/* A */case 11: p=0x7C;break;/* B */case 12: p=0x39

4、;break;/* C */case 13: p=0x5E;break;/* D */case 14: p=0x79;break;/* E */case 15: p=0x71;break;/* F */default: break;return(p);/* 显示函数 */void display(void)uchar i;switch (digbit)case 1:i=0;break;case 2:i=1;break;case 4:i=2;break;case 8:i=3;break;default: break;DIGPORT = 0;/ 关闭显示WORDPORT = getcode(wor

5、dbufi);/ 送字型码DIGPORT = digbit;/ 送字位码if (digbit0x08)digbit = digbit*2;else digbit = 0x01;/*/* Copyright (c) 2005, 通信工程学院 */* All rights reserved. */* 作 者:戴佳 */*/#ifndef_7LEDSHOW_H / 防止7LEDShow.h被重复引用#define_7LEDSHOW_H#include / 引用标准库的头文件#include #include #include #define uchar unsigned char #define u

6、int unsigned int #define DIGPORT XBYTE0x0200/ 定义字位口#define WORDPORT XBYTE0x0100/ 定义字型口#define fosc11.0592/ 晶振频率 #define time02000/ 定时2000usuchar digbit;/ 字位uchar wordbuf4;/ 字型码缓冲区uint idata time0_tmp; / 临时变量,用于计算定时uchar getcode(uchar i);/ 根据共阴极字型编码表获取字型代码函数void display(void);/ 显示函数#endif/*/* Copyrig

7、ht (c) 2005, 通信工程学院 */* All rights reserved. */* 作 者:戴 佳 */*/#include 8DigitShow.h/* 延时t毫秒 */void delay(uint t)uint i;while(t-)/* 对于12M时钟,约延时1ms */for (i=0;i125;i+)/* 向MAX7219写入字节(8位)*/void SendChar (uchar ch)uchar i,temp; _nop_(); for (i=0;i8;i+) temp=ch&0x80; ch=ch1; if(temp) DIN=1; CLK=0; CLK=1;

8、else DIN=0; CLK=0; CLK=1; /* 向MAX7219写入字(16位)*/void WriteWord (uchar addr,uchar num) LOAD=0; _nop_(); SendChar(addr); _nop_(); SendChar(num); _nop_(); LOAD=1;/ 锁存进相应寄存器/* MAX7219初始化 */void InitDisplay (void) WriteWord (ScanLimit,ScanDigit); / 设置扫描界限 WriteWord (DecodeMode,DecodeDigit); / 设置译码模式 Write

9、Word (Intensity,IntensityGrade); / 设置亮度 WriteWord (ShutDown,NormalOperation); / 设置为正常工作模式/* 主函数 */void main(void) InitDisplay ();/ MAX7219初始化 WriteWord(DisplayTest,TestMode);/ 开始显示测试,点亮所有LED delay(3000); / 延时约3s WriteWord (DisplayTest,TextEnd);/ 退出显示测试模式 while(1) uchar i,j;/* 8个数码管以相同间隔时间2s同时变化显示09的

10、数字 */ for (i=0;i=9;i+) delay(2000);/ 间隔约2s InitDisplay();for (j=0;j=7;j+) DisBufferj=i; WriteWord (Digit0,DisBuffer0); WriteWord (Digit1,DisBuffer1); WriteWord (Digit2,DisBuffer2); WriteWord (Digit3,DisBuffer3); WriteWord (Digit4,DisBuffer4); WriteWord (Digit5,DisBuffer5); WriteWord (Digit6,DisBuffe

11、r6); WriteWord (Digit7,DisBuffer7); /*/* Copyright (c) 2005, 通信工程学院 */* All rights reserved. */* 作 者:戴 佳 */*/#ifndef_8DIGITSHOW_H / 防止8DigitShow.h被重复引用#define_8DIGITSHOW_H#include / 引用标准库的头文件#include #define uchar unsigned char #define uint unsigned int sbit DIN = P10;/ 串行数据输入sbit CLK = P11;/ 串行时钟sb

12、it LOAD = P12;/ 显示数据锁存控制#define NoOp 0x00 / 空操作寄存器#define Digit0 0x01 / 数码管1寄存器#define Digit1 0x02 / 数码管2寄存器#define Digit2 0x03 / 数码管3寄存器#define Digit3 0x04 / 数码管4寄存器#define Digit4 0x05 / 数码管5寄存器#define Digit5 0x06 / 数码管6寄存器#define Digit6 0x07 / 数码管7寄存器#define Digit7 0x08 / 数码管8寄存器#define DecodeMode

13、 0x09 / 译码模式寄存器#define Intensity 0x0a / 亮度寄存器#define ScanLimit 0x0b / 扫描位数寄存器#define ShutDown 0x0c / 低功耗模式寄存器#define DisplayTest 0x0f / 显示测试寄存器#define ShutdownMode 0x00 / 低功耗方式#define NormalOperation 0x01 / 正常操作方式#define ScanDigit 0x07 / 扫描位数设置,显示8位数码管#define DecodeDigit 0xff / 译码设置,8位均为BCD码#define

14、IntensityGrade 0x0a / 亮度级别设置#define TestMode 0x01 / 显示测试模式#define TextEnd 0x00 / 显示测试结束,恢复正常工作模式uchar DisBuffer8=0,0,0,0,0,0,0,0; / 显示缓存区#endif/*/* Copyright (c) 2005, 通信工程学院 */* All rights reserved. */* /* 作 者:戴佳 */*/#include lcd_show.h#define uint unsigned int#define uchar unsigned char#define CSA

15、 P2_1#define CSB P2_0#define E P2_3#define RW P2_5#define DI P2_6sbit busy_bit=ACC7;/lcd state byte bit 7/*下面是对液晶屏gxm12864d操作的函数, 128x64点阵,汉字显示,CSA,CSB用来进行左右显示区的选择。*/* 发命令i到主窗口*/void lcd_mwc(uchar i) CSA=1; CSB=0; RW=1; DI=0; do ACC=LCD; while (busy_bit) ;/wait for lcd not busy RW=0; LCD=i;/* 写数据i到主

16、窗口*/void lcd_mwd(uchar i) CSA=1; CSB=0; RW=1; DI=0; do ACC=LCD; while (busy_bit);/wait for lcd not busy RW=0; DI=1; LCD=i;/* 清屏 */void lcd_clear(void) uchar i; uchar page; for (page=0xb8;page0xc0;page+) lcd_mwc(page); /*设置显示页面*/ lcd_mwc(0x40); /*设置列地址*/ for (i=0;i64;i+) lcd_mwd(0); /初始化lcdvoid lcd_i

17、nit(void)lcd_mwc(0xc0);lcd_mwc(0x3f);/dispm_hz_up() display up half of a hanzi in left areavoid dispm_hz_up(uchar code * hz)uchar i;for (i=0;i16;i+) lcd_mwd(*(hz+i);/dispm_hz_down() display down half of a hanzi in left areavoid dispm_hz_down(uchar code * hz)uchar i;for (i=16;i32;i+) lcd_mwd(*(hz+i);

18、void main(void)E=1;lcd_clear();lcd_init();lcd_mwc(0xb8);lcd_mwc(0x40);dispm_hz_up(&QING);dispm_hz_up(&CHA);dispm_hz_up(&KA);lcd_mwc(0xb9);lcd_mwc(0x40);dispm_hz_down(&QING);dispm_hz_down(&CHA);dispm_hz_down(&KA);/display 请插卡/*/* Copyright (c) 2005, 通信工程学院 */* All rights reserved. */* /* 作 者:戴佳 */*/#

19、ifndef_LCD_SHOW_H / 防止lcd_show.h被重复引用#define_LCD_SHOW_H#include #include unsigned char code QING32=/* 请 */0x20,0x22,0xEC,0x00,0x20,0x22,0xAA,0xAA,0xAA,0xBF,0xAA,0xAA,0xEB,0xA2,0x20,0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0xFF,0x0A,0x0A,0x0A,0x4A,0x8A,0x7F,0x00,0x00,0x00;unsigned char code CHA32=/* 插 */0x

20、10,0x10,0x10,0xFF,0x90,0x24,0x24,0xA4,0x24,0xFC,0x22,0x23,0x22,0xB0,0x20,0x00,0x02,0x42,0x81,0x7F,0x00,0xFF,0x49,0x48,0x40,0x7F,0x40,0x49,0x49,0xFF,0x01,0x00;unsigned char code KA32=/* 卡 */0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x44,0x44,0x44,0x46,0x44,0x40,0x60,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0

21、xFF,0x00,0x02,0x04,0x0C,0x18,0x00,0x00,0x00,0x00;#define LCD XBYTE0xffff /* LCD端口 */#endif/*/* Copyright (c) 2005, 通信工程学院 */* All rights reserved. */* 作 者:戴 佳 */*/#include PWLock.h/* 键消抖延时函数 */void delay(void)uchar i;for (i=300;i0;i-);/* 键扫描函数 */uchar keyscan(void)uchar scancode,tmpcode;P1 = 0xf0; /

22、 发全0行扫描码if (P1&0xf0)!=0xf0)/ 若有键按下delay();/ 延时去抖动if (P1&0xf0)!=0xf0)/ 延时后再判断一次,去除抖动影响scancode = 0xfe;while(scancode&0x10)!=0)/ 逐行扫描P1 = scancode;/ 输出行扫描码if (P1&0xf0)!=0xf0)/ 本行有键按下tmpcode = (P1&0xf0)|0x0f;/* 返回特征字节码,为1的位即对应于行和列 */return(scancode)+(tmpcode);else scancode = (scancode1)|0x01;/ 行扫描码左移一位

23、return(0);/ 无键按下,返回值为0 /* 定时器0中断服务子程序,2ms定时动态扫描显示 */void time0_int(void) interrupt 1 /* 重置2ms定时 */TH0 = -2000/256;TL0 = -2000%256;if (showflag=1)display();/ 调用显示函数/* 定时器1中断服务子程序,50ms*/void time1_int(void) interrupt 3 uchar k;/* 重置50ms定时 */TH1 = -50000/256;TL1 = -50000%256;if (t1count20)t1count+;else

24、/ 计时到1sTR1 = 0;/ 关闭计数器1t1count = 0;green = 1;/ 绿灯不亮red = 1;/ 红灯不亮showflag = 1;/ 打开数码管显示digbit = 0x01;/ 从数码管第1位开始动态显示for (k=0;k6;k+)/ 显示888888wordbufk = 8;/* 根据共阴极字型编码表获取09,AB字型代码 */uchar getcode(uchar i)uchar p;switch (i)case 0: p=0x3f;break;/* 0 */case 1: p=0x06;break;/* 1 */case 2: p=0x5B;break;/*

25、 2 */case 3: p=0x4F;break;/* 3 */case 4: p=0x66;break;/* 4 */case 5: p=0x6D;break;/* 5 */case 6: p=0x7D;break;/* 6 */case 7: p=0x07;break;/* 7 */case 8: p=0x7F;break;/* 8 */case 9: p=0x67;break;/* 9 */case 10: p=0x77;break;/* A */case 11: p=0x7C;break;/* B */case 12: p=0x39;break;/* C */case 13: p=0

26、x5E;break;/* D */case 14: p=0x79;break;/* E */case 15: p=0x71;break;/* F */default: break;return(p);/* 显示函数 */void display(void)uchar i;switch (digbit)case 1:i=0;break;case 2:i=1;break;case 4:i=2;break;case 8:i=3;break;case 16:i=4;break;case 32:i=5;break;default: break;P2 = 0x0;/ 关闭显示P0 = getcode(wo

27、rdbufi);/ 送字型码P2 = digbit;/ 送字位码if (digbit0x20)/ 共6位digbit = digbit*2;/ 左移一位else digbit = 0x01;/* 密码比较函数 */bit pwcmp(void)bit flag;uchar i;for (i=0;i6;i+)if (pwi=pwbufi)flag = 1;elseflag = 0;i = 6;return(flag);/* 主程序 */void main()uchar j,key;P2 = 0x0;/ 关闭数码管显示TMOD = 0x11;/ T0,T1工作方式1/* 2ms 定时设置 */TH

28、0 = -2000/256;TL0 = 2000%256;/* 50ms 定时设置 */TH1 = -50000/256;TL1 = -50000%256;/* 启动计数器0,关闭计数器1 */TR0 = 1;ET0 = 1;TR1 = 0;ET1 = 1;EA = 1;count = 0;/ 初始没有输入密码,计数器设为0enterflag = 0;/ 没有按下确认键pwflag = 0;/ 密码标志先置为0 green = 1;/ 绿灯不亮red = 1;/ 红灯不亮/* 假设内定密码为937602 */pw0 = 9;pw1 = 3;pw2 = 7;pw3 = 6;pw4 = 0;pw5

29、 = 2;digbit = 0x01;/ 从第一位数码管开始动态扫描/* 刚加电时,显示888888 */for (j=0;j6;j+)wordbufj = 8;showflag = 1;/ 打开数码管显示 while(1) key = keyscan();/ 调用键盘扫描函数switch(key) case 0x11:/ 1行1列,数字0if (count6)wordbufcount = 0x0f;/ 对应密码位上显示“F”pwbufcount = 0;count+;break;case 0x21:/ 1行2列,数字1if (count6)wordbufcount = 0x0f;/ 对应密码

30、位上显示“Fpwbufcount = 1;count+;break;case 0x41:/ 1行3列,数字2if (count6)wordbufcount = 0x0f;/ 对应密码位上显示“Fpwbufcount = 2;count+;break; case 0x81:/ 1行4列,数字3if (count6)wordbufcount = 0x0f;/ 对应密码位上显示“Fpwbufcount = 3;count+;break;case 0x12:/ 2行1列,数字4if (count6)wordbufcount = 0x0f;/ 对应密码位上显示“Fpwbufcount = 4;count

31、+;break;case 0x22:/ 2行2列,数字5if (count6)wordbufcount = 0x0f;/ 对应密码位上显示“Fpwbufcount = 5;count+;break;case 0x42:/ 2行3列,数字6if (count6)wordbufcount = 0x0f;/ 对应密码位上显示“Fpwbufcount = 6;count+;break;case 0x82:/ 2行4列,数字7if (count6)wordbufcount = 0x0f;/ 对应密码位上显示“Fpwbufcount = 7;count+;break;case 0x14:/ 3行1列,数字

32、8if (count6)wordbufcount = 0x0f;/ 对应密码位上显示“Fpwbufcount = 8;count+;break;case 0x24:/ 3行2列,数字9if (count6)wordbufcount = 0x0f;/ 对应密码位上显示“Fpwbufcount = 9;count+;break;case 0x44:/ 3行3列,确认键enterflag = 1;/ 确认键按下if (count=6) / 只有输入6个密码后按确认键才作密码比较pwflag = pwcmp();elsepwflag = 0;/ 否则直接pmflag赋0break;case 0x84:

33、/ 3行4列,取消键count = 0;/ 密码计数清零for (j=0;j6;j+)wordbufj = 8;/ 数码管显示888888pwbufj = 0x0f;/ 用FFFFFF清除已经输入的密码break;default:break;if (enterflag=1)/ 如果按下确认键enterflag = 0; / 标志位置回0count = 0;/ 密码位计数器清零for (j=0;j6;j+)pwbufj = 0x0f;/ 用FFFFFF清除已经输入的密码showflag = 0;/ 关闭数码管显示TR1 = 1;/ 计数器1开始计数t1count = 0;/ 定时器1由50ms累

34、积到1s所用的计数器if (pwflag=1)green = 0; / 绿灯亮elsered = 0; / 红灯亮 /*/* Copyright (c) 2005, 通信工程学院 */* All rights reserved. */* 作 者:戴 佳 */*/#ifndef_PWLOCK_H / 防止PWLock.h被重复引用#define_PWLOCK_H#include #include #include #include #define uchar unsigned char#define uint unsigned intuchar digbit;/ 字位uchar wordbuf6

35、;/ 字型码缓冲区uchar t1count;/ 定时器1由50ms累积到1s所用的计数器uchar count;/ 密码位计数uchar pw6;/ 初始密码存储区uchar pwbuf6;/ 输入密码存储区bit enterflag;/ 确认键按下与否标志bit pwflag;/ 密码正确与否标志bit showflag;/ 数码管显示与否标志sbit green=P30;sbit red=P31;void display(void);/ 显示函数#endif/*/* Copyright (c) 2005, 通信工程学院 */* All rights reserved. */* 作 者:戴

36、 佳 */*/#include MusInstru.h/* 键消抖延时函数 */void delay(void)uchar i;for (i=300;i0;i-);/* 键扫描函数 */uchar getkey(void)uchar scancode,tmpcode;if (P1&0xf0)=0xf0)return(0);scancode = 0xfe;while(scancode&0x10)!=0)/ 逐行扫描P1 = scancode;/ 输出行扫描码if (P1&0xf0)!=0xf0)/ 本行有键按下tmpcode = (P1&0xf0)|0x0f;/* 返回特征字节码,为1的位即对应

37、于行和列 */return(scancode)+(tmpcode);else scancode = (scancode1)|0x01;/ 行扫描码左移一位/* 定时器0中断服务子程序 */void time0_int(void) interrupt 1 using 0/* 设置计数初值 */ TH0 = STH0; TL0 = STL0; P20=P20; / 反相,产生输出脉冲/* 主程序 */void main()uchar key,k;TMOD = 0x01;/ T0,工作方式1ET0 = 1;EA = 1; while(1) P1 = 0xf0; / 发全0行扫描码if (P1&0xf

38、0)!=0xf0)/ 若有键按下delay();/ 延时去抖动if (P1&0xf0)!=0xf0)/ 延时后再判断一次,去除抖动影响key = getkey();/ 调用键盘扫描函数/ 根据获取的按键位置得到k值switch(key) case 0x11:/ 1行1列k = 0;break;case 0x21:/ 1行2列k = 1;break;case 0x41:/ 1行3列k = 2;break; case 0x81:/ 1行4列k = 3;break;case 0x12:/ 2行1列k = 4;break;case 0x22:/ 2行2列k = 5;break;case 0x42:/ 2行3列k = 6;break;case 0x82:/ 2行4列k = 7;break;case 0x14:/ 3行1列k = 8;break;c

温馨提示

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

评论

0/150

提交评论