导航:首页 > 操作系统 > pic单片机c语言视频教程

pic单片机c语言视频教程

发布时间:2023-09-02 05:59:20

❶ PIC单片机C语言

这是个宏定义,他的作用就是用AN0替代CHS2=0;CHS1=0;CHS0=0;

在程序中,当你要用到CHS2=0;CHS1=0;CHS0=0;时,只需要写上AN0就行了。

程序编译时,编译器会自动把AN0再换成CHS2=0;CHS1=0;CHS0=0;进行编译。

有问题请追问。

❷ 单片机C语言程序设计实训100例:基于PIC+Proteus仿真的目录

第1章PIC单片机C语言程序设计概述
1.1 PIC单片机简介
1.2 MPLAB+C语言程序开发环境安装及应用
1.3 PICC/PICC18/MCC18程序设计基础
1.4 PIC单片机内存结构
1.5 PIC单片机配置位
1.6 基本的I/O端口编程
1.7 中断服务程序设计
1.8 PIC单片机外设相关寄存器
1.9 C语言程序设计在PIC单片机应用系统开发中的优势
第2章PROTEUS操作基础
2.1 PROTEUS操作界面简介
2.2 仿真电路原理图设计
2.3 元件选择
2.4 仿真运行
2.5 MPLAB IDE与PROTEUS的联合调试
2.6 PROTEUS在PIC单片机应用系统开发中的优势
第3章 基础程序设计
3.1 闪烁的LED
3.2 用双重循环控制LED左右来回滚动显示
3.3 多花样流水灯
3.4 LED模拟交通灯
3.5 单只数码管循环显示0~9
3.6 4只数码管滚动显示单个数字
3.7 8只数码管扫描显示多个不同字符
3.8 K1~K5控制两位数码管的开关、加减与清零操作
3.9 数码管显示4×4键盘矩阵按键
3.10 数码管显示拨码开关编码
3.11 继电器及双向可控硅控制照明设备
3.12 INT中断计数
3.13 RB端口电平变化中断控制两位数码管开关与加减显示
3.14 TIMER0控制单只LED闪烁
3.15 TIMER0控制流水灯
3.16 TIMER0控制数码管扫描显示
3.17 TIMER1控制交通指示灯
3.18 TIMER1与TIMER2控制十字路口秒计时显示屏
3.19 用工作于同步计数方式的TMR1实现按键或脉冲计数
3.20 用定时器设计的门铃
3.21 报警器与旋转灯
3.22 用工作于捕获方式的CCP1设计的频率计
3.23 用工作于比较模式的CCP1控制音阶播放
3.24 CCP1 PWM模式应用
3.25 模拟比较器测试
3.26 数码管显示两路A/D转换结果
3.27 EEPROM读写与数码管显示
3.28 睡眠模式及看门狗应用测试
3.29 单片机与PC双向串口通信仿真
3.30 PIC单片机并行从动端口PSP读写测试
第4章 硬件应用
4.1 74HC138与74HC154译码器应用
4.2 74HC595串入并出芯片应用
4.3 用74HC164驱动多只数码管显示
4.4 数码管BCD解码驱动器7447与4511应用
4.5 8×8LED点阵屏显示数字
4.6 8位数码管段位复用串行驱动芯片MAX6951应用
4.7 串行共阴显示驱动器MAX7219与7221应用
4.8 14段与16段数码管串行驱动显示
4.9 16键解码芯片74C922应用
4.10 1602LCD字符液晶测试程序
4.11 1602液晶显示DS1302实时时钟
4.12 1602液晶工作于4位模式实时显示当前时间
4.13 带RAM内存的实时时钟与日历芯片PCF8583应用
4.14 2×20串行字符液晶演示
4.15 LGM12864液晶显示程序
4.16 PG160128A液晶图文演示
4.17 TG126410液晶串行模式显示
4.18 HDG12864系列液晶演示
4.19 Nokia7110液晶菜单控制程序
4.20 8通道模拟开关74HC4051应用测试
4.21 用带I2C接口的MCP23016扩展16位通用I/O端口
4.22 用带SPI接口的MCP23S17扩展16位通用I/O端口
4.23 用I2C接口控制MAX6953驱动4片5×7点阵显示器
4.24 用I2C接口控制MAX6955驱动16段数码管显示
4.25 用带SPI接口的数/模转换器MCP4921生成正弦波形
4.26 用带SPI接口的数/模转换器MAX515控制LED亮度循环变化
4.27 正反转可控的直流电机
4.28 PWM控制MOSFET搭建的H桥电路驱动直流电机运行
4.29 正反转可控的步进电机
4.30 用L297+L298控制与驱动步进电机
4.31 PC通过RS-485器件MAX487远程控制单片机
4.32 I2C接口DS1621温度传感器测试
4.33 SPI接口温度传感器TC72应用测试
4.34 温度传感器LM35全量程应用测试
4.35 K型热电偶温度计
4.36 用铂电阻温度传感器PT100设计的测温系统
4.37 DS18B20温度传感器测试
4.38 SHT75温湿度传感器测试
4.39 1-Wire式可寻址开关DS2405应用测试
4.40 光敏电阻应用测试
4.41 MPX4250压力传感器测试
4.42 用I2C接口读写存储器AT24C04
4.43 用SPI接口读写AT25F1024
4.44 PIC18 I2C接口存储器及USART接口测试程序
4.45 PIC18 SPI接口存储器测试程序
4.46 PIC18定时器及A/D转换测试
4.47 用PIC18控制Microwire接口继电器驱动器MAX4820
4.48 MMC存储卡测试
4.49 ATA硬盘数据访问
4.50 微芯VLS5573液晶显示屏驱动器演示
第5章 综合设计
5.1 用DS1302/DS18B20+MAX6951设计的多功能电子日历牌
5.2 用PCF8583设计高仿真数码管电子钟
5.3 用4×20LCD与DS18B20设计的单总线多点温度监测系统
5.4 用内置EEPROM与1602液晶设计的加密电子密码锁
5.5 用PIC单片机与1601LCD设计的计算器
5.6 电子秤仿真设计
5.7 数码管显示的GP2D12仿真测距警报器
5.8 GPS全球定位系统仿真
5.9 能接收串口信息的带中英文硬字库的80×16点阵显示屏
5.10 用M145026与M145027设计的无线收发系统
5.11 红外遥控收发仿真
5.12 交流电压检测与数字显示仿真
5.13 带位置感应器的直流无刷电机PMW控制仿真
5.14 3端可调正稳压器LM317应用测试
5.15 模拟射击训练游戏
5.16 带触摸屏的国际象棋游戏仿真
5.17 温室监控系统仿真
5.18 PIC单片机MODBUS总线通信仿真
5.19 PIC单片机内置CAN总线通信仿真
5.20 基于PIC18+Microchip TCP/IP协议栈的HTTP服务器应用
参考文献

