单片机实训报告.docx
- 文档编号:24334506
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:45
- 大小:73.80KB
单片机实训报告.docx
《单片机实训报告.docx》由会员分享,可在线阅读,更多相关《单片机实训报告.docx(45页珍藏版)》请在冰豆网上搜索。
单片机实训报告
单片机应用综合实训报告
专业:
电气工程及其自动化
班级:
二班
姓名:
赵逸清
学号:
100144989
指导教师:
王爱华、李传江
成绩:
完成日期:
2012年12月31日
基于ADC0808芯片的简单采集系统设计
设计要求:
1.用单片机、ADC0808芯片、数码管等组成温度数据采集显示系统。
温度范围为0—255℃,数码管显示被测温度;当温度低于下限70℃时,实现低温报警,当温度高于上限150℃时,实现高温报警。
2.原理图设计根据所确定的设计电路,利用Proteus软件绘制电路原理图。
3.软件设计根据电路工作过程,画出软件流程图,根据流程图编写相应的程序。
利用Proteus与KeilμVision4联调,直到实验现象正确为止。
4.设计报告按规定的规范和要求书写并打印。
Proteus图:
图1基于ADC0808芯片的简单采集系统设计原理图
源代码程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
//数码管段码(共阴)0~9
ucharcodeDuan_Code[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//数码管位码
ucharcodeWei_Code[]=
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbitCLK=P2^7;//时钟信号
sbitST=P2^6;//启动信号
sbitEOC=P2^5;//转换结束信号
sbitOE=P2^4;//输出使能
sbitRED=P1^6;
sbitYELLOW=P1^5;
sbitBEEP=P1^7;
//数据缓存
ucharData_Buffer[]={0,0,0};
//函数声明
voidData_Process(uchar);
voidSEG7_Static_Display(uchar,uchar);
voidSEG7_Dynamic_Display(uchar);
voiddelay_500us(void);
voidBeep(void);
voiddelay_nms(uint);
//主程序
voidmain()
{
BEEP=1;
RED=1;
YELLOW=1;
TMOD&=0xf0;//Timer0,mode2.等同TMOD=0x02;
TMOD|=0x02;
TH0=0x14;
TL0=0x14;
EA=1;//相当于IE=0x82;
ET0=1;
TR0=1;
P1=0x3f;//选择ADC0809的通道3(P1.4~P1.6)
while
(1)
{
ST=0;ST=1;ST=0;//启动A/D转换
while(EOC==0);//等待转换完成
OE=1;
Data_Process(P3);
OE=0;
SEG7_Dynamic_Display(3);
}
}
//延时子函数,n*1ms
voiddelay_nms(uintnms)
{
uchart;
while(nms--)for(t=0;t<120;t++);
}
//数据处理
voidData_Process(uchard)
{
uintResult;
Result=(uint)d;
Data_Buffer[0]=(50000/500*Result/100)/100;
Data_Buffer[1]=(50000/500*Result/100)%100/10;
Data_Buffer[2]=(50000/500*Result/100)%10;
if(Result>150)
{
SEG7_Dynamic_Display(3);
Beep();
RED=~RED;
}
if(Result>=70&&Result<=150)
{
RED=1;
YELLOW=1;
SEG7_Dynamic_Display(3);
}
if(Result<70)
{
SEG7_Dynamic_Display(3);
Beep();
YELLOW=~YELLOW;
}
}
//静态显示1位
voidSEG7_Static_Display(ucharNum,ucharPosition)
{
P2=0xff;
P0=Duan_Code[Num];
P2=Wei_Code[Position];
}
//动态显示(n位)
voidSEG7_Dynamic_Display(ucharn)
{
uchari;
for(i=0;i { SEG7_Static_Display(Data_Buffer[i],i); delay_nms (2); } } //Timer0中断服务程序,给ADC0808提供时钟信号 voidTimer0_INT()interrupt1 { CLK=~CLK; } voidBeep(void) { uchari; for(i=0;i<100;i++) { delay_500us(); BEEP=~BEEP; } } voiddelay_500us(void) { uchart; for(t=0;t<120;t++); } 100000s以内的计时程序 设计要求: 1.程序启动后即开始计时,时间显示在数码管上,在6只数码管上完成0~99999.9s计时. 2.原理图设计根据所确定的设计电路,利用Proteus软件绘制电路原理图。 3.软件设计根据电路工作过程,画出软件流程图,根据流程图编写相应的程序。 利用Proteus与KeilμVision4联调,直到实验现象正确为止。 4.设计报告按规定的规范和要求书写并打印。 Proteus图: 图2100000s以内的计时程序原理图 源程序: #include #include #defineucharunsignedchar #defineuintunsignedint voidTimer0_initial(void); voidProcess(void); ucharcodeDuan_Code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//数码管段码 0x7f,0x6f,0xff};//共阴极 ucharcodeWei_Code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管位码 //子函数声明 voidSEG7_static_display(uchar,uchar);//静态扫描 voiddelay(uint); voidDisplay(void); ucharBuffer[]={0,0,0,0,0,0}; longCount=0; longs=0; intmain(void) {Timer0_initial(); while (1) { Process(); Display(); } } voidTimer0_initial(void)//Timer0初始化,定时功能,中断方式 { TMOD&=0xf0;TMOD|=0x01; TH0=(65536-50*11059200/12/1000)/256; TL0=(65536-50*11059200/12/1000)%256; EA=1;ET0=1;TR0=1; } voidTimer0_int()interrupt1 { TH0=(65536-50*11059200/12/1000)/256; TL0=(65536-50*11059200/12/1000)%256; Count++; if(Count==2) {Count=0;s++;if(s==1000000)s=0;} } voidProcess(void) { Buffer[0]=s/100000; Buffer[1]=s%100000/10000; Buffer[2]=s%10000/1000; Buffer[3]=s%1000/100; Buffer[4]=s%100/10; Buffer[5]=s%10;} voidSEG7_static_display(ucharnum,ucharposition) { P3=0xff; P0=Duan_Code[num]; P3=Wei_Code[position]; if(position==4)P0=P0|0x80; } voidDisplay(void) {uchari; for(i=0;i<6;i++) {SEG7_static_display(Buffer[i],i); delay (2); }} voiddelay(uintms) { uchart; while(ms--)for(t=0;t<120;t++); } 单片机实现数字钟(六位LED显示小时.分.秒) 设计要求: 1.应用MCS-51单片机设计单片机实现数字钟(六位LED显示XX.XX.XX)电路。 选用6位LED数码显示,实时显示时、分、秒,通过按键进行时、分、秒值的设定。 2.原理图设计根据所确定的设计电路,利用Proteus软件绘制电路原理图。 3.软件设计根据电路工作过程,画出软件流程图,根据流程图编写相应的程序。 利用Proteus与KeilμVision4联调,直到实验现象正确为止。 Proteus图: 图3单片机实现数字钟(六位LED显示小时.分.秒)原理图 源程序代码: #include #defineucharunsignedchar #defineuintunsignedint //数码管段码0~9,灭 ucharcodeDuan_Code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; //数码管位码 ucharcodeWei_Code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义K5 sbitK5=P1^4; sbitK6=P1^5; sbitK7=P1^6; sbitK8=P1^7; //定义变量 uchari,Second_Counts,Key_Flag_Index,H,M; bitKey_State; //数据缓存 ucharData_Buffer[]={0,0,0,0,0,0}; //子函数申明 voidDisplay(void); voidKey_Event_Handle(void); voidTimer1_Initial(void); voiddelay_nms(uint); voidSEG7_Static_Display(uchar,uchar); voidSEG7_Dynamic_Display(uchar); voidData_Process(void); //主函数 intmain(void) { i=0; Second_Counts=0; Key_Flag_Index=0; Key_State=1; Timer1_Initial(); while (1) { Data_Process(); Display(); if(Key_State! =K5) { delay_nms(20); if(Key_State! =K5) { Key_State=K5; Key_Event_Handle(); } } if(Key_State! =K6) { delay_nms(70); if(Key_State! =K6) { H++; if(H==24) { H=0; } } } if(Key_State! =K7) { delay_nms(70); if(Key_State! =K7) { M++; if(M==60) { M=0; } } } if(Key_State! =K8) { delay_nms(70); if(Key_State! =K8) { Second_Counts++; if(Second_Counts==60) { Second_Counts=0; } } } } } //延时子函数,n*1ms voiddelay_nms(uintnms) { uchart; while(nms--)for(t=0;t<120;t++); } //静态显示1位 voidSEG7_Static_Display(ucharNum,ucharPosition) { P2=0xff; P0=Duan_Code[Num]; P2=Wei_Code[Position]; if(Position==5)P0=P0&0x7f; if(Position==3)P0=P0&0x7f; } //动态显示,可改变显示起始位置 voidSEG7_Dynamic_Display(uchark) { uchari; for(i=0;i<6;i++) { SEG7_Static_Display(Data_Buffer[i],7-i); delay_nms (2); } } //显示函数 voidDisplay(void) { SEG7_Dynamic_Display(); } //按键处理 voidKey_Event_Handle(void) { if(Key_State==0) { delay_nms(20); if(Key_State==0) { Key_Flag_Index=(Key_Flag_Index+1)%3; switch(Key_Flag_Index) { case1: H--;M--;Second_Counts--;EA=1;ET1=1;TR1=1;break; case0: H--;M--;Second_Counts=0;Second_Counts--;break; case2: H--;M--;Second_Counts--;EA=0;ET1=0;TR1=0;break; } } } } //数据处理 voidData_Process(void) { Data_Buffer[1]=Second_Counts/10; Data_Buffer[0]=Second_Counts%10; Data_Buffer[2]=M%10; Data_Buffer[3]=M/10; Data_Buffer[4]=H%10; Data_Buffer[5]=H/10; } //Timer1初始化,定时功能,中断方式 voidTimer1_Initial(void) { TMOD&=0x0f;TMOD|=0x10;//Timer1,定时,mode1 TH1=(65536-20*11059200/12/1000)/256; TL1=(65536-20*11059200/12/1000)%256; EA=1; ET1=1; TR1=1; } //Timer1中断服务程序 voidTimer1_Int(void)interrupt3 { TH1=(65536-20*11059200/12/1000)/256; TL1=(65536-20*11059200/12/1000)%256; if(++i==50) { i=0; Second_Counts++; if(Second_Counts==60) { Second_Counts=0; M++; } if(M==60) { M=0; H++; } if(H==24) { H=0; }//满10s归0 } } 数码管显示4X4矩阵键盘按键号 设计要求: 1.按下任意键时,数码管都会显示其键的序号,扫描程序首先判断按键发生在哪一列,然后根据所发生的行附加不同的值,从而得到按键的序号。 2.原理图设计根据所确定的设计电路,利用Proteus软件绘制电路原理图。 3.软件设计根据电路工作过程,画出软件流程图,根据流程图编写相应的程序。 利用Proteus与KeilμVision4联调,直到实验现象正确为止。 4.设计报告按规定的规范和要求书写并打印。 Proteus图: 图4数码管显示4X4矩阵键盘按键号原理图 源代码程序: #include #include #defineuintunsignedint #defineucharunsignedchar //矩阵键盘按键值码表,0~9,A~F ucharcodeKeyCodeTable[]= {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //共阳数码管段码,0~9,A~F,- ucharcodeDuan_Code[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; //共阳数码管位码,由左到右,1-->8位 ucharcodeWei_Code[]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //蜂鸣器引脚定义 //子函数申明 voiddelay_nms(uint);//延时函数,n*1ms voiddelay_500us(void);//延时函数,500us ucharKeys_Scan(void);//矩阵键盘扫描函数 voidSEG7_Static_Display(uchar,uchar);//静态显示函数 //主函数 intmain(void) { ucharKey_Value=16; while (1) { P1=0xf0; if((P1&0xf0)! =0xf0) { delay_nms(15);//去抖动 if((P1&0xf0)! =0xf0) { Key_Value=Keys_Scan(); P1=0xf0;//等待按键释放,发声提示 while((P1&0xf0)! =0xf0) { P1=0xf0; } } } SEG7_Static_Display(Key_Value,7); } } //延时子函数,n*1ms voiddelay_nms(uintnms) { uchart; while(nms--)for(t=0;t<120;t++); } //延时子函数,500us voiddelay_500us(void) { uchart; for(t=0;t<60;t++); } //矩阵键盘扫描子函数(行扫描法) ucharKeys_Scan(void) { uchart=0xfe; uchari,j,temp; P1=0xf0;//送行扫描信号 if((P1&0xf0)! =0xf0) { for(i=0;i<4;i++)//4行分别扫描 { P1=t; temp=P1; for(j=0;j<16;j++)//比对键码,返回键值 { if(temp==KeyCodeTable[j])return(j); } t=_crol_(t,1);//调整行 } } return(16);//返回无按键值 } //静态显示子函数 voidSEG7_Static_Display(ucharnum,ucharPosition) { P2=0xff;//关闭数码管显示 P0=Duan_Code[num];//送显示数据 P2=Wei_Code[Position];//选择显示的位 } 8X8点阵LED电路设计 设计要求: 1.应用MCS-51单片机设计8X8点阵LED电路。 选用8X8点阵LED显示器,一个发光二极管控制点阵中的一个点,用三个按键实现文字的左、右移动和暂停功能。 2.原理图设计根据所确定的设计电路,利用Proteus软件绘制电路原理图。 3.软件设计根据电路工作过程,画出软件流程图,根据流程图编写相应的程序。 利用Proteus与KeilμVision4联调,直到实验现象正确为止。 4.设计报告按规定的规范和要求书写并打印。 Proteus图: 图58X8点阵LED电路设计原理图 源程序代码: #include sbitSD=P3^0;//串行数据输入 sbitST_CK=P3^2;//存储寄存器时钟输入 sbitSH_CK=P3^1; sbitK1=P1^1; sbitK2=P1^2; sbitK3=P1^0; unsignedchari; unsignedintm,n,a=0; voidSer_IN(unsignedcharData) { unsignedchari; for(i=0;i<8;i++) { SH_CK=0; SD=Data&0x80; Data<<=1; SH_CK=1; } } voidPar_OUT(void) { ST_CK=0; ST_CK=1; } voiddelay() {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)