为什么P1=0x00点亮一盏灯的是第八盏灯

请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?-MSP430-与非网电子技术论坛-电子技术行业最有针对性的电子工程师技术讨论论坛
>>技术社区
请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?
积分:1帖子:2
精华:0等级:学徒注册时间:最后登录:
请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?
#include &msp430g2231.h&
unsigned int a=0,p=1,
void delay(int x)
& int i,j;
& for(i=0;i&=x;i++)
& & & for(j=0;j&=x;j++);
void initial()
& & & & DCOCTL=0x30; & & & & &//15.25MHZ
& & & & BCSCTL1=0x0f;
& & & & BCSCTL2=0x00;
& & & & _BIS_SR(OSCOFF);
#pragma vector=PORT1_VECTOR
__interrupt void port11(void)&
& LPM0_EXIT;
& if(P1IFG&BIT2)
& & & p=0;
& P1IFG=0;
#pragma vector=TIMERA0_VECTOR
__interrupt void timera(void) &
& & count++;
& & if(a==85)
& & & & & a=0;
& & & & & P1OUT^=BIT0;
void main()
& & & WDTCTL=WDTPW+WDTHOLD;
& & & initial();
& & & P1IE|=BIT2;
& & & P1IES|=BIT2;
& & & _EINT();
& & & P1DIR|=BIT0;
& & & LED0OFF;
& & & if(!p)
& & & & & & CCTL0=CCIE;
& & & & & & TACCR0=10000;
& & & & & & TACTL=MC_1+TASSEL_2+TACLR;
& & & & & & TACCR0=10000;
& & & LPM0;
LED0OFF是P1.0为低电平的宏定义
[最后修改于 08:22]
积分:0帖子:424
精华:0等级:学徒注册时间:最后登录:
RE:请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?
P1.2端口没有设置,进不了端口中断的
头衔:版主
积分:13帖子:970
精华:0等级:学徒注册时间:最后登录:
RE:请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?
是不是你没有外接晶振了???
积分:4帖子:96
精华:0等级:学徒注册时间:最后登录:
RE:请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?
主要检查以下几个地方:1,是否打开总中断和定时器中断2,用单步调试看看按键是否能进到中断程序,观察变量P的值是否如你想象的改变3,检查定时器初始化和时钟初始化程序是否有误,对照手册一一检查
积分:4帖子:96
精华:0等级:学徒注册时间:最后登录:
RE:请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?
公司没有430,调试不了,回去再看
积分:0帖子:3
精华:0等级:学徒注册时间:最后登录:
RE:请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?
是否打开总中断和定时器中断
积分:86帖子:169
精华:0等级:学徒注册时间:最后登录:
RE:请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?
接上,你按下去p1.2是拉高还是拉低,确认下,看你代码应该是为高才有效。我喜欢把初始化语句尽量放前面去,最后在判断语句再开中断,总中断,觉得更加简练。
积分:86帖子:169
精华:0等级:学徒注册时间:最后登录:
RE:请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?
接上,你按下去p1.2是拉高还是拉低,确认下,看你代码应该是为高才有效。
我喜欢把初始化语句尽量放前面去,最后在判断语句再开中断,总中断,觉得更加简练。
积分:86帖子:169
精华:0等级:学徒注册时间:最后登录:
RE:请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?
接上,你按下去p1.2是拉高还是拉低,确认下,看你代码应该是为高才有效。
我喜欢把初始化语句尽量放前面去,最后在判断语句再开中断,总中断,觉得更加简练。
积分:0帖子:15
精华:0等级:学徒注册时间:最后登录:
RE:请问为什么就是不能实现按P1.2键,启动定时器,灯闪烁?
你在主程序里加个循环试试。
旗下网站: |
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号 北京市公安局备案编号: 京ICP备:号
通信成功,数据正在处理中...> 【基础教程】端口基本操作(流水灯)
管理员:&人数:30小组积分:352简介:希望大家在这里共同进步!小组公告小组暂无公告.&&|&&&&|&&
需要确认注册邮箱后才能下载,
楼主&&[其他]&
【基础教程】端口基本操作(流水灯)
积分:1429分
总积分:2886分
发表于 17:11
&本文章来自(张彦欣单片机),这里你想查询更多的教程和信息。 今天,我们来进行MCS51的第一堂课,这才是真正的写程序。既然要学习MCS51的端口,我们就闲来温习一下MCS51的几个IO口。&&& P0端口:具有8 位漏极开路的双向IO口。每位可以驱动8个TTL逻辑电平。&&& P1端口:具有内部上拉电阻的双向IO口。每位可驱动4个TTL逻辑电平。&&& P2端口:具有内部上拉电阻的双向IO口。每位可驱动4个TTL逻辑电平。&&& P3端口:具有内部上拉电阻的双向IO口。每位可驱动4个TTL逻辑电平。&&& 今天,我们就来控制这些IO口,让他们输出一定的内容。这是基础,以后各种芯片的使用,其实都是通过控制IO输出各种有时序的电平(就是输出一定的波形),来控制芯片的。&&& &&& 这些IO口,输出什么电平(高电平还是低电平)是通过我们的程序来控制的。在C语言中,控制端口的输出极其的简单,我们闲来看几个例子:&&& P0 = 0x01;&&& //将P0口(这个P0在REG51.H头文件中已经定义,可以直接使用)赋值为0x01;&&&&&&&&&&&&&&&&&&&&&&&&&& //我们知道,0x01是16进制,转换成二进制是0B。&&&&&&&&&&&&&&&&&&&&&&&&&& //我们知道,P0口是8位的,分别是P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7&&&&&&&&&&&&&&&&&&&&&&&&&&&//这个赋值,其实就是对应的将P0.0输出高电平,其他的输出低电平。&&& P1 = 0xFF;&&& //这个和上面是一样的,0xFF的二进制是0B。意思就是将P1的八个引&&&&&&&&&&&&&&&&&&&&&&&&& //脚,全部输出为高电平。&&& 那如何给某一个特定的引脚赋值呢?比如,我就是想让第40个引脚输出高电平,不想改变其他引脚的状态。这个简单,我们看看MCS51的管脚图,第40个引脚是P0.0口。&&& 那么用C语言的思维方式是不是应该这么写:&&& P0^0 = 1;&&//注意,P0.0只是一位,他的状态只能是0或者1。不能出现P0^0=0x12这样的语句。&&&&&&&&&&&&&&&&&&&&&&& //当然,这么写也是不对的。因为C语言中“^”是一个“异或”运算符。机器会&&&&&&&&&&&&&&&&&&&&&& //以为你这里进行的是P0和0的异或运算。所以出错。&& 应该这样来表达:&& sbit MyBit = P0^0;&&& //将P0^0定义成一个“位变量”,这个变量的名字叫MyBit(你可以起任何的名字--但不能和REG51.H头文件里面的重合)&& MyBit="1";&&&&&&&&&&&&&&&&&&& //再给这个位变量赋值。&&& 怎么样,给端口赋值是不是很简单啊?你也看出来了吧,其实在C语言中,一个语句可以有很多中表达方式,比如给P0.0赋值的这个例子,我还可以这么写:&&& P0 |= 0x01;&&&&&&&&&&& //这个你现在如果看不懂,不要紧,后来你就会知道了。&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //“|”是一个“或运算”符。而且这个句子等价于P0 = P0 | 0x01 ;明白了吧。&&&&&&& 好了,你也应该大体明白端口赋值的道理了。接下来,我们就开始写一个我们自己的程序吧~~&&&&1.打开我们的编程软件Keil。建立一个工程。(如果你还不明白这一步怎么操作,你可以看看教程中的“KEIL的使用”)&&& &&& 2.我们先来写一个极其简单的程序:&&& #include &REG51.H&&&&&&&&&&&&&//先将CPU的头文件包含到工程中来。这其中定义了CPU所有的寄存器。&&& void main()&&&&&&&&&&&&&&&&&&&&&&&&&&&//main()函数,是一个工程中的主函数,程序就是从这里开始运行的,是必须有的。&&&&{&&&&&&&&&& for(;;)&&&&&&&&&&&&&&&&&&&&&&&&& & //你没有看错,这个for(;;)里面的确没有变量和控制条件.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //就是为了无限循环,也可以使用while(1)。&&&&&&&&&&&{&&&&&&&&&&&&&&&& P0 = 0x01;&&&&&&&&&&& &//在这个不断循环中,一直执行一句话,就是P0 = 0x01。&&&&&&&&&& }&&& }&&& 3.编译一下,链接一下,OK,程序没有错误“0个错误,0个警告”。&&& 4.把程序下载到我们的开发板L-20上,看看CPU运行的结果是什么吧?哈哈,不用说,你会看到流水灯除了第一个,其他7个都是亮的。说到了流水灯,我看我们有必要来看看流水灯的电路:&&& &&& 从照片上,我们就可以看到,L-20系统有8个发光二极管,这一排发光二极管的连接方式如右面的这个电器连接示意图所示,发光二极管是这样连接到CPU的。(图中只是画出了链接到P0.7的那个LED放光二极管,还有7个没有画出,他们分别连接到P0的其他端口)。你也许已经注意到了,这个发光二极管是反着接到CPU上的,也就是说,当CPU的P0.7口输出高电平的时候,D7这个发光二极管是不亮的(因为两端的电压相等,不会有电流流过);当CPU的P0.7口输出为低电平的时候,+5V端有电流流想CPU的P0.7端口,这时LED放光二极管点亮。&&& 有人问了,为什么要向相应的端口写“0”的时候才亮;写“1”的时候就不亮,这和我们平时的思维方式不同啊,电路为什么要这么连接啊?哈哈,我这样链接是有原因的:CPU的端口,往外提供电流的能力很小,一般才零点几MA左右,根本就不能是LED发光;但是灌电流却比较大,可达到20MA左右,完全可以使LED发光。现在明白为什么要这么链接了吧?就是为了能让lED在不使用功率发达器件的情况下,直接点亮。&&& 好了,既然知道L-20系统的流水灯电路和原理了,接下来,我们就写个程序来控制这些灯的亮灭吧~~#include &REG51.H&void main(){&&&& for(;;)&&& {&&&&&&&&& P0 = 0x00;&&&& //把P0口上的LED灯全部打开。&&&&&&&&& P0 = 0xFF;&&&//把P0口上的LED灯全部熄灭。&&& }}&&& 好了,在CPU的无限循环运行中,我们让它关掉LED,再打开LED。是不是就是让L-20上的八个LED灯不断的闪烁啊?哼哼~~赶紧把这个程序下载到L-20上看看运行的结果吧~~&&& 什么,不对?LED灯没有闪烁,而是一直在亮?怎么可能,我们程序中明明是让P0口上的灯先打开,后关闭啊?问题出在哪里?哈哈,问题就处在我们低估CPU的运行速度了。CPU的运行速度非常的快,它不断的开关LED,但是频率相当的高(达到500 000 HZ),由于我们的眼睛有视觉暂留效应,所以我们根本就看不出来LED灯在闪烁(事实上,他的确在闪烁)。&&& 那该怎么办啊?哈哈,当然是让他闪烁的慢一点了:#include &REG51.H&void main(){&&&&&& for(;;)&&& { &&&&&&&&& P0=0x00;&&&&&&&&&&&&&&&&&&&&&&&&&& //打开所有的LED灯。&&&&&&&&& for(i=0;i&60000;i++);&&&&&&& //打开后,让CPU数数,数到60000后再执行下面的语句。这就是延时的原理。&&&&&&&&& P0=0xFF;&&&&&&&&&&&&&&&&&&&&&&&&&& //关闭所有的LED灯。&&&&&&&&& for(i=0;i&60000;i++);&&&&&&& //延时的原理其实就是让CPU执行空语句,浪费CPU的时间。&&& }}&&& 赶紧把这个程序下载到L-20上看看效果吧~~哈哈,是不是看到L-20实验板上的发光二极管在一闪一闪的?对了,这就是我们要的效果!注意:&&& 到了这里,有些朋友想发挥一下了。他想让灯闪烁的再慢一点,所以他在延时那部分是这么写的:for(i=0;i&100000;i++);结果呢,他发现这个灯根本就不闪烁了,而是一直亮。大家知道问题出在哪里吗?对了,问题就出在“变量溢出”了。你看看“i”这个变量,是unsigned int型的,这中型号的变量的范围是0 ~ 65535。当i=65535以后,再加1,就是0了,怎么可能大于100000?所以,第一个for()循环就通过不了了,就一直卡在那里了。所以说,大家在以后的项目中,一定一定要注意变量溢出问题!!&&& 有些朋友还是不满足让这些LED只是这样一闪一闪的,他希望这些LED也和马路边上的霓虹灯一样,不断的交替闪动,就仿佛流水一样,来来回回,十分好玩。还是那句话“没有问题哇!”Come on~~#include &REG51.H&void main(){&&&&&&&&&&& for(;;)&&&&& {&&&&&&&&&&& P0=0xFF;&&&&&&&&&&&&&&&&&&&&& &//全部关闭LED。&&&&&&&&&&& for(i=0;i&20000;i++);&&& //延迟一段时间。&&&&&&&&&&& P0 = 0xFE;&&&&&&&&&&&&&&&&&&& //打开第一个灯。 0B&&&&&&&&&&&&for(i=0;i&20000;i++); &&&&&&&&&&& P0 = 0xFD;&&&&&&&&&&&&&&&&&&& //打开第二个灯。 0B&&&&&&&&&&& for(i=0;i&20000;i++); &&&&&&&&&&& P0 = 0xFB;&&&&&&&&&&&&&&&&&&& //打开第三个等。 0B&&&&&&&&&&&&for(i=0;i&20000;i++); &&&&&&&&&&& P0 = 0xF7;&&&&&&&&&&&&&&&&& //打开第四个灯。 0B&&&&&&&&&&& for(i=0;i&20000;i++); &&&&&&&&&&& P0 = 0xEF;&&&&&&&&&&&&&&&&&&& //打开第五个灯。 0B&&&&&&&&&&&&for(i=0;i&20000;i++); &&&&&&&&&&& P0 = 0xDF;&&&&&&&&&&&&&&&&&&&&//打开第六个灯。 0B&&&&&&&&&&&&for(i=0;i&20000;i++); &&&&&&&&&&& P0 = 0XBF;&&&&&&&&&&&&&&&&&&&&//打开第七个灯。 0B&&&&&&&&&&&&for(i=0;i&20000;i++); &&&&&&&&&&& P0 = 0x7F;&&&&&&&&&&&&&&&&&&&&//打开第八个灯。&&0B&&&&&& }}&&& 好啦!怎么样,能看的懂吧?原理非常的简单,就是先让第一个灯亮,过一段时间,再让第二个灯亮,再第三个,第四个……这样以来,这些灯就像流水一样不断的来回循环,是不是很有意思。&&& 当然,你自己也可以规定不同的流动方式,赶紧动手制作你自己的流水灯吧!!最后,请你欣赏我自己做的几个简单的流水灯运行结果吧!~&
空城笑影 编辑于 17:12
--- 现有 1个主题,共 1页,目前第 1页 ---&&
点击,立即回复。
IC厂商小组
在线研讨会
赞助商链接
2015 EDN China -- Use of this website is subject to its terms of use.
京ICP备号-1 |
京公网安备 |如何用单片机AT89S52的p2口控制八盏灯依次点亮一盏的程序啊?_百度知道
如何用单片机AT89S52的p2口控制八盏灯依次点亮一盏的程序啊?
大哥大姐,人命关天啊!55555…
提问者采纳
#include & } } } / / temp=_crol_(a--);reg51;b--) for(a=125;---------延时--------------- void delay(uint c) /delay(500).h&// delay(500);/----------主函数------------- void main() { while(1) { uchar temp,b; temp=00; #define uchar unsigned char #define uint unsigned int sbit led1=P0^0;a&0;1ms { unsigned int a.h&P0= void delay(uint),1);/ /b&/ / for(b=c#include& while(1) { P2= sbit beep=P1^0
其他类似问题
at89s52的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁纪念碑谷第八关 怎么过。点亮第一盏灯后乌鸦走哪里啊?哪里有门啊?_百度知道
纪念碑谷第八关 怎么过。点亮第一盏灯后乌鸦走哪里啊?哪里有门啊?
baidu.hiphotos.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http://e.hiphotos./zhidao/pic/item/18d8bc3eb1fb635abd3fd1f41345b1b;<a href="http.baidu.jpg" esrc="http://e://e&/zhidao/wh%3D600%2C800/sign=/zhidao/wh%3D450%2C600/sign=d74febc6af98ca029afbc3eb1fb635abd3fd1f41345b1b
com/jnbg/gonglue/:///jnbg/gonglue/:///jnbg/gonglue/://www./jnbg/gonglue/96460.html纪念碑谷全攻略 第二章教学关攻略<a href="/jnbg/gonglue/://www://www:///jnbg/gonglue/96443://www.html纪念碑谷全攻略 第六章迷宫攻略<a href="/jnbg/gonglue/96422.html纪念碑谷全攻略 第八章箱子攻略纪念碑谷全攻略 第三章隐寺攻略纪念碑谷全攻略 第四章水宫攻略纪念碑谷全攻略 第五章尖塔攻略<a href="http.html纪念碑谷全攻略 第九章斜坡攻略纪念碑谷全攻略 第十章观象台攻略<a href="/jnbg/gonglue/96479.html纪念碑谷全攻略 第七章乌雅巢攻略
其他类似问题
乌鸦的相关知识
按默认排序
其他1条回答
我跟你问题一样,跟攻略的顺序不太一样
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁用74HC595点亮LED灯程序,求大神找问题出在哪?_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:60,993贴子:
用74HC595点亮LED灯程序,求大神找问题出在哪?收藏
#include&reg51.h&#define unint unsigned int#define unchar unsigned charsbit sclk595=P1^1;//时钟脉冲sbit ds=P1^0; //串行数据输入sbit rck=P1^2;//存储器脉冲sbit oe595=P1^3;//使能端口void delay(unint ms) //延时ms{unint j,k;for(j=j&0;j--)for(k=110;k&0;k--);}void wr595()
//595发送一字节{unint a,for(a=0;a&8;a++){
sclk595=0;
if((temp&0x80)==0x80)
sclk595=1;
//上升沿有效
sclk595=0;
temp=temp&&1; //移位}}void out() //595输出一字节{rck=0;delay(1);rck=1;delay(1);oe595=0;}void main(){while(1){temp=0wr595();out();delay(1000);temp=0x00;wr595();out();delay(10);}}
只是实现简单的全亮和全灭。但是只会全亮,不管怎么改程序。另求引肢接线方法。
怎么没人?是我的问题太简单了?
操作芯片的时候有没使能oe595
将wr595中的uint temp定义为全局变量,然后main函数中delay10改大点
#include&reg51.h&#define uint unsigned int#define uchar unsigned charsbit sclk595=P1^1;sbit ds=P1^0;sbit rck=P1^2;sbit oe595=P1^3;void delay(uint ms){uint j,k;for(j=j&0;j--)
for(k=110;k&0;k--)}void wr595(){
oe595=0; sclk595=0;
for(a=0;a&8;a++){if((temp&0x80)){ds=1;}elseds=0;sclk595=1;delay(1);sclk595=0;temp&&=1;
}}void out(){oe595=0;rck=0;delay(1);rck=1;delay(1);rck=0;}void main(void){while(1){temp=0xf0;wr595();out();delay(100);temp=0x00;wr595(); out(); delay(100); }}
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 为你点亮一盏灯 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信