|
【练习】PIC 编程 - LED闪灯 (功力挑战)
[复制链接]
|
|
发表于 13-12-2007 05:47 PM
|
显示全部楼层
原帖由 fritlizt 于 13-12-2007 05:01 PM 发表 
我的方法很神奇的。。哈哈。
没有啦。。。
其实main program只是拿来set parameters,简单来讲我在main program 设定led 要怎样闪烁。
然后timer interrupt就会读取parameters和base on那些parameters决定 ...
是的,我明白你是用timer interrupt来令 LED 闪烁的。可是当你的 main program call 以下的 function 时
LedBlinking (1, 500, 500);
LedBlinking (2, 1000, 1000);
LedBlinking (3, 50, 50);
Delay (10000); 延迟 10 秒。
假如任何一个 function 都不满足状况,就会停留在延迟 10 秒 的程序对吗 ?所以最后一个执行的是 function 3 {LedBlinking (3, 500, 500);。 LedBlinking (3, 50, 50);。LedBlinking (3, 10, 90); }, 因此我想要了解的是 function 1 与 function 2 似乎都不会执行似的, 问题重点是它们(function 1 与 function 2)什么是什么时候才执行的呢?? |
|
|
|
|
|
|
|
发表于 13-12-2007 06:01 PM
|
显示全部楼层
原帖由 fritlizt 于 13-12-2007 05:01 PM 发表 
我的方法很神奇的。。哈哈。
没有啦。。。
其实main program只是拿来set parameters,简单来讲我在main program 设定led 要怎样闪烁。
然后timer interrupt就会读取parameters和base on那些parameters决定 ...
呵呵!我明白你的做法了,多谢了。 |
|
|
|
|
|
|
|
发表于 16-12-2007 07:41 PM
|
显示全部楼层
这次用timer interrupt 来从新排过
//12MHz Crystal
#include <AT89X51.H>
sbit L1 =P1^0; //LED1
sbit L2 =P1^1;
sbit L3 =P1^2;
unsigned int a,b,c,t1,T2,T3,of1,of2,of3;
float D1,D2,D3,on1,on2,on3;
void function (void);
main() {
TMOD =1;
t1= 1000; //time = 1/freq (in ms)
T2= 2000;
T3= 100;
D1= 0.05; //duty cycle
D2= 0.15;
D3= 0.1;
on1= t1* D1; //on time
on2= T2*D2;
on3= T3*D3;
a=0;
b=0;
c=0;
L1=1;
L2=1;
L3=1;
TH0=0xfc; // set timer 0 to 1ms
TL0=0x18; // same as above
TR0=1; // start timer 0
IE=0x82; //enable Global & timer 0 interrupt
while (1); // keep looping do nothing. every 1ms timer 0
} // interrupt will jump to function
void function (void )interrupt 1 { //timer 0 interrupt
if ( a ==on1){
L1=0;}
else if (a==t1){
L1=1;
a=0;}
if ( b==on2){
L2=0;}
else if (b==T2){
L2=1;
b=0;}
if ( c ==on3){
L3=0;}
else if (c==T3){
L3=1;
c=0;}
a++;
b++;
c++;
} |
|
|
|
|
|
|
|
发表于 16-12-2007 10:59 PM
|
显示全部楼层
原帖由 chan1314 于 16-12-2007 07:41 PM 发表 
这次用timer interrupt 来从新排过
- //12MHz Crystal
- #include <AT89X51.H>
- sbit L1 =P1^0; //LED1
- sbit L2 =P1^1;
- sbit L3 =P1^2;
- unsigned int a,b,c,t1,T2,T3,of1,of2,of3;
- float D1,D2,D3,on1,on2,on3;
-
- //void function (void);
- main() {
- TMOD =1;
复制代码
interrupt function在keil 里面是特别的, 不用prototyping
- void function (void )interrupt 1 { //timer 0 interrupt
- if ( a ==on1){
- L1=0;}
- else if (a==t1){
- L1=1;
- a=0;}
- if ( b==on2){
- L2=0;}
- else if (b==T2){
- L2=1;
- b=0;}
- if ( c ==on3){
- L3=0;}
- else if (c==T3){
- L3=1;
- c=0;}
- a++;
- b++;
- c++;
- TH0=0xfc; // set timer 0 to 1ms
- TL0=0x18; // same as above
- TF0=1; // clear timer flag
- }
复制代码
timer 0 没有16bits autoreload的功能。 得manual reload. 还有你忘了clear timer flag. TF0. |
|
|
|
|
|
|
|
发表于 4-10-2008 09:38 PM
|
显示全部楼层
哎哟,我太迟来了,楼主请问什么是MCU?
看到我的答案请不要笑,我会害羞的。 
Q1-
- #include <16f877a.h> //use PIC16F877A
- #use delay(clock=20000000) //20MHz
- #fuses hs, noprotect, nowdt, nolvp
- #byte portb=6 //port B is used, address is 6
- void main()
- {
- set_tris_b(0b00000000);
- do
- {
- portb=0b00000111;
- delay_ms(500);
- portb=0b00000000;
- delay_ms(500);
- }while(1);
- }
复制代码 Q2-
- #include <16f877a.h> //use PIC16F877A
- #use delay(clock=20000000) //20MHz
- #fuses hs, noprotect, nowdt, nolvp
- #byte portb=6 //port B is used, address is 6
- void main()
- {
- int k,l,m,n;
- set_tris_b(0b00000000);
- do
- {
- for(k=0; k<6; k++)
- {
- portb=0b00000111;
- delay_ms(50);
- portb=0b00000011;
- delay_ms(50);//100ms-500ms
- }
-
- ///////////////////////////////////////////////
- for(l=0; l<6; l++)
- {
- portb=0b00000110;
- delay_ms(50);
- portb=0b00000010;
- delay_ms(50); //600ms-1000ms
- }
-
- /////////////////////////////////////////////////////////
- for(m=0; m<6; m++)
- {
- portb=0b00000101;
- delay_ms(50);
- portb=0b00000001;
- delay_ms(50);//1100ms-1500ms
- }
-
- /////////////////////////////////////////////////////////////////
- for(n=0; n<6; n++)
- {
- portb=0b00000100;
- delay_ms(50);
- portb=0b00000000;
- delay_ms(50);//1600ms-2000ms
- }
-
- }while(1);
- }
复制代码 Q3
还要我做吗?哈哈。。。我会用回Q1和Q2的方法的,哈哈。。。
我会晕的。
请楼主多多指教。
[ 本帖最后由 东邪西毒 于 5-10-2008 12:55 PM 编辑 ] |
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 5-10-2008 08:32 PM
|
显示全部楼层
第三题-
- #include <16f877a.h> //use PIC16F877A
- #use delay(clock=20000000) //20MHz
- #fuses hs, noprotect, nowdt, nolvp
- #byte portb=6 //port B is used, address is 6
- void main()
- {
- int a,b,c;
- set_tris_b(0b00000000);
- do
- {
- portb=0b00000111;
- delay_ms(10);
- portb=0b00000011;
- delay_ms(40);
- portb=0b00000010;
- delay_ms(50); //first 100ms
- ////////////////////////////////////////////////////
- for(a=0; a<3; a++)
- {
- portb=0b00000110;
- delay_ms(10);
- portb=0b00000010;
- delay_ms(90); //next 200ms, total 300ms
- }
- /////////////////////////////////////////////////////////
- for(b=0; b<8; b++)
- {
- portb=0b00000100;
- delay_ms(10);
- portb=0b00000000;
- delay_ms(90);//next 700ms, total 1000ms
- }
- /////////////////////////////////////////////////////////////////
- portb=0b00000101;
- delay_ms(10);
- portb=0b00000001;
- delay_ms(40);
- portb=0b000000000;
- delay_ms(50);//next 100ms, total 1100ms
- /////////////////////////////////////////////////////////////////
- for(c=0; c<10; c++)
- {
- portb=0b00000100;
- delay_ms(10);
- portb=0b00000000;
- delay_ms(90);//next 900ms, total 2000ms
- }
-
- }while(1);
- }
复制代码 没人来指教我的? 
[ 本帖最后由 东邪西毒 于 5-10-2008 08:36 PM 编辑 ] |
评分
-
查看全部评分
|
|
|
|
|
|
|

楼主 |
发表于 6-10-2008 04:50 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 6-10-2008 10:48 PM
|
显示全部楼层
谢谢指教,我刚学不久,只好用这basis来做。我会参考他们的。 |
|
|
|
|
|
|
|

楼主 |
发表于 7-10-2008 09:43 AM
|
显示全部楼层
原帖由 东邪西毒 于 6-10-2008 10:48 PM 发表 
谢谢指教,我刚学不久,只好用这basis来做。我会参考他们的。
没有问题, 方法其实有很多种, 都是从简单的开始学, 开始的时候是乱乱搞, (因为有时连自己都不知道要什么), 后来就会改进, 改进了又在改进,逻辑思考(Logical thinking) 才是最重要, 最后找到“方法”。 |
|
|
|
|
|
|
|
发表于 8-10-2008 12:14 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 31-3-2009 06:21 PM
|
显示全部楼层
Q1:
#include <16f877a.h>
#include <stdio.h>
#use delay(clock=4000000)
#fuses NOWDT,HS,NOPUT, NOPROTECT,NOLVP
struct pin_map
{
int unused1:8;
boolean LED1;
boolean LED2;
boolean LED3;
int unused2:5;
};
struct pin_map port;
struct pin_map direction;
#byte port=0x05
#byte direction=0x85
void main()
{
direction.LED1=0;
direction.LED2=0;
direction.LED3=0;
port.LED1=1;
port.LED2=1;
port.LED3=1;
delay_ms(500);
while(1)
{
port.LED1=!port.LED1;
port.LED2=!port.LED2;
port.LED3=!port.LED3;
delay_ms(500);
}
} |
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 31-3-2009 06:22 PM
|
显示全部楼层
Q2:
#include <16f877a.h>
#include <stdio.h>
#use delay(clock=4000000)
#fuses NOWDT,HS,NOPUT, NOPROTECT,NOLVP
struct pin_map
{
int unused1:8;
boolean LED1;
boolean LED2;
boolean LED3;
int unused2:5;
};
struct pin_map port;
struct pin_map direction;
#byte port=0x05
#byte direction=0x85
int count1=0,count2=0,count3=0;
void main()
{
setup_timer_0(RTCC_INTERNAL);
set_timer0(156);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
direction.LED1=0;
direction.LED2=0;
direction.LED3=0;
port.LED1=1;
port.LED2=1;
port.LED3=1;
while(1)
{
;
}
}
#INT_RTCC
void rtcc_isr()
{
count1++;
count2++;
count3++;
if(count1==500)
{
count1=0;
port.LED3=!port.LED3;
}
if(count2==5000)
{
count2=0;
port.LED2=!port.LED2;
}
if(count3==10000)
{
count3=0;
port.LED3=!port.LED3;
}
} |
|
|
|
|
|
|
|
发表于 1-4-2009 01:12 AM
|
显示全部楼层
以上的程序是用ccs c 来编写,我不会用proteus,所以不会simulate,如果有错误请多多指教 |
|
|
|
|
|
|
|
发表于 2-4-2009 03:52 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 2-4-2009 11:37 AM
|
显示全部楼层
请问版主,rtos怎么用?有什么写法?可以给example吗? |
|
|
|
|
|
|
|

楼主 |
发表于 3-4-2009 11:01 AM
|
显示全部楼层
原帖由 热爱音乐 于 31-3-2009 06:22 PM 发表 
Q2:
#include
#include
#use delay(clock=4000000)
#fuses NOWDT,HS,NOPUT, NOPROTECT,NOLVP
struct pin_map
{
int unused1:8;
boolean LED1;
boolean LED2;
boolean LED3;
int unuse ...
不行哦。。
 |
|
|
|
|
|
|
|
发表于 3-4-2009 11:20 AM
|
显示全部楼层
原帖由 热爱音乐 于 2-4-2009 11:37 AM 发表 
请问版主,rtos怎么用?有什么写法?可以给example吗?
rtos很少人自己写
都是用罢了。有很多rtos.个别有自己的用法。得看他们的user manual才懂怎样用 |
|
|
|
|
|
|
|
发表于 4-4-2009 09:28 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 5-4-2009 12:56 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 5-4-2009 05:35 PM
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|