Categories
04/09/2011
C51 Programming Cont.
By dch1 in Just Notes No Comments
今天终于学习了一直以来想学的中断功能,也是单片机中三大核心之一(定时器、中断、串口通信)
还是挺好玩的,下面还是一些课后习题:
1、利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHz。
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay1s(void);uchar xdata status,i;
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
for (status=0; status<20; i++)
P0=~0x01;
status=0;
for (status=0; status<20; i++)
P0=~0x00;
status=0;
}
}void delay1s(void)
{
unsigned char a,b,c;
for(c=95;c>0;c–)
for(b=26;b>0;b–)
for(a=185;a>0;a–);
}void exter0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
status++;
}
另外,如果需要定时器1来执行,则需要这么写:
void exter1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
status++;
}main()
TMOD=0x10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
2、利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay1s(void);uchar xdata status,i,j,t;
void main()
{
TMOD=0x10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
while(1)
{
P0=~0x01;
for (i=0;i<8;i++)
{
t=_crol_(P0,1);
for (status=0;status<2;j++)
P0=~0x00;
status=0;
for (status=0;status<2;j++)
P0=t;
status=0;
}
}
}void delay1s(void)
{
unsigned char a,b,c;
for(c=95;c>0;c–)
for(b=26;b>0;b–)
for(a=185;a>0;a–);
}void exter1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
status++;
}
3、同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔2s依次输出1,10,50,100,200,400,800,1k(hz)的方波。
这道题费的时间比较长,可能是没有完全掌握双定时器优先级的缘故,搞了一晚上,除了这道题,其余三道题基本上都是十几分钟内就搞定的。
PS: 暂时先放弃这道题吧…………
4、用定时器以间隔500MS在6位数码管上依次显示0、1、2、3….C、D、E、F,重复。
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay1s(void);uchar xdata status,status1;
sbit Lock=P3^6;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
Lock=1;
while(1)
{
P2=~0x01;
for (status1=0; status1<16; status1++)
{
while (status<10);
status=0;
Lock=1;
P0=~table[status1];
Lock=0;
P2=_crol_(P2,1);
}
}
}void delay1s(void)
{
unsigned char a,b,c;
for(c=95;c>0;c–)
for(b=26;b>0;b–)
for(a=185;a>0;a–);
}void exter0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
status++;
}
18/09/2011
Keil C51 仿真问题解决
By dch1 in Just Notes, Life No Comments
今日用SST的51仿真芯片测试程序,谁知在一次意外断电的途中,单片机无法再与Keil软件通讯,换原来的STC芯片刷写照常,证明问题出在仿真芯片上。
网上搜索后了解到,可能是断电导致监控程序FLASH区域数据丢失,需要重写程序,于是到网上找到了V4.5的监控程序,但用SP200S专业版始终无法写入芯片。
再次查询网站后,找到如下一篇帖子:http://www.willar.com/forum/forum_view.asp?view_id=16752
但解决方案仍然没有。
其实解决方法很简单,在烧写SST仿真固件之前,重新插拔一次编程器,一切迎刃而解。
另外提供仿真固件下载:http://www.mcusj.com/forum/forum_view.asp?forum_id=29&view_id=16829