IO
口高低电平控制
功能:点亮
P1
口的一个
LED
灯
说明:该程序是学习单片机入门的第一个程序
就像我们学习英语时第一个要学字母
A
通过程序了解如何控制端口的高低电平
:
1278088276
日期:
2012.8
------------------------------------------------*/
#include<reg52.h>//
头文件,无需改动。时间学久了就会明白它的作用了。
//
就好比我们走路时一定要先穿双鞋。
sbit LED=P1^0
// sbit
是系统默认的一个关键字,
LED
则是自己给
P1^0
端口取的名字
//
这句话的功能就是给
P1^0
取个名字叫
LED
unsigned char i,j
//
定义变量
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
while (1)
//
主循环
{
For(i=1000i>0i--)
{
LED=1
//
将
P1.0
口赋值
1
,对外输出高电平
,
若二极管共阴,则点亮
//
二极管
}
For(i=1000i>0i--)
{
LED=0
//
将
P1.0
口赋值
0
,对外输出低电平
}
}
}
程序
2
:点亮一个二极管的第二个方法
/*-----------------------------------------------
名称:
IO
口高低电平控制
功能:点亮
P1
口的一个
LED
灯
说明:该程序是学习单片机入门的第一个程序
就像我们学习英语时第一个要学字母
A
通过程序了解如何控制端口的高低电平
:
1278088276
日期:
2012.8
------------------------------------------------*/
#include<reg52.h>
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
P1 = 0xFF
//P1
口全部为高电平,对应的
LED
灯全灭掉,
//FF
换算成二进制是
1111 1111
P1 = 0xFE
//P1
口的最低位点亮,可以更改数值是其他的灯点亮
//0xfe
是
16
进制,
0x
开头表示
16
进制数,
//fe
换算成二进制是
1111 1110
while (1)
//
主循环
{
//
主循环中添加其他需要一直工作的程序
}
}
程序
3
:点亮多个二极管
/*-----------------------------------------------
名称:点亮多个二极管
功能:点亮多个二极管
说明:该程序是学习单片机入门的第一个程序
就像我们学习英语时第一个要学字母
A
通过程序了解如何控制端口的高低电平
:
1278088276
日期:
2012.8
#include<reg52.h>
sbit LED0=P1^0//
用
sbit
关键字
定义
LED
到
P1.0
端口,
sbit LED1=P1^1//LED
是自己任意定义且容易记忆的符号
sbit LED2=P1^2
sbit LED3=P1^3
sbit LED4=P1^4
sbit LED5=P1^5
sbit LED6=P1^6
sbit LED7=P1^7
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
LED0=0
//
将
P1.0
口赋值
0
,对外输出低电平
LED1=1
//
将
P1.1
口赋值
1
,对外输出低电平
LED2=0
LED3=1
LED4=0
LED5=1
LED6=0
LED7=1
while (1)
//
主循环
{
//
主循环中添加其他需要一直工作的程序
}
}
相信很多初学者都有同样的疑问,也有同样的希望。就是用C++语言来写单片机程序的源代码。现在我来解释一下单片机的源代码程序几乎没有人用C++来写的。\x0d\x0a1. 假设一下你现在用C++写完了一个程序代码。那么你要让单片机认识必须要编译吧,对吧 。请问你有合适的编译软件来编译你的代码吗?\x0d\x0a2. 就算有编译器能编译,你能保证它的代码效率一定能给单片机用吗?\x0d\x0a单片机的ROM是K级的水平,执行指令的速度也远远小于PC。绝对不能和PC机相比的。这个就决定了单片机编程时很多时候要考虑它的代码效率和代码大小问题。所以一般情况下对于单片机编程我们之用汇编语言或者C语言。就算是用C写程序也要注意代码的效率等问题。\x0d\x0a还有就是只有很大型的项目及应用程序开发才有可能有C++来写程序。一般的系统文件,应用程序都是用C来写的。有的系统代码甚至要用汇编语言来写。\x0d\x0a举个生活中的例子:如果你从家里去公司上班你一般的出行方式是什么?\x0d\x0a1.坐公车 2.骑车 3.自己开车 4.坐地铁 5.走过去。如果谁说他是做直升飞机去上班的。那要么这个人脑子不正常,要么就是太有钱了炫富。如果你要打苍蝇用苍蝇拍子就行了。如果要你用巡航导d来打苍蝇,你认为可能吗?\x0d\x0a所以我们单片机写程序的话一般就是汇编语言和C语言。几乎没有人用C++语言的。/*这是用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!='\0') //直到字符串结束
{
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=0i<8i++) //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=0i<8i++)
{
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=0j<nj++)
{
_nop_()
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)