电信单片机实验指导.docx
- 文档编号:11903466
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:46
- 大小:981.98KB
电信单片机实验指导.docx
《电信单片机实验指导.docx》由会员分享,可在线阅读,更多相关《电信单片机实验指导.docx(46页珍藏版)》请在冰豆网上搜索。
电信单片机实验指导
电信专业
《单片机原理及应用》实践性实验
任务书与报告书
皖西学院机电学院
翁志远编
2014年6月
实践性实验流程
1、领取实验任务书后认真阅读,了解实验任务。
2、在原有单片机最小系统基础上从学院实验室领取所需实验元器件,按照原理图焊接好电路。
3、按照任务书要求编写好程序,调试无误后烧录到单片机上。
观察现象是否满足任务书要求。
4、调试完成后到学院机房由指导老师验收,验收合格后评定成绩。
单片机最小系统板资料
一单片机最小系统板:
二单片机原理图:
皖西学院机电系《单片机原理与应用》任务及报告书
实验名称智能广告灯实验指导教师翁志远
班级电信1101姓名王征学号2011011182总成绩
1、实验目的
1.进一步熟悉编程和程序调试
2.掌握单片机端口的基本操作
2、实验仪器和元器件
实验仪器:
单片机最小系统、万用表。
实验元件:
led灯8个、560欧电阻8个、杜邦线若干。
3、实验原理图及说明
实验参考电路图如下:
实验说明
(1)理解单片机开发板电路原理图;
(2)按要求编写程序.
4、实验内容
(1)做单一灯的左移右移,八个发光二极管D1-D8分别接在单片机的P2.0-P2.7接口上,输出“0”时,发光二极管亮,开始时P2.0→P2.1→P2.2→P2.3→┅→P2.7→P2.6→┅→P2.0亮,重复循环。
(2)观察实验现象.
5、实验报告(可附页)
一、根据内容绘出程序流程图,写出实验程序。
调试程序,观察结果。
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
voidDelay(uintx)
{
uchart;
while(x--)
{
for(t=1200;t>0;t--);
}
}
voidmain()
{
uchari;
P0=0xFE;
while
(1)
{
for(i=7;i>0;i--)
{
P0=_crol_(P0,1);
Delay(1000);
}
for(i=7;i>0;i--)
{
P0=_cror_(P0,1);
Delay(1000);
}
}
}
二、实验现象
如图七个二极管先从左到右依次亮、再从右到左依次亮,就这样依次循环。
三、实验调试过程中所遇到的问题、解决问题的思路和解决的方法。
在用keil编写程序时会出现一系列的问题,比如:
建立工程时的问题、编程问题等,
编程序时出现的问题可以根据老师所给的文件中自己慢慢的去摸索,直至问题得到解决,实在不行再去问同学或老师;还有就是在焊接八个二极管时要注意其连接情况,并要认真的按电路图焊接电路,把程序下载到单片机上时,要按照原理图进行连接。
四、实验后的经验教训总结。
学习单片机要有一定的基础:
电子技术方面要有数字电路和模拟电路等方面的理论基础,特别是数字电路;编程语言要求汇编语言或C语言。
不管做什么事,计划是很重要的。
没有一个完好的计划,做事情就会没有一个好的顺序,做事情会比较乱,很难成功。
而有一个好的计划,不管做什么事都会事半功倍,做事心中有数,明确重点和缓急,不会有疏漏。
这样才能提高成功率。
此次试验也让我对单片机的部分接口有了一定的了解,以及对编程和c语言又有了进一步的了解。
实验报告成绩教师签名年月日
皖西学院机电系《单片机原理与应用》任务及报告书
实验名称按键识别与显示指导教师翁志远
班级电信1101姓名王征学号2011011182总成绩
1、实验目的
1.进一步熟悉编程和程序调试
2.掌握独立键盘的检测原理
2、实验仪器和元器件
实验仪器:
单片机最小系统、直流稳压电源、万用表。
3、实验原理图及说明
实验参考电路图如下:
实验说明
(1)理解单片机开发板电路原理图;
(2)按要求编写程序.
4、实验内容
(1)编写矩阵键盘扫面程序,对矩阵键盘进行识别.
(2)将按下去按键对应的十六进制数显示在某一位数码管上.
5、实验报告(可附页)
一、根据内容绘出程序流程图,写出实验程序。
调试程序,观察结果。
#include
#include
/*******CH452常用命令码*************/
#defineCH452_NOP0x0000//空操作
#defineCH452_RESET0x0201//复位
#defineCH452_LEVEL0x0100//加载光柱值,需另加7位数据
#defineCH452_CLR_BIT0x0180//段位清0,需另加6位数据
#defineCH452_SET_BIT0x01C0//段位置1,需另加6位数据
#defineCH452_SLEEP0x0202//进入睡眠状态
#defineCH452_LEFTMOV0x0300//设置移动方式-左移
#defineCH452_LEFTCYC0x0301//设置移动方式-左循环
#defineCH452_RIGHTMOV0x0302//设置移动方式-右移
#defineCH452_RIGHTCYC0x0303//设置移动方式-右循环
#defineCH452_SELF_BCD0x0380//自定义BCD码,需另加7位数据
#defineCH452_SYSOFF0x0400//关闭显示、关闭键盘
#defineCH452_SYSON10x0401//开启显示
#defineCH452_SYSON20x0403//开启显示、键盘
#defineCH452_SYSON2W0x0423//开启显示、键盘,真正2线接口
#defineCH452_NO_BCD0x0500//设置默认显示方式,可另加3位扫描极限
#defineCH452_BCD0x0580//设置BCD译码方式,4位扫描占空比(默认0为16/16)
#defineCH452_TWINKLE0x0600//设置闪烁控制,需另加8位数据
#defineCH452_GET_KEY0x0700//获取按键,返回按键代码
#defineCH452_DIG00x0800//数码管位0显示,需另加8位数据
#defineCH452_DIG10x0900//数码管位1显示,需另加8位数据
#defineCH452_DIG20x0a00//数码管位2显示,需另加8位数据
#defineCH452_DIG30x0b00//数码管位3显示,需另加8位数据
#defineCH452_DIG40x0c00//数码管位4显示,需另加8位数据
#defineCH452_DIG50x0d00//数码管位5显示,需另加8位数据
#defineCH452_DIG60x0e00//数码管位6显示,需另加8位数据
#defineCH452_DIG70x0f00//数码管位7显示,需另加8位数据
/*******CH452在BCD译码方式下的特殊字符**********/
#defineCH452_BCD_SPACE0x10
#defineCH452_BCD_PLUS0x11
#defineCH452_BCD_MINUS0x12
#defineCH452_BCD_EQU0x13
#defineCH452_BCD_LEFT0x14
#defineCH452_BCD_RIGHT0x15
#defineCH452_BCD_UNDER0x16
#defineCH452_BCD_CH_H0x17
#defineCH452_BCD_CH_L0x18
#defineCH452_BCD_CH_P0x19
#defineCH452_BCD_DOT0x1A
#defineCH452_BCD_SELF0x1E
#defineCH452_BCD_TEST0x88
#defineCH452_BCD_DOT_X0x80
/*******2线接口的CH452定义************/
#defineCH452_I2C_ADDR00x40//CH452的ADDR=0时的地址
#defineCH452_I2C_ADDR10x60//CH452的ADDR=1时的地址,默认值
#defineCH452_I2C_MASK0x3E//CH452的2线接口高字节命令掩码
#defineDELAY_IO{_nop_();_nop_();}//IO操作需延时,STC单片机12MHz下2个即可
/*******此程序作为头文件时CH452对外子程序声明************/
//externunsignedcharCH452_Read_Key(0);//从CH452读取按键代码
//externvoidCH452_Write(unsignedshortcmd);//向CH452发出操作命令、显示等
/**************************************
CH452与单片机的端口连接;CH452_ADDR=1,即地址选择脚接Vcc;
CH452的H3L2引脚接VCC,使用2线接口模式;CH452_INT接单片机P3.3(INT1)方便使用中断获取按键值
//**************************************/
sbitCH452_SCL=P1^7;
sbitCH452_SDA=P1^6;
sbitCH452_INT=P3^2;
unsignedcharvolatilekey;//定义一个按键值变量
/******************************
函数说明:
模拟I2C启动
******************************/
voidCH452_I2c_Start(void)
{
CH452_SDA=1;DELAY_IO;//发送起始条件的数据信号
CH452_SCL=1;DELAY_IO;
CH452_SDA=0;DELAY_IO;//发送起始信号
CH452_SCL=0;DELAY_IO;//钳住I2C总线,准备发送或接收数据
}
/******************************
函数说明:
模拟I2C结束
******************************/
voidCH452_I2c_Stop(void)
{
CH452_SDA=0;DELAY_IO;
CH452_SCL=1;DELAY_IO;
CH452_SDA=1;DELAY_IO;//发送I2C总线结束信号
}
/******************************
函数说明:
模拟I2C写一个字节数据
入口参数:
dat=要写入的数据或者命令
******************************/
voidCH452_I2c_WrByte(unsignedchardat)
{
unsignedchari;
for(i=0;i!
=8;i++)//输出8位数据
{
if(dat&0x80){CH452_SDA=1;}
else{CH452_SDA=0;}
DELAY_IO;
CH452_SCL=1;
dat<<=1;DELAY_IO;
CH452_SCL=0;DELAY_IO;
}
CH452_SDA=1;DELAY_IO;
CH452_SCL=1;DELAY_IO;//接收应答
CH452_SCL=0;DELAY_IO;
}
/******************************
函数说明:
模拟I2C读取一个字节数据
出口参数:
dat=要读取的数据,一般为按键值
******************************/
unsignedcharCH452_I2c_RdByte(void)
{
unsignedchardat;
unsignedchari;
CH452_SDA=1;DELAY_IO;
dat=0;
for(i=0;i!
=8;i++)//输入8位数据
{
CH452_SCL=1;DELAY_IO;
dat<<=1;
if(CH452_SDA)dat++;//输入1位
CH452_SCL=0;DELAY_IO;
}
CH452_SDA=1;DELAY_IO;
CH452_SCL=1;DELAY_IO;//发出无效应答
CH452_SCL=0;DELAY_IO;
returndat;
}
/******************************
函数说明:
模拟I2C写入指令
入口参数:
cmd=要写入的指令代码
******************************/
voidCH452_Write(unsignedintcmd)
{
CH452_I2c_Start();//启动总线
CH452_I2c_WrByte((unsignedchar)(cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1);
CH452_I2c_WrByte((unsignedchar)cmd);//发送数据
CH452_I2c_Stop();//结束总线
}
/******************************
函数说明:
模拟I2C读取CH452按键值
入口参数:
read_cmd=读取指令代码
出口参数:
按键值0x00~0x3F
******************************/
unsignedcharCH452_Read(unsignedintread_cmd)
{
unsignedchartemp;
CH452_I2c_Start();//启动总线
CH452_I2c_WrByte((unsignedchar)(read_cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1|0x01);
temp=CH452_I2c_RdByte();//读取数据
CH452_I2c_Stop();//结束总线
returntemp;
}
/******************************
函数说明:
读取CH452按键值
入口参数:
mode=1返回按键ASCII码,mode=0返回十六进制数
出口参数:
按键值,ASCII码或者十六进制数
******************************/
unsignedcharCH452_Read_Key(unsignedcharmode)//返回按键值
{
unsignedcharkey_temp,key_temp2;
key_temp=CH452_Read(CH452_GET_KEY);
switch(key_temp&0x3F)
{
//此处代码按矩阵4*4薄膜键盘测试而来,也可根据注释对照键盘写相应的按键代码
case0x00:
key_temp='D';key_temp2=0x0d;break;//DIG0+SEG0=K1
case0x01:
key_temp='#';key_temp2=0x0f;break;//DIG0+SEG1=K2
case0x02:
key_temp='0';key_temp2=0x00;break;//DIG0+SEG2=K3
case0x03:
key_temp='*';key_temp2=0x0e;break;//DIG0+SEG3=K4
case0x08:
key_temp='C';key_temp2=0x0c;break;//DIG1+SEG0=K5
case0x09:
key_temp='9';key_temp2=0x09;break;//DIG1+SEG1=K6
case0x0a:
key_temp='8';key_temp2=0x08;break;//DIG1+SEG2=K7
case0x0b:
key_temp='7';key_temp2=0x07;break;//DIG1+SEG3=K8
case0x10:
key_temp='B';key_temp2=0x0b;break;//DIG2+SEG0=K9
case0x11:
key_temp='6';key_temp2=0x06;break;//DIG2+SEG1=K10
case0x12:
key_temp='5';key_temp2=0x05;break;//DIG2+SEG2=K11
case0x13:
key_temp='4';key_temp2=0x04;break;//DIG2+SEG3=K12
case0x18:
key_temp='A';key_temp2=0x0a;break;//DIG3+SEG0=K13
case0x19:
key_temp='3';key_temp2=0x03;break;//DIG3+SEG1=K14
case0x1a:
key_temp='2';key_temp2=0x02;break;//DIG3+SEG2=K15
case0x1b:
key_temp='1';key_temp2=0x01;break;//DIG3+SEG3=K16
}
if(mode)return(key_temp);//返回Hex值,0~F
elsereturn(key_temp2);//返回ASCII码,供液晶显示等使用
}
/******************************
函数说明:
主程序2012.9.25
******************************/
voidmain(void)
{
EX0=1;EA=1;//开启外部中断1的中断允许,开启全局中断允许
CH452_Write(CH452_RESET);//CH452复位命令
CH452_Write(CH452_SYSON2);//开显示键盘
CH452_Write(CH452_BCD|0x00);//BCD直接译码,0x05显示占空比5/16,为0则为16/16
//显示2,3,4,5
CH452_Write(CH452_DIG0|2);
CH452_Write(CH452_DIG1|3);
CH452_Write(CH452_DIG2|4);
CH452_Write(CH452_DIG3|5);
//将要显示的数字与CH452_BCD_DOT_X或操作,增加小数点显示6.,7.,8.,9.
CH452_Write(CH452_DIG4|6);
CH452_Write(CH452_DIG5|7);
CH452_Write(CH452_DIG6|8);
CH452_Write(CH452_DIG7|9);
while
(1)//{;}//等待CH452产生按键中断
//voidINT1_ISR(void)interrupt2//外部中断1的中断服务程序
{
key=CH452_Read_Key(0);//读按键值,0为返回十六进制数
//CH452_Write(CH452_LEFTMOV);//显示数据左移1位
CH452_Write(CH452_DIG0|key);//显示按键值
}}
2、实验现象
如图,数码管上显示的是键盘上的按键值,按下一个键,数码管的第一位会显示此键的数值;在按下另一个键时,第一位会显示此键的值,而上一次的值会左移一位,此后的按键与此相同。
三、实验调试过程中所遇到的问题、解决问题的思路和解决的方法。
在编程过程中会出现此文件编译不了,以及数码管不能显示出数据;解决办法是:
先对着原理图的接口把程序中错的接口定义给改过来,然后再仔细检查程序是否还有其他错误,之后再下载到单片机上进行调试,先试试每个按键是否对应其所对的数据,若不是则对着程序进行改。
四、实验后的经验教训总结。
此次试验让我掌握了独立键盘检测的原理,并且知道了做事要多动脑,选出最好的方法。
一件事往往有多种解决方法,一个好的方法,不仅能使事情事半功倍,而且往往决定最后的成与败,所以做事时一定要多动一下脑筋,想出最好的方法,试验过程中需要不断的调试,不断的改动,让我受益颇深。
实验报告成绩教师签名年月日
皖西学院机电系《单片机原理与应用》任务及报告书
实验名称00-99计数器指导教师翁志远
班级电信1101姓名王征学号2011011182总成绩
1、实验目的
1.学习STC12C5A60S2内部定时计数器的使用和编程方法
2.进一步掌握中断处理程序的编写方法
2、实验仪器和元器件
实验仪器:
单片机最小系统、直流稳压电源、万用表。
3、实验原理图及说明
实验参考电路图如下:
实验说明
51单片机有两个16位内部定时器/计数器(T/C,Timer/Counter)。
若是计数内部晶振驱动时钟,则是定时器;若是计数8051的输入引脚的脉冲信号,则它是计数器。
定时器实际上也是工作在计数方式下,只不过对固定频率的脉冲计数。
由于脉冲周期固定由计数值可以计算出时间,有定时功能。
定时器有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON。
TMOD用于设置定时器/计数器的工作方式0-3,并确定用于定时还是用于计数。
TCON主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。
4、实验内容
(1)用数码管动态显示,实现00-99秒计数器。
(2)调试程序并观察实验现象
5、实验报告(可附页)
一、根据内容绘出程序流程图,写出实验程序。
调试程序,观察结果。
#include
#include"intrins.h"
/*******CH452常用命令码*************/
#defineCH452_NOP0x0000//空操作
#defineCH452
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电信 单片机 实验 指导