试验报告.doc_第1页
试验报告.doc_第2页
试验报告.doc_第3页
试验报告.doc_第4页
试验报告.doc_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

专业: 电科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个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的端口和各特殊寄存器定义在此文件中 此包含比不可少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会不停的左移或右移试验程序: #include #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 = 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)/ 延时子程序unsigned char i;while(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 beep = 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; /按钮松开 关闭继电器试验报告六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 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灯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_() /* 定义空指令 */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 = led7codelednumval%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,0x6d,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个扫描周期清零一次 +lednumval; /每隔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=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(unsigned 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; /每隔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; 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; 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; delay(150); 试验报告十 试验数码管显示时钟 试验目的: 1 通过本例程了解 ds1302时钟芯片的基本原理和使用 , 2 驱 动程序的编写以及实现数字字符在数码管中的显示。3懂ds1302在c语言中的操作 实验原理: ds1302时钟芯片的基本原理和使用 ,驱动程序的编写以及实现数字字符在数码管中的显示。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: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_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(); /写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽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_tmpdisplay7=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_(); /启动 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_(); _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+) /分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_tmpdatei); 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=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的数据。时间间隔可以调整 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; /关闭看门狗,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 ifg1 &= ofifg; /清除振荡器失效标志,ifg1 中断标志寄存器1,ofifg 振荡器失效时置位, /振荡器失效时产生非屏蔽中断请求。ofifg 标志必须由用户软件来清除。 for (iq0 = 255; iq0 0; iq0-); / 延时,等待xt2起振 while (ifg1 & ofifg) != 0); /判断xt2是否起振,如果不起振继续执行 do 语句。 bcsctl2 |= sels+selm_2; /基本时钟系统控制寄存器2,sels 选择smclk时钟源为 xt2clk /selm_2 选择mclk时钟源,为 xt2clkvoid timera_init() cctl0 = ccie; /打开 ccr0 捕获比较寄存器的中断 ccr0 = 8000; /设置捕获/比较寄存器初始值,晶振为8m tactl = tassel_2 + mc_1 + taclr; /时钟源选择为smclk + 增计数模式 + 清除定时器a计数器 /tassel_2时钟源选择为smclk /mc_1增计数模式 /计数器清0,taclr=0x0004,清除定时器a计数器void main(void) wdtctl = wdtpw + wdthold; / stop wdt clock_init(); / 时钟初始化 timera_init(); / 定时器初始化 p2dir |= bit2; / p2.2 output _bis_sr(lpm0_bits + gie); / enter lpm0 / open all interrupt#pragma vector=timera0_vector_interrupt void timer_a (void) beep_timer+; if(beep_timer=500) beep_timer=0; switch(beep_flag) case 1: beep_flag=2; beep_on; break; case 2: beep_off; beep_flag=1; break; default:break; 试验报告十三矩阵键盘实验目的:实验原理:矩阵键盘二进制计数,用4个led灯显示实验程序:#include#define uchar unsigned char#define uint unsigned intuchar key_scan(void) /列输出0,扫描行,判定键值 /行线被上拉电阻拉高,列输出低电平,判断行线是否被拉低。 uchar key_v=0,key=0; p5dir = 0x10; /0001 0000 ,第一列输出,逐行扫描,判定键值 if(p5in&0x0f)!=0x0f) /判断是否有键按下 for(uint x=100;x;x-); /延时消抖 if(p5in&0x0f)!=0x0f) /确定有键按下 key_v=p5in&0x0f; /得到

温馨提示

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

评论

0/150

提交评论