❸ PIC单片机C语言

是左移,>>表示右移动

相当于 HC595_DATA_HIGH PORTC |0x01;

如果是HC595_DATA_HIGH PORTC |=(1<<2),1左移2位,那就是0000 0100
相当于 HC595_DATA_HIGH PORTC |0x04;
就是把 HC595_DATA_HIGH PORTC这个数的2位(0,1,2----第三位与1进行或运算)

注意:这里指的是位运算,上面的0x01,0x04在 或运算的时候可以这么写,因为其他位都是0,没有关系

❹ 单片机教程

王云 51单片机教程,就很好,身边很多同学在用。

❺ 在pic中如何用C语言编写程序

//09/10/24
//lcd1602显示时间 日期 星期 温度
//通过按键校时:K10--小时,K11--分钟,K12--秒(归零),K13-星期,BR1--年,RB2--月,RB3--日。
//芯片要求:PIC16F877A

#include<pic.h> //包含单片机内部资源预定义
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

#define i_o RB4 //定义DS1302的数据口
#define sclk RB0 //定义DS1302的时钟口
#define rst RB5 //定义DS1302的复位口
#define rs RA1 //1602
#define rw RA2
#define e RA3
# define DQ RA0 //定义18B20数据端口

unsigned char TLV=0 ; //采集到的温度高8位
unsigned char THV=0; //采集到的温度低8位

