这个是以前写的程序了,貌似可以满足你的要求。 引脚你看你喊改的怎么改吧。。。。。
源代码:(MCU:AT89S52编译环境:Keil uVision4)
#include<reg52.h>
#define W P2 //数码管位选
#define D P1//数码管段选
#define uchar unsigned char
#define TH (65363-10000)/256 //定时器中断初始值
#define TL (65363-10000)%256
uchar display[] = { 0xfc , 0x60 ,0xda , 0xf2 ,0x66 ,0xb6 , 0xbe , 0xe0 , 0xfe , 0xf6 } //数码管0~9数字的代码
int s[3],count=0,k=0
void xian() //数码管显示
void delay(int)//延迟
void main()
{
IE=0x83 //中断设定
TCON=0x01
TMOD=0x01
//中断开了两个,一个是定时器的,还有一个是外部中断,用于暂停,方式是负边缘扫描郑镇判
TH0=TH //定时器载入初始值
TL0=TL
TR0=1 //定时器中断开
while(1)
xian()
}
void xian()
{
W=0xfe //显示第一位
D=display[s[0]]
delay(1)
D=0x00
W=0xfd //显示第二位
D=(display[s[1]])|0x01 //后面的0x01是那个小数点
delay(1)
D=0x00
W=0xfb //显示第三位
D=display[s[2]]
delay(1)
D=0x00
}
void delay(int x)//延迟函数
{
int i,j
for(i=0i<xi++)
for(j=0j<120j++)
}
void my_T0(void) interrupt 1 //定时器中断函数
{
TH0=TH //载入初值
TL0=TL
if(!k)
if(++count==10) //每10次记一次数
{
count=0
s[0]+=1
if(s[0]==10)
{
s[1]++
s[0]=0
}
if(s[1]==10)
{
s[2]++
s[1]=0
}
if(s[2]==10)
{
s[0]=0
s[1]=0
s[2]=0
}
}
}
void my_TH0(void) interrupt 0 //外部中断0
{
k=1-k
}
这个就是秒表了。。。。。
另外说明一下:其中暂停是用的外部中断0,清零其实可以直接用复位键。
另外这个秒表实际上并不太精确,根据每人晶振的不同,定时器的初值还要进行改动。。。。
我不清楚DP-51PROC 里面的引脚是怎么分布的,你就研旅腔究一下改改这个程序吧。
ROM的任务是存储程序,就是单片机执行的指令,所以叫做“程序存储器”;当然也可以存储数据,比如显示汉字使用的字模数据。对于RAM,在单片机总只是临时存储运算过程中产生的中间数据,所以RAM叫做“数据存储器”。你还犯了个错:寄存器就等于RAM吗?二者是完全不同的概念,尽管有的寄存器可以当作RAM使用,但是寄存器的功能不是为了存储数据使用的。
ROM中的内容在断电之后不会丢失,RAM在复位或者断电之后数据就全没了。
对于补充问题的回答:ROM中的程序“不可变”是什么意思?就是ROM中的程序在执行时所实现的功能不能改变ROM的内容,或者说就是不能改变程序自身的结构——否则就不需要你自己写程序了,或者程序会混乱的不可收拾。最典型的例子就是AVR单片机的应用程序含颂春中(不包括Bootloader程序)中是禁止出现SPM指令的,在AVR单片机中SPM指令的作用就能改变ROM的内容,所以在单片机在执行指令时都会避开SPM指令。
但是在使用编程器或者下载线对单片机ROM中的程樱逗序改写时,那是外部因素造成的改变,而不是单片机内部ROM中谈耐程序做到的。 而在RAM中存储的内容,是可以被程序改变的,还有EEPROM也和RAM一样。
所以要明白“不可变”的含义,打比方说就是你在车内能把车掀翻吗?只有在车外才能做到!
“还有单片机rom出场时候给他写了一个程序,那个程序是不可更改的,我以前是这样理解的啊!!!”——你说的这类单片机是属于一次性编程的OTP ROM或者EPROM的单片机,这在PIC的低端单片机中使用的很多,是为了降低成本。这种单片机适合使用在批量生产的产品中,只要程序一写进单片机,那就不同再通过编程器之类的设备来改变了。
查找最大值的程序,不是很简单的胡告吗?如下即可:
ORG 0H
MOV R0, #30H
ACALL ZI
SJMP $
-----------------------------------
ZI:
MOV B, #0 先用0当做最大值.
MOV R7, #16比较16次.
LOOP: MOV A, @R0 取来一个数升州字.
CJNE A, B, B1 比较.
B1: JC B2 有借位转移吵做蔽.
MOV B, A 够减则存到B中.
B2: INC R0 转到下一个.
DJNZ R7, LOOP 循环16遍.
RET
-----------------------------------
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)