单片机实训报.doc_第1页
单片机实训报.doc_第2页
单片机实训报.doc_第3页
单片机实训报.doc_第4页
单片机实训报.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

单片机实训报告第一章总体设计一:实训产品: 电子时钟二:产品要求: a.键盘b.液晶显示c.闹钟d.调时e.温度显示f.屏幕分辨率调节三:采购清单:序号元件名称型号与规格单位数量1电阻R1,R,5,1k,R2 ,R3,R4 10kR7,10只5电位器R6 103排阻:103只只112电解电容C5 10F/16V只13瓷片电容C1, C2 30pF只24晶振12MHz只15发光二级管D1只16三级管Q1 9012只17蜂鸣器个18单片机AT89S52块19集成电路插座40脚块110按钮S1S2轻触个611DS18B20个112阴阳排针个若干131602个1141.5v干电池个415电池盒个116跳线个若干17线路板单面万用版个1第二章硬件设计第三章软件设计 电子时钟程序,可以显示时间和设置的闹钟时间,也可以关闭闹钟,还可以显示温度,k1是设置按键, k2是数值加键,k3是数值减键,k4是确定按键,k5是快关闹钟按键,k6是复位按键。#include /52系列单片机头文件#define uint unsigned int /宏定义#define uchar unsigned char /宏定义uchar code table=0123456789; /显示数数组uchar code table1=OPEN ALARM: ; /字符数组uchar code table2=ALARM OFF:;/字符数组/*液晶定义*/sbit lcdrs=P14; /液晶数据命令选择端sbit lcden=P15; /液晶使能端/*按键定义*/sbit k1=P10; /设置按键端口sbit k2=P11; /加按键端口sbit k3=P12; /减按键端口sbit k4=P13; /确定按键端口sbit k5=P34; /开关闹钟按键端口char shi1=6,fen1=32; /设置闹钟变量sbit beep=P37; /蜂鸣器控制端口sbit DQ=P32; /18B20键控制端口uint temp; /定义整型的温度数据float f_temp; /定义浮点型的温度数据char shi=6,fen=31,miao=50,a; /时间变量uint num,num1,fuhao; bit flag,flag1,flag2; /标志位延时函数void delayms(uint x) uint i,j; for(i=x;i0;i-)for(j=110;j0;j-); 液晶写命令函数void write_com(uchar com) lcdrs=0; /选择写命令模式 P0=com; /将写的命令字送到数据总线上 delayms(2); /稍做延时以待数据稳定 lcden=1; /使能端给一高脉冲,因为初始化函数中已经将lcden置为0 delayms(2); /稍做延时 lcden=0; /将使能端置0已完成高脉冲 液晶写数据函数void write_data(uchar date) lcdrs=1; /选择写命令模式 P0=date; /将数据送到数据总线上 delayms(2); /稍做延时以待数据稳定 lcden=1; /使能端给一高脉冲,因为初始化函数中已经将lcden置为0 delayms(2); /稍做延时 lcden=0; /将使能端置0已完成高脉冲液晶初始化函数*void init() uint m; /定义变量 lcden=0; /使能端置0 write_com(0x38); /设置16*2显示,5*7点阵,8位数据接口 write_com(0x0c); /设置开显示,不显示光标 write_com(0x06); /写一个字符后地址指针加1 write_com(0x01); /显示清0,数据指针清0 TMOD=0X01; /设置定时器0为工作方式1 TH0=(65536-50000)/256; /装初值12Mhz晶振时50ms数为50000 TL0=(65536-50000)%256; EA=1; /开总中断 ET0=1; /开定时器0中断 TR0=1; /启用定时器0 write_com(0x80+0x40); /液晶第二行第一位显示命令 for(m=0;m0) i-; DQ=1; /拉高总线 i=4; /稍做延时 while(i0) i-;读字节子函数bit tempreadbit(void) /读1位数据函数 uint i; bit dat; DQ=0;i+;DQ=1;i+;i+; /i+起到延时作用dat=DQ; i=8; while(i0)i-; return(dat); 读1字节的数据函数uchar tempread(void)/读1字节的数据函数 uint i,j,dat; dat=0; for(i=1;i=8;i+) j=tempreadbit(); dat=(j1); /读出的数据最低位在最前面,这样刚好一个字节在dat里 return(dat); 读1字节的数据函数void tempwritebyte(uchar dat) /向DS18B20写一个字节的数据函数 uint i; uchar j; bit testb; for(j=1;j1; if(testb) /写1 DQ=0; i+;i+; DQ=1; i=8;while(i0) i-; else /写0 DQ=0; i=8; while(i0) i-; DQ=1; i+;i+;DS18B20开始获取温度并转换函数void tempchange(void) /DS18B20开始获取温度并转换 dsreset(); /初始化DS18B20 delayms(1); tempwritebyte(0xcc);/写跳过读ROM指令 tempwritebyte(0x44);/写温度转换指令读取寄存器中存储的温度数据函数uint get_temp() /读取寄存器中存储的温度数据 uchar a,b,c; dsreset(); /初始化DS18B20 delayms(1); tempwritebyte(0xcc); /写跳过读ROM指令 tempwritebyte(0xbe);/写温度转换指令 a=tempread(); /读低8位 b=tempread(); /读高8位 temp=b;temp=8; /两个字节组成一个数 temp=temp|a; c=b&0xf8; /取出b的前五位 switch(c) case 0:fuhao=0; /正温度,符号位不显示 f_temp=temp*0.0625; /温度在寄存器中为12位,分辨率为0.0625 temp=f_temp*10+0.5; /乘以10表示小数点后面只取一位 break; case 0xf8: fuhao=1; /显示-号,既是负温度 f_temp=(temp+1)*0.0625; /温度在寄存器中为12位,分辨率为0.0625 temp=f_temp*10+0.5; /乘以10表示小数点后面只取一位 break; return temp; /temp是整型 显示子函数void display() uint b,m,c; b=temp; write_com(0x80); /液晶第一行第一位写命令 write_data(tableshi/10); /显示时间时的十位 write_data(tableshi%10); /显示时间时的个位 write_data(:); /显示字符: write_data(tablefen/10); /显示时间分的十位 write_data(tablefen%10); /显示时间分的个位 write_data(:); /显示字符: write_data(tablemiao/10); /显示时间秒的十位 write_data(tablemiao%10); /显示时间秒的个位 write_data( ); /显示空格 write_data( ); /显示空格 write_data(tableb/100%10); /显示温度的百位 write_data(tableb/10%10); /显示温度的十位 write_data(.); /显示字符. write_data(tableb%10); /显示温度的个位 write_data(0xdf); /显示温度符号 write_data(C); /显示字符C if(fuhao=1) /判断温度是否为负值 for(m=0;m100;m+)write_com(0x80+9); write_data(-);if(flag1=0) /判断温度是否为正值write_com(0x80+0x40); /液晶第二行的第一个位置写命令for(c=0;c11;c+) /显示字符OPEN ALARM:write_data(table1c); elsewrite_com(0x80+0x40); /液晶第二行的第一个位置写命令for(c=0;c11;c+) /显示字符ALARM OFF:write_data(table2c);按键扫描子函数uint keyscan()if(k1=0) /判断k1是否按下 delayms(10); /延时消抖if(k1=0) /再次判断k1是否按下 TR0=0; /关闭定时器0 a+;flag=1; while(!k1); /等待按键释放 if(k2=0) /判断k2是否按下 delayms(10); /延时消抖if(k2=0) /再次判断k2是否按下if(a=1)shi+;if(shi=24)shi=0;if(a=2) fen+;if(fen=60) fen=0;if(a=3)miao+; if(miao=60)miao=0;if(a=4)shi1+;if(shi1=24) shi1=0;if(a=5)fen1+;if(fen1=60)fen1=0; write_com(0x0c); /设置开显示,不显示光标write_com(0x80); /液晶第一行的第一位写命令write_data(tableshi/10); /显示时间时的十位write_data(tableshi%10); /显示时间时的个位 write_data(:); /显示: write_data(tablefen/10); /显示时间分的十位 write_data(tablefen%10); /显示时间分的个位 write_data(:); /显示: write_data(tablemiao/10); /显示时间秒的十位 write_data(tablemiao%10); /显示时间秒的个位 write_com(0x80+0x40+11); /液晶第一行的第十二位写命令 write_data(tableshi1/10); /显示闹钟时的十位 write_data(tableshi1%10); /显示闹钟时的个位 write_data(:); /显示: write_data(tablefen1/10); /显示闹钟分的十位 write_data(tablefen1%10); /显示闹钟分的个位 while(!k2); /等待按键释放 if(k3=0) /判断k3键是否按下 delayms(10); /延时消抖if(k3=0) /再次判断k3键是否按下if(a=1)shi-;if(shi=-1)shi=23; if(a=2)fen-;if(fen=-1)fen=59; if(a=3)miao-;if(miao=-1)miao=59; if(a=4) shi1-;if(shi1=-1)shi1=23; if(a=5)fen1-;if(fen1=-1)fen1=59; write_com(0x0c); /设置开显示,不显示光标write_com(0x80); /液晶第一行的第一位写命令 write_data(tableshi/10); /显示时间时的十位 write_data(tableshi%10); /显示时间时的个位 write_data(:); /显示: write_data(tablefen/10); /显示时间分的十位 write_data(tablefen%10); /显示时间分的个位 write_data(:); /显示: write_data(tablemiao/10); /显示时间秒的十位 write_data(tablemiao%10); /显示时间秒的个位 write_com(0x80+0x40+11); /液晶第一行的第十二位写命令 write_data(tableshi1/10); /显示闹钟时的十位 write_data(tableshi1%10); /显示闹钟时的个位 write_data(:); /显示: write_data(tablefen1/10); /显示闹钟分的十位 write_data(tablefen1%10); /显示闹钟分的个位 while(!k3); /等待按键释放if(k4=0) /判断k4键是 否按下 delayms(10); /延时消抖if(k4=0) /再次判断按键是否按下TR0=1; /启用定时器0 a=0;write_com(0x0c); /设置开显示,不显示光 标 if(k5=0) /判断k5是否按下 delayms(10); /延时消抖if(k5=0) /再次判断k5键是否按下 flag1=flag1; /flag1取反 return a; /返回a的值 数据处理子函数void chuli() switch(a) case 1: write_com(0x80); /第一行第1位写命令write_com(0x0f); /光标闪烁 break; case 2: write_com(0x80+3); /第一行第4位写命 令write_com(0x0f); /光标闪烁 break; case 3: write_com(0x8

温馨提示

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

评论

0/150

提交评论