unsigned char ;
unsigned char shi; //整数十位
unsigned char ge; //整数个位
unsigned char shifen; //十分位
float temp;

void display();

//定义读取时间和日期存放表格
char table1[7];
//定义0-9的显示代码
const char table2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char rx_data,read_data,count,sec,min,hour,day,mon,week,year,time;

//----------------------------------------------
//ds18b20部分
//------------------------------------------------
//延时函数
void delay1(unsigned int x)
{
unsigned int i;
for(i=x;i>0;i--);
}

//------------------------------------------------
//延时函数
void delay2(char x,char y)
{
char z;
do{
z=y;
do{;}while(--z);
}while(--x);
}
//其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。
//则是:14+(3*(Y-1)+7)*(X-1)。

//***************************************
//初始化ds18b20
void ds18b20_init()
{
char presence=1;
while(presence)
{
TRISA0=0; //主机拉至低电平
DQ=0;
delay2(2,99); //延时503us
TRISA0=1; //释放总线等电阻拉高总线,并保持15~60us
delay2(2,8); //延时70us
if(DQ==1) presence=1; //没有接收到应答信号,继续复位
else presence=0; //接收到应答信号
delay2(2,60); //延时430us
}
}

//*****************************************************
//写ds18b20
void ds18b20_write_byte(unsigned char code)
{
unsigned char i,k;
for(i=8;i>0;i--)
{
k=code&0x01;
TRISA0=0;
DQ=0; //数据线拉低产生时间片
asm("nop");
asm("nop");
if(k) DQ=1; //写1则拉高数据电平
delay1(3); //延时42us,ds18b20对数据线采样
asm("nop");
TRISA0=1; //采样结束,释放总线,拉高电平
code=code>>1;
delay1(7); //延时82us
}
}

//****************************************************
//读ds18b20
unsigned char ds18b20_read_byte()
{
unsigned char i,k;
for(i=8;i>0;i--)
{
k=k>>1;
TRISA0=0;
DQ=0; //数据线拉低再拉高产生读时间片
asm("nop");
asm("nop");
TRISA0=1;
asm("nop");
asm("nop");
if(DQ) k=k|0x80; //15us内要完成读位
delay1(6); //延时72us后释放总线
}
return (k);
}

//********************************************
//启动温度转换函数
void get_temp()
{
int i;
signed int t;
TRISA0=1;
ds18b20_init(); //复位等待从机应答
ds18b20_write_byte(0XCC); //忽略ROM匹配
ds18b20_write_byte(0X44); //发送温度转化命令
for(i=2;i>0;i--)
{

display(); //调用多次显示函数,确保温度转换完成所需要的时间
}
ds18b20_init(); //再次复位,等待从机应答
ds18b20_write_byte(0XCC); //忽略ROM匹配
ds18b20_write_byte(0XBE); //发送读温度命令
TLV=ds18b20_read_byte(); //读出温度低8
THV=ds18b20_read_byte(); //读出温度高8位
TRISA0=1; //释放总线

t=THV<<8;
t=t|TLV;
if(t<0) //负温度
{
temp=(~t+1)*0.0625*10+0.5; //负温度时,取反加1再乘以0.0625得实际温度,乘10+0.5显示小数点一位,且四舍五入
}
else
temp=t*0.0625*10+0.5; //正温度
if(t<0)
='-'; //负温度时百位显示负号
else
=(const) temp/1000+0x30; //百位
shi=((const) temp%1000)/100; //十位
ge=((const) temp%1000)%100/10; //个位
shifen=((const) temp%1000)%100%10; //十分位
NOP();
}

//---------------------------------------------
//------------DS1303部分-----------------------
//---------------------------------------------
//延时程序
void delay() //延时程序
{
int i; //定义整形变量
for(i=0x64;i--;); //延时
}

