❶ 请教单片机编按时间控制的程序的思路
ATF144X的思路确实挺好,而且在选项越多时,越能减少因查询的工作量.
❷ 用52单片机C语言编写程序,实现00~59计时。要求用T0,工作方式1。
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit la=P2^6; //段选
sbit wela=P2^7; //位选
uchar shi,ge,num1,num2; //变量
uchar code table[]={0x3f,0x06,0x5b,0x4f, //共阴极字型码
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint x) //延时子程序
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void init()
{
TMOD=0x01; //设置定时器0的工作方式
TH0=(65536-50000)/256; //装初值
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void display() //显示子程序
{
la=1;
P0=table[ge]; //送段选数据
la=0;
P0=0xff; //送位选数据前关闭所有显示
wela=1;
P0=0xfe; //送位选数据
wela=0;
delay(5); //延时
la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
}
void main()
{
init();
while(1)
{
display();
}
}
void timer() interrupt 1
{
TH0=(65536-50000)/256; //重装初值
TL0=(65536-50000)%256;
num1++;
if(num1==20) //到了20次,1秒时间到
{
num1=0; //清0重新计数
num2++;
if(num2==60)
num2=0;
P1=0x00;
delay(500);
P1=0xff;
shi=num2/10; //把一个2位数分离后分别送数码管显示
ge=num2%10; //十位和个位
}
}
试了的,可以放心,采纳吧!
❸ 请问这个单片机的程序怎么编写,实验目的是显示时间00~99s,每秒自动加一,开始键按下,时钟开始走
http://blog.163.com/asm_c/blog/static/24820311320116257520198/
参考。
❹ 单片机写程序步骤
给单片机写程序的步骤至少有以下几点:
❺ 单片机程序设计 很简单的 高分悬赏
每个灯亮1秒,每个灯闪亮频率为5次/秒。
下列程序,在PROTEUS中仿真通过.
;-------------------------------------
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
ORG 0030H
MAIN:
MOV SP, #7FH
MOV TMOD,#01H
MOV TL0, #LOW(65536-50000)
MOV TH0, #HIGH(65536-50000)
SETB TR0
MOV IE, #82H
MOV R2, #2
MOV R3, #10
MOV R4, #0
M_LOOP:
LJMP M_LOOP ;等待中断,一切闪动、移位,都在中断里面解决
;----------------------------------------------------------------
T0_INT:
MOV TL0, #LOW(65536-50000)
MOV TH0, #HIGH(65536-50000)
DJNZ R2, T0_END
MOV R2, #2 ;加大此数字,如改为8,可降低速度,便于观察.
INC R4
DJNZ R3, FLASH ;100ms减一次一.
MOV R3, #10
INC R6 ;1s加一次一
FLASH:
MOV A, R6
ANL A, #7
MOV R5, A ;0~7, 1s换一次位.
INC R5
MOV A, R4
MOV C, ACC.0
MOV A, #255
MOV P1, A ;关显示
T0_LOOP:
RLC A
DJNZ R5, T0_LOOP
MOV P1, A
T0_END:
RETI
;------------------------------------------------------------
END
❻ 51单片机的编程问题
1:C51编译器如何区分位地址和字节地址
是靠预定义实现的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者声明了P0端口地址位于0x80,后者说明了P0端口的bit0,即P0.0位于位地址空间0x80处。这2个0x80具有完全不同的含义,靠关键字sfr和sbit来区别。这样当程序被编译时,编译器会依此编译成相应的汇编语言。例如:
C51语句: P0 = 1;
P0声明为sfr,因此编译成:mov 80h,01h,将把0x01数据送入0x80单元,由于0x80单元物理上对应P0端口,因此,P0.0脚将输出高电平(其实是呈现高阻态,P0口独有的),其他.1-.7脚输出低电平。
C51语句: P0_0 = 1;
P0_0声明为sbit,因此编译成:setb 80h,这将把位地址空间的0x80地址的bit的值置1。这个位正是P0口的bit0,执行后,P0.0将输出高阻态。而P0.1-.7不会变化。
2:C51为什么要嵌套汇编
51单片机一个显着优点就是指令执行时间固定,因此可以适应时序要求严格的场合。例如符合ISO7816协议的cpu卡的读写,对时序要求比较严格。其实就是用io脚做出来的同步半双工串口。支持cpu卡的程序一般比较庞大,需要用c51来组织,但是由于c编译的不确定性,必须把底层程序封装成汇编语言模块嵌入到工程中。这就带来几个问题:如何声明函数、参数如何传递等。限于篇幅,不能说得很细。下面举例:
汇编程序单独保存一个文件,加入到工程中,函数如下:
_proc_a:
mov a, r7
inc a
mov r7, a
ret
用c语言在.h文件中声明: extern unsigned char proc_a(unsigned char val);
调用时形如: retvalue = proc_a(0x11);
说明:
a:汇编程序如果带参数,则需要在汇编程序前多加一个下划线。而声明它的地方不用加(伟福编译器这么要求的)。
b:函数的形参中第一参数用R7传递,函数返回值用R7返回,这是C51的通用规范。其他参数都有相应规定。函数可以返回一个位,用psw的c位返回。c:上面的语句,执行顺序是把0x11给R7,然后跳转子程序,子程序将它加1后送回。
d:函数跳转到汇编程序时,本区的R0-R7,A,B,PSW,DPTR等寄存器可以供子程序使用,不必考虑调用后是否要恢复这些常规资源。上例中,A的值被函数使用了,编程者不必恢复调用前的值。
❼ 单片机C语言该怎么编写时钟程序
这个是简单的数码管时钟显示如果有需要,我写过比较完善的1602显示时钟.显示控制年月日等等.#include<reg51.h>
sbit Begin=P2^0;
sbit Hour=P2^1;
sbit Mus=P2^2;
sbit End=P2^3;
unsigned char code Tab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
unsigned char code num[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char Time[]={0,0,16,0,0,16,0,0};
unsigned char a;
unsigned int x,m,th;
void init()
{
TMOD=0x01;
TH0=(65535/50000)/256;
TL0=(65535/50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
unsigned char keyboard()
{
if(Begin==0){
delay(5);
if(Begin==0)
return 1;
}
if(Hour==0){
delay(30);
if(Hour==0)
return 2;
}
if(Mus==0)
return 3;
if(End==0)
return 4;
}
void display()
{
unsigned char i; for(i=0;i<8;i++)
{
P3=num[i];
P0=Tab[Time[i]];
delay(5);
}
}
void main()
{
unsigned char Key;
init();
Key=keyboard();
if(Key==1)
{
while(1){
Key=keyboard();
display();
if(Key==2)
x+=3600;
if(Key==3)
x+=1;
if(Key==4)
return;
}
}}
void holes() interrupt 1 using 2
{
TH0=(65535/50000)/256;
TL0=(65535/50000)%256;
a++;
if(a>=20)
{
x++;
m=x;
th=m/3600; //设置小时
Time[0]=th/10;
Time[1]=th%10;
m=m%3600; Time[2]=16; th=m/60; //设置分钟
Time[3]=th/10;
Time[4]=th%10;
m=m%60; Time[5]=16; th=m; //设置秒
Time[6]=th/10;
Time[7]=th%10; a=0;
}
}
❽ 如何用单片机编写一个八位循环计数器程序
x0为启动按钮,x1为停止按钮。y0~y7为8盏灯。程序在按下启动按钮后,灯1先亮,1秒(T0延时)后灭,1秒后(T1延时)灯2亮,依次循环。当按下x1后,循环结束。
❾ 单片机定时器的汇编语言程序编程
ORG 0000H
SJMP START
ORG 001BH
AJMP INT_TIMER1
ORG 0040H
START:
MOV TMOD,#20H
MOV TH1,#231
MOV TL1,#231
SETB ET1
SETB TR1
SETB EA
MOV P1,#00H
CLR A
SJMP $
INT_TIMER1:
JZ OUTOUT_HIGH
CLR P1.2
SJMP INC_A
OUTOUT_HIGH:
SETB P1.2
INC_A: INC A
CJNE A,#08H,SKIP_SET0
CLR A
SKIP_SET0:
RETI
END
❿ 用c++怎样编写51单片机程序
相信很多初学者都有同样的疑问,也有同样的希望。就是用C++语言来写单片机程序的源代码。现在我来解释一下单片机的源代码程序几乎没有人用C++来写的。x0dx0a1. 假设一下你现在用C++写完了一个程序代码。那么你要让单片机认识必须要编译吧,对吧 。请问你有合适的编译软件来编译你的代码吗?x0dx0a2. 就算有编译器能编译,你能保证它的代码效率一定能给单片机用吗?x0dx0a 单片机的ROM是K级的水平,执行指令的速度也远远小于PC。绝对不能和PC机相比的。这个就决定了单片机编程时很多时候要考虑它的代码效率和代码大小问题。所以一般情况下对于单片机编程我们之用汇编语言或者C语言。就算是用C写程序也要注意代码的效率等问题。x0dx0a 还有就是只有很大型的项目及应用程序开发才有可能有C++来写程序。一般的系统文件,应用程序都是用C来写的。有的系统代码甚至要用汇编语言来写。x0dx0a举个生活中的例子:如果你从家里去公司上班你一般的出行方式是什么?x0dx0a1.坐公车 2.骑车 3.自己开车 4.坐地铁 5.走过去。如果谁说他是做直升飞机去上班的。那要么这个人脑子不正常,要么就是太有钱了炫富。如果你要打苍蝇用苍蝇拍子就行了。如果要你用巡航导弹来打苍蝇,你认为可能吗?x0dx0a 所以我们单片机写程序的话一般就是汇编语言和C语言。几乎没有人用C++语言的。