当前位置:首页 » 编程语言 » pic单片机c语言开发入门
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

pic单片机c语言开发入门

发布时间: 2022-08-11 10:22:48

1. 谁有PIC单片机c语言开发入门的PDF给小弟发个,想学习下,希望一起交流下,我的邮箱:[email protected]

我也在找PIC单片机C语言开发入门的pdf,谁有的话也给我发一份 [email protected]

2. 学习PIC单片机C语言编程,想买本书 ,基本上是零基础,最好是实例多点,注释完整容易看懂的~大家给推荐下~

是这样的 学习单片机前 的确是要先打点基础 不然听起来莫名其妙 到最后越来越吃力!首先会C语言 要学得比较好!然后再学 《微机原理》这门课 这门课很重要 虽然学得时8088芯片 很过时 但是你要是学懂了 那么单片机以及往后的神马都是相通的! 而且微机原理中学得是汇编语言 这种语言好处就是 学懂汇编就能知道微机中 包括单片机中是如何运行的!电工电子是一门课 重要的是电子这门课 也就是常说的模电和数电!这门课也很重要 在以后进行单片机二次开发时候能起来很大作用!打基础就先这么多了 学完以上的就可以正式开始学习单片机 不会有难度了 但是想成为真正的电子工程师 还要学一些课程 比方说高频电子电路 很重要!至于说学习的目的 在等你学完单片机 自己体会我觉得更好!回答完毕 希望满意!

3. 请帮我介绍几本用C语言开发单片机的入门书,谢谢了

------------------------------------
AVR单片机C语言开发入门指导
出版社: 清华大学出版社
作者 : 沈文 Eagle lee 詹卫前
------------------------------------
PIC单片机C语言开发入门
出版社: 北京航空航天大学出版社
作者 : 武锋 等
------------------------------------
MSP430系列单片机C语言程序设计与开发
出版社: 北京航空航天大学出版社
作者: 胡大可
------------------------------------
8051单片机C语言开发环境实务与设计
出版社:科学出版社
作者: 赖麟文
------------------------------------
C51单片机高效入门
出版社: 机械工业
作者 : 徐玮
------------------------------------

问题补充:

如果是学习Atmel的AVR的话,选择下面这本书是你不二的选择,写得非常经典。

AVR单片机C语言开发入门指导
出版社: 清华大学出版社
作者 : 沈文 Eagle lee 詹卫前

4. 求学习pic单片机c语言入门的书(电子版),我的邮箱是[email protected] 急急急!!!!

用 C 语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护
升级方便、代码的重复利用率高、便于跨平台的代码移植等等,因此C 语言编程在单片机
系统设计中已得到越来越广泛的运用。针对PIC 单片机的软件开发,同样可以用C 语言实
现。
但在单片机上用 C 语言写程序和在PC 机上写程序绝对不能简单等同。现在的PC 机资
源十分丰富,运算能力强大,因此程序员在写PC 机的应用程序时几乎不用关心编译后的可
执行代码在运行过程中需要占用多少系统资源,也基本不用担心运行效率有多高。写单片机
的C 程序最关键的一点是单片机内的资源非常有限,控制的实时性要求又很高,因此,如
果没有对单片机体系结构和硬件资源作详尽的了解,以笔者的愚见认为是无法写出高质量实
用的C 语言程序。这就是为什么前面所有章节中的的示范代码全部用基础的汇编指令实现
的原因,希望籍此能使读者对PIC 单片机的指令体系和硬件资源有深入了解,在这基础之
上再来讨论C 语言编程,就有水到渠成的感觉。
本书围绕中档系列 PIC 单片机来展开讨论,Microchip 公司自己没有针对中低档系列PIC
单片机的C 语言编译器,但很多专业的第三方公司有众多支持PIC 单片机的C 语言编译器
提供,常见的有Hitech、CCS、IAR、Bytecraft 等公司。其中笔者最常用的是Hitech 公司的
PICC 编译器,它稳定可靠,编译生成的代码效率高,在用PIC 单片机进行系统设计和开发
的工程师群体中得到广泛认可。其正式完全版软件需要购置,但在其网站上有限时的试用版
供用户评估。另外,Hitech 公司针对广大PIC 的业余爱好者和初学者还提供了完全免费的学
习版PICC-Lite 编译器套件,它的使用方式和完全版相同,只是支持的PIC 单片机型号限制
在PIC16F84、PIC16F877 和PIC16F628 等几款。这几款Flash 型的单片机因其所具备的丰富
的片上资源而最适用于单片机学习入门,因此笔者建议感兴趣的读者可从PICC-Lite 入手掌
握PIC 单片机的C 语言编程。
在此列出几个主要的针对 PIC 单片机的C 编译器相关连接网址,供读者参考:
Hitech-PICC: www.htsoft.com
IAR: www.iar.com
CCS: www.ccsinfo.com/picc.shtml
ByteCraft: www.bytecraft.com/mpccaps.html
本章将介绍 Hitech-PICC 编译器的一些基本概念,由于篇幅所限将不涉及C 语言的标准
语法和基础知识介绍,因为在这些方面都有大量的书籍可以参考。重点突出针对PIC 单片
机的特点而所需要特别注意的地方

相关电子书已发送!

5. 初学者请问PIC单片机用MPLAB软件进行C语言编程,看什么书比较合适

《PIC16F87X单片机实用软件与接口技术-C语言及其应用》(刘和平编着)

6. 想学习PIC编程要先学习什么

PIC=peripheral interface control
pic集成了很多外围器件,例如CCP模块,通讯模块等
PIC 单片机是一个小的计算机,PIC单片机有计算功能和记忆内存像CPU并由软件控制允行。最好是有本教程然后自己就可以直接买件输入程序练习了。建议你先看看微机原理作为铺垫,C语言是必要的,另外学学汇编语言也是很有用的。
C语言在前期,就是你的汇编可以的情况下没有 太大的用,但是学到后面的话你就会发现会汇编很复杂,而C就会比较简单容易了

7. PIC单片机 c语言编程

以DIP-40的PIC16F877A来举例 灯闪动频率为1秒
void Delay_Ms(unsigned char n);
void main(void)
{
while(1)
{
RA0 = 1;//2脚输出
//11脚是供电
RD2 = 1;//21脚输出
trisA = 0x04; //4脚RA2作为输入
if(RA2 == 0) //如果4脚为低电平
{
//执行代码
}
else //如果4脚为高电平
{
//执行代码
}
Delay_Ms(1000); //延时1秒
RA0 = 0;//2脚输出
//11脚是供电
RD2 = 0;//21脚输出
Delay_Ms(1000); //延时1秒
}
}
void Delay_Ms(unsigned char n) //延时程序
{
unsigned int i;
unsigned char j;
for(j=0;j<n;j++)
{
for(i=0;i<Fosc/44000;i++)
{
}
}
}

8. 在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(); //调用显示函数
}
}