//写一个字节数据函数
void write_byte(unsigned char data)
{
int j; //设置循环变量
for(j=0;j<8;j++) //连续写8bit
{
i_o=0; //先设置数据为0
sclk=0; //时钟信号拉低
if(data&0x01) //判断待发送的数据位是0或1
{
i_o=1; //待发送数据位是1
}
data=data>>1; //待发送的数据右移1位
sclk=1; //拉高时钟信号
}
sclk=0; //写完一个字节,拉低时钟信号
}

//---------------------------------------------
//读一个字节函数
unsigned char read_byte()
{
int j; //设置循环变量
TRISB4=1; //设置数据口方向为输入
for(j=8;j--;) //连续读取8bit
{
sclk=0; //拉低时钟信号
rx_data=rx_data>>1; //接收寄存器右移1位
if(i_o==1) rx_data=rx_data|0x80;
sclk=1; //拉高时钟信号
}
TRISB4=0; //恢复数据口方向为输出
sclk=0; //拉低时钟信号
return(rx_data); //返回读取到的数据
}

//----------------------------------------------
//写DS1302
void write_ds1302(unsigned char addr,unsigned char code)
{
rst=0;
sclk=0;
rst=1;
write_byte(addr);
write_byte(code);
sclk=0;
rst=1;
}

//-------------------------------------------
//读DS1302
void read_ds1302(unsigned char addr)
{
rst=0;
sclk=0;
rst=1;
write_byte(addr);
read_data=read_byte();
//return read_data;
}

//---------------------------------------------
//读取时间函数
void get_time()
{

int i; //设置循环变量
rst=1; //使能DS1302
write_byte(0xbf); //发送多字节读取命令
for(i=0;i<7;i++) //连续读取7个字节数据
{
table1[i]=read_byte(); //调用读取1个字节数据的函数
}
rst=0; //复位DS1302
}

//DS1302初始化函数
void ds1302_init()
{
sclk=0; //拉低时钟信号
rst =0; //复位DS1302
rst=1; //使能DS1302
write_ds1302(0x8e,0); //发控制命令
rst=0; //复位
}

//---------------------------------------------
//设置时间函数
void set_time()
{
//定义待设置的时间: 秒、 分、 时、 日、月、星期、年、控制字
const char table[]={0x00,0x00,0x12,0x23,0x10,0x05,0x09,0x00};
int i; //定义循环变量
rst=1; //使能DS1302
write_byte(0xbe); //时钟多字节写命令
for(i=0;i<8;i++) //连续写8个字节数据
{
write_byte(table[i]); //调用写一个字节函数
}
rst=0; //复位
}

//-------------------------------------------
//8位二进制数转换为十进制数
void two_to_ten(unsigned char i)
{
time=(table1[i]&0x0f)+(table1[i]>>4)*0x0a;
}

//-------------------------------------------
//十进制数转换为BCD码
void ten_to_bcd(unsigned char i)
{
time=((i/0x0a)<<4)|(i%0x0a);
}

