导航:首页 > 操作系统 > 单片机程序编写正确案例

单片机程序编写正确案例

发布时间:2023-08-20 20:40:08

单片机实验 编写程序

单片机实验,其实这就是典型的流水灯电路,P1口接8个流水灯,每个灯点亮1秒。用定时器T1定时50ms,中断20次就为1秒,可用_crol_()移位函数实现。仿真效果如下图所示。

Ⅱ c51单片机程序实例

#include<reg51.h>
#defineucharunsignedchar
uchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0到9
ucharnum,cnt,disn;
ucharkeyval,disk;
ucharled[]={1,2,3,4};
voiddealdat(uchara)
{
led[0]=0;
led[1]=0;
led[2]=0;
led[3]=0;
led[a]=disk;
}
voiddelay(unsignedinta)
{
unsignedinti,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
voidt0isr()interrupt1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
switch(num)
{
case0:P2=0x01;break;
case1:P2=0x02;break;
case2:P2=0x04;break;
case3:P2=0x08;break;
default:break;
}
P0=~tab[led[num]];
num++;
num&=0x03;
cnt++;
if(cnt>100)
{
cnt=0;
disn++;
disn%=4;
dealdat(disn);
}
}

ucharkbscan(void)
{
unsignedcharsccode,recode;
P3=0x0f;//发0扫描,列线输入
if((P3&0x0f)!=0x0f)//有键按下
{
// delay(20);//延时去抖动
if((P3&0x0f)!=0x0f)
{
sccode=0xef;//逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return0;//无键按下,返回0
}

voidgetkey(void)
{
unsignedcharkey;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{
case0x11:keyval=7;break;
case0x12:keyval=4;break;
case0x14:keyval=1;break;
case0x18:keyval=10;break;
case0x21:keyval=8;break;
case0x22:keyval=5;break;
case0x24:keyval=2;break;
case0x28:keyval=0;break;
case0x41:keyval=9;break;
case0x42:keyval=6;break;
case0x44:keyval=3;break;
case0x48:keyval=11;break;
case0x81:keyval=12;break;
case0x82:keyval=13;break;
case0x84:keyval=14;break;
case0x88:keyval=15;break;
default:keyval=0xff;break;
}
}

main()
{
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
getkey();
if(keyval!=0xff)disk=keyval;
delay(10);
}

}

Ⅲ 单片机应用程序的开发步骤

具体步骤如下:

1、首先,开启我们的keil软件,具体的安装步骤就不做太多的介绍了;

开启后,点击菜单栏上的Project选项,创建我们的工程,如图所示;

编译完成后,在我们的文件夹下找到.hex的文件,将其烧写到我们的芯片中即可。

Ⅳ 编写一个完整的单片机C51程序

#include<reg51.h>
sbit led=P1^0; //单片机管脚位声明
void main()
{
TMOD=0x01; //定时器TO工作在方式1
TH0=(65536-5000)/256; //装初值,12M晶振 1为1us; 5000为5000us=5ms;
TL0=(65536-5000)%256;
EA =1; //开总中断
ET0=1; //开定时器TO中断
TR0=1; //启动定时器
P1=0; //初始化P1口
while(1) ; //程序在这里等待中断发生
}
void T0_time() interrupt 1
{
unsigned char num;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num++;
if(num==100) //0.5S (1s闪烁1次==0.5S亮0.5S灭)
{
num=0;
led=~led; //led状态取反
}
}

Ⅳ 51单片机程序编写(劳驾写得详细一点)

#include <reg51.h>
void delay(unsigned int n)
{
while(n--);
}
void main()
{
char i;
//可以编好想要怎么流水的灯位的状态
unsigned char led[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
while(1)
{
for(i=0;i<8;i++)
{
P1=led[i]; //LED接在P1口
delay(10000);
}
for(i=0;i<8;i++)
{
P1=led[8-i];
delay(10000);
}
}
}

Ⅵ 用c语言编写单片机流水灯程序,(8个发光二极管从左至右循环点亮)

#include<reg51.h>

voiddelay(void)

{

unsignedinti,j;

for(i=0;i<200;i++)

for(j=0;j<1000;j++)

;

}

voidmain(void)

{

while(1)

{

P3=0xfe;//第一个灯亮

delay();//延时

P3=0xfd;//第二个灯亮

delay();

P3=0xfb;//第三个灯亮

delay();

P3=0xf7;//第四个灯亮

delay();

P3=0xef;//第五个灯亮

delay();

P3=0xdf;//第六个灯亮

delay();

P3=0xbf;//第七个灯亮

delay();

P3=0x7f;//第八个灯亮

delay();

}

}

(6)单片机程序编写正确案例扩展阅读

单片机C语言16种方式流水灯

voidmain()

{

while(1)

{

P1=0xfe;//点亮第一个发光管

Delay(5000);

P1=0xfd;//点亮第二个发光管

Delay(5000);

P1=0xfb;

Delay(5000);

P1=0xf7;

Delay(5000);

P1=0xef;

Delay(5000);

P1=0xdf;

Delay(5000);

P1=0xbf;

Delay(5000);

P1=0x7f;//点亮第八个发光管

}

}

Ⅶ 单片机的程序怎么编写

你可以先把0放到一个单元里面,比如说100h,然后
mov
r0,100h
inc
100h
mov
r1,100h
inc
100h
继续写下去就可以了。

Ⅷ 51单片机程序编写

/*这是用LCD显示所测温度的代码,你参考一下,如果没问题的话,其他的功能你再添加就好了,不难*/

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

#define Nack_number 10

//**************端口定义**************************************************

uchar flag; //LCD控制线接口

sbit RS=P1^0; //RS端

sbit RW=P1^1; //读写端

sbit LCDE=P2^5; //使能端

//mlx90614端口定义

sbit SCK=P2^1; //时钟线

sbit SDA=P2^2; //数据线

//************数据定义****************************************************

bdata uchar flag1; //可位寻址数据

sbit bit_out=flag1^7;

sbit bit_in=flag1^0;

uchar tempH,tempL,err;


//************************** LCD1602 ***********************************

//向LCD写入命令或数据*****************************************************

#define LCD_COMMAND 0 //命令

#define LCD_DATA 1 // 数据

#define LCD_CLEAR_SCREEN 0x01 // 清屏

#define LCD_HOMING 0x02 // 光标返回原点

//设置显示模式******* 0x08+ *********************************************

#define LCD_SHOW 0x04 //显示开

#define LCD_HIDE 0x00 //显示关

#define LCD_CURSOR 0x02 //显示光标

#define LCD_NO_CURSOR 0x00 //无光标

#define LCD_FLASH 0x01 //光标闪动

#define LCD_NO_FLASH 0x00 //光标不闪动

//设置输入模式********** 0x04+ ********************************************

#define LCD_AC_UP 0x02 //光标右移 AC+

#define LCD_AC_DOWN 0x00 //默认 光标左移 AC-

#define LCD_MOVE 0x01 //画面可平移

#define LCD_NO_MOVE 0x00 //默认 画面不移动


//************************** mlx90614 ***********************************

//command mode 命令模式

#define RamAccess 0x00 //对RAM操作

#define EepomAccess 0x20 //对EEPRAM操作

#define Mode 0x60 //进入命令模式

#define ExitMode 0x61 //退出命令模式

#define ReadFlag 0xf0 //读标志

#define EnterSleep 0xff //进入睡眠模式

//ram address read only RAM地址(只读)

#define AbmientTempAddr 0x03 //周围温度

#define IR1Addr 0x04

#define IR2Addr 0x05

#define LineAbmientTempAddr 0x06 //环境温度

/*0x0000 0x4074 16500 0.01/单元

-40 125*/

#define LineObj1TempAddr 0x07 //目标温度,红外温度

/*0x27ad-0x7fff 0x3559 22610 0.02/单元

-70.01-382.19 0.01 452.2*/

#define LineObj2TempAddr 0x08

//eepom address EEPROM地址

#define TObjMaxAddr 0x00 //测量范围上限设定

#define TObjMinAddr 0x01 //测量范围下限设定

#define PWMCtrlAddr 0x02 //PWM设定

#define TaRangeAddr 0x03 //环境温度设定

#define KeAddr 0x04 //频率修正系数

#define ConfigAddr 0x05 //配置寄存器

#define SMbusAddr 0x0e //器件地址设定

#define Reserverd1Addr 0x0f //保留

#define Reserverd2Addr 0x19 //保留

#define ID1Addr 0x1c //ID地址1

#define ID2Addr 0x1d //ID地址2

#define ID3Addr 0x1e //ID地址3

#define ID4Addr 0x1f //ID地址4


//************函数声明*****************************************************

void start(); //MLX90614发起始位子程序

void stop(); //MLX90614发结束位子程序

uchar ReadByte(void); //MLX90614接收字节子程序

void send_bit(void); //MLX90614发送位子程序

void SendByte(uchar number); //MLX90614接收字节子程序

void read_bit(void); //MLX90614接收位子程序

void delay(uint N); //延时程序

uint readtemp(void); //读温度数据

void init1602(void); //LCD初始化子程序

void busy(void); //LCD判断忙子程序

void cmd_wrt(uchar cmd); //LCD写命令子程序

void dat_wrt(uchar dat); //LCD写数据子程序

void display(uint Tem); //显示子程序

void Print(uchar *str); //字符串显示程序


//*************主函数*******************************************

void main()

{

uint Tem; //温度变量

SCK=1;

SDA=1;

delay(4);

SCK=0;

delay(1000);

SCK=1;

init1602(); //初始化LCD

while(1)

{

Tem=readtemp(); //读取温度

cmd_wrt(0x01); //清屏

Print(" Temperature: "); //显示字符串 Temperature: 且换行

display(Tem); //显示温度

Print(" ^C"); //显示摄氏度

delay(10000); //延时再读取温度显示

}

}

void Print(uchar *str) //字符串显示程序

{

while(*str!='') //直到字符串结束

{

dat_wrt(*str); //转成ASCII码

str++; //指向下一个字符

}

}


//*********输入转换并显示*********

void display(uint Tem)

{

uint T,a,b;

T=Tem*2;

if(T>=27315) //温度为正

{

T=T-27315; //

a=T/100; //温度整数

b=T-a*100; //温度小数

if(a>=100) //温度超过100度

{

dat_wrt(0x30+a/100); //显示温度百位

dat_wrt(0x30+a%100/10); //显示温度十位

dat_wrt(0x30+a%10); //显示温度个位

}

else if(a>=10) //温度超过10度

{

dat_wrt(0x30+a%100/10); //显示温度十位

dat_wrt(0x30+a%10); //显示温度个位

}

else //温度不超过10度

{

dat_wrt(0x30+a); //显示温度个位

}

dat_wrt(0x2e); //显示小数点

if(b>=10) //温度小数点后第1位数不等于0

{

dat_wrt(0x30+b/10); //显示温度小数点后第1位数

dat_wrt(0x30+b%10); //显示温度小数点后第2位数

}

else //温度小数点后第1位数等于0

{

dat_wrt(0x30); //显示温度小数点后第1位数0

dat_wrt(0x30+b); //显示温度小数点后第2位数

}

}

else //温度为负

{

T=27315-T;

a=T/100;

b=T-a*100;

dat_wrt(0x2d); //显示负号

if(a>=10) //温度低于负10度

{

dat_wrt(0x30+a/10); //显示温度十位

dat_wrt(0x30+a%10); //显示温度个位

}

else //温度高于负10度

{

dat_wrt(0x30+a); //显示温度个位

}

dat_wrt(0x2e); //显示小数点

if(b>=10) //温度小数点后第1位数不等于0

{

dat_wrt(0x30+b/10); //显示温度小数点后第1位数

dat_wrt(0x30+b%10); //显示温度小数点后第2位数

}

else //温度小数点后第1位数等于0

{

dat_wrt(0x30); //显示温度小数点后第1位数0

dat_wrt(0x30+b); //显示温度小数点后第2位数

}

}

}

//************************************

void start(void) //停止条件是 SCK=1时,SDA由1到0

{

SDA=1;

delay(4);

SCK=1;

delay(4);

SDA=0;

delay(4);

SCK=0;

delay(4);

}

//------------------------------

void stop(void) //停止条件是 SCK=1时,SDA由0到1

{

SCK=0;

delay(4);

SDA=0;

delay(4);

SCK=1;

delay(4);

SDA=1;

}

//---------发送一个字节---------

void SendByte(uchar number)

{

uchar i,n,dat;

n=Nack_number; //可以重发次数

Send_again:

dat=number;

for(i=0;i<8;i++) //8位依次发送

{

if(dat&0x80) //取最高位

{

bit_out=1; //发1

}

else

{

bit_out=0; //发0

}

send_bit(); //发送一个位

dat=dat<<1; //左移一位

}

read_bit(); //接收1位 应答信号

if(bit_in==1) //无应答时重发

{

stop();

if(n!=0)

{

n--; //可以重发Nack_number=10次

goto Repeat; //重发

}

else

{

goto exit; //退出

}

}

else

{

goto exit;

}

Repeat:

start(); //重新开始

goto Send_again; //重发

exit: ; //退出

}

//-----------发送一个位---------

void send_bit(void)

{

if(bit_out==1)

{

SDA=1; //发1

}

else

{

SDA=0; //发0

}

_nop_();

SCK=1; //上升沿

delay(4);delay(4);

SCK=0;

delay(4);delay(4);

}

//----------接收一个字节--------

uchar ReadByte(void)

{

uchar i,dat;

dat=0; //初值为0

for(i=0;i<8;i++)

{

dat=dat<<1; //左移

read_bit(); //接收一位

if(bit_in==1)

{

dat=dat+1; //为1时对应位加1

}

}

SDA=0; //发送应答信号0

send_bit();

return dat; //带回接收数据

}

//----------接收一个位----------

void read_bit(void)

{

SDA=1; //数据端先置1

bit_in=1;

SCK=1; //上升沿

delay(4);delay(4);

bit_in=SDA; //读数据

_nop_();

SCK=0;

delay(4);delay(4);

}



//------------------------------

uint readtemp(void)

{

SCK=0;

start(); //开始条件

SendByte(0x00); //发送从地址00

SendByte(0x07); //发送命令

start(); //开始条件

SendByte(0x01); //读从地址00

bit_out=0;

tempL=ReadByte(); //读数据低字节

bit_out=0;

tempH=ReadByte(); //读数据高字节

bit_out=1;

err=ReadByte(); //读错误信息码

stop(); //停止条件

return(tempH*256+tempL);

}

//******************LCD显示子函数***********************

void init1602(void) //初始化LCD

{

cmd_wrt(0x01); //清屏

cmd_wrt(0x0c); //开显示,不显示光标,不闪烁

cmd_wrt(0x06); //完成一个字符码传送后,光标左移,显示不发生移位

cmd_wrt(0x38); //16×2显示,5×7点阵,8位数据接口

}

void busy(void) //LCD忙标志判断

{

flag=0x80; //赋初值 高位为1 禁止

while(flag&0x80) //读写操作使能位禁止时等待 继续检测

{

P0=0xff;

RS=0; //指向地址计数器

RW=1; //读

LCDE=1; //信号下降沿有效

flag=P0; //读状态位 高位为状态

LCDE=0;

}

}

void cmd_wrt(uchar cmd) //写命令子函数

{

LCDE=0;

busy(); //检测 读写操作使能吗

P0=cmd; //命令

RS=0; //指向命令计数器

RW=0; //写

LCDE=1; //高电平有效

LCDE=0;

}

void dat_wrt(uchar dat) //写数据子函数

{

busy(); //检测 读写操作使能吗

LCDE=0;

if(flag==16)

{

RS=0; //指向指令寄存器

RW=0; //写

P0=0XC0; //指向第二行

LCDE=1; //高电平有效

LCDE=0;

}

RS=1; //指向数据寄存器

RW=0; //写

P0=dat; //写数据

LCDE=1; //高电平有效

LCDE=0;

}

//------------延时--------------

void delay(uint n)

{

uint j;

for(j=0;j<n;j++)

{

_nop_();

}

}


Ⅸ 单片机汇编语言程序,我想写一个循环点亮的LED,然后用外部中断0接到一个按键上,怎么写我需要详细的程序

循环点亮LED灯,也就是流水灯效果的控制,可以用定时器来控制,这样做相对代码量较少而时间比较精确,外部中断0接以按键,可以控制动态效果的启停。程序如下:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXT0 ;外部中断0,控制流水灯启停
ORG 000BH
LJMP T0ISR ;定时0控制流水灯循环点亮
ORG 0030H
MAIN:
MOV TMOD,#01H ;设置定时器0工作模式
MOV TH0,#HIGH(65536-60000) ;60毫秒定时
MOV TL0,#LOW(65536-60000)
SETB ET0
SETB EA
MOV A,#0FEH ;LED等初始化
MOV P0,A
SJMP $
EXT0:
CPL TR0
RETI
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-60000)
MOV TL0,#LOW(65536-60000)
SETB ET0
RL A
MOV P0,A ;循环点亮LED灯
RETI
END

阅读全文

与单片机程序编写正确案例相关的资料

热点内容
计算机专业学51单片机 浏览:206
程序员不接受反驳 浏览:294
微软自带的压缩软件 浏览:286
中国玩家在日本服务器做什么 浏览:48
12864和单片机 浏览:898
25匹空调压缩机 浏览:649
adkandroid下载 浏览:308
如何在苹果电脑上装python 浏览:327
哪个app的跑步训练内容最丰富 浏览:583
广讯通怎么删除文件夹 浏览:206
解压的视频化妆品 浏览:674
易语言新进程监视源码 浏览:941
turbo码译码算法 浏览:956
stc11f16xe单片机 浏览:282
linuxupdate命令行 浏览:578
pdf转化成wps 浏览:765
php抛出错误 浏览:159
买车看车用什么app 浏览:656
dos怎么清除屏幕上的命令 浏览:813
压缩裤冬天 浏览:449