单片机 用C语言 keil uVision2 编程 编一个红绿灯
将两个程序分别做成连个子程序,然后在主程序中调用就成了啊!
程序采用定时器T0定时,没有用软件延时。
;以下为汇编程序
org0000h
jmpstart
org0030h
start:
movtmod,#01h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
st:
movr2,#0
lpr2:setbp1.0
callt1500ms
clrP1.0
callt1500ms
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
jmpst
t1500ms:
movr7,#3
loop1:callt500ms
djnzr7,lpr7
ret
t500ms:
movr7,#100
loop1:callt50ms
djnzr7,lpr7
ret
t50ms:
clrtf0
movth0,#high(65536-50000)
movtl0,#low(65536-50000)
setbtr0
jnbtf0,$
clrtf0
ret
jmp$
end
//以下为C语言编程
#include
sbit P10=P1^0;
void delay50ms();
void delay500ms();
void delay1500ms();
main()
{
while(1)
{
P10=1;
delay1500ms();
P10=0;
delay500ms();
}
}
void delay50ms()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
while(!TF0);
TF0=0;
}
void delay500ms()
{
unsigned char i=10;
while(i--)delay50ms();
}
void delay1500ms()
{
unsigned char i=3;
while(i--)delay500ms();
}
#include<AT89X52.H>
#define LED_D P2
#define LED_S P1
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
sfr P1M0=0xB2;
unsigned int m,i,post1,post2;
unsigned int k=0,nums=1,n=1;
void timer1() interrupt 1 using 1
{
i++;
TH0=0XB1; //初始化
TL0=0XE0; //初始化
post1=9-(i/50%10);
post2=2-i/500;
m=i/25;
if(m==60)
i=0;
}
void initialize()
{
P0=0XFF ;
TMOD=0X01;
TR0=1;
TH0=0XB1;
TL0=0XE0;
}
void show()
{ switch(n)
{ case 1:
LED_D=table[post1];
LED_S=0x01;
break;
case 3:
LED_D=table[post2];
LED_S=0x02;
break;
}
if(n++==4)
n=1;
switch(nums)
{
case 1:
if(m<52)
P0=0XDE;
if(m>=52&&m<59)
{P0_0=1;
if(k++>=50000)
{
P0_1=!P0_1;
k=0;
}
}
if(m==59)
nums=2;
break;
case 2:
if(m<52)
P0=0XF3;
if(m>=52&&m<59)
{
P0_3=1;
if(k++>=50000)
{
P0_4=!P0_4;
k=0;
}
}
if(m==59)
nums=1;
break;
default: break;
}
}
void main()
{
initialize();
EA=1;
P1M0=0XF0;
ET0=1;
TR0=1;
while(1)
{
show();
}
}
这是带数码管显示的红绿灯,主要用了四位8段的数码管显示时间。如果需要详细的继续追问。
很简单,延时程序 调整下就ok了
void delay(int t)
{
unsigned int i, j;
j=t*60;
while(j--)
{
for(i=1000;i;i--);
}
} //约1秒延时
调用的时候调用 参数分别设为 3 15 就可以了
#include<reg52.h>
#define uchar unsigned char
void delayms(ms);
red=P0^0;
green=P0^1
yellow=P0^2;
int main(void)
{
while(1)
{
red=0;
delayms(15000);
red=1;
green=0;
delayms(15000);
green=1;
yellow=0;
delayms(3000);
}
}
return(0);
}
void delayms(ms)
{
uchar i;
for(ms;ms>0;ms--)
for(i=110;i>0;i--);
}
大琼邦诺: #include "reg51.h"main(){unsigned int i,j;while(1){P1=0xfe; //点亮第一个LEDfor(i=200;i>0;i--)for(j=500;j>0;j--);P1=0xfd; //点亮第二个LEDfor(i=200;i>0;i--)for(j=500;j>0;j--);P1=0xfb; //点亮第三个LEDfor(i=200;i>0;i--)for(j=500;j>...
全南县19457921056: keil和vc++,单片机编程 - ?
大琼邦诺: 1、从编程思路的角度说,单片机上用keil编程,和用VC++编程没什么不同;2、二者语言规则不同;3、主要不同在于二者针对的对象不同,所以编译架构也就不同.不一定非要用keil,也有很多别的编译软件,有支持汇编,也有支持C的,也有...
全南县19457921056: 所有的单片机都能运行用keil软件写的C语言程序吗? - ?
大琼邦诺: KEIL是用C语言编写单片机程序的,但是单片机并不认识C语言,KEIL还可以把扩展名为C的文件转换为扩展名为HEX的文件,绝大多数单片机都认识HEX文件.
全南县19457921056: 用keil软件如何将汇编与C语言结合起来一起编写单片机的程序 - ?
大琼邦诺: 在混合编程中,最常用也是最实用的方法是在C语言中加入部分汇编语言的代码,分为两种方法. 方法1)在Keil C51的函数中直接插入汇编语句 方法2)按照Keil C51接口规则,编写汇编模块方法1是利用编译控制命令#pragma asm(用来标识...
全南县19457921056: 用Keil uVision3软件进行51单片机c语言编程,定义变量a为无符号整形出错了?具体如下 - ?
大琼邦诺: 这个是因为你的单词unsigned写错了.unsigned int就是定义无符号整型数,它不会对编译造成任何影响的.
全南县19457921056: 初学单片机,在使用Keil uvision4 编译C语言文件时,提示如下: - ?
大琼邦诺: 看看是不是设备选型选错了 还有你的g的变量是不是定义错了
全南县19457921056: 怎么用KEIL调试单片机汇编程序 - ?
大琼邦诺: 首先打开KEIL软件 单机项目新建 选择芯片 在点击文件新建 然后保存(**.a或者**.c)然后输入程序 在然后就连接 编译 执行 下载 ok
全南县19457921056: 单片机在Keil中用C语言怎样在PO口输出地址和数据,怎样输出16位的地址和数据. - ?
大琼邦诺: 输出的是二进制数,至于是地址是数据要看你的外设控制端口的接法!ALE只是外部存储器的读写使能信号!只有在单片机没有任何程序,刚上电的时候,ALE输出1/6的Fosk,希望可以给你建议!
全南县19457921056: 汇编语言和c语言混编 用keil怎么写入单片机啊?求步骤!谢谢! - ?
大琼邦诺: #pragma asm 汇编代码#pragma endasm 这是写法 但是要完成这种写法需要进行设置 首先看到你keil左边那个工程列表 → 选中你嵌入了汇编的C文件 → 右键→选择Option for file 然后看到弹出的对话框 在对话框右边偏少 有5个复选框 初始的设置时 复选框前面全是灰色的勾 点击“Generate Assembler SRC File”和“Assemble SRC File”这两个选项 直到勾变成黑色 保存即完成设置
全南县19457921056: 用KEIL编写C语言程序实现:单片机是AT89C51,实现一个计时器,数码管为6为的,有三个按键接在P0上. - ?
大琼邦诺: 按照你的要求写的程序如下,你拿去测试吧!#include "REG52.H" sbit SHUG_01 = P2^0; //数码管1 sbit SHUG_02 = P2^1; //数码管2 sbit SHUG_03 = P2^2; //数码管3 sbit SHUG_04 = P2^3; //数码管4 sbit SHUG_05 = P2^4; //数码管5 ...