//------------------------------------------
//校时程序
void change_time()
{
if(RC0==0) //改变星期---k13
{
delay();
if(RC0==0)
{
if(count==0)
{
count=1;
two_to_ten(5);
week=time;
week++;
if(week>=8)
{
week==1;
write_ds1302(0x8A,1);
}
else
write_ds1302(0x8A,week);
}
}
}
else if(RC1==0) //秒归零--k12
{
delay();
if(RC1==0)
{
if(count==0)
{
count=1;
write_ds1302(0x80,0);
}
}
}
else if(RC2==0) //改变分位--k11
{
delay();
if(RC2==0)
{
if(count==0)
{
count=1;
two_to_ten(1);//BCD码转换成十进制数
min=time;
min++;
if(min>=60)
{
min=0;
write_ds1302(0x82,min);
}
else
{
ten_to_bcd(min);//十进制数转换为BCD码存进DS1302
write_ds1302(0x82,time);
}
}
}
}

else if(RC3==0) //改变小时位--k10
{
delay();
if(RC3==0)
{
if(count==0)
{
count=1;
two_to_ten(2);//BCD码转换成十进制数
hour=time;
hour++;
if(hour>=24)
{
hour=0;
write_ds1302(0x84,hour);
}
else
{
ten_to_bcd(hour);
write_ds1302(0x84,time);
}
}
}
}

else if(RB2==0)
{
delay();
if(RB2==0)
{
if(count==0)
{
count=1;
two_to_ten(4);//BCD码转换成十进制数
mon=time;
mon++;
if(mon>=13)
{
mon=1;
write_ds1302(0x88,mon);
}
else
{
ten_to_bcd(mon);
write_ds1302(0x88,time);
}
}
}
}

else if(RB3==0)
{
delay();
if(RB3==0)
{
if(count==0)
{
count=1;
two_to_ten(3);//BCD码转换成十进制数
day=time;
day++;
if((table1[6]%4==0)&&(table1[4]==2)&&(day>=30)) //润年2月
{
day=1;
write_ds1302(0x86,day);
}
else if(((table1[6]%4)!=0)&&(table1[4]==2)&&(day>=29))//非润年的2月
{
day=1;
write_ds1302(0x86,day);
}
else if(((table1[4]==1)||(table1[4]==3)||(table1[4]==5)||(table1[4]==7)||(table1[4]==8)||(table1[4]==0x10)||(table1[4]==0x12))&&(day>=32))
{
day=1;
write_ds1302(0x86,day);
}
else if(((table1[4]==4)||(table1[4]==6)||(table1[4]==9)||(table1[4]==0x11))&&(day>=31))
{
day=1;
write_ds1302(0x86,day);
}
else
{
ten_to_bcd(day);
write_ds1302(0x86,time);
}
}
}
}

else if(RB1==0)
{
delay();
if(RB1==0)
{
if(count==0)
{
count=1;
two_to_ten(6);//BCD码转换成十进制数
year=time;
year++;
if(year>=16)
{
year=0x00;
write_ds1302(0x8c,0);
}
else
{
ten_to_bcd(year);
write_ds1302(0x8c,time);
}
}
}
}
else
count=0;

}

//****************************************
//**************lcd1602*******************
//****************************************
//延时程序
//void delay()
// {
// unsigned char i;
// for(i=100;i>0;i--);
// }

//****************************************
//LCD写一个字节数据
void write_lcd(unsigned char code)
{
PORTD=code;
rs=1;
rw=0;
e=0;
delay();
e=1;
}

//****************************************
//lcd写命令函数
void lcd_enable(unsigned char code)
{
PORTD=code;
rs=0;
rw=0;
e=0;
delay();
e=1;
}
//*****************************************
//lcd显示设置
void lcd_init()
{
lcd_enable(0x01); //清除显示
lcd_enable(0x38); //设置16X2显示,5X7点阵
lcd_enable(0x0c); //开显示,不显示光标
lcd_enable(0x06); //光标左移
}

