四、定时器0控制数码管一亮一灭 实验内容:
0.5定时时间一到,数码管闪烁一次;
实验电路图:
源程序:
#include \#include \
#define LED (1 << 7) /* P0.7引脚控制LED,低电平点亮 */ /* 函数名称:main()
* 函数功能:通过查询定时器0中断标志位控制LED点亮*/ int main(void)
{ PINSEL1 = 0x00000000; // 设置管脚连接GPIO IO0DIR = LED; // 设置LED控制口输出 T0TC = 0; // 定时器0初始化 T0PR = 99; // 设置定时器0分频为100分频,得120000Hz T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC T0MR0 = 60024; // 比较值(0.5s定时值) T0TCR = 0x03; // 启动并复位T0TC T0TCR = 0x01; while (1) { while ((T0IR & 0x01) == 0); // 等待定时时间到 T0IR = 0x01; // 清除中断标志 if ((IO0SET & LED) == 0) // 取反LED状态 IO0SET = LED; else IO0CLR = LED; } }
五、数码管动态显示 实验电路图:
源程序:
#include\void delay(uint32 x) { uint8 i; while(x--) for(i=500000;i>0;i--); }
uint8 table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };
uint8 table1[]={ 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
int main(void) { uint8 i,j,p=16; PINSEL0=0x00000000; PINSEL1=0x00000000; IO0DIR=0x00ffff00; while(1) { for(i=0;i<8;i++) { IO0CLR=IO0CLR|0xff00; IO0SET=~table[i]<<8;
for(j=0;j<8;j++) {
IO0CLR=IO0CLR|0xff0000; IO0SET=1<
六、将读取的DS18B20温度值转换为十进制 实验电路图:
#include \ #include \
uint8
}
/************************************
Tp[12]; *************************************
*** // 温度显示数据
uint16 tt; * 函数名称:ConvertTemperature() uint8 TMark = 0; * 函数功能: 将读取的 DS18B20 温度值转换// 温度正负标志 为十进制数 * 入口参数:tvalue 读取的DS18B20当前温/************************************度值 ***************************************************************************** *************************************
**/ * 函数名称:Init()
void ConvertTemperature(uint16 tvalue){ * 函数功能:I/O端口初始化,设置引脚连
Tp[1] = tvalue/1000+0x30; 接模块
************************************* // 百位数 ************************************* Tp[2] = tvalue00/100+0x30; **/ // 十位数 void Init(void){ Tp[3] = tvalue0/10+0x30; PINSEL0 |= 0x00000000; // 设置引脚连// 个位数
Tp[4] = 0x2E; 接模块
PINSEL1 |= 0x00000088; // 显示小数点 PINSEL2 &= 0x00000004; Tp[5] = tvalue+0x30;
for (i=0; i<50000; i++); // 显示温度小数位
Tp[6] = 0x01; }
// 显示自定义字符,用于温度符号显示
Tp[7]= 0x43; /************************************
*************************************// 显示字符\
Tp[8]= 0x20; *** // 显示字符\ * 函数名称:main() Tp[9]= 0x20; * 函数功能:主函数
// 显示字符\
Tp[10]= 0x20; // 显示字符\
Tp[11]= 0x20; // 显示字符\
if (TMark == 0){ Tp[0] = 0x20; // 正温度不显示符号
} else{ Tp[0] = 0x2D; // 负温度显示负号:- } if (Tp[1] == 0x30){ Tp[1] = 0x20; // 如果百位为0,不显示
if (Tp[2] == 0x30){ Tp[2] = 0x20; // 如果十位为0,不显示
} } } /**************************************************************************** * 函数名称:DelayNS()
* 函数功能:软件延时
* 入口参数:dly 延时参数,值越大,延时
越久
****************************************************************************/ void DelayNS(uint32 dly){ uint32 i; for ( ; dly>0; dly--)
************************************* *************************************
**/ int main(void){
uint8 i; Init(); // I/O 端口初始化
lcd_init(); // LCD初始化 DisText(0x80,\ for(i=0;i<110;i++)ReadTemp(); // 预读DS18B20 while (1){ ConvertTemperature(ReadTemp()); // 温度转换
DisText(0xc4,Tp); // 显示当前温度 }
}
七、LCD 1602显示1 实验电路图:
源程序:
#include \#define rs (1<<5) #define rw (1<<6) #define en (1<<7) #define busy (1<<15)
/****************************************************************************
* 函数名称:ChkBusy()
* 函数功能:检查总线是否忙
****************************************************************************/
void ChkBusy() { IO0DIR=0xf0; while(1) { IO0CLR=rs; IO0SET=rw; IO0SET=en;
if(!(IO0PIN & busy))break;
IO0CLR=en; } IO0DIR=0xffffffff; }
/****************************************************************************
* 函数名称:WrOp() * 函数功能:写命令
* 入口参数:dat,待写入LCD的命令 ****************************************************************************/
void WrOp(uint8 dat) { ChkBusy(); IO0CLR=rs; IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数