《试验报告.doc》由会员分享,可在线阅读,更多相关《试验报告.doc(46页珍藏版)》请在三一办公上搜索。
1、 专业: 电科101 姓名: 李静 试验一 LED闪烁的简单试验试验目的:1、了解单片机C程序的基本结构2、了解单片机C程序的设计和调试方法3、掌握顺序控制程序的简单编程实验原理: p2口的八个端口分别对应控制8个LED灯,当对应端口 为低电平时,灯亮;否则灯灭。试验程序:#include /此文件中定义了51的一些特殊功能寄存器void delay(unsigned int i); /声明延时函数main() P2 = 0x00; /置P0口为低电平 点亮P2口8个LED灯 delay(600); / 调用延时程序 等待一段时间后熄灭 P2 = 0xff; /置P0口为高电平 熄灭P2口8个
2、LED灯 delay(600); / 调用延时程序/*延时函数*/void delay(unsigned int i) unsigned char j; for(i; i 0; i-) /循环600*255次 机器在这里执行需要一段时间 也就达到了延时效果 for(j = 255; j 0; j-);试验二按键控制LED灯的亮灭试验目的: 1实现按键对LED的控制,及实现不同的功能,让按键更加多功能 ,熟练掌握按键功能。 2掌握顺序控制程序的简单编程试验原理: 按键则点亮LED灯,8路指示灯接p0口。通过控制按键来控制LED灯的亮灭,按下按键灯亮,反之灯灭。试验程序:#include /51的
3、端口和各特殊寄存器定义在此文件中 此包含比不可少sbit LED = P20; /定义LED在P2.0脚上sbit K1 = P00; /定义按钮在P0.0脚上main() if(!K1) LED = 0; /当按键按下对应单片机脚变低电平 LED变低灯亮 else LED = 1; /当松开键按对应单片机脚变高电平 LED变高灯灭试验报告三按键控制程序试验目的: 按键控制程序试验原理: P2 与 JP1 (LED灯)连接, P0与 JP5(按键接口)连接 开始点亮P1LED,按P01 LED向右移一位,按P00LED向左移一位,连续 按动按钮LED会不停的左移或右移试验程序: #includ
4、e #include 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 = k
5、ey_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)/ 延时子程序unsigned char i;whil
6、e(ms-)for(i = 0; i 120; i+); 试验报告四蜂鸣器简单发声试验目的: 1、学习8031内部端口的使用和编程方法。 2、进一步掌握顺序处理程序的编程方法。试验原理: p1.5接峰鸣器,按键接p0.0脚,利用按键控制峰鸣 器 发声。按下按键时,蜂鸣器发出声音。 试验程序: #include /51的端口和各特殊寄存器定义在此文件中 此包含比不可少sbit BEEP = P15; /定义蜂鸣器接、在P1.5脚上sbit K1 = P00; /定义按钮在P0.0脚上main() if(!K1) BEEP = 0; /当按键按下对应单片机脚变低电平 BEEP发声 else BEE
7、P = 1; /当松开键按对应单片机脚变高电平 BEE试验报告五继电器实验试验目的: 1学习8031内部继电器的使用方法。 2 学习驱动芯片处理程序的编程方法。试验原理: JP11(P2)与JP5(按钮接口) ,按下P2.7 继电器P1.4动作, 通过74HC14控制ULN2003 驱动芯片驱动继电器 *试验程序:#include /51的端口和各特殊寄存器定义在此文件中sbit RELAY = P14; /定义继电器对应单片机管脚sbit K1 = P27; /定义按钮对应单片机管脚main() if (!K1) RELAY = 0; /按钮按下 开启继电器 else RELAY = 1;
8、/按钮松开 关闭继电器试验报告六138译码器试验目的: 1. 了解138译码器工作原理 2. 学会用C语言对138译码器简单的编程控制 试验原理: 利用译码器输入端A 在 P2.2 管脚上,输入端B接P2.3, 输入端C接P2.4,来控制LED灯的亮灭试验程序:#include sbit HC138A = P22; /定义译码器输入端A 在 P2.2 管脚上sbit HC138B = P23; /定义译码器输入端B 在 P2.3 管脚上sbit HC138C = P24; /定义译码器输入端C 在 P2.4 管脚上void delay(unsigned int i) unsigned char
9、 j; for(i; i 0; i-) for(j = 255; j 0; j-);main()/ 点亮第一个LED灯HC138C = 0; HC138B = 0; HC138A = 0; delay(1500); /延时/ 点亮第二个LED灯HC138C = 0; HC138B = 0; HC138A = 1;delay(1500); /延时/ 点亮第三个LED灯HC138C = 0; HC138B = 1; HC138A = 0;delay(1500);/ 点亮第四个LED灯HC138C = 0; HC138B = 1; HC138A = 1;delay(2000);/ 点亮第五个LED灯
10、HC138C = 1; HC138B = 0; HC138A = 0;delay(1500);/ 点亮第六个LED灯HC138C = 1; HC138B = 0; HC138A = 1;delay(1500);HC138C = 1; HC138B = 1; HC138A = 0;delay(1500);HC138C = 1; HC138B = 1; HC138A = 1;delay(1500); 试验报告七试验目的:用单片机脚直接控制数码管试验原理:P0 与JP3 用8PIN排线连接,试验程序:#include #include #define NOP() _nop_() /* 定义空指令 *
11、/void delay(unsigned int i); /函数声名/ 此表为 LED 的字模 unsigned char code LED7Code = 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71;main() unsigned int LedNumVal=1 ,C ; /定义变量 while(1) if (+C= 300) LedNumVal+ ; /每隔300个扫描周期加一次 C =0; /每隔300个扫描清零 / 将字模送到P0口显示 P0 = LED7CodeLedNu
12、mVal%10&0x7f; /LED7 0x7f为小数点 共阴和共阳此处也是不一样; delay(150); /调用延时程序 试验报告八试验数码管上显示数字试验目的: 1单片机直接实现位选 共阴极2掌握数码管的位选,段选。 试验原理: 利用单片机的端口直接控制数码管,实现数字显示试验程序:#include #include void delay(unsigned int i); /函数声名char DelayCNT;/定义变量 /此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab = 0x3f,0x06,0x5b,0x4f,0x66,0x6
13、d,0x7d,0x07,0x7f,0x6f,0x40; /段码控制/此表为8个数码管位选控制, 共阴数码管 1-8个 - unsigned char code dispbit8=0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F; /位选控制 查表的方法控制/*主函数*/ main() unsigned int i,LedNumVal=1 ; /变量定义 unsigned int LedOut10; /变量定义 DelayCNT=0; while(1) if(+DelayCNT=20) /控制数字变化速度 DelayCNT=0; /20个扫描周期清零一次 +LedN
14、umVal; /每隔20个扫描周期加一次 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
15、=Disp_TabLedNumVal%10; /个位 for( i=0; i 0; i-) for(j = 200; j 0; j-); 试验报告九 试验数码管上显示数字试验目的: 培养运用单片机进行综合控制的能力和技巧试验原理: 译码器位选 共阴极,P0与J12 用8PIN排线连接试验程序:#include #include sbit LS138A = P22; /定义138译码器的输入A脚由P2.2控制 sbit LS138B = P23; /定义138译码器的输入脚B由P2.3控制sbit LS138C = P24; /定义138译码器的输入脚C由P2.4控制void delay(uns
16、igned int i); /函数声名char DelayCNT; /此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab = 0x3f,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; /每
17、隔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_Tab
18、LedNumVal%10; /个位 for( i=0; i9; i+) /实现8位动态扫描循环 P0 = LedOuti; /将字模送到P0口显示 switch(i) /使用switch 语句控制位选 也可以是用查表的方式 学员可以试着自己修改 case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; c
19、ase 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break; delay(150); 试验报告十 试验数码管显示时钟 试验目的: 1 通过本例程了解 DS1302时钟芯片的基本原理和使用 , 2 驱 动程序的编写以及实现数字字符在数码管中的显示。3懂DS1302在C语言中的操作 实验原理: DS1302时钟芯片的基本
20、原理和使用 ,驱动程序的编写以及实现数字字符在数码管中的显示。JP1302跳线冒要短接。 *实验程序:#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include sbit SCK=P36;/时钟sbit SDA=P34;/数据sbit RST = P35;/ DS1302复位sbit LS138A=P22; sbit LS138B=P23;sbit LS138C=P24; bit ReadRTC_Flag;/定义读DS1302标志unsigned char l_tmpdate7=0,0,12,15,5,3,8;/秒分时日月周年08-05-15 12:00
21、:00unsigned char l_tmpdisplay8;code unsigned char write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分时日月周年 最低位读写位code unsigned char read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; code unsigned char table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; /共阴数码管 0-9 - 熄灭表void Write
22、_Ds1302_byte(unsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);/read RTC void Set_RTC(void); /set RTC void InitTIMER0(void);/inital timer0void main(void) InitTIMER0(); /初始化定时器0 Set_RTC(); /写入时钟值,如
23、果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽while(1) if(ReadRTC_Flag) ReadRTC_Flag=0;Read_RTC(); l_tmpdisplay0=l_tmpdate2/16;/数据的转换,因我们采用数码管09的显示,将数据分开l_tmpdisplay1=l_tmpdate2&0x0f;l_tmpdisplay2=10; /加入-l_tmpdisplay3=l_tmpdate1/16;l_tmpdisplay4=l_tmpdate1&0x0f;l_tmpdisplay5=10;l_tmpdisplay6=l_tmpdate0/16;l_tmpdispl
24、ay7=l_tmpdate0&0x0f; void InitTIMER0(void) TMOD|=0x01;/定时器设置 16位 TH0=0xef;/初始化值 TL0=0xf0; ET0=1; TR0=1; EA=1;void Write_Ds1302_Byte(unsigned char temp) unsigned char i; for (i=0;i=1; /右移一位 SCK=1; void Write_Ds1302( unsigned char address,unsigned char dat ) RST=0;_nop_(); SCK=0;_nop_(); RST=1; _nop_(
25、); /启动 Write_Ds1302_Byte(address);/发送地址 Write_Ds1302_Byte(dat);/发送数据 RST=0; /恢复/*/* 读出DS1302数据 */*/unsigned char Read_Ds1302 ( unsigned char address ) unsigned char i,temp=0x00; RST=0;_nop_();_nop_(); SCK=0;_nop_();_nop_(); RST=1;_nop_();_nop_(); Write_Ds1302_Byte(address); for (i=0;i=1;/右移一位_nop_()
26、; _nop_(); _nop_(); SCK=1; RST=0;_nop_(); /以下为DS1302复位的稳定时间 _nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return (temp);/返回/*/* 读时钟数据 */*/void Read_RTC(void) /读取 日历 unsigned char i,*p; p=read_rtc_address; /地址传递 for(i=0;i7;i+) /分
27、7次读取 秒分时日月周年 l_tmpdatei=Read_Ds1302(*p); p+; /*/* 设定时钟数据 */*/void Set_RTC(void) /设定 日历unsigned char i,*p,tmp;for(i=0;i7;i+) /BCD处理tmp=l_tmpdatei/10;l_tmpdatei=l_tmpdatei%10;l_tmpdatei=l_tmpdatei+tmp*16; Write_Ds1302(0x8E,0X00); p=write_rtc_address;/传地址 for(i=0;i7;i+)/7次写入 秒分时日月周年 Write_Ds1302(*p,l_t
28、mpdatei); p+; Write_Ds1302(0x8E,0x80);/*/* 定时器中断函数 */*/void tim(void) interrupt 1 using 1 /中断,用于数码管扫描 static unsigned char i,num; TH0=0xf5; TL0=0xe0; P0=tablel_tmpdisplayi;/查表法得到要显示数字的数码段 switch(i) case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=
29、0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break; i+;if(i=8) i=0; num+; if(10=num) /隔段时间读取1302的数据。时间间隔可
30、以调整 ReadRTC_Flag=1; /使用标志位判断 num=0实验用430单片机控制LED灯闪烁实验目的:实验原理:p4.4 口的LED灯闪烁。实验程序:#include /定义头文件/#include io430.h /或用这个通用头文件int i=0,j=0; /声明需使用的全局变量并初始化用于延时 void Delay() for(i=0;i500;i+) for(j=0;j110;j+); void main() /构建主程序 / Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; /关闭
31、看门狗,WDTPW 高字节看门狗口令,为5AH。 /HOLD 停止看门狗定时器工作,降低功耗。HOLD=1 时钟禁止输入,计数停止。 P4SEL &= BIT4; /选择 P4.4 作为普通 I/O 口功能, P4SEL=0 普通I/O口 P4DIR |= BIT4; /将P4.4 设置为输出方向 P4OUT |= BIT4; /使P4.4 输出高电平(实验板上初始化灯的状态为熄灭) while(1) P4OUT = BIT4; /灯的状态取反 Delay(); /调用延时子程序 实验报告十二蜂鸣器发声实验目的:实验原理:P2.2 = 0 开蜂鸣器实验程序:#include #define Beep_on P2OUT&=BIT2; /P2.2 = 0 开蜂鸣器#define Beep_OFF P2OUT|= BIT2; /P2.2 = 1 关蜂鸣器unsigned char beep_flag=1;unsigned int beep_timer; unsigned char iq0; BCSCTL1 = RSEL0 + RSEL1 + RSEL2; /基本时钟系统控制寄存器1,Resl.0=Resl.1=Resl.2=1 选择最高的标称频率 BCSCTL1&=XT2OFF; /打开XT2振荡器 , TX2OFF=1 TX2振荡器关闭 do