//-------------------------------------------
//显示函数
void display()
{
// PORTD=0X80; //小时
lcd_enable(0X80);
write_lcd((table1[2]>>4)+0x30);

// PORTD=0x81;
lcd_enable(0x81);
write_lcd((table1[2]&0x0f)+0x30);

// PORTD=0X82;
lcd_enable(0X82);
write_lcd(':');

// PORTD=0X83; //分
lcd_enable(0X83);
write_lcd((table1[1]>>4)+0x30);

// PORTD=0x84;
lcd_enable(0x84);
write_lcd((table1[1]&0x0f)+0x30);

// PORTD=0X85;
lcd_enable(0X85);
write_lcd(':');

// PORTD=0X86; //秒
lcd_enable(0X86);
write_lcd((table1[0]>>4)+0x30);

// PORTD=0x87;
lcd_enable(0x87);
write_lcd((table1[0]&0x0f)+0x30);

// PORTD=0X89; //温度的百位
lcd_enable(0X89);
write_lcd();

// PORTD=0X8a; //温度的十位
lcd_enable(0X8a);
write_lcd(shi+0x30);

// PORTD=0X8b; //温度的个位
lcd_enable(0X8b);
write_lcd(ge+0x30);

// PORTD=0X8c;
lcd_enable(0X8c);
write_lcd('.');

// PORTD=0X8d; //温度的十分位
lcd_enable(0X8d);
write_lcd(shifen+0x30);

// PORTD=0X8e; //显示'C'
lcd_enable(0X8e);
write_lcd('C');
//
// PORTD=0XC0; //年
lcd_enable(0XC0);
write_lcd((table1[6]>>4)+0x30);

//PORTD=0XC1;
lcd_enable(0XC1);
write_lcd((table1[6]&0x0f)+0x30);

// PORTD=0XC2;
lcd_enable(0XC2);
write_lcd('-');

// PORTD=0XC3; //月
lcd_enable(0XC3);
write_lcd((table1[4]>>4)+0x30);

// PORTD=0xC4;
lcd_enable(0xC4);
write_lcd((table1[4]&0x0f)+0x30);

// PORTD=0XC5;
lcd_enable(0XC5);
write_lcd('-');

// PORTD=0XC6; //日
lcd_enable(0XC6);
write_lcd((table1[3]>>4)+0x30);

// PORTD=0xC7;
lcd_enable(0xC7);
write_lcd((table1[3]&0x0f)+0x30);

// PORTD=0XCD; //星期
lcd_enable(0XCD);
write_lcd((table1[5]&0x0f)+0x30);

}

//--------------------------------------------
//引脚定义函数
void port_init()
{
TRISA=0x00; //设置A口全输出
TRISD=0X00; //设置D口全输出
ADCON1=0X06; //设置A口为普通I/O口
TRISB=0X0E; //
OPTION=0X00; //开启B口弱上拉
PORTA=0XFF;
PORTD=0XFF; //先熄灭所有显示
lcd_init();
TRISC=0XEF; //RC3输出,其他为输入
PORTC=0XEF;
count=0;
}

//----------------------------------------------
//主函数
void main()
{
port_init(); //调用引脚初始化函数
read_ds1302(0x81); //查看DS1302是否起振
if(read_data&0x80) //否,则初始化DS1302
{
ds1302_init(); //调用DS1302初始化函数
set_time(); //调用设置时间函数
}
while(1)
{
get_time(); //调用取时间函数
change_time();
get_temp(); //调用温度转换函数
display(); //调用显示函数
}
}

❻ 单片机大神有哪些人

一、吴鉴鹰

吴鉴鹰,男,1985.9,老家安徽安庆,04年毕业于电子科技大学学生,后接触单片机,已经成为单片机领域的一个企业家,名下有鉴鹰电子科技有限公司,主要进行教育类电子产品的开发和电力电力产品以及智能仪器仪表的开发,旗下的产品有高频数字电源,网络分析仪,矿下安全检测系统,无损探测仪等高科技产品。
在本科期间,就积极参与校园的各项活动,那时我对电子的感情用“痴迷”两个字来形
容绝不为过,参加学校组织的各项比赛,在本科生期间,获得全国的电子设计大赛一等奖,
全国飞思卡尔比赛一等奖。利于业余时间申请并获得专利10余项。
因为着有《吴鉴鹰单片机项目实战精讲》而被人们熟知。

阅读全文

与pic单片机c语言视频教程相关的资料

热点内容
去做APP开户有什么危险没得啊 浏览:696
8分之1乘58算法 浏览:170
php提交过滤 浏览:356
豪斯曼检验stata命令 浏览:769
云看地是什么APP 浏览:885
数学指南pdf 浏览:858
phpcurldll64位 浏览:982
程序员脱产一年半 浏览:851
hr招程序员有什么条件 浏览:589
android开源集合 浏览:870
华为云服务器登录密码和账号 浏览:154
中世纪java程序员 浏览:786
什么开发引擎使用python 浏览:176
sh脚本运行命令 浏览:318
广联达加密锁怎么看到期 浏览:174
cad轨迹命令 浏览:981
同事刷到女程序员自媒体视频 浏览:573
校验算法的缺点是什么 浏览:719
PHP商品分类功能实现 浏览:332
php取字符串中间 浏览:432