《《51单片机C语言应用程序实例精讲》.pdf》由会员分享,可在线阅读,更多相关《《51单片机C语言应用程序实例精讲》.pdf(120页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、/*/*Copyright(c)2004,通信工程学院戴佳*/*All rights reserved.*/*作 者:戴佳 */*/*4 位 8 段数码管分别动态显示“1234”,*/#include 7LEDShow.h void main()DIGPORT=0;/关闭显示 TMOD=0 x01;/T0 工作方式 1 /*2ms 定时设置*/time0_tmp=65536-time0*fosc/12;TH0=(time0_tmp/256);TL0=(time0_tmp%256);TR0=1;ET0=1;EA=1;digbit=0 x01;/从第一位数码管开始 wordbuf3=4;wordb
2、uf2=3;wordbuf1=2;wordbuf0=1;while(1);/*定时器 0 中断服务子程序,定时动态扫描显示*/void time0_int(void)interrupt 1 TH0=(time0_tmp/256);TL0=(time0_tmp%256);display();1/*根据共阴极字型编码表获取 09,AB 字型代码*/uchar getcode(uchar i)uchar p;switch(i)case 0:p=0 x3f;break;/*0*/case 1:p=0 x06;break;/*1*/case 2:p=0 x5B;break;/*2*/case 3:p=0
3、 x4F;break;/*3*/case 4:p=0 x66;break;/*4*/case 5:p=0 x6D;break;/*5*/case 6:p=0 x7D;break;/*6*/case 7:p=0 x07;break;/*7*/case 8:p=0 x7F;break;/*8*/case 9:p=0 x67;break;/*9*/case 10:p=0 x77;break;/*A*/case 11:p=0 x7C;break;/*B*/case 12:p=0 x39;break;/*C*/case 13:p=0 x5E;break;/*D*/case 14:p=0 x79;brea
4、k;/*E*/case 15:p=0 x71;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(wordbufi);/送字型码 DIGPORT=digbit;/送字位码 2 if(digbit0 x08)digbit=digbit*2;else digb
5、it=0 x01;/*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*作 者:戴佳 */*/#ifndef _7LEDSHOW_H /防止 7LEDShow.h 被重复引用#define _7LEDSHOW_H#include /引用标准库的头文件#include#include#include#define uchar unsigned char#define uint unsigned int#define DIGPORT XBYTE0 x0200/定义字位口#define WORDPORT XBYTE0 x0100/定义字型口#de
6、fine fosc 11.0592 /晶振频率#define time0 2000 /定时 2000us uchar digbit;/字位 uchar wordbuf4;/字型码缓冲区 uint idata time0_tmp;/临时变量,用于计算定时 uchar getcode(uchar i);/根据共阴极字型编码表获取字型代码函数 void display(void);/显示函数#endif 3/*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*作 者:戴 佳 */*/#include 8DigitShow.h /*延时 t 毫秒*
7、/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&0 x80;ch=ch1;if(temp)DIN=1;CLK=0;CLK=1;else DIN=0;CLK=0;CLK=1;4/*向 MAX7219 写入字(16 位)*/void WriteWord(uchar addr,uchar num)LOAD=0;_nop_();Se
8、ndChar(addr);_nop_();SendChar(num);_nop_();LOAD=1;/锁存进相应寄存器 /*MAX7219 初始化*/void InitDisplay(void)WriteWord(ScanLimit,ScanDigit);/设置扫描界限 WriteWord(DecodeMode,DecodeDigit);/设置译码模式 WriteWord(Intensity,IntensityGrade);/设置亮度 WriteWord(ShutDown,NormalOperation);/设置为正常工作模式 /*主函数*/void main(void)InitDisplay
9、();/MAX7219 初始化 WriteWord(DisplayTest,TestMode);/开始显示测试,点亮所有 LED delay(3000);/延时约 3s WriteWord(DisplayTest,TextEnd);/退出显示测试模式 while(1)uchar i,j;/*8 个数码管以相同间隔时间 2s 同时变化显示 09 的数字*/for(i=0;i=9;i+)delay(2000);/间隔约 2s InitDisplay();for(j=0;j=7;j+)DisBufferj=i;WriteWord(Digit0,DisBuffer0);WriteWord(Digit1
10、,DisBuffer1);WriteWord(Digit2,DisBuffer2);5 WriteWord(Digit3,DisBuffer3);WriteWord(Digit4,DisBuffer4);WriteWord(Digit5,DisBuffer5);WriteWord(Digit6,DisBuffer6);WriteWord(Digit7,DisBuffer7);/*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*作 者:戴 佳 */*/#ifndef _8DIGITSHOW_H /防止 8DigitShow.h 被重复引用#
11、define _8DIGITSHOW_H#include /引用标准库的头文件#include#define uchar unsigned char#define uint unsigned int sbit DIN=P10;/串行数据输入 sbit CLK=P11;/串行时钟 sbit LOAD=P12;/显示数据锁存控制#define NoOp 0 x00 /空操作寄存器#define Digit0 0 x01 /数码管 1 寄存器#define Digit1 0 x02 /数码管 2 寄存器#define Digit2 0 x03 /数码管 3 寄存器#define Digit3 0 x
12、04 /数码管 4 寄存器#define Digit4 0 x05 /数码管 5 寄存器#define Digit5 0 x06 /数码管 6 寄存器#define Digit6 0 x07 /数码管 7 寄存器#define Digit7 0 x08 /数码管 8 寄存器#define DecodeMode 0 x09 /译码模式寄存器#define Intensity 0 x0a /亮度寄存器#define ScanLimit 0 x0b /扫描位数寄存器#define ShutDown 0 x0c /低功耗模式寄存器#define DisplayTest 0 x0f /显示测试寄存器#d
13、efine ShutdownMode 0 x00 /低功耗方式 6#define NormalOperation 0 x01 /正常操作方式#define ScanDigit 0 x07 /扫描位数设置,显示 8 位数码管#define DecodeDigit 0 xff /译码设置,8 位均为 BCD 码#define IntensityGrade 0 x0a /亮度级别设置#define TestMode 0 x01 /显示测试模式#define TextEnd 0 x00 /显示测试结束,恢复正常工作模式 uchar DisBuffer8=0,0,0,0,0,0,0,0;/显示缓存区#e
14、ndif 7/*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*/*作 者:戴佳 */*/#include lcd_show.h#define uint unsigned int#define uchar unsigned char#define CSA P2_1#define CSB P2_0#define E P2_3#define RW P2_5#define DI P2_6 sbit busy_bit=ACC7;/lcd state byte bit 7 /*下面是对液晶屏 gxm12864d 操作的函数,128x64 点阵,汉字
15、显示,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 到主窗口*/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;8 DI=1;LCD=i;/*清屏 */void lcd_clear(void)uchar
16、 i;uchar page;for(page=0 xb8;page0 xc0;page+)lcd_mwc(page);/*设置显示页面*/lcd_mwc(0 x40);/*设置列地址*/for(i=0;i64;i+)lcd_mwd(0);/初始化 lcd void lcd_init(void)lcd_mwc(0 xc0);lcd_mwc(0 x3f);/dispm_hz_up()display up half of a hanzi in left area void dispm_hz_up(uchar code*hz)uchar i;for(i=0;i16;i+)lcd_mwd(*(hz+i)
17、;/dispm_hz_down()display down half of a hanzi in left area void dispm_hz_down(uchar code*hz)uchar i;for(i=16;i32;i+)lcd_mwd(*(hz+i);9 void main(void)E=1;lcd_clear();lcd_init();lcd_mwc(0 xb8);lcd_mwc(0 x40);dispm_hz_up(&QING);dispm_hz_up(&CHA);dispm_hz_up(&KA);lcd_mwc(0 xb9);lcd_mwc(0 x40);dispm_hz_d
18、own(&QING);dispm_hz_down(&CHA);dispm_hz_down(&KA);/display 请插卡 /*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*/*作 者:戴佳 */*/#ifndef _LCD_SHOW_H /防止 lcd_show.h 被重复引用#define _LCD_SHOW_H#include#include unsigned char code QING32=/*请*/0 x20,0 x22,0 xEC,0 x00,0 x20,0 x22,0 xAA,0 xAA,0 xAA,0 xBF,0 x
19、AA,0 xAA,0 xEB,0 xA2,0 x20,0 x00,0 x00,0 x00,0 x7F,0 x20,0 x10,0 x00,0 xFF,0 x0A,0 x0A,0 x0A,0 x4A,0 x8A,0 x7F,0 x00,0 x00,0 x00 10;unsigned char code CHA32=/*插*/0 x10,0 x10,0 x10,0 xFF,0 x90,0 x24,0 x24,0 xA4,0 x24,0 xFC,0 x22,0 x23,0 x22,0 xB0,0 x20,0 x00,0 x02,0 x42,0 x81,0 x7F,0 x00,0 xFF,0 x49,
20、0 x48,0 x40,0 x7F,0 x40,0 x49,0 x49,0 xFF,0 x01,0 x00;unsigned char code KA32=/*卡*/0 x40,0 x40,0 x40,0 x40,0 x40,0 x40,0 xFF,0 x44,0 x44,0 x44,0 x46,0 x44,0 x40,0 x60,0 x40,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 xFF,0 x00,0 x02,0 x04,0 x0C,0 x18,0 x00,0 x00,0 x00,0 x00;#define LCD XBYTE0 xffff/
21、*LCD 端口*/#endif 11/*/*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=0 xf0;/发全 0 行扫描码 if(P1&0 xf0)!=0 xf0)/若有键按下 delay();/延时去抖动 if(P1&0 xf0)!=0 xf0)/延时后再判断一次,去除抖
22、动影响 scancode=0 xfe;while(scancode&0 x10)!=0)/逐行扫描 P1=scancode;/输出行扫描码 if(P1&0 xf0)!=0 xf0)/本行有键按下 tmpcode=(P1&0 xf0)|0 x0f;/*返回特征字节码,为 1 的位即对应于行和列*/return(scancode)+(tmpcode);else scancode=(scancode1)|0 x01;/行扫描码左移一位 return(0);/无键按下,返回值为 0 /*定时器 0 中断服务子程序,2ms 定时动态扫描显示*/12void time0_int(void)interrup
23、t 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 /计时到 1s TR1=0;/关闭计数器 1 t1count=0;green=1;/绿灯不亮 red=1;/红灯不亮 showflag=1;/打开数码管显示 digbit=0 x0
24、1;/从数码管第 1 位开始动态显示 for(k=0;k6;k+)/显示 888888 wordbufk=8;/*根据共阴极字型编码表获取 09,AB 字型代码*/uchar getcode(uchar i)uchar p;switch(i)case 0:p=0 x3f;break;/*0*/case 1:p=0 x06;break;/*1*/case 2:p=0 x5B;break;/*2*/13 case 3:p=0 x4F;break;/*3*/case 4:p=0 x66;break;/*4*/case 5:p=0 x6D;break;/*5*/case 6:p=0 x7D;break
25、;/*6*/case 7:p=0 x07;break;/*7*/case 8:p=0 x7F;break;/*8*/case 9:p=0 x67;break;/*9*/case 10:p=0 x77;break;/*A*/case 11:p=0 x7C;break;/*B*/case 12:p=0 x39;break;/*C*/case 13:p=0 x5E;break;/*D*/case 14:p=0 x79;break;/*E*/case 15:p=0 x71;break;/*F*/default:break;return(p);/*显示函数*/void display(void)ucha
26、r 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=0 x0;/关闭显示 P0=getcode(wordbufi);/送字型码 P2=digbit;/送字位码 if(digbit0 x20)/共 6 位 digbit=digbit*2;/左移一位 else digbit=0 x01;/*密码比较函数*/14bit pwcmp(void)bit flag;uchar i;f
27、or(i=0;i6;i+)if(pwi=pwbufi)flag=1;else flag=0;i=6;return(flag);/*主程序*/void main()uchar j,key;P2=0 x0;/关闭数码管显示 TMOD=0 x11;/T0,T1 工作方式 1 /*2ms 定时设置*/TH0=-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;/初始没有输入密码,计数器设为 0 enterflag
28、=0;/没有按下确认键 pwflag=0;/密码标志先置为 0 15 green=1;/绿灯不亮 red=1;/红灯不亮 /*假设内定密码为 937602*/pw0=9;pw1=3;pw2=7;pw3=6;pw4=0;pw5=2;digbit=0 x01;/从第一位数码管开始动态扫描 /*刚加电时,显示 888888*/for(j=0;j6;j+)wordbufj=8;showflag=1;/打开数码管显示 while(1)key=keyscan();/调用键盘扫描函数 switch(key)case 0 x11:/1 行 1 列,数字 0 if(count6)wordbufcount=0 x
29、0f;/对应密码位上显示“F”pwbufcount=0;count+;break;case 0 x21:/1 行 2 列,数字 1 if(count6)wordbufcount=0 x0f;/对应密码位上显示“F pwbufcount=1;count+;break;case 0 x41:/1 行 3 列,数字 2 if(count6)wordbufcount=0 x0f;/对应密码位上显示“F 16 pwbufcount=2;count+;break;case 0 x81:/1 行 4 列,数字 3 if(count6)wordbufcount=0 x0f;/对应密码位上显示“F pwbufc
30、ount=3;count+;break;case 0 x12:/2 行 1 列,数字 4 if(count6)wordbufcount=0 x0f;/对应密码位上显示“F pwbufcount=4;count+;break;case 0 x22:/2 行 2 列,数字 5 if(count6)wordbufcount=0 x0f;/对应密码位上显示“F pwbufcount=5;count+;break;case 0 x42:/2 行 3 列,数字 6 if(count6)wordbufcount=0 x0f;/对应密码位上显示“F pwbufcount=6;count+;break;case
31、 0 x82:/2 行 4 列,数字 7 if(count6)wordbufcount=0 x0f;/对应密码位上显示“F pwbufcount=7;count+;break;17 case 0 x14:/3 行 1 列,数字 8 if(count6)wordbufcount=0 x0f;/对应密码位上显示“F pwbufcount=8;count+;break;case 0 x24:/3 行 2 列,数字 9 if(count6)wordbufcount=0 x0f;/对应密码位上显示“F pwbufcount=9;count+;break;case 0 x44:/3 行 3 列,确认键 e
32、nterflag=1;/确认键按下 if(count=6)/只有输入 6 个密码后按确认键才作密码比较 pwflag=pwcmp();else pwflag=0;/否则直接 pmflag 赋 0 break;case 0 x84:/3 行 4 列,取消键 count=0;/密码计数清零 for(j=0;j6;j+)wordbufj=8;/数码管显示 888888 pwbufj=0 x0f;/用 FFFFFF 清除已经输入的密码 break;default:break;if(enterflag=1)/如果按下确认键 enterflag=0;/标志位置回 0 count=0;/密码位计数器清零 f
33、or(j=0;j6;j+)pwbufj=0 x0f;/用 FFFFFF 清除已经输入的密码 showflag=0;/关闭数码管显示 TR1=1;/计数器 1 开始计数 18 t1count=0;/定时器 1 由 50ms 累积到 1s 所用的计数器 if(pwflag=1)green=0;/绿灯亮 else red=0;/红灯亮 /*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*作 者:戴 佳 */*/#ifndef _PWLOCK_H /防止 PWLock.h 被重复引用#define _PWLOCK_H#include#includ
34、e#include#include#define uchar unsigned char#define uint unsigned int uchar digbit;/字位 uchar wordbuf6;/字型码缓冲区 uchar t1count;/定时器 1 由 50ms 累积到 1s 所用的计数器 uchar count;/密码位计数 uchar pw6;/初始密码存储区 uchar pwbuf6;/输入密码存储区 bit enterflag;/确认键按下与否标志 bit pwflag;/密码正确与否标志 bit showflag;/数码管显示与否标志 sbit green=P30;sbi
35、t red=P31;void display(void);/显示函数#endif 19/*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*作 者:戴 佳 */*/#include MusInstru.h /*键消抖延时函数*/void delay(void)uchar i;for(i=300;i0;i-);/*键扫描函数*/uchar getkey(void)uchar scancode,tmpcode;if(P1&0 xf0)=0 xf0)return(0);scancode=0 xfe;while(scancode&0 x10)!=0
36、)/逐行扫描 P1=scancode;/输出行扫描码 if(P1&0 xf0)!=0 xf0)/本行有键按下 tmpcode=(P1&0 xf0)|0 x0f;/*返回特征字节码,为 1 的位即对应于行和列*/return(scancode)+(tmpcode);else scancode=(scancode1)|0 x01;/行扫描码左移一位 /*定时器 0 中断服务子程序*/void time0_int(void)interrupt 1 using 0 /*设置计数初值*/TH0=STH0;TL0=STL0;20 P20=P20;/反相,产生输出脉冲 /*主程序*/void main()u
37、char key,k;TMOD=0 x01;/T0,工作方式 1 ET0=1;EA=1;while(1)P1=0 xf0;/发全 0 行扫描码 if(P1&0 xf0)!=0 xf0)/若有键按下 delay();/延时去抖动 if(P1&0 xf0)!=0 xf0)/延时后再判断一次,去除抖动影响 key=getkey();/调用键盘扫描函数 /根据获取的按键位置得到 k 值 switch(key)case 0 x11:/1 行 1 列 k=0;break;case 0 x21:/1 行 2 列 k=1;break;case 0 x41:/1 行 3 列 k=2;break;case 0 x
38、81:/1 行 4 列 k=3;break;case 0 x12:/2 行 1 列 k=4;break;case 0 x22:/2 行 2 列 k=5;break;21 case 0 x42:/2 行 3 列 k=6;break;case 0 x82:/2 行 4 列 k=7;break;case 0 x14:/3 行 1 列 k=8;break;case 0 x24:/3 行 2 列 k=9;break;case 0 x44:/3 行 3 列 k=10;break;case 0 x84:/3 行 4 列 k=11;break;case 0 x18:/3 行 4 列 k=12;break;ca
39、se 0 x28:/3 行 4 列 k=13;break;case 0 x48:/3 行 4 列 k=14;break;case 0 x88:/3 行 4 列 k=15;break;default:break;P20=P20;/反相 /*根据所得的 k 值设定计数器 1 的计数初值*/STH0=tabk/256;STL0=tabk%256;TR0=1;/开始计数 P1=0 xf0;/发全 0 行扫描码 while(P1&0 xf0)!=0 xf0)/若没有松开按键 22 P1=0 xf0;TR1=0;/若按键松开,则停止计数,不产生脉冲输出 /*/*Copyright(c)2005,通信工程学
40、院 */*All rights reserved.*/*作 者:戴 佳 */*/#ifndef _MUSINSTRU_H /防止 MusInstru.h 被重复引用#define _MUSINSTRU_H#include#include#include#include#define uchar unsigned char#define uint unsigned int /*音符与计数值对应表*/uint code tab=64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65
41、157,65178;sbit P20=P20;/此引脚输出脉冲 uchar STH0;uchar STL0;#endif 23/*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*作 者:戴 佳 */*/#include voice.h /*延时 t 毫秒*/void delay(uint t)uint i;while(t-)/*对于 11.0592M 时钟,约延时 1ms*/for(i=0;i125;i+)/*外部中断 0 服务子程序*/void out_int0()interrupt 0 using 1 EX0=0;/关外部中断 0 P
42、D=1;/进入节电状态 if(count2)/再重播 2 次,共 3 次放音 count+;delay(500);/延时 500ms P2=P2&0 xFC;/A8=A9=0 P0=P0&0 x00;/起始地址为 0 playback();/从地址 0 处播放 EX0=1;/开外部中断 0 else IdleFlag=1;/变为空闲状态,可以再次按开始键 count=0;/*主程序*/24void main()EA=1;/开 CPU 中断 count=0;StartFlag=0;IdleFlag=1;while(IdleFlag=1)if(START)delay(10);/延时去抖动 if(S
43、TART)StartFlag=1;/开始键按下标志 if(StartFlag=1)do P2=P2&0 xFC;/A8=A9=0 P0=P0&0 x00;/起始地址为 0 record();/录音开始,存放在地址 0 处 while(START);/开始键松开 StartFlag=0;PR=1;/结束录音 PD=1;/进入节电状态 delay(500);/延时 500ms 再播放录音 EX0=1;/开外部中断 0 P2=P2&0 xFC;/A8=A9=0 P0=P0&0 x00;/起始地址为 0 playback();/从地址 0 处进行第一次播放 IdleFlag=0;/当前不空闲,按开始键
44、无效 25/*录音函数*/void record(void)CE=0;PD=0;PR=0;/*放音函数*/void playback(void)CE=0;PD=0;PR=1;/*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*作 者:戴 佳 */*/#ifndef _VOICE_H /防止 Voice.h 被重复引用#define _VOICE_H#include /引用标准库的头文件#include#define uchar unsigned char#define uint unsigned int void record(void)
45、;void playback(void);uchar count;/重复播放次数计数器 uchar StartFlag;/开始键按下标志 uchar IdleFlag;/系统是否处于空闲状态标志 /*定义语音芯片 ISD2560 的控制引脚*/sbit START=P10;sbit EOM=P14;sbit PR=P15;sbit PD=P16;26sbit CE=P17;#endif 27/*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*作 者:戴 佳 */*/#include ParallelADC.h main()EA=1;EX0
46、=1;/打开外部中断 0 /*无限循环,等待外部中断 0 启动模数转换*/while(1);/*外部中断 0 服务子程序*/void int0svr(void)interrupt 0 using 1 EX0=0;/关闭外部中断 0 /*向 MAX197 的控制字寄存器写入控制字 0 x40;PD1=0,PD0=1:正常工作,内部时钟模式;ACQMOD=0:内部控制采集;RNG=0,BIP=0:05V 测量范围;A2=A1=A0=0:测量通道为 0 号*/adch0=0 x40;/*查询 MAX197 的中断输出 ADINT,检测是否完成了信号的一次模数转换*/while(ADINT!=0)/当
47、转换完成时,先设置 HBEN0,即先读低位 HBEN=0;CH0DataL=adch0;/设置 HBEN1,再读高位 HBEN=1;CH0DataH=adch0;HBEN=0;EX0=1;/打开外部中断 0 28/*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*作 者:戴 佳 */*/#ifndef _PARALLELADC_H /防止 ParallelADC.h 被重复引用#define _PARALLELADC_H#include /引用标准库的头文件#include#define uchar unsigned char uchar
48、 CH0DataL,CH0DataH;/*MAX197 片外地址定义*/#define adch0 XBYTE0 x0100 sbit ADINT=P10;/MAX197 的中断输出位 sbit HBEN=P11;/MAX197 数据总线复用控制#endif 29/*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*作 者:戴 佳 */*/#include SerialADC.h /*外部中断 0 服务子程序*/void int0svr(void)interrupt 0 using 1 uchar count,tmp,i;EX0=0;/关闭
49、外部中断 0 tmp=0;CS=1;/CS 置高,片选无效 IOCLK=0;/I/O CLK 置低 CS=0;/片选有效 _nop_();/执行一步空指令起到延时至少 1.4us 的作用 for(count=0;count8;count+)IOCLK=1;/I/O CLOCK 置高 if(DATAOUT)tmp+;tmp=tmp1;/左移一位 IOCLK=0;/I/O CLOCK 置低 CS=1;/CS 置高,片选无效 DataResult=tmp;for(i=0;i3;i+)/适当延时超过 17us _nop_();EX0=1;/打开外部中断 0 void main()EA=1;30 EX0
50、=1;/打开外部中断 0 /*无限循环,等待外部中断 0 启动模数转换*/while(1);/*/*Copyright(c)2005,通信工程学院 */*All rights reserved.*/*作 者:戴 佳 */*/#ifndef _SERIALADC_H /防止 SerialADC.h 被重复引用#define _SERIALADC_H#include /引用标准库的头文件#include#define uchar unsigned char uchar DataResult;/存放转换后数据 sbit IOCLK=P10;/输入输出时钟 I/O CLK sbit DATAOUT=P